summaryrefslogtreecommitdiff
path: root/xfa/src/fxfa/src/common/xfa_document.h
blob: fe19ea06a653a67713c9e48f6c566ab7291f74c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
// 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_DOCUMENT_H
#define _XFA_DOCUMENT_H
class IXFA_DocParser;
class CXFA_LayoutProcessor;
class IXFA_DocLayout;
class IXFA_LayoutPage;
class CXFA_LayoutItem;
class IXFA_PageContent;
class IXFA_ScriptContext;
class CXFA_Node;
class IXFA_Notify;
class IXFA_ObjFactory;
class CXFA_Document;
enum XFA_VERSION {
  XFA_VERSION_UNKNOWN = 0,
  XFA_VERSION_200 = 200,
  XFA_VERSION_202 = 202,
  XFA_VERSION_204 = 204,
  XFA_VERSION_205 = 205,
  XFA_VERSION_206 = 206,
  XFA_VERSION_207 = 207,
  XFA_VERSION_208 = 208,
  XFA_VERSION_300 = 300,
  XFA_VERSION_301 = 301,
  XFA_VERSION_303 = 303,
  XFA_VERSION_306 = 306,
  XFA_VERSION_DEFAULT = XFA_VERSION_303,
  XFA_VERSION_MIN = 200,
  XFA_VERSION_MAX = 400,
};
#define XFA_LAYOUTSTATUS_Visible 0x0001
#define XFA_LAYOUTSTATUS_Viewable 0x0010
#define XFA_LAYOUTSTATUS_Printable 0x0020
enum XFA_NODEEVENT {
  XFA_NODEEVENT_Ready,
  XFA_NODEEVENT_ValueChanging,
  XFA_NODEEVENT_ValueChanged,
  XFA_NODEEVENT_ChildAdded,
  XFA_NODEEVENT_ChildRemoved,
};
enum XFA_PAGEEVENT {
  XFA_PAGEEVENT_PageAdded,
  XFA_PAGEEVENT_PageRemoved,
};
enum XFA_LAYOUTEVENT {
  XFA_LAYOUTEVENT_ItemAdded,
  XFA_LAYOUTEVENT_ItemRemoving,
  XFA_LAYOUTEVENT_RectChanged,
  XFA_LAYOUTEVENT_StatusChanged,
};
enum XFA_LAYOUTRESULT {
  XFA_LAYOUTRESULT_Continue,
  XFA_LAYOUTRESULT_Done,
  XFA_LAYOUTRESULT_NextContent,
};
#define XFA_LAYOUTNOTIFY_StrictHeight 0x0001
#define XFA_LAYOUTNOTIFY_NoParentBreak 0x0002
class IXFA_Notify {
 public:
  virtual ~IXFA_Notify() {}
  virtual void OnPageEvent(IXFA_LayoutPage* pSender,
                           XFA_PAGEEVENT eEvent,
                           void* pParam = NULL) = 0;

  virtual void OnNodeEvent(CXFA_Node* pSender,
                           XFA_NODEEVENT eEvent,
                           void* pParam = NULL,
                           void* pParam2 = NULL,
                           void* pParam3 = NULL,
                           void* pParam4 = NULL) = 0;
  virtual void OnWidgetDataEvent(CXFA_WidgetData* pSender,
                                 FX_DWORD dwEvent,
                                 void* pParam = NULL,
                                 void* pAdditional = NULL,
                                 void* pAdditional2 = NULL) = 0;

  virtual CXFA_LayoutItem* OnCreateLayoutItem(CXFA_Node* pNode) = 0;
  virtual void OnLayoutEvent(IXFA_DocLayout* pLayout,
                             CXFA_LayoutItem* pSender,
                             XFA_LAYOUTEVENT eEvent,
                             void* pParam = NULL,
                             void* pParam2 = NULL) = 0;
  virtual void StartFieldDrawLayout(CXFA_Node* pItem,
                                    FX_FLOAT& fCalcWidth,
                                    FX_FLOAT& fCalcHeight) = 0;
  virtual FX_BOOL FindSplitPos(CXFA_Node* pItem,
                               int32_t iBlockIndex,
                               FX_FLOAT& fCalcHeightPos) = 0;
  virtual FX_BOOL RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem) = 0;
  virtual int32_t ExecEventByDeepFirst(CXFA_Node* pFormNode,
                                       XFA_EVENTTYPE eEventType,
                                       FX_BOOL bIsFormReady = FALSE,
                                       FX_BOOL bRecursive = TRUE,
                                       CXFA_WidgetAcc* pExclude = NULL) = 0;
  virtual void AddCalcValidate(CXFA_Node* pNode) = 0;
  virtual IXFA_Doc* GetHDOC() = 0;
  virtual IXFA_DocProvider* GetDocProvider() = 0;
  virtual IXFA_AppProvider* GetAppProvider() = 0;
  virtual IXFA_WidgetHandler* GetWidgetHandler() = 0;
  virtual IXFA_Widget* GetHWidget(CXFA_LayoutItem* pLayoutItem) = 0;
  virtual void OpenDropDownList(IXFA_Widget* hWidget) = 0;
  virtual CFX_WideString GetCurrentDateTime() = 0;
  virtual void ResetData(CXFA_WidgetData* pWidgetData = NULL) = 0;
  virtual int32_t GetLayoutStatus() = 0;
  virtual void RunNodeInitialize(CXFA_Node* pNode) = 0;
  virtual void RunSubformIndexChange(CXFA_Node* pSubformNode) = 0;
  virtual CXFA_Node* GetFocusWidgetNode() = 0;
  virtual void SetFocusWidgetNode(CXFA_Node* pNode) = 0;
};
class IXFA_ObjFactory {
 public:
  virtual ~IXFA_ObjFactory() {}
  virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement) = 0;
  virtual CXFA_Node* CreateNode(XFA_LPCPACKETINFO pPacket,
                                XFA_ELEMENT eElement) = 0;
};
#define XFA_DOCFLAG_StrictScoping 0x0001
#define XFA_DOCFLAG_HasInteractive 0x0002
#define XFA_DOCFLAG_Interactive 0x0004
#define XFA_DOCFLAG_Scripting 0x0008
class CScript_DataWindow;
class CScript_EventPseudoModel;
class CScript_HostPseudoModel;
class CScript_LogPseudoModel;
class CScript_LayoutPseudoModel;
class CScript_SignaturePseudoModel;
class CXFA_Document : public IXFA_ObjFactory {
 public:
  CXFA_Document(IXFA_DocParser* pParser);
  ~CXFA_Document();
  CXFA_Node* GetRoot() const { return m_pRootNode; }
  IXFA_DocParser* GetParser() const { return m_pParser; }
  IXFA_Notify* GetNotify() const;
  void SetRoot(CXFA_Node* pNewRoot);
  CXFA_Object* GetXFANode(const CFX_WideStringC& wsNodeName);
  CXFA_Object* GetXFANode(FX_DWORD wsNodeNameHash);
  void AddPurgeNode(CXFA_Node* pNode);
  FX_BOOL RemovePurgeNode(CXFA_Node* pNode);
  void PurgeNodes();
  FX_BOOL HasFlag(FX_DWORD dwFlag) { return (m_dwDocFlags & dwFlag) == dwFlag; }
  void SetFlag(FX_DWORD dwFlag, FX_BOOL bOn = TRUE);
  FX_BOOL IsInteractive();
  XFA_VERSION GetCurVersionMode() { return m_eCurVersionMode; }
  XFA_VERSION RecognizeXFAVersionNumber(CFX_WideString& wsTemplateNS);
  CXFA_LocaleMgr* GetLocalMgr();
  virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement);
  virtual CXFA_Node* CreateNode(XFA_LPCPACKETINFO pPacket,
                                XFA_ELEMENT eElement);
  void DoProtoMerge();
  CXFA_Node* GetNodeByID(CXFA_Node* pRoot, const CFX_WideStringC& wsID);

  void DoDataMerge();
  void DoDataRemerge(FX_BOOL bDoDataMerge);
  CXFA_Node* DataMerge_CopyContainer(CXFA_Node* pTemplateNode,
                                     CXFA_Node* pFormNode,
                                     CXFA_Node* pDataScope,
                                     FX_BOOL bOneInstance = FALSE,
                                     FX_BOOL bDataMerge = TRUE,
                                     FX_BOOL bUpLevel = TRUE);
  void DataMerge_UpdateBindingRelations(CXFA_Node* pFormUpdateRoot);
  CXFA_Node* GetNotBindNode(CXFA_ObjArray& arrayNodes);
  CXFA_LayoutProcessor* GetLayoutProcessor();
  IXFA_DocLayout* GetDocLayout();
  IXFA_ScriptContext* InitScriptContext(FXJSE_HRUNTIME hRuntime);
  IXFA_ScriptContext* GetScriptContext();
  void ClearLayoutData();

 public:
  CFX_MapPtrTemplate<FX_DWORD, CXFA_Node*> m_rgGlobalBinding;
  CXFA_NodeArray m_pPendingPageSet;

 protected:
  IXFA_DocParser* m_pParser;
  IXFA_ScriptContext* m_pScriptContext;
  CXFA_LayoutProcessor* m_pLayoutProcessor;
  CXFA_Node* m_pRootNode;

  CXFA_LocaleMgr* m_pLocalMgr;
  CScript_DataWindow* m_pScriptDataWindow;
  CScript_EventPseudoModel* m_pScriptEvent;
  CScript_HostPseudoModel* m_pScriptHost;
  CScript_LogPseudoModel* m_pScriptLog;
  CScript_LayoutPseudoModel* m_pScriptLayout;
  CScript_SignaturePseudoModel* m_pScriptSignature;
  CXFA_NodeSet m_rgPurgeNodes;
  XFA_VERSION m_eCurVersionMode;
  FX_DWORD m_dwDocFlags;
  friend class CXFA_SimpleParser;
};
#endif