// 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 CPDF_Matrix;
class CPDF_PageObjects;
class CPDF_Point;
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 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(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 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(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 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(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 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 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 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:
  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(CPDF_Rect* 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 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(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 CPDF_Point& point) = 0;
  virtual void ScrollToListItem(int32_t nItemIndex) = 0;
  virtual CPDF_Rect 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 CPDF_Point& point) const = 0;
  virtual int32_t GetFirstSelected() const = 0;

  virtual void AddString(const FX_WCHAR* string) = 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 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(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_
