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