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