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.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
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;
19 class CFX_Edit_Iterator;
20 class CFX_Edit_Refresh;
21 class CFX_Edit_UndoItem;
23 class CFX_Edit_Provider;
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))
30 template<class T> T FX_EDIT_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }
31 template<class T> T FX_EDIT_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }
33 #define FX_EDIT_PI 3.14159265358979f
34 #define FX_EDIT_ITALIC_ANGEL 10 * FX_EDIT_PI / 180.0f
37 /* ------------------------- CFX_Edit_Refresh ---------------------------- */
63 struct CFX_Edit_LineRect
65 CFX_Edit_LineRect(const CPVT_WordRange & wrLine,const CPDF_Rect & rcLine) :
66 m_wrLine(wrLine), m_rcLine(rcLine)
70 FX_BOOL operator != (const CFX_Edit_LineRect & linerect) const
72 return FXSYS_memcmp(this, &linerect, sizeof(CFX_Edit_LineRect)) != 0;
75 FX_BOOL IsSameHeight(const CFX_Edit_LineRect & linerect) const
77 return FX_EDIT_IsFloatZero((m_rcLine.top - m_rcLine.bottom) - (linerect.m_rcLine.top -linerect.m_rcLine.bottom));
80 FX_BOOL IsSameTop(const CFX_Edit_LineRect & linerect) const
82 return FX_EDIT_IsFloatZero(m_rcLine.top - linerect.m_rcLine.top);
85 FX_BOOL IsSameLeft(const CFX_Edit_LineRect & linerect) const
87 return FX_EDIT_IsFloatZero(m_rcLine.left - linerect.m_rcLine.left);
90 FX_BOOL IsSameRight(const CFX_Edit_LineRect & linerect) const
92 return FX_EDIT_IsFloatZero(m_rcLine.right - linerect.m_rcLine.right);
95 CPVT_WordRange m_wrLine;
99 class CFX_Edit_LineRectArray
102 CFX_Edit_LineRectArray()
106 virtual ~CFX_Edit_LineRectArray()
113 for (FX_INT32 i = 0, sz = m_LineRects.GetSize(); i < sz; i++)
114 delete m_LineRects.GetAt(i);
116 m_LineRects.RemoveAll();
121 m_LineRects.RemoveAll();
124 void operator = (CFX_Edit_LineRectArray & rects)
127 for (FX_INT32 i = 0, sz = rects.GetSize(); i < sz; i++)
128 m_LineRects.Add(rects.GetAt(i));
133 void Add(const CPVT_WordRange & wrLine,const CPDF_Rect & rcLine)
135 if (CFX_Edit_LineRect * pRect = new CFX_Edit_LineRect(wrLine,rcLine))
136 m_LineRects.Add(pRect);
139 FX_INT32 GetSize() const
141 return m_LineRects.GetSize();
144 CFX_Edit_LineRect * GetAt(FX_INT32 nIndex) const
146 if (nIndex < 0 || nIndex >= m_LineRects.GetSize())
149 return m_LineRects.GetAt(nIndex);
152 CFX_ArrayTemplate<CFX_Edit_LineRect*> m_LineRects;
155 class CFX_Edit_RectArray
162 virtual ~CFX_Edit_RectArray()
169 for (FX_INT32 i = 0, sz = m_Rects.GetSize(); i < sz; i++)
170 delete m_Rects.GetAt(i);
172 this->m_Rects.RemoveAll();
175 void Add(const CPDF_Rect & rect)
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;
182 if (CPDF_Rect * pNewRect = new CPDF_Rect(rect))
183 m_Rects.Add(pNewRect);
186 FX_INT32 GetSize() const
188 return m_Rects.GetSize();
191 CPDF_Rect * GetAt(FX_INT32 nIndex) const
193 if (nIndex < 0 || nIndex >= m_Rects.GetSize())
196 return m_Rects.GetAt(nIndex);
199 CFX_ArrayTemplate<CPDF_Rect*> m_Rects;
202 class CFX_Edit_Refresh
206 virtual ~CFX_Edit_Refresh();
209 void Push(const CPVT_WordRange & linerange,const CPDF_Rect & rect);
211 void Analyse(FX_INT32 nAlignment);
212 void AddRefresh(const CPDF_Rect & rect);
213 const CFX_Edit_RectArray * GetRefreshRects() const;
217 CFX_Edit_LineRectArray m_NewLineRects;
218 CFX_Edit_LineRectArray m_OldLineRects;
219 CFX_Edit_RectArray m_RefreshRects;
223 /* ------------------------- CFX_Edit_Select ---------------------------- */
225 class CFX_Edit_Select
232 CFX_Edit_Select(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)
237 CFX_Edit_Select(const CPVT_WordRange & range)
239 Set(range.BeginPos,range.EndPos);
242 CPVT_WordRange ConvertToWordRange() const
244 return CPVT_WordRange(this->BeginPos,this->EndPos);
253 void Set(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)
255 this->BeginPos = begin;
259 void SetBeginPos(const CPVT_WordPlace & begin)
261 this->BeginPos = begin;
264 void SetEndPos(const CPVT_WordPlace & end)
269 FX_BOOL IsExist() const
271 return this->BeginPos != this->EndPos;
274 FX_BOOL operator != (const CPVT_WordRange & wr) const
276 return wr.BeginPos != this->BeginPos || wr.EndPos != this->EndPos;
279 CPVT_WordPlace BeginPos,EndPos;
282 /* ------------------------- CFX_Edit_Undo ---------------------------- */
287 CFX_Edit_Undo(FX_INT32 nBufsize = 10000);
288 virtual ~CFX_Edit_Undo();
293 void AddItem(IFX_Edit_UndoItem* pItem);
295 FX_BOOL CanUndo() const;
296 FX_BOOL CanRedo() const;
297 FX_BOOL IsModified() const;
298 FX_BOOL IsWorking() const;
302 IFX_Edit_UndoItem* GetItem(FX_INT32 nIndex);
303 FX_INT32 GetItemCount(){return m_UndoItemStack.GetSize();}
304 FX_INT32 GetCurUndoPos(){return m_nCurUndoPos;}
307 void SetBufSize(FX_INT32 nSize){m_nBufSize = nSize;}
308 FX_INT32 GetBufSize(){return m_nBufSize;}
314 CFX_ArrayTemplate<IFX_Edit_UndoItem*> m_UndoItemStack;
316 FX_INT32 m_nCurUndoPos;
323 class CFX_Edit_UndoItem : public IFX_Edit_UndoItem
326 CFX_Edit_UndoItem() : m_bFirst(TRUE), m_bLast(TRUE) {}
327 virtual ~CFX_Edit_UndoItem(){}
329 virtual CFX_WideString GetUndoTitle() {return L"";}
330 virtual void Release(){delete this;}
333 void SetFirst(FX_BOOL bFirst){m_bFirst = bFirst;}
334 FX_BOOL IsFirst(){return m_bFirst;}
335 void SetLast(FX_BOOL bLast){m_bLast = bLast;}
336 FX_BOOL IsLast(){return m_bLast;}
343 class CFX_Edit_GroupUndoItem : public IFX_Edit_UndoItem
346 CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle);
347 virtual ~CFX_Edit_GroupUndoItem();
349 void AddUndoItem(CFX_Edit_UndoItem* pUndoItem);
355 virtual CFX_WideString GetUndoTitle();
356 virtual void Release();
359 CFX_WideString m_sTitle;
360 CFX_ArrayTemplate<CFX_Edit_UndoItem*> m_Items;
363 /* ------------------------- CFX_Edit_UndoItem derived classes ---------------------------- */
365 class CFXEU_InsertWord : public CFX_Edit_UndoItem
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();
378 CPVT_WordPlace m_wpOld;
379 CPVT_WordPlace m_wpNew;
382 CPVT_WordProps m_WordProps;
385 class CFXEU_InsertReturn : public CFX_Edit_UndoItem
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();
398 CPVT_WordPlace m_wpOld;
399 CPVT_WordPlace m_wpNew;
400 CPVT_SecProps m_SecProps;
401 CPVT_WordProps m_WordProps;
404 class CFXEU_Backspace : public CFX_Edit_UndoItem
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();
418 CPVT_WordPlace m_wpOld;
419 CPVT_WordPlace m_wpNew;
422 CPVT_SecProps m_SecProps;
423 CPVT_WordProps m_WordProps;
426 class CFXEU_Delete : public CFX_Edit_UndoItem
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();
440 CPVT_WordPlace m_wpOld;
441 CPVT_WordPlace m_wpNew;
444 CPVT_SecProps m_SecProps;
445 CPVT_WordProps m_WordProps;
449 class CFXEU_Clear : public CFX_Edit_UndoItem
452 CFXEU_Clear(CFX_Edit * pEdit, const CPVT_WordRange & wrSel, const CFX_WideString & swText);
453 virtual ~CFXEU_Clear();
461 CPVT_WordRange m_wrSel;
462 CFX_WideString m_swText;
465 class CFXEU_ClearRich : public CFX_Edit_UndoItem
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();
480 CPVT_WordPlace m_wpOld;
481 CPVT_WordPlace m_wpNew;
482 CPVT_WordRange m_wrSel;
485 CPVT_SecProps m_SecProps;
486 CPVT_WordProps m_WordProps;
489 class CFXEU_InsertText : public CFX_Edit_UndoItem
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();
503 CPVT_WordPlace m_wpOld;
504 CPVT_WordPlace m_wpNew;
505 CFX_WideString m_swText;
507 CPVT_SecProps m_SecProps;
508 CPVT_WordProps m_WordProps;
511 class CFXEU_SetSecProps : public CFX_Edit_UndoItem
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();
524 CPVT_WordPlace m_wpPlace;
525 CPVT_WordRange m_wrPlace;
526 EDIT_PROPS_E m_eProps;
528 CPVT_SecProps m_OldSecProps;
529 CPVT_SecProps m_NewSecProps;
530 CPVT_WordProps m_OldWordProps;
531 CPVT_WordProps m_NewWordProps;
534 class CFXEU_SetWordProps : public CFX_Edit_UndoItem
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();
546 CPVT_WordPlace m_wpPlace;
547 CPVT_WordRange m_wrPlace;
548 EDIT_PROPS_E m_eProps;
550 CPVT_WordProps m_OldWordProps;
551 CPVT_WordProps m_NewWordProps;
554 /* ------------------------- CFX_Edit ---------------------------- */
556 class CFX_Edit : public IFX_Edit
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;
570 CFX_Edit(IPDF_VariableText * pVT);
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();
582 void SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint = TRUE);
583 void SetScrollPos(const CPDF_Point & point);
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);
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);
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);
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);
633 FX_BOOL InsertText(FX_LPCWSTR text, FX_INT32 charset = DEFAULT_CHARSET,
634 const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);
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);
641 FX_INT32 WordPlaceToWordIndex(const CPVT_WordPlace & place) const;
642 CPVT_WordPlace WordIndexToWordPlace(FX_INT32 index) const;
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;
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;
666 void SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar);
667 void GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;
672 void SetSel(const CPVT_WordPlace & begin,const CPVT_WordPlace & end);
673 FX_BOOL IsSelected() const;
676 void RearrangePart(const CPVT_WordRange & range);
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);
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);
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;
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);
715 void SetCaret(FX_INT32 nPos);
716 void SetCaret(const CPVT_WordPlace & place);
718 void SetCaretOrigin();
719 void SetCaretChange();
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;
727 void EnableUndo(FX_BOOL bUndo);
728 void EnableOprNotify(FX_BOOL bNotify);
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;
736 void BeginGroupUndo(const CFX_WideString& sTitle);
738 void AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem);
739 void AddUndoItem(IFX_Edit_UndoItem* pUndoItem);
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;
747 IPDF_VariableText* m_pVT;
748 IFX_Edit_Notify* m_pNotify;
749 IFX_Edit_OprNotify* m_pOprNotify;
750 CFX_Edit_Provider* m_pVTProvide;
752 CPVT_WordPlace m_wpCaret;
753 CPVT_WordPlace m_wpOldCaret;
754 CFX_Edit_Select m_SelState;
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_bEnableOverflow;
766 FX_BOOL m_bEnableRefresh;
767 CPDF_Rect m_rcOldContent;
768 FX_BOOL m_bEnableUndo;
770 FX_BOOL m_bOprNotify;
771 CFX_Edit_GroupUndoItem* m_pGroupUndoItem;
774 /* ------------------------- CFX_Edit_Iterator ---------------------------- */
776 class CFX_Edit_Iterator : public IFX_Edit_Iterator
779 CFX_Edit_Iterator(CFX_Edit * pEdit,IPDF_VariableText_Iterator * pVTIterator);
780 virtual ~CFX_Edit_Iterator();
784 FX_BOOL NextSection();
787 FX_BOOL PrevSection();
789 FX_BOOL GetWord(CPVT_Word & word) const;
790 FX_BOOL GetLine(CPVT_Line & line) const;
791 FX_BOOL GetSection(CPVT_Section & section) const;
792 void SetAt(FX_INT32 nWordIndex);
793 void SetAt(const CPVT_WordPlace & place);
794 const CPVT_WordPlace & GetAt() const;
795 IFX_Edit* GetEdit() const;
799 IPDF_VariableText_Iterator* m_pVTIterator;
802 class CFX_Edit_Provider : public IPDF_VariableText_Provider
805 CFX_Edit_Provider(IFX_Edit_FontMap* pFontMap);
806 virtual ~CFX_Edit_Provider();
808 IFX_Edit_FontMap* GetFontMap();
810 FX_INT32 GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle);
811 FX_INT32 GetTypeAscent(FX_INT32 nFontIndex);
812 FX_INT32 GetTypeDescent(FX_INT32 nFontIndex);
813 FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);
814 FX_INT32 GetDefaultFontIndex();
815 FX_BOOL IsLatinWord(FX_WORD word);
818 IFX_Edit_FontMap* m_pFontMap;
821 #endif //_FXET_EDIT_H_