Clean up CPDF_AnnotList.
[pdfium.git] / fpdfsdk / include / fxedit / fxet_edit.h
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #ifndef FPDFSDK_INCLUDE_FXEDIT_FXET_EDIT_H_
8 #define FPDFSDK_INCLUDE_FXEDIT_FXET_EDIT_H_
9
10 #include "../../../core/include/fpdfdoc/fpdf_vt.h"
11 #include "fx_edit.h"
12
13 class CFX_Edit_Page;
14 struct CFX_Edit_LineRect;
15 class CFX_Edit_LineRectArray;
16 class CFX_Edit_RectArray;
17 class CFX_Edit_Refresh;
18 class CFX_Edit_Select;
19 class CFX_Edit;
20 class CFX_Edit_Iterator;
21 class CFX_Edit_Refresh;
22 class CFX_Edit_UndoItem;
23 class CFX_Edit_Undo;
24 class CFX_Edit_Provider;
25
26 #define FX_EDIT_IsFloatZero(f) (f < 0.0001 && f > -0.0001)
27 #define FX_EDIT_IsFloatEqual(fa, fb) FX_EDIT_IsFloatZero(fa - fb)
28 #define FX_EDIT_IsFloatBigger(fa, fb) (fa > fb && !FX_EDIT_IsFloatEqual(fa, fb))
29 #define FX_EDIT_IsFloatSmaller(fa, fb) \
30   (fa < fb && !FX_EDIT_IsFloatEqual(fa, fb))
31
32 template <class T>
33 T FX_EDIT_MIN(const T& i, const T& j) {
34   return ((i < j) ? i : j);
35 }
36 template <class T>
37 T FX_EDIT_MAX(const T& i, const T& j) {
38   return ((i > j) ? i : j);
39 }
40
41 #define FX_EDIT_PI 3.14159265358979f
42 #define FX_EDIT_ITALIC_ANGEL 10 * FX_EDIT_PI / 180.0f
43
44 /* ------------------------- CFX_Edit_Refresh ---------------------------- */
45
46 enum REFRESH_PLAN_E { RP_ANALYSE, RP_NOANALYSE, RP_OPTIONAL };
47
48 enum EDIT_PROPS_E {
49   EP_LINELEADING,
50   EP_LINEINDENT,
51   EP_ALIGNMENT,
52   EP_FONTINDEX,
53   EP_FONTSIZE,
54   EP_WORDCOLOR,
55   EP_SCRIPTTYPE,
56   EP_UNDERLINE,
57   EP_CROSSOUT,
58   EP_CHARSPACE,
59   EP_HORZSCALE,
60   EP_BOLD,
61   EP_ITALIC
62 };
63
64 struct CFX_Edit_LineRect {
65   CFX_Edit_LineRect(const CPVT_WordRange& wrLine, const CPDF_Rect& rcLine)
66       : m_wrLine(wrLine), m_rcLine(rcLine) {}
67
68   FX_BOOL operator!=(const CFX_Edit_LineRect& linerect) const {
69     return FXSYS_memcmp(this, &linerect, sizeof(CFX_Edit_LineRect)) != 0;
70   }
71
72   FX_BOOL IsSameHeight(const CFX_Edit_LineRect& linerect) const {
73     return FX_EDIT_IsFloatZero(
74         (m_rcLine.top - m_rcLine.bottom) -
75         (linerect.m_rcLine.top - linerect.m_rcLine.bottom));
76   }
77
78   FX_BOOL IsSameTop(const CFX_Edit_LineRect& linerect) const {
79     return FX_EDIT_IsFloatZero(m_rcLine.top - linerect.m_rcLine.top);
80   }
81
82   FX_BOOL IsSameLeft(const CFX_Edit_LineRect& linerect) const {
83     return FX_EDIT_IsFloatZero(m_rcLine.left - linerect.m_rcLine.left);
84   }
85
86   FX_BOOL IsSameRight(const CFX_Edit_LineRect& linerect) const {
87     return FX_EDIT_IsFloatZero(m_rcLine.right - linerect.m_rcLine.right);
88   }
89
90   CPVT_WordRange m_wrLine;
91   CPDF_Rect m_rcLine;
92 };
93
94 class CFX_Edit_LineRectArray {
95  public:
96   CFX_Edit_LineRectArray() {}
97
98   virtual ~CFX_Edit_LineRectArray() { Empty(); }
99
100   void Empty() {
101     for (int32_t i = 0, sz = m_LineRects.GetSize(); i < sz; i++)
102       delete m_LineRects.GetAt(i);
103
104     m_LineRects.RemoveAll();
105   }
106
107   void RemoveAll() { m_LineRects.RemoveAll(); }
108
109   void operator=(CFX_Edit_LineRectArray& rects) {
110     Empty();
111     for (int32_t i = 0, sz = rects.GetSize(); i < sz; i++)
112       m_LineRects.Add(rects.GetAt(i));
113
114     rects.RemoveAll();
115   }
116
117   void Add(const CPVT_WordRange& wrLine, const CPDF_Rect& rcLine) {
118     m_LineRects.Add(new CFX_Edit_LineRect(wrLine, rcLine));
119   }
120
121   int32_t GetSize() const { return m_LineRects.GetSize(); }
122
123   CFX_Edit_LineRect* GetAt(int32_t nIndex) const {
124     if (nIndex < 0 || nIndex >= m_LineRects.GetSize())
125       return NULL;
126
127     return m_LineRects.GetAt(nIndex);
128   }
129
130   CFX_ArrayTemplate<CFX_Edit_LineRect*> m_LineRects;
131 };
132
133 class CFX_Edit_RectArray {
134  public:
135   CFX_Edit_RectArray() {}
136
137   virtual ~CFX_Edit_RectArray() { Empty(); }
138
139   void Empty() {
140     for (int32_t i = 0, sz = m_Rects.GetSize(); i < sz; i++)
141       delete m_Rects.GetAt(i);
142
143     m_Rects.RemoveAll();
144   }
145
146   void Add(const CPDF_Rect& rect) {
147     // check for overlapped area
148     for (int32_t i = 0, sz = m_Rects.GetSize(); i < sz; i++) {
149       CPDF_Rect* pRect = m_Rects.GetAt(i);
150       if (pRect && pRect->Contains(rect))
151         return;
152     }
153
154     m_Rects.Add(new CPDF_Rect(rect));
155   }
156
157   int32_t GetSize() const { return m_Rects.GetSize(); }
158
159   CPDF_Rect* GetAt(int32_t nIndex) const {
160     if (nIndex < 0 || nIndex >= m_Rects.GetSize())
161       return NULL;
162
163     return m_Rects.GetAt(nIndex);
164   }
165
166   CFX_ArrayTemplate<CPDF_Rect*> m_Rects;
167 };
168
169 class CFX_Edit_Refresh {
170  public:
171   CFX_Edit_Refresh();
172   virtual ~CFX_Edit_Refresh();
173
174   void BeginRefresh();
175   void Push(const CPVT_WordRange& linerange, const CPDF_Rect& rect);
176   void NoAnalyse();
177   void Analyse(int32_t nAlignment);
178   void AddRefresh(const CPDF_Rect& rect);
179   const CFX_Edit_RectArray* GetRefreshRects() const;
180   void EndRefresh();
181
182  private:
183   CFX_Edit_LineRectArray m_NewLineRects;
184   CFX_Edit_LineRectArray m_OldLineRects;
185   CFX_Edit_RectArray m_RefreshRects;
186 };
187
188 /* ------------------------- CFX_Edit_Select ---------------------------- */
189
190 class CFX_Edit_Select {
191  public:
192   CFX_Edit_Select() {}
193
194   CFX_Edit_Select(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) {
195     Set(begin, end);
196   }
197
198   CFX_Edit_Select(const CPVT_WordRange& range) {
199     Set(range.BeginPos, range.EndPos);
200   }
201
202   CPVT_WordRange ConvertToWordRange() const {
203     return CPVT_WordRange(BeginPos, EndPos);
204   }
205
206   void Default() {
207     BeginPos.Default();
208     EndPos.Default();
209   }
210
211   void Set(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) {
212     BeginPos = begin;
213     EndPos = end;
214   }
215
216   void SetBeginPos(const CPVT_WordPlace& begin) { BeginPos = begin; }
217
218   void SetEndPos(const CPVT_WordPlace& end) { EndPos = end; }
219
220   FX_BOOL IsExist() const { return BeginPos != EndPos; }
221
222   FX_BOOL operator!=(const CPVT_WordRange& wr) const {
223     return wr.BeginPos != BeginPos || wr.EndPos != EndPos;
224   }
225
226   CPVT_WordPlace BeginPos, EndPos;
227 };
228
229 /* ------------------------- CFX_Edit_Undo ---------------------------- */
230
231 class CFX_Edit_Undo {
232  public:
233   CFX_Edit_Undo(int32_t nBufsize = 10000);
234   virtual ~CFX_Edit_Undo();
235
236   void Undo();
237   void Redo();
238
239   void AddItem(IFX_Edit_UndoItem* pItem);
240
241   FX_BOOL CanUndo() const;
242   FX_BOOL CanRedo() const;
243   FX_BOOL IsModified() const;
244   FX_BOOL IsWorking() const;
245
246   void Reset();
247
248   IFX_Edit_UndoItem* GetItem(int32_t nIndex);
249   int32_t GetItemCount() { return m_UndoItemStack.GetSize(); }
250   int32_t GetCurUndoPos() { return m_nCurUndoPos; }
251
252  private:
253   void SetBufSize(int32_t nSize) { m_nBufSize = nSize; }
254   int32_t GetBufSize() { return m_nBufSize; }
255
256   void RemoveHeads();
257   void RemoveTails();
258
259  private:
260   CFX_ArrayTemplate<IFX_Edit_UndoItem*> m_UndoItemStack;
261
262   int32_t m_nCurUndoPos;
263   int32_t m_nBufSize;
264   FX_BOOL m_bModified;
265   FX_BOOL m_bVirgin;
266   FX_BOOL m_bWorking;
267 };
268
269 class CFX_Edit_UndoItem : public IFX_Edit_UndoItem {
270  public:
271   CFX_Edit_UndoItem() : m_bFirst(TRUE), m_bLast(TRUE) {}
272   ~CFX_Edit_UndoItem() override {}
273
274   CFX_WideString GetUndoTitle() override { return L""; }
275
276   void SetFirst(FX_BOOL bFirst) { m_bFirst = bFirst; }
277   FX_BOOL IsFirst() { return m_bFirst; }
278   void SetLast(FX_BOOL bLast) { m_bLast = bLast; }
279   FX_BOOL IsLast() { return m_bLast; }
280
281  private:
282   FX_BOOL m_bFirst;
283   FX_BOOL m_bLast;
284 };
285
286 class CFX_Edit_GroupUndoItem : public IFX_Edit_UndoItem {
287  public:
288   CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle);
289   ~CFX_Edit_GroupUndoItem() override;
290
291   void Undo() override;
292   void Redo() override;
293   CFX_WideString GetUndoTitle() override;
294
295   void AddUndoItem(CFX_Edit_UndoItem* pUndoItem);
296   void UpdateItems();
297
298  private:
299   CFX_WideString m_sTitle;
300   CFX_ArrayTemplate<CFX_Edit_UndoItem*> m_Items;
301 };
302
303 /* ------------------------- CFX_Edit_UndoItem derived classes
304  * ---------------------------- */
305
306 class CFXEU_InsertWord : public CFX_Edit_UndoItem {
307  public:
308   CFXEU_InsertWord(CFX_Edit* pEdit,
309                    const CPVT_WordPlace& wpOldPlace,
310                    const CPVT_WordPlace& wpNewPlace,
311                    FX_WORD word,
312                    int32_t charset,
313                    const CPVT_WordProps* pWordProps);
314   ~CFXEU_InsertWord() override;
315
316   // CFX_Edit_UndoItem
317   void Redo() override;
318   void Undo() override;
319
320  private:
321   CFX_Edit* m_pEdit;
322
323   CPVT_WordPlace m_wpOld;
324   CPVT_WordPlace m_wpNew;
325   FX_WORD m_Word;
326   int32_t m_nCharset;
327   CPVT_WordProps m_WordProps;
328 };
329
330 class CFXEU_InsertReturn : public CFX_Edit_UndoItem {
331  public:
332   CFXEU_InsertReturn(CFX_Edit* pEdit,
333                      const CPVT_WordPlace& wpOldPlace,
334                      const CPVT_WordPlace& wpNewPlace,
335                      const CPVT_SecProps* pSecProps,
336                      const CPVT_WordProps* pWordProps);
337   ~CFXEU_InsertReturn() override;
338
339   // CFX_Edit_UndoItem
340   void Redo() override;
341   void Undo() override;
342
343  private:
344   CFX_Edit* m_pEdit;
345
346   CPVT_WordPlace m_wpOld;
347   CPVT_WordPlace m_wpNew;
348   CPVT_SecProps m_SecProps;
349   CPVT_WordProps m_WordProps;
350 };
351
352 class CFXEU_Backspace : public CFX_Edit_UndoItem {
353  public:
354   CFXEU_Backspace(CFX_Edit* pEdit,
355                   const CPVT_WordPlace& wpOldPlace,
356                   const CPVT_WordPlace& wpNewPlace,
357                   FX_WORD word,
358                   int32_t charset,
359                   const CPVT_SecProps& SecProps,
360                   const CPVT_WordProps& WordProps);
361   ~CFXEU_Backspace() override;
362
363   // CFX_Edit_UndoItem
364   void Redo() override;
365   void Undo() override;
366
367  private:
368   CFX_Edit* m_pEdit;
369
370   CPVT_WordPlace m_wpOld;
371   CPVT_WordPlace m_wpNew;
372   FX_WORD m_Word;
373   int32_t m_nCharset;
374   CPVT_SecProps m_SecProps;
375   CPVT_WordProps m_WordProps;
376 };
377
378 class CFXEU_Delete : public CFX_Edit_UndoItem {
379  public:
380   CFXEU_Delete(CFX_Edit* pEdit,
381                const CPVT_WordPlace& wpOldPlace,
382                const CPVT_WordPlace& wpNewPlace,
383                FX_WORD word,
384                int32_t charset,
385                const CPVT_SecProps& SecProps,
386                const CPVT_WordProps& WordProps,
387                FX_BOOL bSecEnd);
388   ~CFXEU_Delete() override;
389
390   // CFX_Edit_UndoItem
391   void Redo() override;
392   void Undo() override;
393
394  private:
395   CFX_Edit* m_pEdit;
396
397   CPVT_WordPlace m_wpOld;
398   CPVT_WordPlace m_wpNew;
399   FX_WORD m_Word;
400   int32_t m_nCharset;
401   CPVT_SecProps m_SecProps;
402   CPVT_WordProps m_WordProps;
403   FX_BOOL m_bSecEnd;
404 };
405
406 class CFXEU_Clear : public CFX_Edit_UndoItem {
407  public:
408   CFXEU_Clear(CFX_Edit* pEdit,
409               const CPVT_WordRange& wrSel,
410               const CFX_WideString& swText);
411   ~CFXEU_Clear() override;
412
413   // CFX_Edit_UndoItem
414   void Redo() override;
415   void Undo() override;
416
417  private:
418   CFX_Edit* m_pEdit;
419
420   CPVT_WordRange m_wrSel;
421   CFX_WideString m_swText;
422 };
423
424 class CFXEU_ClearRich : public CFX_Edit_UndoItem {
425  public:
426   CFXEU_ClearRich(CFX_Edit* pEdit,
427                   const CPVT_WordPlace& wpOldPlace,
428                   const CPVT_WordPlace& wpNewPlace,
429                   const CPVT_WordRange& wrSel,
430                   FX_WORD word,
431                   int32_t charset,
432                   const CPVT_SecProps& SecProps,
433                   const CPVT_WordProps& WordProps);
434   ~CFXEU_ClearRich() override;
435
436   // CFX_Edit_UndoItem
437   void Redo() override;
438   void Undo() override;
439
440  private:
441   CFX_Edit* m_pEdit;
442
443   CPVT_WordPlace m_wpOld;
444   CPVT_WordPlace m_wpNew;
445   CPVT_WordRange m_wrSel;
446   FX_WORD m_Word;
447   int32_t m_nCharset;
448   CPVT_SecProps m_SecProps;
449   CPVT_WordProps m_WordProps;
450 };
451
452 class CFXEU_InsertText : public CFX_Edit_UndoItem {
453  public:
454   CFXEU_InsertText(CFX_Edit* pEdit,
455                    const CPVT_WordPlace& wpOldPlace,
456                    const CPVT_WordPlace& wpNewPlace,
457                    const CFX_WideString& swText,
458                    int32_t charset,
459                    const CPVT_SecProps* pSecProps,
460                    const CPVT_WordProps* pWordProps);
461   ~CFXEU_InsertText() override;
462
463   // CFX_Edit_UndoItem
464   void Redo() override;
465   void Undo() override;
466
467  private:
468   CFX_Edit* m_pEdit;
469
470   CPVT_WordPlace m_wpOld;
471   CPVT_WordPlace m_wpNew;
472   CFX_WideString m_swText;
473   int32_t m_nCharset;
474   CPVT_SecProps m_SecProps;
475   CPVT_WordProps m_WordProps;
476 };
477
478 class CFXEU_SetSecProps : public CFX_Edit_UndoItem {
479  public:
480   CFXEU_SetSecProps(CFX_Edit* pEdit,
481                     const CPVT_WordPlace& place,
482                     EDIT_PROPS_E ep,
483                     const CPVT_SecProps& oldsecprops,
484                     const CPVT_WordProps& oldwordprops,
485                     const CPVT_SecProps& newsecprops,
486                     const CPVT_WordProps& newwordprops,
487                     const CPVT_WordRange& range);
488   ~CFXEU_SetSecProps() override;
489
490   // CFX_Edit_UndoItem
491   void Redo() override;
492   void Undo() override;
493
494  private:
495   CFX_Edit* m_pEdit;
496   CPVT_WordPlace m_wpPlace;
497   CPVT_WordRange m_wrPlace;
498   EDIT_PROPS_E m_eProps;
499
500   CPVT_SecProps m_OldSecProps;
501   CPVT_SecProps m_NewSecProps;
502   CPVT_WordProps m_OldWordProps;
503   CPVT_WordProps m_NewWordProps;
504 };
505
506 class CFXEU_SetWordProps : public CFX_Edit_UndoItem {
507  public:
508   CFXEU_SetWordProps(CFX_Edit* pEdit,
509                      const CPVT_WordPlace& place,
510                      EDIT_PROPS_E ep,
511                      const CPVT_WordProps& oldprops,
512                      const CPVT_WordProps& newprops,
513                      const CPVT_WordRange& range);
514   ~CFXEU_SetWordProps() override;
515
516   // CFX_Edit_UndoItem
517   void Redo() override;
518   void Undo() override;
519
520  private:
521   CFX_Edit* m_pEdit;
522   CPVT_WordPlace m_wpPlace;
523   CPVT_WordRange m_wrPlace;
524   EDIT_PROPS_E m_eProps;
525
526   CPVT_WordProps m_OldWordProps;
527   CPVT_WordProps m_NewWordProps;
528 };
529
530 /* ------------------------- CFX_Edit ---------------------------- */
531
532 class CFX_Edit : public IFX_Edit {
533   friend class CFX_Edit_Iterator;
534   friend class CFXEU_InsertWord;
535   friend class CFXEU_InsertReturn;
536   friend class CFXEU_Backspace;
537   friend class CFXEU_Delete;
538   friend class CFXEU_Clear;
539   friend class CFXEU_ClearRich;
540   friend class CFXEU_SetSecProps;
541   friend class CFXEU_SetWordProps;
542   friend class CFXEU_InsertText;
543
544  public:
545   CFX_Edit(IPDF_VariableText* pVT);
546   ~CFX_Edit() override;
547
548   // IFX_Edit
549   void SetFontMap(IFX_Edit_FontMap* pFontMap) override;
550   void SetVTProvider(IPDF_VariableText_Provider* pProvider) override;
551   void SetNotify(IFX_Edit_Notify* pNotify) override;
552   void SetOprNotify(IFX_Edit_OprNotify* pOprNotify) override;
553   IFX_Edit_Iterator* GetIterator() override;
554   IPDF_VariableText* GetVariableText() override;
555   IFX_Edit_FontMap* GetFontMap() override;
556   void Initialize() override;
557   void SetPlateRect(const CPDF_Rect& rect, FX_BOOL bPaint = TRUE) override;
558   void SetScrollPos(const CPDF_Point& point) override;
559   void SetAlignmentH(int32_t nFormat = 0, FX_BOOL bPaint = TRUE) override;
560   void SetAlignmentV(int32_t nFormat = 0, FX_BOOL bPaint = TRUE) override;
561   void SetPasswordChar(FX_WORD wSubWord = '*', FX_BOOL bPaint = TRUE) override;
562   void SetLimitChar(int32_t nLimitChar = 0, FX_BOOL bPaint = TRUE) override;
563   void SetCharArray(int32_t nCharArray = 0, FX_BOOL bPaint = TRUE) override;
564   void SetCharSpace(FX_FLOAT fCharSpace = 0.0f, FX_BOOL bPaint = TRUE) override;
565   void SetHorzScale(int32_t nHorzScale = 100, FX_BOOL bPaint = TRUE) override;
566   void SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE) override;
567   void SetMultiLine(FX_BOOL bMultiLine = TRUE, FX_BOOL bPaint = TRUE) override;
568   void SetAutoReturn(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) override;
569   void SetAutoFontSize(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) override;
570   void SetAutoScroll(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) override;
571   void SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint = TRUE) override;
572   void SetTextOverflow(FX_BOOL bAllowed = FALSE,
573                        FX_BOOL bPaint = TRUE) override;
574   FX_BOOL IsRichText() const override;
575   void SetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE) override;
576   FX_BOOL SetRichFontSize(FX_FLOAT fFontSize) override;
577   FX_BOOL SetRichFontIndex(int32_t nFontIndex) override;
578   FX_BOOL SetRichTextColor(FX_COLORREF dwColor) override;
579   FX_BOOL SetRichTextScript(int32_t nScriptType) override;
580   FX_BOOL SetRichTextBold(FX_BOOL bBold = TRUE) override;
581   FX_BOOL SetRichTextItalic(FX_BOOL bItalic = TRUE) override;
582   FX_BOOL SetRichTextUnderline(FX_BOOL bUnderline = TRUE) override;
583   FX_BOOL SetRichTextCrossout(FX_BOOL bCrossout = TRUE) override;
584   FX_BOOL SetRichTextCharSpace(FX_FLOAT fCharSpace) override;
585   FX_BOOL SetRichTextHorzScale(int32_t nHorzScale = 100) override;
586   FX_BOOL SetRichTextLineLeading(FX_FLOAT fLineLeading) override;
587   FX_BOOL SetRichTextLineIndent(FX_FLOAT fLineIndent) override;
588   FX_BOOL SetRichTextAlignment(int32_t nAlignment) override;
589   void OnMouseDown(const CPDF_Point& point,
590                    FX_BOOL bShift,
591                    FX_BOOL bCtrl) override;
592   void OnMouseMove(const CPDF_Point& point,
593                    FX_BOOL bShift,
594                    FX_BOOL bCtrl) override;
595   void OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl) override;
596   void OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl) override;
597   void OnVK_LEFT(FX_BOOL bShift, FX_BOOL bCtrl) override;
598   void OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl) override;
599   void OnVK_HOME(FX_BOOL bShift, FX_BOOL bCtrl) override;
600   void OnVK_END(FX_BOOL bShift, FX_BOOL bCtrl) override;
601   void SetText(const FX_WCHAR* text,
602                int32_t charset = DEFAULT_CHARSET,
603                const CPVT_SecProps* pSecProps = NULL,
604                const CPVT_WordProps* pWordProps = NULL) override;
605   FX_BOOL InsertWord(FX_WORD word,
606                      int32_t charset = DEFAULT_CHARSET,
607                      const CPVT_WordProps* pWordProps = NULL) override;
608   FX_BOOL InsertReturn(const CPVT_SecProps* pSecProps = NULL,
609                        const CPVT_WordProps* pWordProps = NULL) override;
610   FX_BOOL Backspace() override;
611   FX_BOOL Delete() override;
612   FX_BOOL Clear() override;
613   FX_BOOL InsertText(const FX_WCHAR* text,
614                      int32_t charset = DEFAULT_CHARSET,
615                      const CPVT_SecProps* pSecProps = NULL,
616                      const CPVT_WordProps* pWordProps = NULL) override;
617   FX_BOOL Redo() override;
618   FX_BOOL Undo() override;
619   int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const override;
620   CPVT_WordPlace WordIndexToWordPlace(int32_t index) const override;
621   CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace& place) const override;
622   CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const override;
623   CPVT_WordPlace GetSectionBeginPlace(
624       const CPVT_WordPlace& place) const override;
625   CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace& place) const override;
626   CPVT_WordPlace SearchWordPlace(const CPDF_Point& point) const override;
627   int32_t GetCaret() const override;
628   CPVT_WordPlace GetCaretWordPlace() const override;
629   CFX_WideString GetSelText() const override;
630   CFX_WideString GetText() const override;
631   FX_FLOAT GetFontSize() const override;
632   FX_WORD GetPasswordChar() const override;
633   CPDF_Point GetScrollPos() const override;
634   int32_t GetCharArray() const override;
635   CPDF_Rect GetPlateRect() const override;
636   CPDF_Rect GetContentRect() const override;
637   CFX_WideString GetRangeText(const CPVT_WordRange& range) const override;
638   int32_t GetHorzScale() const override;
639   FX_FLOAT GetCharSpace() const override;
640   int32_t GetTotalWords() const override;
641   void SetSel(int32_t nStartChar, int32_t nEndChar) override;
642   void GetSel(int32_t& nStartChar, int32_t& nEndChar) const override;
643   void SelectAll() override;
644   void SelectNone() override;
645   FX_BOOL IsSelected() const override;
646   void Paint() override;
647   void EnableNotify(FX_BOOL bNotify) override;
648   void EnableRefresh(FX_BOOL bRefresh) override;
649   void RefreshWordRange(const CPVT_WordRange& wr) override;
650   void SetCaret(int32_t nPos) override;
651   CPVT_WordRange GetWholeWordRange() const override;
652   CPVT_WordRange GetSelectWordRange() const override;
653   void EnableUndo(FX_BOOL bUndo) override;
654   void EnableOprNotify(FX_BOOL bNotify) override;
655   FX_BOOL IsTextFull() const override;
656   FX_BOOL IsTextOverflow() const;
657   FX_BOOL CanUndo() const override;
658   FX_BOOL CanRedo() const override;
659   FX_BOOL IsModified() const override;
660   CPVT_WordRange GetVisibleWordRange() const override;
661   void AddUndoItem(IFX_Edit_UndoItem* pUndoItem) override;
662
663   FX_BOOL Empty();
664
665   CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place,
666                               const FX_WCHAR* text,
667                               int32_t charset,
668                               const CPVT_SecProps* pSecProps,
669                               const CPVT_WordProps* pWordProps);
670   int32_t GetCharSetFromUnicode(FX_WORD word, int32_t nOldCharset);
671
672   int32_t GetTotalLines() const;
673
674  private:
675   void SetSel(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
676
677   void RearrangeAll();
678   void RearrangePart(const CPVT_WordRange& range);
679   void ScrollToCaret();
680   void SetScrollInfo();
681   void SetScrollPosX(FX_FLOAT fx);
682   void SetScrollPosY(FX_FLOAT fy);
683   void SetScrollLimit();
684   void SetContentChanged();
685
686   void SetText(const FX_WCHAR* text,
687                int32_t charset,
688                const CPVT_SecProps* pSecProps,
689                const CPVT_WordProps* pWordProps,
690                FX_BOOL bAddUndo,
691                FX_BOOL bPaint);
692   FX_BOOL InsertWord(FX_WORD word,
693                      int32_t charset,
694                      const CPVT_WordProps* pWordProps,
695                      FX_BOOL bAddUndo,
696                      FX_BOOL bPaint);
697   FX_BOOL InsertReturn(const CPVT_SecProps* pSecProps,
698                        const CPVT_WordProps* pWordProps,
699                        FX_BOOL bAddUndo,
700                        FX_BOOL bPaint);
701   FX_BOOL Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint);
702   FX_BOOL Delete(FX_BOOL bAddUndo, FX_BOOL bPaint);
703   FX_BOOL Clear(FX_BOOL bAddUndo, FX_BOOL bPaint);
704   FX_BOOL InsertText(const FX_WCHAR* text,
705                      int32_t charset,
706                      const CPVT_SecProps* pSecProps,
707                      const CPVT_WordProps* pWordProps,
708                      FX_BOOL bAddUndo,
709                      FX_BOOL bPaint);
710   FX_BOOL SetRichTextProps(EDIT_PROPS_E eProps,
711                            const CPVT_SecProps* pSecProps,
712                            const CPVT_WordProps* pWordProps);
713   FX_BOOL SetSecProps(EDIT_PROPS_E eProps,
714                       const CPVT_WordPlace& place,
715                       const CPVT_SecProps* pSecProps,
716                       const CPVT_WordProps* pWordProps,
717                       const CPVT_WordRange& wr,
718                       FX_BOOL bAddUndo);
719   FX_BOOL SetWordProps(EDIT_PROPS_E eProps,
720                        const CPVT_WordPlace& place,
721                        const CPVT_WordProps* pWordProps,
722                        const CPVT_WordRange& wr,
723                        FX_BOOL bAddUndo);
724   void PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange& wr);
725   void PaintInsertText(const CPVT_WordPlace& wpOld,
726                        const CPVT_WordPlace& wpNew);
727
728   inline CPDF_Point VTToEdit(const CPDF_Point& point) const;
729   inline CPDF_Point EditToVT(const CPDF_Point& point) const;
730   inline CPDF_Rect VTToEdit(const CPDF_Rect& rect) const;
731   inline CPDF_Rect EditToVT(const CPDF_Rect& rect) const;
732
733   void Refresh(REFRESH_PLAN_E ePlan,
734                const CPVT_WordRange* pRange1 = NULL,
735                const CPVT_WordRange* pRange2 = NULL);
736   void RefreshPushLineRects(const CPVT_WordRange& wr);
737   void RefreshPushRandomRects(const CPVT_WordRange& wr);
738
739   void SetCaret(const CPVT_WordPlace& place);
740   void SetCaretInfo();
741   void SetCaretOrigin();
742   void SetCaretChange();
743
744   CPVT_WordRange GetLatinWordsRange(const CPVT_WordPlace& place) const;
745   CPVT_WordRange CombineWordRange(const CPVT_WordRange& wr1,
746                                   const CPVT_WordRange& wr2);
747
748
749   void BeginGroupUndo(const CFX_WideString& sTitle);
750   void EndGroupUndo();
751   void AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem);
752
753   void SetPageInfo(const CPVT_WordPlace& place);
754   CPVT_WordPlace SearchPageEndPlace(const CPVT_WordPlace& wpPageBegin,
755                                     const CPDF_Point& point) const;
756   FX_FLOAT GetLineTop(const CPVT_WordPlace& place) const;
757   FX_FLOAT GetLineBottom(const CPVT_WordPlace& place) const;
758
759  private:
760   IPDF_VariableText* m_pVT;
761   IFX_Edit_Notify* m_pNotify;
762   IFX_Edit_OprNotify* m_pOprNotify;
763   CFX_Edit_Provider* m_pVTProvide;
764
765   CPVT_WordPlace m_wpCaret;
766   CPVT_WordPlace m_wpOldCaret;
767   CFX_Edit_Select m_SelState;
768
769   CPDF_Point m_ptScrollPos;
770   CPDF_Point m_ptRefreshScrollPos;
771   FX_BOOL m_bEnableScroll;
772   IFX_Edit_Iterator* m_pIterator;
773   CFX_Edit_Refresh m_Refresh;
774   CPDF_Point m_ptCaret;
775   CFX_Edit_Undo m_Undo;
776   int32_t m_nAlignment;
777   FX_BOOL m_bNotifyFlag;
778   FX_BOOL m_bEnableOverflow;
779   FX_BOOL m_bEnableRefresh;
780   CPDF_Rect m_rcOldContent;
781   FX_BOOL m_bEnableUndo;
782   FX_BOOL m_bNotify;
783   FX_BOOL m_bOprNotify;
784   CFX_Edit_GroupUndoItem* m_pGroupUndoItem;
785 };
786
787 /* ------------------------- CFX_Edit_Iterator ---------------------------- */
788
789 class CFX_Edit_Iterator : public IFX_Edit_Iterator {
790  public:
791   CFX_Edit_Iterator(CFX_Edit* pEdit, IPDF_VariableText_Iterator* pVTIterator);
792   ~CFX_Edit_Iterator() override;
793
794   // IFX_Edit_Iterator
795   FX_BOOL NextWord() override;
796   FX_BOOL NextLine() override;
797   FX_BOOL NextSection() override;
798   FX_BOOL PrevWord() override;
799   FX_BOOL PrevLine() override;
800   FX_BOOL PrevSection() override;
801   FX_BOOL GetWord(CPVT_Word& word) const override;
802   FX_BOOL GetLine(CPVT_Line& line) const override;
803   FX_BOOL GetSection(CPVT_Section& section) const override;
804   void SetAt(int32_t nWordIndex) override;
805   void SetAt(const CPVT_WordPlace& place) override;
806   const CPVT_WordPlace& GetAt() const override;
807   IFX_Edit* GetEdit() const override;
808
809  private:
810   CFX_Edit* m_pEdit;
811   IPDF_VariableText_Iterator* m_pVTIterator;
812 };
813
814 class CFX_Edit_Provider : public IPDF_VariableText_Provider {
815  public:
816   CFX_Edit_Provider(IFX_Edit_FontMap* pFontMap);
817   virtual ~CFX_Edit_Provider();
818
819   IFX_Edit_FontMap* GetFontMap();
820
821   int32_t GetCharWidth(int32_t nFontIndex, FX_WORD word, int32_t nWordStyle);
822   int32_t GetTypeAscent(int32_t nFontIndex);
823   int32_t GetTypeDescent(int32_t nFontIndex);
824   int32_t GetWordFontIndex(FX_WORD word, int32_t charset, int32_t nFontIndex);
825   int32_t GetDefaultFontIndex();
826   FX_BOOL IsLatinWord(FX_WORD word);
827
828  private:
829   IFX_Edit_FontMap* m_pFontMap;
830 };
831
832 #endif  // FPDFSDK_INCLUDE_FXEDIT_FXET_EDIT_H_