summaryrefslogtreecommitdiff
path: root/fpdfsdk/include/fxedit/fx_edit.h
blob: d04b45d5877f348d3ec92d93ba8f9fd1e96f0cb1 (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
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
// 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 FPDFSDK_INCLUDE_FXEDIT_FX_EDIT_H_
#define FPDFSDK_INCLUDE_FXEDIT_FX_EDIT_H_

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

class CFX_RenderDevice;
class CPDF_Font;
class CFX_Matrix;
class CPDF_PageObjectHolder;
class CFX_FloatPoint;
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))

#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(int32_t nFontIndex) = 0;
  // get the alias of a pdf font.
  virtual CFX_ByteString GetPDFFontAlias(int32_t nFontIndex) = 0;
  // get the index of a font that can show a word.
  virtual int32_t GetWordFontIndex(FX_WORD word,
                                   int32_t charset,
                                   int32_t nFontIndex) = 0;
  // get the charcode of word from unicode
  virtual int32_t CharCodeFromUnicode(int32_t nFontIndex, FX_WORD word) = 0;
  // get the charset of unicode
  virtual int32_t CharSetFromUnicode(FX_WORD word, int32_t 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 CFX_FloatPoint& ptHead,
                           const CFX_FloatPoint& 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 CFX_FloatRect& rcContent) = 0;
  // Invalidate the rectangle relative to the bounding box of edit.
  virtual void IOnInvalidateRect(CFX_FloatRect* 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(int32_t 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 ~IFX_Edit_UndoItem() {}

  virtual void Undo() = 0;
  virtual void Redo() = 0;
  virtual CFX_WideString GetUndoTitle() = 0;
};

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 CFX_FloatRect& rect,
                            FX_BOOL bPaint = TRUE) = 0;
  // set the scroll origin
  virtual void SetScrollPos(const CFX_FloatPoint& point) = 0;

  // set the horizontal text alignment in text box, nFormat (0:left 1:middle
  // 2:right).
  virtual void SetAlignmentH(int32_t 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(int32_t 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(int32_t nLimitChar = 0, FX_BOOL bPaint = TRUE) = 0;
  // if set the count of charArray , then all words is shown in equal space.
  virtual void SetCharArray(int32_t 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(int32_t 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(int32_t 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(int32_t 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(int32_t 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(int32_t nAlignment) = 0;

  // set the selected range of text.
  // if nStartChar == 0 and nEndChar == -1, select all the text.
  virtual void SetSel(int32_t nStartChar, int32_t nEndChar) = 0;
  // get the selected range of text.
  virtual void GetSel(int32_t& nStartChar, int32_t& 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 int32_t 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 CFX_FloatPoint GetScrollPos() const = 0;
  // get the bounding box of the text area.
  virtual CFX_FloatRect GetPlateRect() const = 0;
  // get the fact area of the text.
  virtual CFX_FloatRect 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 CFX_FloatPoint& point,
                           FX_BOOL bShift,
                           FX_BOOL bCtrl) = 0;
  // send the mousemove message to edit when mouse down is TRUE.
  virtual void OnMouseMove(const CFX_FloatPoint& 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(const FX_WCHAR* text,
                       int32_t 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,
                             int32_t 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(const FX_WCHAR* text,
                             int32_t 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(int32_t 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 int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const = 0;
  // map word index to word place.
  virtual CPVT_WordPlace WordIndexToWordPlace(int32_t 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 CFX_FloatPoint& 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 int32_t GetCharArray() const = 0;
  // get the horizontal scale of all characters
  virtual int32_t 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 int32_t GetTotalWords() const = 0;

  virtual void AddUndoItem(IFX_Edit_UndoItem* pUndoItem) = 0;

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

 protected:
  virtual ~IFX_Edit() {}
};

class IFX_List_Notify {
 public:
  // 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(CFX_FloatRect* pRect) = 0;

 protected:
  virtual ~IFX_List_Notify() {}
};

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 CFX_FloatRect& rect) = 0;
  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;

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

  virtual FX_FLOAT GetFontSize() const = 0;
  virtual IFX_Edit* GetItemEdit(int32_t nIndex) const = 0;
  virtual int32_t GetCount() const = 0;
  virtual FX_BOOL IsItemSelected(int32_t 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(int32_t nItemIndex) const = 0;
  virtual int32_t FindNext(int32_t nIndex, FX_WCHAR nChar) const = 0;

  virtual void SetScrollPos(const CFX_FloatPoint& point) = 0;
  virtual void ScrollToListItem(int32_t nItemIndex) = 0;
  virtual CFX_FloatRect GetItemRect(int32_t nIndex) const = 0;
  virtual int32_t GetCaret() const = 0;
  virtual int32_t GetSelect() const = 0;
  virtual int32_t GetTopItem() const = 0;
  virtual int32_t GetItemIndex(const CFX_FloatPoint& point) const = 0;
  virtual int32_t GetFirstSelected() const = 0;

  virtual void AddString(const FX_WCHAR* str) = 0;
  virtual void SetTopItem(int32_t nIndex) = 0;
  virtual void Select(int32_t nItemIndex) = 0;
  virtual void SetCaret(int32_t nItemIndex) = 0;
  virtual void Empty() = 0;
  virtual void Cancel() = 0;
  virtual CFX_WideString GetText() const = 0;

  virtual void OnMouseDown(const CFX_FloatPoint& point,
                           FX_BOOL bShift,
                           FX_BOOL bCtrl) = 0;
  virtual void OnMouseMove(const CFX_FloatPoint& 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(int32_t nItemIndex, FX_BOOL bShift, FX_BOOL bCtrl) = 0;
  virtual FX_BOOL OnChar(FX_WORD nChar, FX_BOOL bShift, FX_BOOL bCtrl) = 0;

 protected:
  virtual ~IFX_List() {}
};

CFX_ByteString GetPDFWordString(IFX_Edit_FontMap* pFontMap,
                                int32_t nFontIndex,
                                FX_WORD Word,
                                FX_WORD SubWord);

#endif  // FPDFSDK_INCLUDE_FXEDIT_FX_EDIT_H_