Remove if checks after new.
[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
273   CFX_WideString GetUndoTitle() override { return L""; }
274
275   void SetFirst(FX_BOOL bFirst) { m_bFirst = bFirst; }
276   FX_BOOL IsFirst() { return m_bFirst; }
277   void SetLast(FX_BOOL bLast) { m_bLast = bLast; }
278   FX_BOOL IsLast() { return m_bLast; }
279
280  private:
281   FX_BOOL m_bFirst;
282   FX_BOOL m_bLast;
283 };
284
285 class CFX_Edit_GroupUndoItem : public IFX_Edit_UndoItem {
286  public:
287   CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle);
288   ~CFX_Edit_GroupUndoItem() override;
289
290   void Undo() override;
291   void Redo() override;
292   CFX_WideString GetUndoTitle() override;
293
294   void AddUndoItem(CFX_Edit_UndoItem* pUndoItem);
295   void UpdateItems();
296
297  private:
298   CFX_WideString m_sTitle;
299   CFX_ArrayTemplate<CFX_Edit_UndoItem*> m_Items;
300 };
301
302 /* ------------------------- CFX_Edit_UndoItem derived classes
303  * ---------------------------- */
304
305 class CFXEU_InsertWord : public CFX_Edit_UndoItem {
306  public:
307   CFXEU_InsertWord(CFX_Edit* pEdit,
308                    const CPVT_WordPlace& wpOldPlace,
309                    const CPVT_WordPlace& wpNewPlace,
310                    FX_WORD word,
311                    int32_t charset,
312                    const CPVT_WordProps* pWordProps);
313   virtual ~CFXEU_InsertWord();
314
315   void Redo();
316   void Undo();
317
318  private:
319   CFX_Edit* m_pEdit;
320
321   CPVT_WordPlace m_wpOld;
322   CPVT_WordPlace m_wpNew;
323   FX_WORD m_Word;
324   int32_t m_nCharset;
325   CPVT_WordProps m_WordProps;
326 };
327
328 class CFXEU_InsertReturn : public CFX_Edit_UndoItem {
329  public:
330   CFXEU_InsertReturn(CFX_Edit* pEdit,
331                      const CPVT_WordPlace& wpOldPlace,
332                      const CPVT_WordPlace& wpNewPlace,
333                      const CPVT_SecProps* pSecProps,
334                      const CPVT_WordProps* pWordProps);
335   virtual ~CFXEU_InsertReturn();
336
337   void Redo();
338   void Undo();
339
340  private:
341   CFX_Edit* m_pEdit;
342
343   CPVT_WordPlace m_wpOld;
344   CPVT_WordPlace m_wpNew;
345   CPVT_SecProps m_SecProps;
346   CPVT_WordProps m_WordProps;
347 };
348
349 class CFXEU_Backspace : public CFX_Edit_UndoItem {
350  public:
351   CFXEU_Backspace(CFX_Edit* pEdit,
352                   const CPVT_WordPlace& wpOldPlace,
353                   const CPVT_WordPlace& wpNewPlace,
354                   FX_WORD word,
355                   int32_t charset,
356                   const CPVT_SecProps& SecProps,
357                   const CPVT_WordProps& WordProps);
358   virtual ~CFXEU_Backspace();
359
360   void Redo();
361   void Undo();
362
363  private:
364   CFX_Edit* m_pEdit;
365
366   CPVT_WordPlace m_wpOld;
367   CPVT_WordPlace m_wpNew;
368   FX_WORD m_Word;
369   int32_t m_nCharset;
370   CPVT_SecProps m_SecProps;
371   CPVT_WordProps m_WordProps;
372 };
373
374 class CFXEU_Delete : public CFX_Edit_UndoItem {
375  public:
376   CFXEU_Delete(CFX_Edit* pEdit,
377                const CPVT_WordPlace& wpOldPlace,
378                const CPVT_WordPlace& wpNewPlace,
379                FX_WORD word,
380                int32_t charset,
381                const CPVT_SecProps& SecProps,
382                const CPVT_WordProps& WordProps,
383                FX_BOOL bSecEnd);
384   virtual ~CFXEU_Delete();
385
386   void Redo();
387   void Undo();
388
389  private:
390   CFX_Edit* m_pEdit;
391
392   CPVT_WordPlace m_wpOld;
393   CPVT_WordPlace m_wpNew;
394   FX_WORD m_Word;
395   int32_t m_nCharset;
396   CPVT_SecProps m_SecProps;
397   CPVT_WordProps m_WordProps;
398   FX_BOOL m_bSecEnd;
399 };
400
401 class CFXEU_Clear : public CFX_Edit_UndoItem {
402  public:
403   CFXEU_Clear(CFX_Edit* pEdit,
404               const CPVT_WordRange& wrSel,
405               const CFX_WideString& swText);
406   virtual ~CFXEU_Clear();
407
408   void Redo();
409   void Undo();
410
411  private:
412   CFX_Edit* m_pEdit;
413
414   CPVT_WordRange m_wrSel;
415   CFX_WideString m_swText;
416 };
417
418 class CFXEU_ClearRich : public CFX_Edit_UndoItem {
419  public:
420   CFXEU_ClearRich(CFX_Edit* pEdit,
421                   const CPVT_WordPlace& wpOldPlace,
422                   const CPVT_WordPlace& wpNewPlace,
423                   const CPVT_WordRange& wrSel,
424                   FX_WORD word,
425                   int32_t charset,
426                   const CPVT_SecProps& SecProps,
427                   const CPVT_WordProps& WordProps);
428   virtual ~CFXEU_ClearRich();
429
430   void Redo();
431   void Undo();
432
433  private:
434   CFX_Edit* m_pEdit;
435
436   CPVT_WordPlace m_wpOld;
437   CPVT_WordPlace m_wpNew;
438   CPVT_WordRange m_wrSel;
439   FX_WORD m_Word;
440   int32_t m_nCharset;
441   CPVT_SecProps m_SecProps;
442   CPVT_WordProps m_WordProps;
443 };
444
445 class CFXEU_InsertText : public CFX_Edit_UndoItem {
446  public:
447   CFXEU_InsertText(CFX_Edit* pEdit,
448                    const CPVT_WordPlace& wpOldPlace,
449                    const CPVT_WordPlace& wpNewPlace,
450                    const CFX_WideString& swText,
451                    int32_t charset,
452                    const CPVT_SecProps* pSecProps,
453                    const CPVT_WordProps* pWordProps);
454   virtual ~CFXEU_InsertText();
455
456   void Redo();
457   void Undo();
458
459  private:
460   CFX_Edit* m_pEdit;
461
462   CPVT_WordPlace m_wpOld;
463   CPVT_WordPlace m_wpNew;
464   CFX_WideString m_swText;
465   int32_t m_nCharset;
466   CPVT_SecProps m_SecProps;
467   CPVT_WordProps m_WordProps;
468 };
469
470 class CFXEU_SetSecProps : public CFX_Edit_UndoItem {
471  public:
472   CFXEU_SetSecProps(CFX_Edit* pEdit,
473                     const CPVT_WordPlace& place,
474                     EDIT_PROPS_E ep,
475                     const CPVT_SecProps& oldsecprops,
476                     const CPVT_WordProps& oldwordprops,
477                     const CPVT_SecProps& newsecprops,
478                     const CPVT_WordProps& newwordprops,
479                     const CPVT_WordRange& range);
480   virtual ~CFXEU_SetSecProps();
481
482   void Redo();
483   void Undo();
484
485  private:
486   CFX_Edit* m_pEdit;
487   CPVT_WordPlace m_wpPlace;
488   CPVT_WordRange m_wrPlace;
489   EDIT_PROPS_E m_eProps;
490
491   CPVT_SecProps m_OldSecProps;
492   CPVT_SecProps m_NewSecProps;
493   CPVT_WordProps m_OldWordProps;
494   CPVT_WordProps m_NewWordProps;
495 };
496
497 class CFXEU_SetWordProps : public CFX_Edit_UndoItem {
498  public:
499   CFXEU_SetWordProps(CFX_Edit* pEdit,
500                      const CPVT_WordPlace& place,
501                      EDIT_PROPS_E ep,
502                      const CPVT_WordProps& oldprops,
503                      const CPVT_WordProps& newprops,
504                      const CPVT_WordRange& range);
505   virtual ~CFXEU_SetWordProps();
506
507   void Redo();
508   void Undo();
509
510  private:
511   CFX_Edit* m_pEdit;
512   CPVT_WordPlace m_wpPlace;
513   CPVT_WordRange m_wrPlace;
514   EDIT_PROPS_E m_eProps;
515
516   CPVT_WordProps m_OldWordProps;
517   CPVT_WordProps m_NewWordProps;
518 };
519
520 /* ------------------------- CFX_Edit ---------------------------- */
521
522 class CFX_Edit : public IFX_Edit {
523   friend class CFX_Edit_Iterator;
524   friend class CFXEU_InsertWord;
525   friend class CFXEU_InsertReturn;
526   friend class CFXEU_Backspace;
527   friend class CFXEU_Delete;
528   friend class CFXEU_Clear;
529   friend class CFXEU_ClearRich;
530   friend class CFXEU_SetSecProps;
531   friend class CFXEU_SetWordProps;
532   friend class CFXEU_InsertText;
533
534  public:
535   CFX_Edit(IPDF_VariableText* pVT);
536   virtual ~CFX_Edit();
537
538   void SetFontMap(IFX_Edit_FontMap* pFontMap);
539   void SetVTProvider(IPDF_VariableText_Provider* pProvider);
540   void SetNotify(IFX_Edit_Notify* pNotify);
541   void SetOprNotify(IFX_Edit_OprNotify* pOprNotify);
542   IFX_Edit_Iterator* GetIterator();
543   IPDF_VariableText* GetVariableText();
544   IFX_Edit_FontMap* GetFontMap();
545
546   void Initialize();
547   void SetPlateRect(const CPDF_Rect& rect, FX_BOOL bPaint = TRUE);
548   void SetScrollPos(const CPDF_Point& point);
549
550   void SetAlignmentH(int32_t nFormat = 0, FX_BOOL bPaint = TRUE);
551   void SetAlignmentV(int32_t nFormat = 0, FX_BOOL bPaint = TRUE);
552   void SetPasswordChar(FX_WORD wSubWord = '*', FX_BOOL bPaint = TRUE);
553   void SetLimitChar(int32_t nLimitChar = 0, FX_BOOL bPaint = TRUE);
554   void SetCharArray(int32_t nCharArray = 0, FX_BOOL bPaint = TRUE);
555   void SetCharSpace(FX_FLOAT fCharSpace = 0.0f, FX_BOOL bPaint = TRUE);
556   void SetHorzScale(int32_t nHorzScale = 100, FX_BOOL bPaint = TRUE);
557   void SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE);
558   void SetMultiLine(FX_BOOL bMultiLine = TRUE, FX_BOOL bPaint = TRUE);
559   void SetAutoReturn(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);
560   void SetAutoFontSize(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);
561   void SetAutoScroll(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);
562   void SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint = TRUE);
563   void SetTextOverflow(FX_BOOL bAllowed = FALSE, FX_BOOL bPaint = TRUE);
564
565   FX_BOOL IsRichText() const;
566   void SetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE);
567   FX_BOOL SetRichFontSize(FX_FLOAT fFontSize);
568   FX_BOOL SetRichFontIndex(int32_t nFontIndex);
569   FX_BOOL SetRichTextColor(FX_COLORREF dwColor);
570   FX_BOOL SetRichTextScript(int32_t nScriptType);
571   FX_BOOL SetRichTextBold(FX_BOOL bBold = TRUE);
572   FX_BOOL SetRichTextItalic(FX_BOOL bItalic = TRUE);
573   FX_BOOL SetRichTextUnderline(FX_BOOL bUnderline = TRUE);
574   FX_BOOL SetRichTextCrossout(FX_BOOL bCrossout = TRUE);
575   FX_BOOL SetRichTextCharSpace(FX_FLOAT fCharSpace);
576   FX_BOOL SetRichTextHorzScale(int32_t nHorzScale = 100);
577   FX_BOOL SetRichTextLineLeading(FX_FLOAT fLineLeading);
578   FX_BOOL SetRichTextLineIndent(FX_FLOAT fLineIndent);
579   FX_BOOL SetRichTextAlignment(int32_t nAlignment);
580
581   void OnMouseDown(const CPDF_Point& point, FX_BOOL bShift, FX_BOOL bCtrl);
582   void OnMouseMove(const CPDF_Point& point, FX_BOOL bShift, FX_BOOL bCtrl);
583   void OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl);
584   void OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl);
585   void OnVK_LEFT(FX_BOOL bShift, FX_BOOL bCtrl);
586   void OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl);
587   void OnVK_HOME(FX_BOOL bShift, FX_BOOL bCtrl);
588   void OnVK_END(FX_BOOL bShift, FX_BOOL bCtrl);
589
590   void SetText(const FX_WCHAR* text,
591                int32_t charset = DEFAULT_CHARSET,
592                const CPVT_SecProps* pSecProps = NULL,
593                const CPVT_WordProps* pWordProps = NULL);
594   FX_BOOL InsertWord(FX_WORD word,
595                      int32_t charset = DEFAULT_CHARSET,
596                      const CPVT_WordProps* pWordProps = NULL);
597   FX_BOOL InsertReturn(const CPVT_SecProps* pSecProps = NULL,
598                        const CPVT_WordProps* pWordProps = NULL);
599   FX_BOOL Backspace();
600   FX_BOOL Delete();
601   FX_BOOL Clear();
602   FX_BOOL Empty();
603   FX_BOOL InsertText(const FX_WCHAR* text,
604                      int32_t charset = DEFAULT_CHARSET,
605                      const CPVT_SecProps* pSecProps = NULL,
606                      const CPVT_WordProps* pWordProps = NULL);
607   FX_BOOL Redo();
608   FX_BOOL Undo();
609   CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place,
610                               const FX_WCHAR* text,
611                               int32_t charset,
612                               const CPVT_SecProps* pSecProps,
613                               const CPVT_WordProps* pWordProps);
614   int32_t GetCharSetFromUnicode(FX_WORD word, int32_t nOldCharset);
615
616   int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const;
617   CPVT_WordPlace WordIndexToWordPlace(int32_t index) const;
618
619   CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace& place) const;
620   CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const;
621   CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace& place) const;
622   CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace& place) const;
623   CPVT_WordPlace SearchWordPlace(const CPDF_Point& point) const;
624
625   int32_t GetCaret() const;
626   CPVT_WordPlace GetCaretWordPlace() const;
627   CFX_WideString GetSelText() const;
628   CFX_WideString GetText() const;
629   FX_FLOAT GetFontSize() const;
630   FX_WORD GetPasswordChar() const;
631   CPDF_Point GetScrollPos() const;
632   int32_t GetCharArray() const;
633   CPDF_Rect GetPlateRect() const;
634   CPDF_Rect GetContentRect() const;
635   CFX_WideString GetRangeText(const CPVT_WordRange& range) const;
636   int32_t GetHorzScale() const;
637   FX_FLOAT GetCharSpace() const;
638   int32_t GetTotalWords() const;
639   int32_t GetTotalLines() const;
640
641   void SetSel(int32_t nStartChar, int32_t nEndChar);
642   void GetSel(int32_t& nStartChar, int32_t& nEndChar) const;
643
644  private:
645   void SelectAll();
646   void SelectNone();
647   void SetSel(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
648   FX_BOOL IsSelected() const;
649
650   void RearrangeAll();
651   void RearrangePart(const CPVT_WordRange& range);
652   void Paint();
653   void ScrollToCaret();
654   void SetScrollInfo();
655   void SetScrollPosX(FX_FLOAT fx);
656   void SetScrollPosY(FX_FLOAT fy);
657   void SetScrollLimit();
658   void SetContentChanged();
659   void EnableNotify(FX_BOOL bNotify);
660
661   void SetText(const FX_WCHAR* text,
662                int32_t charset,
663                const CPVT_SecProps* pSecProps,
664                const CPVT_WordProps* pWordProps,
665                FX_BOOL bAddUndo,
666                FX_BOOL bPaint);
667   FX_BOOL InsertWord(FX_WORD word,
668                      int32_t charset,
669                      const CPVT_WordProps* pWordProps,
670                      FX_BOOL bAddUndo,
671                      FX_BOOL bPaint);
672   FX_BOOL InsertReturn(const CPVT_SecProps* pSecProps,
673                        const CPVT_WordProps* pWordProps,
674                        FX_BOOL bAddUndo,
675                        FX_BOOL bPaint);
676   FX_BOOL Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint);
677   FX_BOOL Delete(FX_BOOL bAddUndo, FX_BOOL bPaint);
678   FX_BOOL Clear(FX_BOOL bAddUndo, FX_BOOL bPaint);
679   FX_BOOL InsertText(const FX_WCHAR* text,
680                      int32_t charset,
681                      const CPVT_SecProps* pSecProps,
682                      const CPVT_WordProps* pWordProps,
683                      FX_BOOL bAddUndo,
684                      FX_BOOL bPaint);
685   FX_BOOL SetRichTextProps(EDIT_PROPS_E eProps,
686                            const CPVT_SecProps* pSecProps,
687                            const CPVT_WordProps* pWordProps);
688   FX_BOOL SetSecProps(EDIT_PROPS_E eProps,
689                       const CPVT_WordPlace& place,
690                       const CPVT_SecProps* pSecProps,
691                       const CPVT_WordProps* pWordProps,
692                       const CPVT_WordRange& wr,
693                       FX_BOOL bAddUndo);
694   FX_BOOL SetWordProps(EDIT_PROPS_E eProps,
695                        const CPVT_WordPlace& place,
696                        const CPVT_WordProps* pWordProps,
697                        const CPVT_WordRange& wr,
698                        FX_BOOL bAddUndo);
699   void PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange& wr);
700   void PaintInsertText(const CPVT_WordPlace& wpOld,
701                        const CPVT_WordPlace& wpNew);
702
703   inline CPDF_Point VTToEdit(const CPDF_Point& point) const;
704   inline CPDF_Point EditToVT(const CPDF_Point& point) const;
705   inline CPDF_Rect VTToEdit(const CPDF_Rect& rect) const;
706   inline CPDF_Rect EditToVT(const CPDF_Rect& rect) const;
707
708   void EnableRefresh(FX_BOOL bRefresh);
709   void Refresh(REFRESH_PLAN_E ePlan,
710                const CPVT_WordRange* pRange1 = NULL,
711                const CPVT_WordRange* pRange2 = NULL);
712   void RefreshPushLineRects(const CPVT_WordRange& wr);
713   void RefreshPushRandomRects(const CPVT_WordRange& wr);
714   void RefreshWordRange(const CPVT_WordRange& wr);
715
716   void SetCaret(int32_t nPos);
717   void SetCaret(const CPVT_WordPlace& place);
718   void SetCaretInfo();
719   void SetCaretOrigin();
720   void SetCaretChange();
721
722   CPVT_WordRange GetWholeWordRange() const;
723   CPVT_WordRange GetVisibleWordRange() const;
724   CPVT_WordRange GetLatinWordsRange(const CPVT_WordPlace& place) const;
725   CPVT_WordRange CombineWordRange(const CPVT_WordRange& wr1,
726                                   const CPVT_WordRange& wr2);
727   CPVT_WordRange GetSelectWordRange() const;
728
729   void EnableUndo(FX_BOOL bUndo);
730   void EnableOprNotify(FX_BOOL bNotify);
731
732   FX_BOOL IsTextFull() const;
733   FX_BOOL IsTextOverflow() const;
734   FX_BOOL CanUndo() const;
735   FX_BOOL CanRedo() const;
736   FX_BOOL IsModified() const;
737
738   void BeginGroupUndo(const CFX_WideString& sTitle);
739   void EndGroupUndo();
740   void AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem);
741   void AddUndoItem(IFX_Edit_UndoItem* pUndoItem);
742
743   void SetPageInfo(const CPVT_WordPlace& place);
744   CPVT_WordPlace SearchPageEndPlace(const CPVT_WordPlace& wpPageBegin,
745                                     const CPDF_Point& point) const;
746   FX_FLOAT GetLineTop(const CPVT_WordPlace& place) const;
747   FX_FLOAT GetLineBottom(const CPVT_WordPlace& place) const;
748
749  private:
750   IPDF_VariableText* m_pVT;
751   IFX_Edit_Notify* m_pNotify;
752   IFX_Edit_OprNotify* m_pOprNotify;
753   CFX_Edit_Provider* m_pVTProvide;
754
755   CPVT_WordPlace m_wpCaret;
756   CPVT_WordPlace m_wpOldCaret;
757   CFX_Edit_Select m_SelState;
758
759   CPDF_Point m_ptScrollPos;
760   CPDF_Point m_ptRefreshScrollPos;
761   FX_BOOL m_bEnableScroll;
762   IFX_Edit_Iterator* m_pIterator;
763   CFX_Edit_Refresh m_Refresh;
764   CPDF_Point m_ptCaret;
765   CFX_Edit_Undo m_Undo;
766   int32_t m_nAlignment;
767   FX_BOOL m_bNotifyFlag;
768   FX_BOOL m_bEnableOverflow;
769   FX_BOOL m_bEnableRefresh;
770   CPDF_Rect m_rcOldContent;
771   FX_BOOL m_bEnableUndo;
772   FX_BOOL m_bNotify;
773   FX_BOOL m_bOprNotify;
774   CFX_Edit_GroupUndoItem* m_pGroupUndoItem;
775 };
776
777 /* ------------------------- CFX_Edit_Iterator ---------------------------- */
778
779 class CFX_Edit_Iterator : public IFX_Edit_Iterator {
780  public:
781   CFX_Edit_Iterator(CFX_Edit* pEdit, IPDF_VariableText_Iterator* pVTIterator);
782   virtual ~CFX_Edit_Iterator();
783
784   FX_BOOL NextWord();
785   FX_BOOL NextLine();
786   FX_BOOL NextSection();
787   FX_BOOL PrevWord();
788   FX_BOOL PrevLine();
789   FX_BOOL PrevSection();
790
791   FX_BOOL GetWord(CPVT_Word& word) const;
792   FX_BOOL GetLine(CPVT_Line& line) const;
793   FX_BOOL GetSection(CPVT_Section& section) const;
794   void SetAt(int32_t nWordIndex);
795   void SetAt(const CPVT_WordPlace& place);
796   const CPVT_WordPlace& GetAt() const;
797   IFX_Edit* GetEdit() const;
798
799  private:
800   CFX_Edit* m_pEdit;
801   IPDF_VariableText_Iterator* m_pVTIterator;
802 };
803
804 class CFX_Edit_Provider : public IPDF_VariableText_Provider {
805  public:
806   CFX_Edit_Provider(IFX_Edit_FontMap* pFontMap);
807   virtual ~CFX_Edit_Provider();
808
809   IFX_Edit_FontMap* GetFontMap();
810
811   int32_t GetCharWidth(int32_t nFontIndex, FX_WORD word, int32_t nWordStyle);
812   int32_t GetTypeAscent(int32_t nFontIndex);
813   int32_t GetTypeDescent(int32_t nFontIndex);
814   int32_t GetWordFontIndex(FX_WORD word, int32_t charset, int32_t nFontIndex);
815   int32_t GetDefaultFontIndex();
816   FX_BOOL IsLatinWord(FX_WORD word);
817
818  private:
819   IFX_Edit_FontMap* m_pFontMap;
820 };
821
822 #endif  // FPDFSDK_INCLUDE_FXEDIT_FXET_EDIT_H_