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
13class CFX_Edit_Page;
14struct CFX_Edit_LineRect;
15class CFX_Edit_LineRectArray;
16class CFX_Edit_RectArray;
17class CFX_Edit_Refresh;
18class CFX_Edit_Select;
19class CFX_Edit;
20class CFX_Edit_Iterator;
21class CFX_Edit_Refresh;
22class CFX_Edit_UndoItem;
23class CFX_Edit_Undo;
24class 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
31template<class T> T FX_EDIT_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }
32template<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
40enum REFRESH_PLAN_E
41{
42	RP_ANALYSE,
43	RP_NOANALYSE,
44	RP_OPTIONAL
45};
46
47enum 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
64struct 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
100class CFX_Edit_LineRectArray
101{
102public:
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
156class CFX_Edit_RectArray
157{
158public:
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
203class CFX_Edit_Refresh
204{
205public:
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
217private:
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
226class CFX_Edit_Select
227{
228public:
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
285class CFX_Edit_Undo
286{
287public:
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
307private:
308	void									SetBufSize(FX_INT32 nSize){m_nBufSize = nSize;}
309	FX_INT32								GetBufSize(){return m_nBufSize;}
310
311	void									RemoveHeads();
312	void									RemoveTails();
313
314private:
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
324class CFX_Edit_UndoItem : public IFX_Edit_UndoItem
325{
326public:
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
336private:
337	FX_BOOL									m_bFirst;
338	FX_BOOL									m_bLast;
339};
340
341class CFX_Edit_GroupUndoItem : public IFX_Edit_UndoItem
342{
343public:
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
354private:
355	CFX_WideString							m_sTitle;
356	CFX_ArrayTemplate<CFX_Edit_UndoItem*>	m_Items;
357};
358
359/* ------------------------- CFX_Edit_UndoItem derived classes ---------------------------- */
360
361class CFXEU_InsertWord : public CFX_Edit_UndoItem
362{
363public:
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
371private:
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
381class CFXEU_InsertReturn : public CFX_Edit_UndoItem
382{
383public:
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
391private:
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
400class CFXEU_Backspace : public CFX_Edit_UndoItem
401{
402public:
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
411private:
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
422class CFXEU_Delete : public CFX_Edit_UndoItem
423{
424public:
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
433private:
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
445class CFXEU_Clear : public CFX_Edit_UndoItem
446{
447public:
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
454private:
455	CFX_Edit*					m_pEdit;
456
457	CPVT_WordRange				m_wrSel;
458	CFX_WideString				m_swText;
459};
460
461class CFXEU_ClearRich : public CFX_Edit_UndoItem
462{
463public:
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
473private:
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
485class CFXEU_InsertText : public CFX_Edit_UndoItem
486{
487public:
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
496private:
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
507class CFXEU_SetSecProps : public CFX_Edit_UndoItem
508{
509public:
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
518private:
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
530class CFXEU_SetWordProps : public CFX_Edit_UndoItem
531{
532public:
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
540private:
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
552class 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
565public:
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
665private:
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
742private:
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
772class CFX_Edit_Iterator : public IFX_Edit_Iterator
773{
774public:
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
793private:
794	CFX_Edit *								m_pEdit;
795	IPDF_VariableText_Iterator*				m_pVTIterator;
796};
797
798class CFX_Edit_Provider : public IPDF_VariableText_Provider
799{
800public:
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
813private:
814	IFX_Edit_FontMap*			m_pFontMap;
815};
816
817#endif  // FPDFSDK_INCLUDE_FXEDIT_FXET_EDIT_H_
818