• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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