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

#include <vector>

#include "xfa/include/fxfa/fxfa_basic.h"
#include "xfa/include/fxfa/fxfa_widget.h"

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

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

 protected:
  IXFA_Doc() {}
};

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

 protected:
  IXFA_Widget() {}
};

#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,
                                  std::vector<CFX_ByteString>& 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 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,
                                  std::vector<CFX_ByteString>& 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  // XFA_INCLUDE_FXFA_FXFA_H_
