// 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 FXFA_H_
#define FXFA_H_

class IFDE_XMLElement;
class CXFA_Node;
class CXFA_NodeList;
class CXFA_WidgetAcc;
class IFWL_AdapterTimerMgr;
class IFX_Font;
class CFX_Graphics;
class IXFA_AppProvider;
class IXFA_App;
class IXFA_FontMgr;
class IXFA_DocProvider;
class IXFA_DocHandler;
class IXFA_DocView;
class IXFA_PageViewRender;
class IXFA_PageView;
class IXFA_WidgetHandler;
class IXFA_WidgetIterator;
class IXFA_MenuHandler;
class IXFA_ChecksumContext;
class IXFA_WidgetAccIterator;

class IXFA_Doc {
public:
    virtual ~IXFA_Doc() { }
protected:
    IXFA_Doc() { }
};


class IXFA_Widget {
public:
    virtual ~IXFA_Widget() { }
protected:
    IXFA_Widget() { }
};


#include "fxfa_basic.h"
#include "fxfa_widget.h"
#define XFA_MBICON_Error	0
#define	XFA_MBICON_Warning	1
#define	XFA_MBICON_Question	2
#define	XFA_MBICON_Status	3
#define XFA_MB_OK			0
#define	XFA_MB_OKCancel		1
#define	XFA_MB_YesNo		2
#define XFA_MB_YesNoCancel	3
#define XFA_IDOK			1
#define XFA_IDCancel		2
#define XFA_IDNo			3
#define XFA_IDYes			4
#define XFA_IDS_ValidateFailed					1
#define XFA_IDS_CalcOverride					2
#define XFA_IDS_ModifyField						3
#define XFA_IDS_NotModifyField					4
#define XFA_IDS_AppName							5
#define XFA_IDS_ImageFilter						6
#define XFA_IDS_UNKNOW_CATCHED					7
#define XFA_IDS_Unable_TO_SET					8
#define XFA_IDS_VALUE_EXCALMATORY				9
#define XFA_IDS_INVALID_ENUM_VALUE				10
#define XFA_IDS_UNSUPPORT_METHOD				11
#define XFA_IDS_UNSUPPORT_PROP					12
#define XFA_IDS_INVAlID_PROP_SET				13
#define XFA_IDS_NOT_DEFAUL_VALUE				14
#define XFA_IDS_UNABLE_SET_LANGUAGE				15
#define XFA_IDS_UNABLE_SET_NUMPAGES				16
#define XFA_IDS_UNABLE_SET_PLATFORM				17
#define XFA_IDS_UNABLE_SET_VALIDATIONENABLE		18
#define XFA_IDS_UNABLE_SET_VARIATION			19
#define XFA_IDS_UNABLE_SET_VERSION				20
#define	XFA_IDS_UNABLE_SET_READY				21
#define XFA_IDS_NUMBER_OF_OCCUR					22
#define XFA_IDS_UNABLE_SET_CLASS_NAME			23
#define XFA_IDS_UNABLE_SET_LENGTH_VALUE			24
#define XFA_IDS_UNSUPPORT_CHAR				    25
#define XFA_IDS_BAD_SUFFIX						26
#define XFA_IDS_EXPECTED_IDENT					27
#define XFA_IDS_EXPECTED_STRING					28
#define XFA_IDS_INVALIDATE_CHAR					29
#define XFA_IDS_REDEFINITION					30
#define XFA_IDS_INVALIDATE_TOKEN				31
#define XFA_IDS_INVALIDATE_EXPRESSION			32
#define XFA_IDS_UNDEFINE_IDENTIFIER				33
#define XFA_IDS_INVALIDATE_LEFTVALUE			34
#define XFA_IDS_COMPILER_ERROR					35
#define XFA_IDS_CANNOT_MODIFY_VALUE				36
#define XFA_IDS_ERROR_PARAMETERS				37
#define XFA_IDS_EXPECT_ENDIF					38
#define XFA_IDS_UNEXPECTED_EXPRESSION			39
#define XFA_IDS_CONDITION_IS_NULL				40
#define XFA_IDS_ILLEGALBREAK					41
#define XFA_IDS_ILLEGALCONTINUE					42
#define XFA_IDS_EXPECTED_OPERATOR				43
#define XFA_IDS_DIVIDE_ZERO						44
#define XFA_IDS_CANNOT_COVERT_OBJECT			45
#define XFA_IDS_NOT_FOUND_CONTAINER				46
#define XFA_IDS_NOT_FOUND_PROPERTY				47
#define XFA_IDS_NOT_FOUND_METHOD				48
#define XFA_IDS_NOT_FOUND_CONST					49
#define XFA_IDS_NOT_ASSIGN_OBJECT				50
#define XFA_IDS_IVALIDATE_INSTRUCTION			51
#define XFA_IDS_EXPECT_NUMBER					52
#define XFA_IDS_VALIDATE_OUT_ARRAY				53
#define XFA_IDS_CANNOT_ASSIGN_IDENT				54
#define XFA_IDS_NOT_FOUNT_FUNCTION				55
#define XFA_IDS_NOT_ARRAY						56
#define XFA_IDS_OUT_ARRAY						57
#define XFA_IDS_NOT_SUPPORT_CALC				58
#define XFA_IDS_ARGUMENT_NOT_ARRAY				59
#define XFA_IDS_ARGUMENT_EXPECT_CONTAINER		60
#define XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT	61
#define XFA_IDS_FUNCTION_IS_BUILDIN				62
#define XFA_IDS_ERROR_MSG						63
#define XFA_IDS_INDEX_OUT_OF_BOUNDS				64
#define XFA_IDS_INCORRECT_NUMBER_OF_METHOD		65
#define XFA_IDS_ARGUMENT_MISMATCH				66
#define XFA_IDS_INVALID_ENUMERATE				67
#define XFA_IDS_INVALID_APPEND					68
#define XFA_IDS_SOM_EXPECTED_LIST				69
#define XFA_IDS_NOT_HAVE_PROPERTY				70
#define XFA_IDS_INVALID_NODE_TYPE				71
#define XFA_IDS_VIOLATE_BOUNDARY				72
#define XFA_IDS_SERVER_DENY						73
#define XFA_IDS_StringWeekDay_Sun				74
#define XFA_IDS_StringWeekDay_Mon				75
#define XFA_IDS_StringWeekDay_Tue				76
#define XFA_IDS_StringWeekDay_Wed				77
#define XFA_IDS_StringWeekDay_Thu				78
#define XFA_IDS_StringWeekDay_Fri				79
#define XFA_IDS_StringWeekDay_Sat				80
#define XFA_IDS_StringMonth_Jan					81
#define XFA_IDS_StringMonth_Feb					82
#define XFA_IDS_StringMonth_March				83
#define XFA_IDS_StringMonth_April				84
#define XFA_IDS_StringMonth_May					85
#define XFA_IDS_StringMonth_June				86
#define XFA_IDS_StringMonth_July				87
#define XFA_IDS_StringMonth_Aug					88
#define XFA_IDS_StringMonth_Sept				89
#define XFA_IDS_StringMonth_Oct					90
#define XFA_IDS_StringMonth_Nov					91
#define XFA_IDS_StringMonth_Dec					92
#define XFA_IDS_String_Today					93
#define XFA_IDS_ValidateLimit					94
#define XFA_IDS_ValidateNullWarning				95
#define XFA_IDS_ValidateNullError				96
#define XFA_IDS_ValidateWarning					97
#define XFA_IDS_ValidateError					98
#define XFA_IDS_ValidateNumberError				99

// Probably should be called IXFA_AppDelegate.
class IXFA_AppProvider
{
public:
    virtual ~IXFA_AppProvider() { }

    /**
     * Specifies the name of the client application in which a form currently exists. Such as Exchange-Pro.
     */
    virtual void SetAppType(const CFX_WideStringC& wsAppType) = 0;
    virtual void GetAppType(CFX_WideString &wsAppType) = 0;
    virtual void SetFoxitAppType(const CFX_WideStringC& wsFoxitAppType) { }
    virtual void GetFoxitAppType(CFX_WideString &wsFoxitAppType) {
        wsFoxitAppType.Empty();
    }

    /**
     * Returns the language of the running host application. Such as zh_CN
     */
    virtual void GetLanguage(CFX_WideString &wsLanguage) = 0;

    /**
     * Returns the platform of the machine running the script. Such as WIN
     */
    virtual void GetPlatform(CFX_WideString &wsPlatform) = 0;

    /**
     * Indicates the packaging of the application that is running the script. Such as Full
     */
    virtual void GetVariation(CFX_WideString &wsVariation) = 0;

    /**
     * Indicates the version number of the current application. Such as 9
     */
    virtual void GetVersion(CFX_WideString &wsVersion) = 0;
    virtual void GetFoxitVersion(CFX_WideString &wsFoxitVersion) {
        wsFoxitVersion.Empty();
    }

    /**
     * Get application name, such as Phantom.
     */
    virtual void GetAppName(CFX_WideString& wsName) = 0;
    virtual void GetFoxitAppName(CFX_WideString& wsFoxitName) {
        wsFoxitName.Empty();
    }

    /**
     * Causes the system to play a sound.
     * @param[in] dwType The system code for the appropriate sound.0 (Error)1 (Warning)2 (Question)3 (Status)4 (Default)
     */
    virtual void Beep(FX_DWORD dwType) = 0;

    /**
     * Displays a message box.
     * @param[in] dwIconType    Icon type, refer to XFA_MBICON.
     * @param[in] dwButtonType  Button type, refer to XFA_MESSAGEBUTTON.
     * @return A valid integer representing the value of the button pressed by the user, refer to XFA_ID.
     */
    virtual int32_t MsgBox(const CFX_WideStringC& wsMessage, const CFX_WideStringC& wsTitle = FX_WSTRC(L""),
                            FX_DWORD dwIconType = 0, FX_DWORD dwButtonType = 0) = 0;

    /**
     * Get a response from the user.
     * @param[in] bMark - Mask the user input with * (asterisks) when true,
     */
    virtual void Response(CFX_WideString &wsAnswer, const CFX_WideStringC& wsQuestion, const CFX_WideStringC& wsTitle = FX_WSTRC(L""),
                          const CFX_WideStringC& wsDefaultAnswer = FX_WSTRC(L""), FX_BOOL bMark = TRUE) = 0;

    virtual int32_t GetDocumentCountInBatch() = 0;
    virtual int32_t GetCurDocumentInBatch() = 0;

    /**
     * Download something from somewhere.
     * @param[in] wsURL - http, ftp, such as "http://www.w3.org/TR/REC-xml-names/".
     */
    virtual IFX_FileRead* DownloadURL(const CFX_WideStringC& wsURL) = 0;

    /**
     * POST data to the given url.
     * @param[in] wsURL         the URL being uploaded.
     * @param[in] wsData        the data being uploaded.
     * @param[in] wsContentType the content type of data including text/html, text/xml, text/plain, multipart/form-data,
     *                          application/x-www-form-urlencoded, application/octet-stream, any valid MIME type.
     * @param[in] wsEncode      the encode of data including UTF-8, UTF-16, ISO8859-1, any recognized [IANA]character encoding
     * @param[in] wsHeader      any additional HTTP headers to be included in the post.
     * @param[out] wsResponse   decoded response from server.
     * @return TRUE Server permitted the post request, FALSE otherwise.
     */
    virtual FX_BOOL PostRequestURL(const CFX_WideStringC& wsURL, const CFX_WideStringC& wsData, const CFX_WideStringC& wsContentType,
                                   const CFX_WideStringC& wsEncode, const CFX_WideStringC& wsHeader, CFX_WideString &wsResponse) = 0;

    /**
     * PUT data to the given url.
     * @param[in] wsURL         the URL being uploaded.
     * @param[in] wsData            the data being uploaded.
     * @param[in] wsEncode      the encode of data including UTF-8, UTF-16, ISO8859-1, any recognized [IANA]character encoding
     * @return TRUE Server permitted the post request, FALSE otherwise.
     */
    virtual FX_BOOL     PutRequestURL(const CFX_WideStringC& wsURL, const CFX_WideStringC& wsData, const CFX_WideStringC& wsEncode) = 0;

    virtual void LoadString(int32_t iStringID, CFX_WideString &wsString) = 0;
    virtual FX_BOOL ShowFileDialog(const CFX_WideStringC& wsTitle, const CFX_WideStringC& wsFilter, CFX_WideStringArray &wsPathArr, FX_BOOL bOpen = TRUE) = 0;
    virtual IFWL_AdapterTimerMgr* GetTimerMgr() = 0;
};
class IXFA_FontMgr
{
public:
    static IXFA_FontMgr* CreateDefault();
    virtual ~IXFA_FontMgr();

    virtual IFX_Font*	GetFont(IXFA_Doc* hDoc, const CFX_WideStringC& wsFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF) = 0;
    virtual IFX_Font*	GetDefaultFont(IXFA_Doc* hDoc, const CFX_WideStringC& wsFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF) = 0;
};
class IXFA_App
{
public:
    static IXFA_App* Create(IXFA_AppProvider* pProvider);
    virtual ~IXFA_App();

    virtual IXFA_DocHandler*	GetDocHandler() = 0;
    virtual IXFA_Doc*			CreateDoc(IXFA_DocProvider* pProvider, IFX_FileRead* pStream, FX_BOOL bTakeOverFile = TRUE) = 0;
    virtual IXFA_Doc*			CreateDoc(IXFA_DocProvider* pProvider, CPDF_Document* pPDFDoc) = 0;
    virtual	IXFA_AppProvider*	GetAppProvider() = 0;
    virtual void				SetDefaultFontMgr(IXFA_FontMgr* pFontMgr) = 0;
    virtual IXFA_MenuHandler*	GetMenuHandler() = 0;
};
class IXFA_MenuHandler
{
public:
    virtual ~IXFA_MenuHandler() { }

    virtual FX_BOOL		CanCopy(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		CanCut(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		CanPaste(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		CanSelectAll(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		CanDelete(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		CanDeSelect(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		Copy(IXFA_Widget* hWidget, CFX_WideString &wsText) = 0;
    virtual FX_BOOL		Cut(IXFA_Widget* hWidget, CFX_WideString &wsText) = 0;
    virtual FX_BOOL		Paste(IXFA_Widget* hWidget, const CFX_WideString &wsText) = 0;
    virtual FX_BOOL		SelectAll(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		Delete(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		DeSelect(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		CanUndo(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		CanRedo(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		Undo(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		Redo(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL		GetSuggestWords(IXFA_Widget* hWidget, CFX_PointF pointf, CFX_ByteStringArray &sSuggest) = 0;
    virtual FX_BOOL		ReplaceSpellCheckWord(IXFA_Widget* hWidget, CFX_PointF pointf, const CFX_ByteStringC& bsReplace) = 0;
};
#define XFA_INVALIDATE_AllPages		0x00000000
#define XFA_INVALIDATE_CurrentPage	0x00000001
#define XFA_PRINTOPT_ShowDialog		0x00000001
#define XFA_PRINTOPT_CanCancel		0x00000002
#define XFA_PRINTOPT_ShrinkPage		0x00000004
#define XFA_PRINTOPT_AsImage		0x00000008
#define XFA_PRINTOPT_ReverseOrder	0x00000010
#define XFA_PRINTOPT_PrintAnnot		0x00000020
#define  XFA_PAGEVIEWEVENT_PostAdded		1
#define  XFA_PAGEVIEWEVENT_PostRemoved		3
#define  XFA_WIDGETEVENT_PostAdded			2
#define  XFA_WIDGETEVENT_PreRemoved			3
#define  XFA_WIDGETEVENT_PostContentChanged	6
#define  XFA_WIDGETEVENT_ListItemRemoved	7
#define  XFA_WIDGETEVENT_ListItemAdded  	8
#define  XFA_WIDGETEVENT_AccessChanged  	9
class IXFA_DocProvider
{
public:
    virtual ~IXFA_DocProvider() { }

    virtual void		SetChangeMark(IXFA_Doc* hDoc) = 0;
    virtual void		InvalidateRect(IXFA_PageView* pPageView, const CFX_RectF& rt, FX_DWORD dwFlags = 0) = 0;
    virtual void		DisplayCaret(IXFA_Widget* hWidget, FX_BOOL bVisible, const CFX_RectF* pRtAnchor) = 0;
    virtual FX_BOOL		GetPopupPos(IXFA_Widget* hWidget, FX_FLOAT fMinPopup, FX_FLOAT fMaxPopup,
                                    const CFX_RectF &rtAnchor, CFX_RectF &rtPopup) = 0;
    virtual FX_BOOL		PopupMenu(IXFA_Widget* hWidget, CFX_PointF ptPopup, const CFX_RectF* pRectExclude = NULL) = 0;
    virtual void		PageViewEvent(IXFA_PageView* pPageView, FX_DWORD dwFlags) = 0;
    virtual void		WidgetEvent(IXFA_Widget* hWidget, CXFA_WidgetAcc* pWidgetData, FX_DWORD dwEvent, void* pParam = NULL, void* pAdditional = NULL) = 0;
    virtual FX_BOOL		RenderCustomWidget(IXFA_Widget* hWidget, CFX_Graphics* pGS, CFX_Matrix* pMatrix, const CFX_RectF& rtUI)
    {
        return FALSE;
    }
    virtual	int32_t	CountPages(IXFA_Doc* hDoc) = 0;
    virtual	int32_t	GetCurrentPage(IXFA_Doc* hDoc) = 0;
    virtual void		SetCurrentPage(IXFA_Doc* hDoc, int32_t iCurPage) = 0;
    virtual FX_BOOL		IsCalculationsEnabled(IXFA_Doc* hDoc) = 0;
    virtual void		SetCalculationsEnabled(IXFA_Doc* hDoc, FX_BOOL bEnabled) = 0;
    virtual void		GetTitle(IXFA_Doc* hDoc, CFX_WideString &wsTitle) = 0;
    virtual void		SetTitle(IXFA_Doc* hDoc, const CFX_WideStringC& wsTitle) = 0;
    virtual void		ExportData(IXFA_Doc* hDoc, const CFX_WideStringC& wsFilePath, FX_BOOL bXDP = TRUE) = 0;
    virtual void		ImportData(IXFA_Doc* hDoc, const CFX_WideStringC& wsFilePath) = 0;
    virtual void		GotoURL(IXFA_Doc* hDoc, const CFX_WideStringC& bsURL, FX_BOOL bAppend = TRUE) = 0;
    virtual FX_BOOL		IsValidationsEnabled(IXFA_Doc* hDoc) = 0;
    virtual void		SetValidationsEnabled(IXFA_Doc* hDoc, FX_BOOL bEnabled) = 0;
    virtual void		SetFocusWidget(IXFA_Doc* hDoc, IXFA_Widget* hWidget) = 0;
    virtual void		Print(IXFA_Doc* hDoc, int32_t nStartPage, int32_t nEndPage, FX_DWORD dwOptions) = 0;
    virtual int32_t			AbsPageCountInBatch(IXFA_Doc* hDoc) = 0;
    virtual int32_t			AbsPageInBatch(IXFA_Doc* hDoc, IXFA_Widget* hWidget) = 0;
    virtual int32_t			SheetCountInBatch(IXFA_Doc* hDoc) = 0;
    virtual int32_t			SheetInBatch(IXFA_Doc* hDoc, IXFA_Widget* hWidget) = 0;
    virtual int32_t			Verify(IXFA_Doc* hDoc, CXFA_Node* pSigNode, FX_BOOL bUsed = TRUE)
    {
        return 0;
    }
    virtual FX_BOOL				Sign(IXFA_Doc* hDoc, CXFA_NodeList* pNodeList, const CFX_WideStringC& wsExpression, const CFX_WideStringC& wsXMLIdent, const CFX_WideStringC& wsValue = FX_WSTRC(L"open"), FX_BOOL bUsed = TRUE)
    {
        return 0;
    }
    virtual CXFA_NodeList*		Enumerate(IXFA_Doc* hDoc)
    {
        return 0;
    }
    virtual FX_BOOL				Clear(IXFA_Doc* hDoc, CXFA_Node* pSigNode, FX_BOOL bCleared = TRUE)
    {
        return 0;
    }
    virtual void		GetURL(IXFA_Doc* hDoc, CFX_WideString &wsDocURL) = 0;
    virtual FX_ARGB		GetHighlightColor(IXFA_Doc* hDoc) = 0;
    virtual void		AddDoRecord(IXFA_Widget* hWidget) = 0;

    virtual FX_BOOL		SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) = 0;
    virtual FX_BOOL		CheckWord(IXFA_Doc* hDoc, const CFX_ByteStringC& sWord) = 0;
    virtual FX_BOOL		GetSuggestWords(IXFA_Doc* hDoc, const CFX_ByteStringC& sWord, CFX_ByteStringArray& sSuggest) = 0;
    virtual FX_BOOL		GetPDFScriptObject(IXFA_Doc* hDoc, const CFX_ByteStringC& utf8Name, FXJSE_HVALUE hValue) = 0;
    virtual FX_BOOL		GetGlobalProperty(IXFA_Doc* hDoc, const CFX_ByteStringC& szPropName, FXJSE_HVALUE hValue) = 0;
    virtual FX_BOOL		SetGlobalProperty(IXFA_Doc* hDoc, const CFX_ByteStringC& szPropName, FXJSE_HVALUE hValue) = 0;
    virtual CPDF_Document*  OpenPDF(IXFA_Doc* hDoc, IFX_FileRead* pFile, FX_BOOL bTakeOverFile) = 0;
    virtual IFX_FileRead*	OpenLinkedFile(IXFA_Doc* hDoc, const CFX_WideString& wsLink) = 0;
};
#define XFA_DOCVIEW_View		0x00000000
#define XFA_DOCVIEW_MasterPage	0x00000001
#define XFA_DOCVIEW_Design		0x00000002
#define XFA_DOCTYPE_Dynamic		0
#define XFA_DOCTYPE_Static		1
#define XFA_DOCTYPE_XDP			2
#define XFA_PARSESTATUS_StatusErr	-3
#define XFA_PARSESTATUS_StreamErr	-2
#define XFA_PARSESTATUS_SyntaxErr	-1
#define XFA_PARSESTATUS_Ready		0
#define XFA_PARSESTATUS_Done		100
class IXFA_DocHandler
{
public:
    virtual ~IXFA_DocHandler() { }

    virtual void				ReleaseDoc(IXFA_Doc* hDoc) = 0;
    virtual IXFA_DocProvider*	GetDocProvider(IXFA_Doc* hDoc) = 0;

    virtual FX_DWORD			GetDocType(IXFA_Doc* hDoc) = 0;
    virtual	int32_t			StartLoad(IXFA_Doc* hDoc) = 0;
    virtual int32_t			DoLoad(IXFA_Doc* hDoc, IFX_Pause *pPause = NULL) = 0;
    virtual void				StopLoad(IXFA_Doc* hDoc) = 0;

    virtual IXFA_DocView*		CreateDocView(IXFA_Doc* hDoc, FX_DWORD dwView = 0) = 0;

    virtual int32_t			CountPackages(IXFA_Doc* hDoc) = 0;
    virtual	void				GetPackageName(IXFA_Doc* hDoc, int32_t iPackage, CFX_WideStringC &wsPackage) = 0;

    virtual FX_BOOL				SavePackage(IXFA_Doc* hDoc, const CFX_WideStringC& wsPackage, IFX_FileWrite* pFile, IXFA_ChecksumContext *pCSContext = NULL) = 0;
    virtual FX_BOOL				CloseDoc(IXFA_Doc* hDoc) = 0;

    virtual FX_BOOL				ImportData(IXFA_Doc* hDoc, IFX_FileRead* pStream, FX_BOOL bXDP = TRUE) = 0;
    virtual	void				SetJSERuntime(IXFA_Doc* hDoc, FXJSE_HRUNTIME hRuntime) = 0;
    virtual FXJSE_HVALUE		GetXFAScriptObject(IXFA_Doc* hDoc) = 0;
    virtual XFA_ATTRIBUTEENUM	GetRestoreState(IXFA_Doc* hDoc) = 0;
    virtual FX_BOOL				RunDocScript(IXFA_Doc* hDoc, XFA_SCRIPTTYPE eScriptType, const CFX_WideStringC& wsScript, FXJSE_HVALUE hRetValue, FXJSE_HVALUE hThisObject) = 0;
};
enum XFA_EVENTTYPE {
    XFA_EVENT_Click,
    XFA_EVENT_Change,
    XFA_EVENT_DocClose,
    XFA_EVENT_DocReady,
    XFA_EVENT_Enter,
    XFA_EVENT_Exit,
    XFA_EVENT_Full,
    XFA_EVENT_IndexChange,
    XFA_EVENT_Initialize,
    XFA_EVENT_MouseDown,
    XFA_EVENT_MouseEnter,
    XFA_EVENT_MouseExit,
    XFA_EVENT_MouseUp,
    XFA_EVENT_PostExecute,
    XFA_EVENT_PostOpen,
    XFA_EVENT_PostPrint,
    XFA_EVENT_PostSave,
    XFA_EVENT_PostSign,
    XFA_EVENT_PostSubmit,
    XFA_EVENT_PreExecute,
    XFA_EVENT_PreOpen,
    XFA_EVENT_PrePrint,
    XFA_EVENT_PreSave,
    XFA_EVENT_PreSign,
    XFA_EVENT_PreSubmit,
    XFA_EVENT_Ready,
    XFA_EVENT_InitCalculate,
    XFA_EVENT_InitVariables,
    XFA_EVENT_Calculate,
    XFA_EVENT_Validate,
    XFA_EVENT_Unknown,
};
#define XFA_VALIDATE_preSubmit		1
#define XFA_VALIDATE_prePrint		2
#define XFA_VALIDATE_preExecute		3
#define XFA_VALIDATE_preSave		4
class CXFA_EventParam
{
public:
    CXFA_EventParam()
    {
        m_pTarget = NULL;
        m_eType = XFA_EVENT_Unknown;
        m_wsResult.Empty();
        Reset();
    }
    void Reset()
    {
        m_wsChange.Empty();
        m_iCommitKey = 0;
        m_wsFullText.Empty();
        m_bKeyDown = FALSE;
        m_bModifier = FALSE;
        m_wsNewContentType.Empty();
        m_wsNewText.Empty();
        m_wsPrevContentType.Empty();
        m_wsPrevText.Empty();
        m_bReenter = FALSE;
        m_iSelEnd = 0;
        m_iSelStart = 0;
        m_bShift = FALSE;
        m_wsSoapFaultCode.Empty();
        m_wsSoapFaultString.Empty();
        m_bIsFormReady = FALSE;
        m_iValidateActivities = XFA_VALIDATE_preSubmit;
    }
    CXFA_WidgetAcc*	m_pTarget;
    XFA_EVENTTYPE	m_eType;
    CFX_WideString	m_wsResult;
    FX_BOOL			m_bCancelAction;
    int32_t		m_iCommitKey;
    FX_BOOL			m_bKeyDown;
    FX_BOOL			m_bModifier;
    FX_BOOL			m_bReenter;
    int32_t		m_iSelEnd;
    int32_t		m_iSelStart;
    FX_BOOL			m_bShift;
    CFX_WideString	m_wsChange;
    CFX_WideString	m_wsFullText;
    CFX_WideString	m_wsNewContentType;
    CFX_WideString	m_wsNewText;
    CFX_WideString	m_wsPrevContentType;
    CFX_WideString	m_wsPrevText;
    CFX_WideString	m_wsSoapFaultCode;
    CFX_WideString	m_wsSoapFaultString;
    FX_BOOL			m_bIsFormReady;
    int32_t		m_iValidateActivities;
};
#define XFA_EVENTERROR_Sucess		1
#define XFA_EVENTERROR_Error		-1
#define XFA_EVENTERROR_NotExist		0
#define XFA_EVENTERROR_Disabled		2
enum XFA_WIDGETORDER {
    XFA_WIDGETORDER_PreOrder,
};
class IXFA_DocView
{
public:
    virtual ~IXFA_DocView() { }

    virtual IXFA_Doc*			GetDoc() = 0;
    virtual	int32_t			StartLayout(int32_t iStartPage = 0) = 0;
    virtual int32_t			DoLayout(IFX_Pause *pPause = NULL) = 0;
    virtual void				StopLayout() = 0;

    virtual int32_t			GetLayoutStatus() = 0;
    virtual	void				UpdateDocView() = 0;
    virtual int32_t			CountPageViews() = 0;
    virtual IXFA_PageView*		GetPageView(int32_t nIndex) = 0;
    virtual IXFA_Widget*			GetWidgetByName(const CFX_WideStringC& wsName) = 0;
    virtual CXFA_WidgetAcc*		GetWidgetAccByName(const CFX_WideStringC& wsName) = 0;
    virtual void				ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc = NULL) = 0;
    virtual int32_t			ProcessWidgetEvent(CXFA_EventParam* pParam, CXFA_WidgetAcc* pWidgetAcc = NULL) = 0;
    virtual IXFA_WidgetHandler*	GetWidgetHandler() = 0;
    virtual IXFA_WidgetIterator*	CreateWidgetIterator() = 0;
    virtual IXFA_WidgetAccIterator* CreateWidgetAccIterator(XFA_WIDGETORDER eOrder = XFA_WIDGETORDER_PreOrder) = 0;
    virtual IXFA_Widget*			GetFocusWidget() = 0;
    virtual void				KillFocus() = 0;
    virtual FX_BOOL				SetFocus(IXFA_Widget* hWidget) = 0;
};
#define XFA_TRAVERSEWAY_Tranvalse		0x0001
#define XFA_TRAVERSEWAY_Form			0x0002
#define XFA_WIDGETFILTER_Visible		0x0001
#define XFA_WIDGETFILTER_Viewable		0x0010
#define XFA_WIDGETFILTER_Printable		0x0020
#define XFA_WIDGETFILTER_Field			0x0100
#define XFA_WIDGETFILTER_AllType		0x0F00
class IXFA_PageView
{
public:
    virtual ~IXFA_PageView() { }

    virtual IXFA_DocView*	GetDocView() = 0;
    virtual int32_t		GetPageViewIndex() = 0;
    virtual void			GetPageViewRect(CFX_RectF &rtPage) = 0;

    virtual void			GetDisplayMatrix(CFX_Matrix &mt, const CFX_Rect &rtDisp, int32_t iRotate) = 0;

    virtual int32_t		LoadPageView(IFX_Pause *pPause = NULL) = 0;
    virtual void			UnloadPageView() = 0;
    virtual IXFA_Widget*		GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) = 0;
    virtual IXFA_WidgetIterator* CreateWidgetIterator(FX_DWORD dwTraverseWay = XFA_TRAVERSEWAY_Form, FX_DWORD dwWidgetFilter = XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_Viewable | XFA_WIDGETFILTER_AllType) = 0;
};
class CXFA_RenderOptions
{
public:
    CXFA_RenderOptions()
        : m_bPrint(FALSE)
        , m_bHighlight(TRUE)
    {
    }
    FX_BOOL			m_bPrint;
    FX_BOOL			m_bHighlight;
};
#define XFA_RENDERSTATUS_Ready			1
#define XFA_RENDERSTATUS_ToBeContinued	2
#define XFA_RENDERSTATUS_Done			3
#define XFA_RENDERSTATUS_Failed			-1
class IXFA_RenderContext
{
public:
    virtual void		Release() = 0;
    virtual int32_t	StartRender(IXFA_PageView* pPageView, CFX_Graphics* pGS, const CFX_Matrix& pMatrix, const CXFA_RenderOptions& options) = 0;
    virtual int32_t	DoRender(IFX_Pause* pPause = NULL) = 0;
    virtual	void		StopRender() = 0;
protected:
    ~IXFA_RenderContext() { }
};
IXFA_RenderContext*	XFA_RenderContext_Create();
enum XFA_WIDGETTYPE {
    XFA_WIDGETTYPE_Barcode,
    XFA_WIDGETTYPE_PushButton,
    XFA_WIDGETTYPE_CheckButton,
    XFA_WIDGETTYPE_RadioButton,
    XFA_WIDGETTYPE_DatetimeEdit,
    XFA_WIDGETTYPE_DecimalField,
    XFA_WIDGETTYPE_NumericField,
    XFA_WIDGETTYPE_Signature,
    XFA_WIDGETTYPE_TextEdit,
    XFA_WIDGETTYPE_DropdownList,
    XFA_WIDGETTYPE_ListBox,
    XFA_WIDGETTYPE_ImageField,
    XFA_WIDGETTYPE_PasswordEdit,
    XFA_WIDGETTYPE_Arc,
    XFA_WIDGETTYPE_Rectangle,
    XFA_WIDGETTYPE_Image,
    XFA_WIDGETTYPE_Line,
    XFA_WIDGETTYPE_Text,
    XFA_WIDGETTYPE_ExcludeGroup,
    XFA_WIDGETTYPE_Subform,
    XFA_WIDGETTYPE_Unknown,
};
#define XFA_WIDGETSTATUS_Visible	0x00000001
#define XFA_WIDGETSTATUS_Invisible	0x00000002
#define XFA_WIDGETSTATUS_Hidden		0x00000004
#define XFA_WIDGETSTATUS_Viewable	0x00000010
#define XFA_WIDGETSTATUS_Printable	0x00000020
#define XFA_WIDGETSTATUS_Focused	0x00000100
class IXFA_WidgetHandler
{
public:
    virtual ~IXFA_WidgetHandler() { }

    virtual IXFA_Widget*		CreateWidget(IXFA_Widget* hParent, XFA_WIDGETTYPE eType, IXFA_Widget* hBefore = NULL) = 0;
    virtual IXFA_PageView*	GetPageView(IXFA_Widget* hWidget) = 0;
    virtual void			GetRect(IXFA_Widget* hWidget, CFX_RectF &rt) = 0;
    virtual FX_DWORD		GetStatus(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL			GetBBox(IXFA_Widget* hWidget, CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus = FALSE) = 0;
    virtual CXFA_WidgetAcc*	GetDataAcc(IXFA_Widget* hWidget) = 0;

    virtual void			GetName(IXFA_Widget* hWidget, CFX_WideString &wsName, int32_t iNameType = 0) = 0;
    virtual	FX_BOOL			GetToolTip(IXFA_Widget* hWidget, CFX_WideString &wsToolTip) = 0;
    virtual	void			SetPrivateData(IXFA_Widget* hWidget, void* module_id, void* pData, PD_CALLBACK_FREEDATA callback) = 0;
    virtual	void*		GetPrivateData(IXFA_Widget* hWidget, void* module_id) = 0;
    virtual FX_BOOL			OnMouseEnter(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL			OnMouseExit(IXFA_Widget* hWidget) = 0;
    virtual FX_BOOL			OnLButtonDown(IXFA_Widget* hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) = 0;
    virtual FX_BOOL			OnLButtonUp(IXFA_Widget* hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) = 0;
    virtual FX_BOOL			OnLButtonDblClk(IXFA_Widget* hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) = 0;
    virtual FX_BOOL			OnMouseMove(IXFA_Widget* hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) = 0;
    virtual FX_BOOL			OnMouseWheel(IXFA_Widget* hWidget, FX_DWORD dwFlags, int16_t zDelta, FX_FLOAT fx, FX_FLOAT fy) = 0;
    virtual FX_BOOL			OnRButtonDown(IXFA_Widget* hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) = 0;
    virtual FX_BOOL			OnRButtonUp(IXFA_Widget* hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) = 0;
    virtual FX_BOOL			OnRButtonDblClk(IXFA_Widget* hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) = 0;

    virtual FX_BOOL			OnKeyDown(IXFA_Widget* hWidget, FX_DWORD dwKeyCode, FX_DWORD dwFlags) = 0;
    virtual FX_BOOL			OnKeyUp(IXFA_Widget* hWidget, FX_DWORD dwKeyCode, FX_DWORD dwFlags) = 0;
    virtual FX_BOOL			OnChar(IXFA_Widget* hWidget, FX_DWORD dwChar, FX_DWORD dwFlags) = 0;
    virtual	FX_DWORD		OnHitTest(IXFA_Widget* hWidget, FX_FLOAT fx, FX_FLOAT fy) = 0;
    virtual FX_BOOL			OnSetCursor(IXFA_Widget* hWidget, FX_FLOAT fx, FX_FLOAT fy) = 0;

    virtual void			RenderWidget(IXFA_Widget* hWidget, CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL, FX_BOOL bHighlight = FALSE) = 0;
    virtual FX_BOOL			HasEvent(CXFA_WidgetAcc* pWidgetAcc, XFA_EVENTTYPE eEventType) = 0;
    virtual int32_t		ProcessEvent(CXFA_WidgetAcc* pWidgetAcc, CXFA_EventParam* pParam) = 0;
};
class IXFA_WidgetIterator
{
public:
    virtual void				Release() = 0;
    virtual void				Reset() = 0;
    virtual IXFA_Widget*			MoveToFirst() = 0;
    virtual IXFA_Widget*			MoveToLast() = 0;
    virtual	IXFA_Widget*			MoveToNext() = 0;
    virtual IXFA_Widget*			MoveToPrevious() = 0;
    virtual	IXFA_Widget*			GetCurrentWidget() = 0;
    virtual	FX_BOOL				SetCurrentWidget(IXFA_Widget* hWidget)  = 0;
protected:
    ~IXFA_WidgetIterator() { }
};
class IXFA_WidgetAccIterator
{
public:
    virtual void				Release() = 0;
    virtual void				Reset() = 0;
    virtual CXFA_WidgetAcc*		MoveToFirst() = 0;
    virtual CXFA_WidgetAcc*		MoveToLast() = 0;
    virtual CXFA_WidgetAcc*		MoveToNext() = 0;
    virtual CXFA_WidgetAcc*		MoveToPrevious() = 0;
    virtual CXFA_WidgetAcc*		GetCurrentWidgetAcc() = 0;
    virtual FX_BOOL				SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget) = 0;
    virtual void				SkipTree() = 0;
protected:
    ~IXFA_WidgetAccIterator() { }
};
IXFA_WidgetAccIterator* XFA_WidgetAccIterator_Create(CXFA_WidgetAcc* pTravelRoot, XFA_WIDGETORDER eOrder = XFA_WIDGETORDER_PreOrder);
class IXFA_ChecksumContext
{
public:
    virtual void				Release() = 0;

    virtual FX_BOOL				StartChecksum() = 0;
    virtual FX_BOOL				UpdateChecksum(IFX_FileRead* pSrcFile, FX_FILESIZE offset = 0, size_t size = 0) = 0;
    virtual void				FinishChecksum() = 0;
    virtual void				GetChecksum(CFX_ByteString &bsChecksum) = 0;
protected:
    ~IXFA_ChecksumContext() { }
};
IXFA_ChecksumContext*	XFA_Checksum_Create();

#endif  // FXFA_H_