// 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/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))

#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:
    ~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 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:
        ~IFX_List() { }
};

#endif  // FPDFSDK_INCLUDE_FXEDIT_FX_EDIT_H_
