Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxfa / src / common / xfa_utils.h
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #ifndef _XFA_UTILS_H_\r
8 #define _XFA_UTILS_H_\r
9 FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier(IFDE_XMLElement* pNode, FX_WSTR wsQualifier, CFX_WideString& wsNamespaceURI);\r
10 template <class NodeType, class TraverseStrategy>\r
11 class CXFA_NodeIteratorTemplate : public CFX_Object\r
12 {\r
13 public:\r
14     CXFA_NodeIteratorTemplate(NodeType* pRootNode = NULL)\r
15         : m_pRoot(pRootNode)\r
16     {\r
17         if(pRootNode) {\r
18             m_NodeStack.Push(pRootNode);\r
19         }\r
20     }\r
21     FX_BOOL Init(NodeType* pRootNode)\r
22     {\r
23         if(!pRootNode) {\r
24             return FALSE;\r
25         }\r
26         m_pRoot = pRootNode;\r
27         m_NodeStack.RemoveAll();\r
28         m_NodeStack.Push(pRootNode);\r
29         return TRUE;\r
30     }\r
31     void Clear()\r
32     {\r
33         m_NodeStack.RemoveAll();\r
34     }\r
35     void Reset()\r
36     {\r
37         Clear();\r
38         if (m_pRoot) {\r
39             m_NodeStack.Push(m_pRoot);\r
40         }\r
41     }\r
42     FX_BOOL SetCurrent(NodeType* pCurNode)\r
43     {\r
44         m_NodeStack.RemoveAll();\r
45         if(pCurNode) {\r
46             CFX_StackTemplate<NodeType*> revStack;\r
47             NodeType* pNode;\r
48             for(pNode = pCurNode; pNode && pNode != m_pRoot; pNode = TraverseStrategy::GetParent(pNode)) {\r
49                 revStack.Push(pNode);\r
50             }\r
51             if(!pNode) {\r
52                 return FALSE;\r
53             }\r
54             revStack.Push(m_pRoot);\r
55             while(revStack.GetSize()) {\r
56                 m_NodeStack.Push(*revStack.GetTopElement());\r
57                 revStack.Pop();\r
58             }\r
59         }\r
60         return TRUE;\r
61     }\r
62     NodeType* GetCurrent()\r
63     {\r
64         return m_NodeStack.GetSize() ? *m_NodeStack.GetTopElement() : NULL;\r
65     }\r
66     NodeType* GetRoot()\r
67     {\r
68         return m_pRoot;\r
69     }\r
70     NodeType* MoveToPrev()\r
71     {\r
72         NodeType *pCurrent = GetCurrent();\r
73         FX_INT32 nStackLength = m_NodeStack.GetSize();\r
74         if(nStackLength == 1) {\r
75             return NULL;\r
76         } else if(nStackLength > 1) {\r
77             NodeType *pCurItem = *m_NodeStack.GetTopElement();\r
78             m_NodeStack.Pop();\r
79             NodeType *pParentItem = *m_NodeStack.GetTopElement();\r
80             NodeType *pParentFirstChildItem = TraverseStrategy::GetFirstChild(pParentItem);\r
81             if(pCurItem == pParentFirstChildItem) {\r
82                 return pParentItem;\r
83             }\r
84             NodeType *pPrevItem = pParentFirstChildItem, *pPrevItemNext = NULL;\r
85             for(; pPrevItem; pPrevItem = pPrevItemNext) {\r
86                 pPrevItemNext = TraverseStrategy::GetNextSibling(pPrevItem);\r
87                 if(!pPrevItemNext || pPrevItemNext == pCurItem) {\r
88                     break;\r
89                 }\r
90             }\r
91             m_NodeStack.Push(pPrevItem);\r
92         } else {\r
93             m_NodeStack.RemoveAll();\r
94             if(m_pRoot) {\r
95                 m_NodeStack.Push(m_pRoot);\r
96             }\r
97         }\r
98         if(m_NodeStack.GetSize() > 0) {\r
99             NodeType *pChildItem = *m_NodeStack.GetTopElement();\r
100             while((pChildItem = TraverseStrategy::GetFirstChild(pChildItem)) != NULL) {\r
101                 while(NodeType *pNextItem = TraverseStrategy::GetNextSibling(pChildItem)) {\r
102                     pChildItem = pNextItem;\r
103                 }\r
104                 m_NodeStack.Push(pChildItem);\r
105             }\r
106             return *m_NodeStack.GetTopElement();\r
107         }\r
108         return NULL;\r
109     }\r
110     NodeType* MoveToNext()\r
111     {\r
112         NodeType **ppNode = NULL;\r
113         NodeType *pCurrent = GetCurrent();\r
114         while (m_NodeStack.GetSize() > 0) {\r
115             while ((ppNode = m_NodeStack.GetTopElement()) != NULL) {\r
116                 if (pCurrent != *ppNode) {\r
117                     return *ppNode;\r
118                 }\r
119                 NodeType *pChild = TraverseStrategy::GetFirstChild(*ppNode);\r
120                 if (pChild == NULL) {\r
121                     break;\r
122                 }\r
123                 m_NodeStack.Push(pChild);\r
124             }\r
125             while ((ppNode = m_NodeStack.GetTopElement()) != NULL) {\r
126                 NodeType *pNext = TraverseStrategy::GetNextSibling(*ppNode);\r
127                 m_NodeStack.Pop();\r
128                 if (m_NodeStack.GetSize() == 0) {\r
129                     break;\r
130                 }\r
131                 if (pNext) {\r
132                     m_NodeStack.Push(pNext);\r
133                     break;\r
134                 }\r
135             }\r
136         }\r
137         return NULL;\r
138     }\r
139     NodeType* SkipChildrenAndMoveToNext()\r
140     {\r
141         NodeType **ppNode = NULL;\r
142         while ((ppNode = m_NodeStack.GetTopElement()) != NULL) {\r
143             NodeType *pNext = TraverseStrategy::GetNextSibling(*ppNode);\r
144             m_NodeStack.Pop();\r
145             if (m_NodeStack.GetSize() == 0) {\r
146                 break;\r
147             }\r
148             if (pNext) {\r
149                 m_NodeStack.Push(pNext);\r
150                 break;\r
151             }\r
152         }\r
153         return GetCurrent();\r
154     }\r
155 protected:\r
156     NodeType                                            *m_pRoot;\r
157     CFX_StackTemplate<NodeType*>        m_NodeStack;\r
158 };\r
159 template <class KeyType>\r
160 class CXFA_PtrSetTemplate : private CFX_MapPtrToPtr\r
161 {\r
162 public:\r
163 \r
164     CXFA_PtrSetTemplate() : CFX_MapPtrToPtr(10) {}\r
165 \r
166     int GetCount() const\r
167     {\r
168         return CFX_MapPtrToPtr::GetCount();\r
169     }\r
170 \r
171 \r
172     FX_BOOL IsEmpty() const\r
173     {\r
174         return CFX_MapPtrToPtr::IsEmpty();\r
175     }\r
176 \r
177     FX_BOOL     Lookup(KeyType key) const\r
178     {\r
179         FX_LPVOID pValue = NULL;\r
180         return CFX_MapPtrToPtr::Lookup((void*)key, pValue);\r
181     }\r
182 \r
183     FX_BOOL operator[](KeyType key)\r
184     {\r
185         return Lookup(key);\r
186     }\r
187 \r
188     void Add(KeyType key)\r
189     {\r
190         CFX_MapPtrToPtr::SetAt((void*)key, (void*)key);\r
191     }\r
192 \r
193     FX_BOOL     RemoveKey(KeyType key)\r
194     {\r
195         return CFX_MapPtrToPtr::RemoveKey((void*)key);\r
196     }\r
197 \r
198     void RemoveAll()\r
199     {\r
200         CFX_MapPtrToPtr::RemoveAll();\r
201     }\r
202 \r
203     FX_POSITION GetStartPosition() const\r
204     {\r
205         return CFX_MapPtrToPtr::GetStartPosition();\r
206     }\r
207 \r
208     void GetNextAssoc(FX_POSITION& rNextPosition, KeyType& rKey) const\r
209     {\r
210         void* pKey = NULL;\r
211         void* pValue = NULL;\r
212         CFX_MapPtrToPtr::GetNextAssoc(rNextPosition, pKey, pValue);\r
213         rKey = (KeyType)(FX_UINTPTR)pKey;\r
214     }\r
215 };\r
216 class CXFA_Node;\r
217 class CXFA_WidgetData;\r
218 #include "fxfa_localevalue.h"\r
219 CXFA_Node*                      XFA_CreateUIChild(CXFA_Node* pNode, XFA_ELEMENT& eWidgetType);\r
220 CXFA_LocaleValue        XFA_GetLocaleValue(CXFA_WidgetData* pWidgetData);\r
221 CFX_WideString          XFA_NumericLimit(const CFX_WideString &wsValue, FX_INT32 iLead, FX_INT32 iTread);\r
222 FX_DOUBLE XFA_WideStringToDouble(const CFX_WideString &wsStringVal);\r
223 FX_DOUBLE XFA_ByteStringToDouble(FX_BSTR szStringVal);\r
224 #ifndef XFA_PARSE_HAS_LINEIDENTIFIER\r
225 #define XFA_PARSE_HAS_LINEIDENTIFIER\r
226 #endif\r
227 FX_BOOL XFA_RecognizeRichText(IFDE_XMLElement* pRichTextXMLNode);\r
228 void    XFA_GetPlainTextFromRichText(IFDE_XMLNode *pXMLNode, CFX_WideString &wsPlainText);\r
229 FX_BOOL XFA_FieldIsMultiListBox(CXFA_Node* pFieldNode);\r
230 IFX_Stream* XFA_CreateWideTextRead(const CFX_WideString &wsBuffer);\r
231 FX_BOOL         XFA_IsLayoutElement(XFA_ELEMENT eElement, FX_BOOL bLayoutContainer = FALSE);\r
232 FX_BOOL         XFA_IsTakingupSpace(XFA_ATTRIBUTEENUM ePresence);\r
233 FX_BOOL         XFA_IsFlowingLayout(XFA_ATTRIBUTEENUM eLayout);\r
234 FX_BOOL         XFA_IsHorizontalFlow(XFA_ATTRIBUTEENUM eLayout);\r
235 void            XFA_DataExporter_DealWithDataGroupNode(CXFA_Node *pDataNode);\r
236 void            XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode, IFX_Stream* pStream, FX_LPCSTR pChecksum = NULL, FX_BOOL bSaveXML = FALSE);\r
237 #endif\r