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