Home | History | Annotate | Download | only in fxedit
      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_
    818