Home | History | Annotate | Download | only in common
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef _XFA_DOCUMENT_H
      8 #define _XFA_DOCUMENT_H
      9 
     10 class CXFA_Document;
     11 class CXFA_LayoutItem;
     12 class CXFA_LayoutProcessor;
     13 class CXFA_Node;
     14 class IXFA_DocLayout;
     15 class IXFA_DocParser;
     16 class IXFA_LayoutPage;
     17 class IXFA_Notify;
     18 class IXFA_ObjFactory;
     19 class IXFA_PageContent;
     20 class IXFA_ScriptContext;
     21 
     22 enum XFA_VERSION {
     23   XFA_VERSION_UNKNOWN = 0,
     24   XFA_VERSION_200 = 200,
     25   XFA_VERSION_202 = 202,
     26   XFA_VERSION_204 = 204,
     27   XFA_VERSION_205 = 205,
     28   XFA_VERSION_206 = 206,
     29   XFA_VERSION_207 = 207,
     30   XFA_VERSION_208 = 208,
     31   XFA_VERSION_300 = 300,
     32   XFA_VERSION_301 = 301,
     33   XFA_VERSION_303 = 303,
     34   XFA_VERSION_306 = 306,
     35   XFA_VERSION_DEFAULT = XFA_VERSION_303,
     36   XFA_VERSION_MIN = 200,
     37   XFA_VERSION_MAX = 400,
     38 };
     39 
     40 #define XFA_LAYOUTSTATUS_Visible 0x0001
     41 #define XFA_LAYOUTSTATUS_Viewable 0x0010
     42 #define XFA_LAYOUTSTATUS_Printable 0x0020
     43 enum XFA_NODEEVENT {
     44   XFA_NODEEVENT_Ready,
     45   XFA_NODEEVENT_ValueChanging,
     46   XFA_NODEEVENT_ValueChanged,
     47   XFA_NODEEVENT_ChildAdded,
     48   XFA_NODEEVENT_ChildRemoved,
     49 };
     50 enum XFA_PAGEEVENT {
     51   XFA_PAGEEVENT_PageAdded,
     52   XFA_PAGEEVENT_PageRemoved,
     53 };
     54 enum XFA_LAYOUTEVENT {
     55   XFA_LAYOUTEVENT_ItemAdded,
     56   XFA_LAYOUTEVENT_ItemRemoving,
     57   XFA_LAYOUTEVENT_RectChanged,
     58   XFA_LAYOUTEVENT_StatusChanged,
     59 };
     60 enum XFA_LAYOUTRESULT {
     61   XFA_LAYOUTRESULT_Continue,
     62   XFA_LAYOUTRESULT_Done,
     63   XFA_LAYOUTRESULT_NextContent,
     64 };
     65 #define XFA_LAYOUTNOTIFY_StrictHeight 0x0001
     66 #define XFA_LAYOUTNOTIFY_NoParentBreak 0x0002
     67 class IXFA_Notify {
     68  public:
     69   virtual ~IXFA_Notify() {}
     70   virtual void OnPageEvent(IXFA_LayoutPage* pSender,
     71                            XFA_PAGEEVENT eEvent,
     72                            void* pParam = NULL) = 0;
     73 
     74   virtual void OnNodeEvent(CXFA_Node* pSender,
     75                            XFA_NODEEVENT eEvent,
     76                            void* pParam = NULL,
     77                            void* pParam2 = NULL,
     78                            void* pParam3 = NULL,
     79                            void* pParam4 = NULL) = 0;
     80   virtual void OnWidgetDataEvent(CXFA_WidgetData* pSender,
     81                                  FX_DWORD dwEvent,
     82                                  void* pParam = NULL,
     83                                  void* pAdditional = NULL,
     84                                  void* pAdditional2 = NULL) = 0;
     85 
     86   virtual CXFA_LayoutItem* OnCreateLayoutItem(CXFA_Node* pNode) = 0;
     87   virtual void OnLayoutEvent(IXFA_DocLayout* pLayout,
     88                              CXFA_LayoutItem* pSender,
     89                              XFA_LAYOUTEVENT eEvent,
     90                              void* pParam = NULL,
     91                              void* pParam2 = NULL) = 0;
     92   virtual void StartFieldDrawLayout(CXFA_Node* pItem,
     93                                     FX_FLOAT& fCalcWidth,
     94                                     FX_FLOAT& fCalcHeight) = 0;
     95   virtual FX_BOOL FindSplitPos(CXFA_Node* pItem,
     96                                int32_t iBlockIndex,
     97                                FX_FLOAT& fCalcHeightPos) = 0;
     98   virtual FX_BOOL RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem) = 0;
     99   virtual int32_t ExecEventByDeepFirst(CXFA_Node* pFormNode,
    100                                        XFA_EVENTTYPE eEventType,
    101                                        FX_BOOL bIsFormReady = FALSE,
    102                                        FX_BOOL bRecursive = TRUE,
    103                                        CXFA_WidgetAcc* pExclude = NULL) = 0;
    104   virtual void AddCalcValidate(CXFA_Node* pNode) = 0;
    105   virtual IXFA_Doc* GetHDOC() = 0;
    106   virtual IXFA_DocProvider* GetDocProvider() = 0;
    107   virtual IXFA_AppProvider* GetAppProvider() = 0;
    108   virtual IXFA_WidgetHandler* GetWidgetHandler() = 0;
    109   virtual IXFA_Widget* GetHWidget(CXFA_LayoutItem* pLayoutItem) = 0;
    110   virtual void OpenDropDownList(IXFA_Widget* hWidget) = 0;
    111   virtual CFX_WideString GetCurrentDateTime() = 0;
    112   virtual void ResetData(CXFA_WidgetData* pWidgetData = NULL) = 0;
    113   virtual int32_t GetLayoutStatus() = 0;
    114   virtual void RunNodeInitialize(CXFA_Node* pNode) = 0;
    115   virtual void RunSubformIndexChange(CXFA_Node* pSubformNode) = 0;
    116   virtual CXFA_Node* GetFocusWidgetNode() = 0;
    117   virtual void SetFocusWidgetNode(CXFA_Node* pNode) = 0;
    118 };
    119 class IXFA_ObjFactory {
    120  public:
    121   virtual ~IXFA_ObjFactory() {}
    122   virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement) = 0;
    123   virtual CXFA_Node* CreateNode(XFA_LPCPACKETINFO pPacket,
    124                                 XFA_ELEMENT eElement) = 0;
    125 };
    126 #define XFA_DOCFLAG_StrictScoping 0x0001
    127 #define XFA_DOCFLAG_HasInteractive 0x0002
    128 #define XFA_DOCFLAG_Interactive 0x0004
    129 #define XFA_DOCFLAG_Scripting 0x0008
    130 class CScript_DataWindow;
    131 class CScript_EventPseudoModel;
    132 class CScript_HostPseudoModel;
    133 class CScript_LogPseudoModel;
    134 class CScript_LayoutPseudoModel;
    135 class CScript_SignaturePseudoModel;
    136 class CXFA_Document : public IXFA_ObjFactory {
    137  public:
    138   CXFA_Document(IXFA_DocParser* pParser);
    139   ~CXFA_Document();
    140   CXFA_Node* GetRoot() const { return m_pRootNode; }
    141   IXFA_DocParser* GetParser() const { return m_pParser; }
    142   IXFA_Notify* GetNotify() const;
    143   void SetRoot(CXFA_Node* pNewRoot);
    144   CXFA_Object* GetXFANode(const CFX_WideStringC& wsNodeName);
    145   CXFA_Object* GetXFANode(FX_DWORD wsNodeNameHash);
    146   void AddPurgeNode(CXFA_Node* pNode);
    147   FX_BOOL RemovePurgeNode(CXFA_Node* pNode);
    148   void PurgeNodes();
    149   FX_BOOL HasFlag(FX_DWORD dwFlag) { return (m_dwDocFlags & dwFlag) == dwFlag; }
    150   void SetFlag(FX_DWORD dwFlag, FX_BOOL bOn = TRUE);
    151   FX_BOOL IsInteractive();
    152   XFA_VERSION GetCurVersionMode() { return m_eCurVersionMode; }
    153   XFA_VERSION RecognizeXFAVersionNumber(CFX_WideString& wsTemplateNS);
    154   CXFA_LocaleMgr* GetLocalMgr();
    155   virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement);
    156   virtual CXFA_Node* CreateNode(XFA_LPCPACKETINFO pPacket,
    157                                 XFA_ELEMENT eElement);
    158   void DoProtoMerge();
    159   CXFA_Node* GetNodeByID(CXFA_Node* pRoot, const CFX_WideStringC& wsID);
    160   void DoDataMerge();
    161   void DoDataRemerge(FX_BOOL bDoDataMerge);
    162   CXFA_Node* DataMerge_CopyContainer(CXFA_Node* pTemplateNode,
    163                                      CXFA_Node* pFormNode,
    164                                      CXFA_Node* pDataScope,
    165                                      FX_BOOL bOneInstance = FALSE,
    166                                      FX_BOOL bDataMerge = TRUE,
    167                                      FX_BOOL bUpLevel = TRUE);
    168   void DataMerge_UpdateBindingRelations(CXFA_Node* pFormUpdateRoot);
    169   CXFA_Node* GetNotBindNode(CXFA_ObjArray& arrayNodes);
    170   CXFA_LayoutProcessor* GetLayoutProcessor();
    171   IXFA_DocLayout* GetDocLayout();
    172   IXFA_ScriptContext* InitScriptContext(FXJSE_HRUNTIME hRuntime);
    173   IXFA_ScriptContext* GetScriptContext();
    174   void ClearLayoutData();
    175 
    176   CFX_MapPtrTemplate<FX_DWORD, CXFA_Node*> m_rgGlobalBinding;
    177   CXFA_NodeArray m_pPendingPageSet;
    178 
    179  protected:
    180   IXFA_DocParser* m_pParser;
    181   IXFA_ScriptContext* m_pScriptContext;
    182   CXFA_LayoutProcessor* m_pLayoutProcessor;
    183   CXFA_Node* m_pRootNode;
    184   CXFA_LocaleMgr* m_pLocalMgr;
    185   CScript_DataWindow* m_pScriptDataWindow;
    186   CScript_EventPseudoModel* m_pScriptEvent;
    187   CScript_HostPseudoModel* m_pScriptHost;
    188   CScript_LogPseudoModel* m_pScriptLog;
    189   CScript_LayoutPseudoModel* m_pScriptLayout;
    190   CScript_SignaturePseudoModel* m_pScriptSignature;
    191   CXFA_NodeSet m_rgPurgeNodes;
    192   XFA_VERSION m_eCurVersionMode;
    193   FX_DWORD m_dwDocFlags;
    194   friend class CXFA_SimpleParser;
    195 };
    196 #endif
    197