summaryrefslogtreecommitdiff
path: root/fpdfsdk/include/fxedit/fx_edit.h
blob: a842fd6284f37e0d72b88de2edfcb5a1bac03de2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef _FX_EDIT_H_
#define _FX_EDIT_H_

#include "../../../core/include/fxcrt/fx_basic.h"
#include "../../../core/include/fxge/fx_dib.h"

class CFX_RenderDevice;
class CPDF_Font;
class CPDF_Matrix;
class CPDF_PageObjects;
class CPDF_Point;
class CPDF_Rect;
class CPDF_TextObject;
class IFX_Edit;
class IFX_Edit_FontMap;
class IFX_Edit_Iterator;
class IFX_Edit_Notify;
class IFX_Edit_UndoItem;
class IFX_List;
class IFX_List_Notify;
class IFX_SystemHandler;
class IPDF_VariableText;
class IPDF_VariableText_Provider;
struct CPVT_Line;
struct CPVT_SecProps;
struct CPVT_Section;
struct CPVT_Word;
struct CPVT_WordPlace;
struct CPVT_WordProps;
struct CPVT_WordRange;

#define PVTWORD_STYLE_NORMAL				0x0000L
#define PVTWORD_STYLE_HIGHLIGHT				0x0001L
#define PVTWORD_STYLE_UNDERLINE				0x0002L
#define PVTWORD_STYLE_CROSSOUT				0x0004L
#define PVTWORD_STYLE_SQUIGGLY				0x0008L
#define PVTWORD_STYLE_DUALCROSSOUT			0x0010L
#define PVTWORD_STYLE_BOLD					0x0020L
#define PVTWORD_STYLE_ITALIC				0x0040L

#define FX_EDIT_ISLATINWORD(u)	(u == 0x2D || (u <= 0x005A && u >= 0x0041) || (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0))

#ifdef FX_READER_DLL
	#ifdef FXET_EXPORT
		#define FXET_CLASS __declspec(dllexport)
	#else
		#define FXET_CLASS
	#endif
#else
	#define FXET_CLASS
#endif

#ifndef DEFAULT_CHARSET
#define DEFAULT_CHARSET         1
#endif 

class IFX_Edit_FontMap
{
public:
        virtual ~IFX_Edit_FontMap() { }
	//map a fontindex to pdf font.
	virtual CPDF_Font *						GetPDFFont(FX_INT32 nFontIndex) = 0;
	//get the alias of a pdf font.
	virtual CFX_ByteString					GetPDFFontAlias(FX_INT32 nFontIndex) = 0;
	//get the index of a font that can show a word.
	virtual FX_INT32						GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) = 0;
	//get the charcode of word from unicode
	virtual FX_INT32						CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word) = 0;
	//get the charset of unicode
	virtual FX_INT32						CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset) = 0;
};

class IFX_Edit_Notify
{
public:
        virtual ~IFX_Edit_Notify() { }
	//set the horizontal scrollbar information.
	virtual void							IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, 
												FX_FLOAT fContentMin, FX_FLOAT fContentMax, 
												FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
	//set the vertical scrollbar information.
	virtual void							IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, 
												FX_FLOAT fContentMin, FX_FLOAT fContentMax, 
												FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
	//set the position of horizontal scrollbar.
	virtual void							IOnSetScrollPosX(FX_FLOAT fx) = 0;
	//set the position of vertical scrollbar.
	virtual void							IOnSetScrollPosY(FX_FLOAT fy) = 0;
	//set the caret information.
	virtual void							IOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place) = 0;
	//if the caret position is changed ,send the information of current postion to user.
	virtual void							IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps) = 0;
	//if the text area is changed, send the information to user.
	virtual void							IOnContentChange(const CPDF_Rect& rcContent) = 0;
	//Invalidate the rectangle relative to the bounding box of edit.
	virtual void							IOnInvalidateRect(CPDF_Rect * pRect) = 0;
};

class IFX_Edit_OprNotify
{
public:
        virtual ~IFX_Edit_OprNotify() { }

	//OprType: 0
	virtual void							OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
	//OprType: 1
	virtual void							OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
	//OprType: 2
	virtual void							OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
	//OprType: 3
	virtual void							OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
	//OprType: 4
	virtual void							OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
	//OprType: 5
	virtual void							OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
	//OprType: 6
	virtual void							OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
	//
	virtual void							OnAddUndo(IFX_Edit_UndoItem* pUndoItem) = 0;
};

class IFX_Edit_Iterator
{
public:
	virtual ~IFX_Edit_Iterator()  {}
public:
	//move the current position to the next word.
	virtual FX_BOOL							NextWord() = 0;
	//move the current position to the next line.
	virtual FX_BOOL							NextLine() = 0;
	//move the current position to the next section. 
	virtual FX_BOOL							NextSection() = 0;

	//move the current position to the previous word.
	virtual FX_BOOL							PrevWord() = 0;
	//move the current position to the previous line.
	virtual FX_BOOL							PrevLine() = 0;
	//move the current position to the previous section. 
	virtual FX_BOOL							PrevSection() = 0;

	//get the information of the current word.
	virtual FX_BOOL							GetWord(CPVT_Word & word) const = 0;
	//get the information of the current line.
	virtual FX_BOOL							GetLine(CPVT_Line & line) const = 0;
	//get the information of the current section.
	virtual FX_BOOL							GetSection(CPVT_Section & section) const = 0;
	//set the current position.
	virtual void							SetAt(FX_INT32 nWordIndex) = 0;
	//set the current position.
	virtual void							SetAt(const CPVT_WordPlace & place) = 0;
	//get the current position.
	virtual const CPVT_WordPlace &			GetAt() const = 0;

	//get the edit which this iterator belongs to
	virtual IFX_Edit*						GetEdit() const = 0;
};

class IFX_Edit_UndoItem
{
public:
	virtual void							Release() = 0;
	virtual void							Undo() = 0;
	virtual void							Redo() = 0;
	virtual CFX_WideString					GetUndoTitle() = 0;

protected:
        ~IFX_Edit_UndoItem() { }
};

class FXET_CLASS IFX_Edit
{
public:
	static IFX_Edit*						NewEdit();
	static	void							DelEdit(IFX_Edit* pEdit);

        //set a IFX_Edit_FontMap pointer implemented by user.
	virtual void							SetFontMap(IFX_Edit_FontMap* pFontMap) = 0;
	//if user don't like to use FontMap, implement VTProvider and set it directly.
	virtual void							SetVTProvider(IPDF_VariableText_Provider* pProvider) = 0;
	//set a IFX_Edit_Notify pointer implemented by user.
	virtual void							SetNotify(IFX_Edit_Notify * pNotify) = 0;
	virtual void							SetOprNotify(IFX_Edit_OprNotify* pOprNotify) = 0;
	//get a pointer allocated by CPDF_Edit, by this pointer, user can iterate the contents of edit, but don't need to release.
	virtual IFX_Edit_Iterator*				GetIterator() = 0;
	//get a VT pointer relative to this edit.
	virtual IPDF_VariableText*				GetVariableText() = 0;
	//get the IFX_Edit_FontMap pointer set by user.
	virtual IFX_Edit_FontMap*				GetFontMap() = 0;

	//initialize the edit.
	virtual void							Initialize() = 0;

	//set the bounding box of the text area.
	virtual void							SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint = TRUE) = 0;
	//set the scroll origin
	virtual void							SetScrollPos(const CPDF_Point & point) = 0;

	//set the horizontal text alignment in text box, nFormat (0:left 1:middle 2:right).
	virtual void							SetAlignmentH(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE) = 0;
	//set the vertical text alignment in text box, nFormat (0:top 1:center 2:bottom).
	virtual void							SetAlignmentV(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE) = 0;
	//if the text is shown in secret , set a character for substitute.
	virtual void							SetPasswordChar(FX_WORD wSubWord = '*', FX_BOOL bPaint = TRUE) = 0;
	//set the maximal count of words of the text.
	virtual void							SetLimitChar(FX_INT32 nLimitChar = 0, FX_BOOL bPaint = TRUE) = 0;
	//if set the count of charArray , then all words is shown in equal space.
	virtual void							SetCharArray(FX_INT32 nCharArray = 0, FX_BOOL bPaint = TRUE) = 0;
	//set the space of two characters.
	virtual void							SetCharSpace(FX_FLOAT fCharSpace = 0.0f, FX_BOOL bPaint = TRUE) = 0;
	//set the horizontal scale of all characters.
	virtual void							SetHorzScale(FX_INT32 nHorzScale = 100, FX_BOOL bPaint = TRUE) = 0;
	//set the leading of all lines
	virtual void							SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE) = 0;
	//if set, CRLF is allowed.
	virtual void							SetMultiLine(FX_BOOL bMultiLine = TRUE, FX_BOOL bPaint = TRUE) = 0;
	//if set, all words auto fit the width of the bounding box.	
	virtual void							SetAutoReturn(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;
	//if set, a font size is calculated to full fit the bounding box.
	virtual void							SetAutoFontSize(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;
	//is set, the text is allowed to scroll.
	virtual void							SetAutoScroll(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;
	//set the font size of all words.
	virtual void							SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint = TRUE) = 0;
	//the text is allowed to auto-scroll, allow the text overflow?
	virtual void							SetTextOverflow(FX_BOOL bAllowed = FALSE, FX_BOOL bPaint = TRUE) = 0;

	//query if the edit is richedit.
	virtual FX_BOOL							IsRichText() const = 0;
	//set the edit is richedit.
	virtual void							SetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE) = 0;
	//set the fontsize of selected text.
	virtual FX_BOOL							SetRichFontSize(FX_FLOAT fFontSize) = 0;	
	//set the fontindex of selected text, user can change the font of selected text.
	virtual FX_BOOL							SetRichFontIndex(FX_INT32 nFontIndex) = 0;
	//set the textcolor of selected text.
	virtual FX_BOOL							SetRichTextColor(FX_COLORREF dwColor) = 0;
	//set the text script type of selected text. (0:normal 1:superscript 2:subscript)
	virtual FX_BOOL							SetRichTextScript(FX_INT32 nScriptType) = 0;	
	//set the bold font style of selected text.
	virtual FX_BOOL							SetRichTextBold(FX_BOOL bBold = TRUE) = 0;
	//set the italic font style of selected text.
	virtual FX_BOOL							SetRichTextItalic(FX_BOOL bItalic = TRUE) = 0;
	//set the underline style of selected text.
	virtual FX_BOOL							SetRichTextUnderline(FX_BOOL bUnderline = TRUE) = 0;
	//set the crossout style of selected text.
	virtual FX_BOOL							SetRichTextCrossout(FX_BOOL bCrossout = TRUE) = 0;
	//set the charspace of selected text, in user coordinate.
	virtual	FX_BOOL							SetRichTextCharSpace(FX_FLOAT fCharSpace) = 0;
	//set the horizontal scale of selected text, default value is 100.
	virtual FX_BOOL							SetRichTextHorzScale(FX_INT32 nHorzScale = 100) = 0;
	//set the leading of selected section, in user coordinate.
	virtual FX_BOOL							SetRichTextLineLeading(FX_FLOAT fLineLeading) = 0;
	//set the indent of selected section, in user coordinate.
	virtual FX_BOOL							SetRichTextLineIndent(FX_FLOAT fLineIndent) = 0;
	//set the alignment of selected section, nAlignment(0:left 1:middle 2:right)
	virtual FX_BOOL							SetRichTextAlignment(FX_INT32 nAlignment) = 0;

	//set the selected range of text.
	//if nStartChar == 0 and nEndChar == -1, select all the text.
	virtual void							SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar) = 0;
	//get the selected range of text.
	virtual void							GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const = 0;
	//select all the text.
	virtual	void							SelectAll() = 0;
	//set text is not selected.
	virtual void							SelectNone() = 0;		
	//get the caret position.
	virtual FX_INT32						GetCaret() const = 0;
	virtual CPVT_WordPlace					GetCaretWordPlace() const = 0;
	//get the string of selected text.
	virtual CFX_WideString					GetSelText() const = 0;
	//get the text conent
	virtual CFX_WideString					GetText() const = 0;
	//query if any text is selected.
	virtual FX_BOOL							IsSelected() const = 0;	
	//get the scroll origin
	virtual CPDF_Point						GetScrollPos() const = 0;
	//get the bounding box of the text area.
	virtual CPDF_Rect						GetPlateRect() const = 0;
	//get the fact area of the text.
	virtual CPDF_Rect						GetContentRect() const = 0;
	//get the visible word range
	virtual CPVT_WordRange					GetVisibleWordRange() const = 0;
	//get the whole word range
	virtual CPVT_WordRange					GetWholeWordRange() const = 0;
	//get the word range of select text
	virtual CPVT_WordRange					GetSelectWordRange() const = 0;

	//send the mousedown message to edit for response.
	//if Shift key is hold, bShift is TRUE, is Ctrl key is hold, bCtrl is TRUE.
	virtual void							OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	//send the mousemove message to edit when mouse down is TRUE.
	virtual void							OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	//send the UP key message to edit.
	virtual void							OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	//send the DOWN key message to edit.
	virtual void							OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	//send the LEFT key message to edit.
	virtual void							OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	//send the RIGHT key message to edit.
	virtual void							OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	//send the HOME key message to edit.
	virtual void							OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	//send the END key message to edit.
	virtual void							OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) = 0;

	//put text into edit.
	virtual void							SetText(FX_LPCWSTR text,FX_INT32 charset = DEFAULT_CHARSET,
													const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;	
	//insert a word into the edit.
	virtual FX_BOOL							InsertWord(FX_WORD word, FX_INT32 charset = DEFAULT_CHARSET, const CPVT_WordProps * pWordProps = NULL) = 0;
	//insert a return into the edit.
	virtual FX_BOOL							InsertReturn(const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;	
	//insert text into the edit.
	virtual FX_BOOL							InsertText(FX_LPCWSTR text, FX_INT32 charset = DEFAULT_CHARSET,
													const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;
	//do backspace operation.
	virtual FX_BOOL							Backspace() = 0;
	//do delete operation.
	virtual FX_BOOL							Delete() = 0;	
	//delete the selected text.
	virtual FX_BOOL							Clear() = 0;

	//do Redo operation.
	virtual FX_BOOL							Redo() = 0;
	//do Undo operation.
	virtual FX_BOOL							Undo() = 0;
	//move caret
	virtual void							SetCaret(FX_INT32 nPos) = 0;

	//arrange all words over again
	virtual void							Paint() = 0;
	
	//allow to refresh screen?
	virtual void							EnableRefresh(FX_BOOL bRefresh) = 0;

	virtual void							RefreshWordRange(const CPVT_WordRange& wr) = 0;

	//allow undo/redo?
	virtual void							EnableUndo(FX_BOOL bUndo) = 0;

	//allow notify?
	virtual void							EnableNotify(FX_BOOL bNotify) = 0;

	//allow opr notify?
	virtual void							EnableOprNotify(FX_BOOL bNotify) = 0;

	//map word place to word index.
	virtual FX_INT32						WordPlaceToWordIndex(const CPVT_WordPlace & place) const = 0;
	//map word index to word place.
	virtual CPVT_WordPlace					WordIndexToWordPlace(FX_INT32 index) const = 0;

	//get the beginning position of a line
	virtual CPVT_WordPlace					GetLineBeginPlace(const CPVT_WordPlace & place) const = 0;

	//get the ending position of a line
	virtual CPVT_WordPlace					GetLineEndPlace(const CPVT_WordPlace & place) const = 0;

	//get the beginning position of a section
	virtual CPVT_WordPlace					GetSectionBeginPlace(const CPVT_WordPlace & place) const = 0;

	//get the ending position of a section
	virtual CPVT_WordPlace					GetSectionEndPlace(const CPVT_WordPlace & place) const = 0;

	//search a wordplace form point
	virtual CPVT_WordPlace					SearchWordPlace(const CPDF_Point& point) const = 0;

	//get the font size of non_rich text or default font size of richtext.
	virtual FX_FLOAT						GetFontSize() const = 0;
	//get the mask character.
	virtual FX_WORD							GetPasswordChar() const = 0;
	//get the count of charArray
	virtual FX_INT32						GetCharArray() const = 0;
	//get the horizontal scale of all characters
	virtual FX_INT32						GetHorzScale() const = 0;
	//get the space of two characters
	virtual FX_FLOAT						GetCharSpace() const = 0;
	//get the latin words of specified range
	virtual CFX_WideString					GetRangeText(const CPVT_WordRange & range) const = 0;
	//is the text full in bounding box
	virtual FX_BOOL							IsTextFull() const = 0;
	virtual FX_BOOL							CanUndo() const = 0;
	virtual FX_BOOL							CanRedo() const = 0;
	//if the content is changed after settext?
	virtual FX_BOOL							IsModified() const = 0;
	//get the total words in edit
	virtual FX_INT32						GetTotalWords() const = 0;

	virtual void							AddUndoItem(IFX_Edit_UndoItem* pUndoItem) = 0;

	static CFX_ByteString					GetEditAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, 
													const CPVT_WordRange* pRange = NULL, 
													FX_BOOL bContinuous = TRUE, FX_WORD SubWord = 0);
	static CFX_ByteString					GetSelectAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange* pRange = NULL);
	static void								DrawEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke,
													const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHandler, void* pFFLData);
	static void								DrawUnderline(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF color,
													const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange);
	static void								DrawRichEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,  
													const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange);
	static void								GeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
													const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
	static void								GenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
													const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
	static void								GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
													const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF color);

protected:
    ~IFX_Edit() { }
};

class IFX_List_Notify
{
public:
        virtual ~IFX_List_Notify() { }
	//set the horizontal scrollbar information.
	virtual void							IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, 
												FX_FLOAT fContentMin, FX_FLOAT fContentMax, 
												FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
	//set the vertical scrollbar information.
	virtual void							IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, 
												FX_FLOAT fContentMin, FX_FLOAT fContentMax, 
												FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
	//set the position of horizontal scrollbar.
	virtual void							IOnSetScrollPosX(FX_FLOAT fx) = 0;
	//set the position of vertical scrollbar.
	virtual void							IOnSetScrollPosY(FX_FLOAT fy) = 0;
	//Invalidate the rectangle relative to the bounding box of edit.
	virtual void							IOnInvalidateRect(CPDF_Rect * pRect) = 0;
};

class FXET_CLASS IFX_List
{
public:
	static IFX_List*						NewList();
	static void								DelList(IFX_List* pList);

	virtual void							SetFontMap(IFX_Edit_FontMap * pFontMap) = 0;
	virtual void							SetNotify(IFX_List_Notify * pNotify) = 0;

	virtual void							SetPlateRect(const CPDF_Rect & rect) = 0;
	virtual void							SetFontSize(FX_FLOAT fFontSize) = 0;

	virtual CPDF_Rect						GetPlateRect() const = 0;
	virtual CPDF_Rect						GetContentRect() const = 0;

	virtual FX_FLOAT						GetFontSize() const = 0;
	virtual IFX_Edit*						GetItemEdit(FX_INT32 nIndex) const = 0;
	virtual FX_INT32						GetCount() const = 0;
	virtual FX_BOOL							IsItemSelected(FX_INT32 nIndex) const = 0;
	virtual FX_FLOAT						GetFirstHeight() const = 0;
	
	virtual void							SetMultipleSel(FX_BOOL bMultiple) = 0;
	virtual FX_BOOL							IsMultipleSel() const = 0;	
	virtual FX_BOOL							IsValid(FX_INT32 nItemIndex) const = 0;
	virtual FX_INT32						FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const = 0;	

	virtual void							SetScrollPos(const CPDF_Point & point) = 0;
	virtual void							ScrollToListItem(FX_INT32 nItemIndex) = 0;
	virtual CPDF_Rect						GetItemRect(FX_INT32 nIndex) const = 0;
	virtual FX_INT32						GetCaret() const = 0;
	virtual FX_INT32						GetSelect() const = 0;	
	virtual FX_INT32						GetTopItem() const = 0;
	virtual FX_INT32						GetItemIndex(const CPDF_Point & point) const = 0;
	virtual FX_INT32						GetFirstSelected() const = 0;

	virtual void							AddString(FX_LPCWSTR string) = 0;
	virtual void							SetTopItem(FX_INT32 nIndex) = 0;	
	virtual void							Select(FX_INT32 nItemIndex) = 0;
	virtual void							SetCaret(FX_INT32 nItemIndex) = 0;
	virtual void							Empty() = 0;
	virtual void							Cancel() = 0;
	virtual CFX_WideString					GetText() const = 0;


	virtual void							OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	virtual void							OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	virtual void							OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	virtual void							OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	virtual void							OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	virtual void							OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	virtual void							OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	virtual void							OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	virtual void							OnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
	virtual FX_BOOL							OnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl) = 0;

protected:
        ~IFX_List() { }
};

#endif