OLD | NEW |
| (Empty) |
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 #include "xfa/src/fxfa/parser/xfa_object.h" | |
8 | |
9 #include "core/include/fxcrt/fx_ext.h" | |
10 #include "xfa/src/fgas/crt/fgas_codepage.h" | |
11 #include "xfa/src/fgas/crt/fgas_system.h" | |
12 #include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h" | |
13 #include "xfa/src/fxfa/parser/xfa_basic_imp.h" | |
14 #include "xfa/src/fxfa/parser/xfa_docdata.h" | |
15 #include "xfa/src/fxfa/parser/xfa_doclayout.h" | |
16 #include "xfa/src/fxfa/parser/xfa_document.h" | |
17 #include "xfa/src/fxfa/parser/xfa_document_layout_imp.h" | |
18 #include "xfa/src/fxfa/parser/xfa_localemgr.h" | |
19 #include "xfa/src/fxfa/parser/xfa_parser.h" | |
20 #include "xfa/src/fxfa/parser/xfa_script.h" | |
21 #include "xfa/src/fxfa/parser/xfa_utils.h" | |
22 | |
23 CXFA_Object::CXFA_Object(CXFA_Document* pDocument, FX_DWORD uFlags) | |
24 : m_pDocument(pDocument), m_uFlags(uFlags) {} | |
25 void CXFA_Object::GetClassName(CFX_WideStringC& wsName) const { | |
26 wsName = XFA_GetElementByID(GetClassID())->pName; | |
27 } | |
28 uint32_t CXFA_Object::GetClassHashCode() const { | |
29 return XFA_GetElementByID(GetClassID())->uHash; | |
30 } | |
31 XFA_ELEMENT CXFA_Object::GetClassID() const { | |
32 if (IsNode()) { | |
33 return AsNode()->GetClassID(); | |
34 } | |
35 if (IsOrdinaryObject()) { | |
36 return AsOrdinaryObject()->GetClassID(); | |
37 } | |
38 if (IsNodeList()) { | |
39 return AsNodeList()->GetClassID(); | |
40 } | |
41 if (IsOrdinaryList()) { | |
42 return XFA_ELEMENT_List; | |
43 } | |
44 ASSERT(FALSE); | |
45 return (XFA_ELEMENT)0; | |
46 } | |
47 void CXFA_Object::Script_ObjectClass_ClassName(FXJSE_HVALUE hValue, | |
48 FX_BOOL bSetting, | |
49 XFA_ATTRIBUTE eAttribute) { | |
50 if (!bSetting) { | |
51 CFX_WideStringC className; | |
52 GetClassName(className); | |
53 FXJSE_Value_SetUTF8String( | |
54 hValue, FX_UTF8Encode(className.GetPtr(), className.GetLength())); | |
55 } else { | |
56 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
57 } | |
58 } | |
59 void CXFA_Object::ThrowScriptErrorMessage(int32_t iStringID, ...) { | |
60 IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider(); | |
61 FXSYS_assert(pAppProvider); | |
62 CFX_WideString wsFormat; | |
63 pAppProvider->LoadString(iStringID, wsFormat); | |
64 CFX_WideString wsMessage; | |
65 va_list arg_ptr; | |
66 va_start(arg_ptr, iStringID); | |
67 wsMessage.FormatV((const FX_WCHAR*)wsFormat, arg_ptr); | |
68 va_end(arg_ptr); | |
69 FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength())); | |
70 } | |
71 | |
72 static void XFA_DeleteWideString(void* pData) { | |
73 delete static_cast<CFX_WideString*>(pData); | |
74 } | |
75 | |
76 static void XFA_CopyWideString(void*& pData) { | |
77 if (pData) { | |
78 CFX_WideString* pNewData = new CFX_WideString(*(CFX_WideString*)pData); | |
79 pData = pNewData; | |
80 } | |
81 } | |
82 static XFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = { | |
83 XFA_DeleteWideString, XFA_CopyWideString}; | |
84 static XFA_OBJECTTYPE XFA_GetElementObjectType(XFA_ELEMENT eElement) { | |
85 return (XFA_OBJECTTYPE)XFA_GetElementByID(eElement)->eObjectType; | |
86 } | |
87 CXFA_Node::CXFA_Node(CXFA_Document* pDoc, FX_WORD ePacket, XFA_ELEMENT eElement) | |
88 : CXFA_Object(pDoc, XFA_GetElementObjectType(eElement)), | |
89 m_pNext(nullptr), | |
90 m_pChild(nullptr), | |
91 m_pLastChild(nullptr), | |
92 m_pParent(nullptr), | |
93 m_pXMLNode(nullptr), | |
94 m_eNodeClass(eElement), | |
95 m_ePacket(ePacket), | |
96 m_dwNameHash(0), | |
97 m_pAuxNode(nullptr), | |
98 m_pMapModuleData(nullptr) { | |
99 ASSERT(m_pDocument); | |
100 } | |
101 CXFA_Node::~CXFA_Node() { | |
102 FXSYS_assert(m_pParent == NULL); | |
103 RemoveMapModuleKey(); | |
104 CXFA_Node *pNext, *pNode = m_pChild; | |
105 while (pNode) { | |
106 pNext = pNode->m_pNext; | |
107 pNode->m_pParent = NULL; | |
108 delete pNode; | |
109 pNode = pNext; | |
110 } | |
111 if (m_pXMLNode && HasFlag(XFA_NODEFLAG_OwnXMLNode)) { | |
112 m_pXMLNode->Release(); | |
113 } | |
114 } | |
115 CXFA_Node* CXFA_Node::Clone(FX_BOOL bRecursive) { | |
116 IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory(); | |
117 CXFA_Node* pClone = pFactory->CreateNode(m_ePacket, m_eNodeClass); | |
118 if (!pClone) { | |
119 return NULL; | |
120 } | |
121 MergeAllData(pClone); | |
122 pClone->UpdateNameHash(); | |
123 if (IsNeedSavingXMLNode()) { | |
124 IFDE_XMLNode* pCloneXML = NULL; | |
125 if (IsAttributeInXML()) { | |
126 CFX_WideString wsName; | |
127 GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE); | |
128 IFDE_XMLElement* pCloneXMLElement = IFDE_XMLElement::Create(wsName); | |
129 CFX_WideStringC wsValue = GetCData(XFA_ATTRIBUTE_Value); | |
130 if (!wsValue.IsEmpty()) { | |
131 pCloneXMLElement->SetTextData(wsValue); | |
132 } | |
133 pCloneXML = pCloneXMLElement; | |
134 pCloneXMLElement = NULL; | |
135 pClone->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown); | |
136 } else { | |
137 pCloneXML = m_pXMLNode->Clone(FALSE); | |
138 } | |
139 pClone->SetXMLMappingNode(pCloneXML); | |
140 pClone->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); | |
141 } | |
142 if (bRecursive) { | |
143 for (CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild; | |
144 pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
145 pClone->InsertChild(pChild->Clone(bRecursive)); | |
146 } | |
147 } | |
148 pClone->SetFlag(XFA_NODEFLAG_Initialized); | |
149 pClone->SetObject(XFA_ATTRIBUTE_BindingNode, NULL); | |
150 return pClone; | |
151 } | |
152 CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem) const { | |
153 switch (eItem) { | |
154 case XFA_NODEITEM_NextSibling: | |
155 return m_pNext; | |
156 case XFA_NODEITEM_FirstChild: | |
157 return m_pChild; | |
158 case XFA_NODEITEM_Parent: | |
159 return m_pParent; | |
160 case XFA_NODEITEM_PrevSibling: | |
161 if (m_pParent) { | |
162 CXFA_Node* pSibling = m_pParent->m_pChild; | |
163 CXFA_Node* pPrev = NULL; | |
164 while (pSibling && pSibling != this) { | |
165 pPrev = pSibling; | |
166 pSibling = pSibling->m_pNext; | |
167 } | |
168 return pPrev; | |
169 } | |
170 return NULL; | |
171 default: | |
172 break; | |
173 } | |
174 return NULL; | |
175 } | |
176 CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem, | |
177 XFA_OBJECTTYPE eType) const { | |
178 CXFA_Node* pNode = NULL; | |
179 switch (eItem) { | |
180 case XFA_NODEITEM_NextSibling: | |
181 pNode = m_pNext; | |
182 if (eType != XFA_OBJECTTYPEMASK) { | |
183 while (pNode && pNode->GetObjectType() != eType) { | |
184 pNode = pNode->m_pNext; | |
185 } | |
186 } | |
187 break; | |
188 case XFA_NODEITEM_FirstChild: | |
189 pNode = m_pChild; | |
190 if (eType != XFA_OBJECTTYPEMASK) { | |
191 while (pNode && pNode->GetObjectType() != eType) { | |
192 pNode = pNode->m_pNext; | |
193 } | |
194 } | |
195 break; | |
196 case XFA_NODEITEM_Parent: | |
197 pNode = m_pParent; | |
198 if (eType != XFA_OBJECTTYPEMASK) { | |
199 while (pNode && pNode->GetObjectType() != eType) { | |
200 pNode = pNode->m_pParent; | |
201 } | |
202 } | |
203 break; | |
204 case XFA_NODEITEM_PrevSibling: | |
205 if (m_pParent) { | |
206 CXFA_Node* pSibling = m_pParent->m_pChild; | |
207 while (pSibling && pSibling != this) { | |
208 if (eType == XFA_OBJECTTYPEMASK || | |
209 eType == pSibling->GetObjectType()) { | |
210 pNode = pSibling; | |
211 } | |
212 pSibling = pSibling->m_pNext; | |
213 } | |
214 } | |
215 break; | |
216 default: | |
217 break; | |
218 } | |
219 return pNode; | |
220 } | |
221 int32_t CXFA_Node::GetNodeList(CXFA_NodeArray& nodes, | |
222 FX_DWORD dwTypeFilter, | |
223 XFA_ELEMENT eElementFilter, | |
224 int32_t iLevel) { | |
225 if (--iLevel < 0) { | |
226 return nodes.GetSize(); | |
227 } | |
228 if (eElementFilter != XFA_ELEMENT_UNKNOWN) { | |
229 CXFA_Node* pChild = m_pChild; | |
230 while (pChild) { | |
231 if (pChild->GetClassID() == eElementFilter) { | |
232 nodes.Add(pChild); | |
233 if (iLevel > 0) { | |
234 GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel); | |
235 } | |
236 } | |
237 pChild = pChild->m_pNext; | |
238 } | |
239 } else if (dwTypeFilter == | |
240 (XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties)) { | |
241 CXFA_Node* pChild = m_pChild; | |
242 while (pChild) { | |
243 nodes.Add(pChild); | |
244 if (iLevel > 0) { | |
245 GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel); | |
246 } | |
247 pChild = pChild->m_pNext; | |
248 } | |
249 } else if (dwTypeFilter != 0) { | |
250 FX_BOOL bFilterChildren = (dwTypeFilter & XFA_NODEFILTER_Children) != 0; | |
251 FX_BOOL bFilterProperties = (dwTypeFilter & XFA_NODEFILTER_Properties) != 0; | |
252 FX_BOOL bFilterOneOfProperties = | |
253 (dwTypeFilter & XFA_NODEFILTER_OneOfProperty) != 0; | |
254 CXFA_Node* pChild = m_pChild; | |
255 while (pChild) { | |
256 const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement( | |
257 GetClassID(), pChild->GetClassID(), XFA_XDPPACKET_UNKNOWN); | |
258 if (pProperty) { | |
259 if (bFilterProperties) { | |
260 nodes.Add(pChild); | |
261 } else if (bFilterOneOfProperties && | |
262 (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) { | |
263 nodes.Add(pChild); | |
264 } else if (bFilterChildren && | |
265 (pChild->GetClassID() == XFA_ELEMENT_Variables || | |
266 pChild->GetClassID() == XFA_ELEMENT_PageSet)) { | |
267 nodes.Add(pChild); | |
268 } | |
269 } else { | |
270 if (bFilterChildren) { | |
271 nodes.Add(pChild); | |
272 } | |
273 } | |
274 pChild = pChild->m_pNext; | |
275 } | |
276 if (bFilterOneOfProperties && nodes.GetSize() < 1) { | |
277 int32_t iProperties = 0; | |
278 const XFA_PROPERTY* pProperty = | |
279 XFA_GetElementProperties(GetClassID(), iProperties); | |
280 if (pProperty == NULL || iProperties < 1) { | |
281 return 0; | |
282 } | |
283 for (int32_t i = 0; i < iProperties; i++) { | |
284 if (pProperty[i].uFlags & XFA_PROPERTYFLAG_DefaultOneOf) { | |
285 IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory(); | |
286 const XFA_PACKETINFO* pPacket = XFA_GetPacketByID(GetPacketID()); | |
287 CXFA_Node* pNewNode = | |
288 pFactory->CreateNode(pPacket, (XFA_ELEMENT)pProperty[i].eName); | |
289 if (!pNewNode) { | |
290 break; | |
291 } | |
292 InsertChild(pNewNode, NULL); | |
293 pNewNode->SetFlag(XFA_NODEFLAG_Initialized); | |
294 nodes.Add(pNewNode); | |
295 break; | |
296 } | |
297 } | |
298 } | |
299 } | |
300 return nodes.GetSize(); | |
301 } | |
302 CXFA_Node* CXFA_Node::CreateSamePacketNode(XFA_ELEMENT eElement, | |
303 FX_DWORD dwFlags) { | |
304 IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory(); | |
305 CXFA_Node* pNode = pFactory->CreateNode(m_ePacket, eElement); | |
306 pNode->SetFlag(dwFlags); | |
307 return pNode; | |
308 } | |
309 CXFA_Node* CXFA_Node::CloneTemplateToForm(FX_BOOL bRecursive) { | |
310 FXSYS_assert(m_ePacket == XFA_XDPPACKET_Template); | |
311 IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory(); | |
312 CXFA_Node* pClone = pFactory->CreateNode(XFA_XDPPACKET_Form, m_eNodeClass); | |
313 if (!pClone) { | |
314 return NULL; | |
315 } | |
316 pClone->SetTemplateNode(this); | |
317 pClone->UpdateNameHash(); | |
318 pClone->SetXMLMappingNode(GetXMLMappingNode()); | |
319 if (bRecursive) { | |
320 for (CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild; | |
321 pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
322 pClone->InsertChild(pChild->CloneTemplateToForm(bRecursive)); | |
323 } | |
324 } | |
325 pClone->SetFlag(XFA_NODEFLAG_Initialized); | |
326 return pClone; | |
327 } | |
328 | |
329 CXFA_Node* CXFA_Node::GetTemplateNode() const { | |
330 return m_pAuxNode; | |
331 } | |
332 | |
333 void CXFA_Node::SetTemplateNode(CXFA_Node* pTemplateNode) { | |
334 m_pAuxNode = pTemplateNode; | |
335 } | |
336 CXFA_Node* CXFA_Node::GetBindData() { | |
337 ASSERT(GetPacketID() == XFA_XDPPACKET_Form); | |
338 return static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode)); | |
339 } | |
340 int32_t CXFA_Node::GetBindItems(CXFA_NodeArray& formItems) { | |
341 if (m_uFlags & XFA_NODEFLAG_BindFormItems) { | |
342 CXFA_NodeArray* pItems = NULL; | |
343 TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems); | |
344 formItems.Copy(*pItems); | |
345 return formItems.GetSize(); | |
346 } | |
347 CXFA_Node* pFormNode = | |
348 static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode)); | |
349 if (pFormNode) { | |
350 formItems.Add(pFormNode); | |
351 } | |
352 return formItems.GetSize(); | |
353 } | |
354 | |
355 static void XFA_DataNodeDeleteBindItem(void* pData) { | |
356 delete static_cast<CXFA_NodeArray*>(pData); | |
357 } | |
358 | |
359 static XFA_MAPDATABLOCKCALLBACKINFO deleteBindItemCallBack = { | |
360 XFA_DataNodeDeleteBindItem, NULL}; | |
361 int32_t CXFA_Node::AddBindItem(CXFA_Node* pFormNode) { | |
362 ASSERT(pFormNode); | |
363 if (m_uFlags & XFA_NODEFLAG_BindFormItems) { | |
364 CXFA_NodeArray* pItems = NULL; | |
365 TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems); | |
366 ASSERT(pItems); | |
367 if (pItems->Find(pFormNode) < 0) { | |
368 pItems->Add(pFormNode); | |
369 } | |
370 return pItems->GetSize(); | |
371 } | |
372 CXFA_Node* pOldFormItem = | |
373 static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode)); | |
374 if (!pOldFormItem) { | |
375 SetObject(XFA_ATTRIBUTE_BindingNode, pFormNode); | |
376 return 1; | |
377 } else if (pOldFormItem == pFormNode) { | |
378 return 1; | |
379 } | |
380 CXFA_NodeArray* pItems = new CXFA_NodeArray; | |
381 SetObject(XFA_ATTRIBUTE_BindingNode, pItems, &deleteBindItemCallBack); | |
382 pItems->Add(pOldFormItem); | |
383 pItems->Add(pFormNode); | |
384 m_uFlags |= XFA_NODEFLAG_BindFormItems; | |
385 return 2; | |
386 } | |
387 int32_t CXFA_Node::RemoveBindItem(CXFA_Node* pFormNode) { | |
388 if (m_uFlags & XFA_NODEFLAG_BindFormItems) { | |
389 CXFA_NodeArray* pItems = NULL; | |
390 TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems); | |
391 ASSERT(pItems); | |
392 int32_t iIndex = pItems->Find(pFormNode); | |
393 int32_t iCount = pItems->GetSize(); | |
394 if (iIndex >= 0) { | |
395 if (iIndex != iCount - 1) { | |
396 pItems->SetAt(iIndex, pItems->GetAt(iCount - 1)); | |
397 } | |
398 pItems->RemoveAt(iCount - 1); | |
399 if (iCount == 2) { | |
400 CXFA_Node* pLastFormNode = pItems->GetAt(0); | |
401 SetObject(XFA_ATTRIBUTE_BindingNode, pLastFormNode); | |
402 m_uFlags &= ~XFA_NODEFLAG_BindFormItems; | |
403 } | |
404 iCount--; | |
405 } | |
406 return iCount; | |
407 } | |
408 CXFA_Node* pOldFormItem = | |
409 static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode)); | |
410 if (pOldFormItem == pFormNode) { | |
411 SetObject(XFA_ATTRIBUTE_BindingNode, NULL); | |
412 pOldFormItem = NULL; | |
413 } | |
414 return pOldFormItem == NULL ? 0 : 1; | |
415 } | |
416 FX_BOOL CXFA_Node::HasBindItem() { | |
417 return (GetPacketID() == XFA_XDPPACKET_Datasets) && | |
418 GetObject(XFA_ATTRIBUTE_BindingNode) != NULL; | |
419 } | |
420 CXFA_WidgetData* CXFA_Node::GetWidgetData() { | |
421 return (CXFA_WidgetData*)GetObject(XFA_ATTRIBUTE_WidgetData); | |
422 } | |
423 CXFA_WidgetData* CXFA_Node::GetContainerWidgetData() { | |
424 if (GetPacketID() != XFA_XDPPACKET_Form) { | |
425 return NULL; | |
426 } | |
427 XFA_ELEMENT classID = GetClassID(); | |
428 if (classID == XFA_ELEMENT_ExclGroup) { | |
429 return NULL; | |
430 } | |
431 CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent); | |
432 if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) { | |
433 return NULL; | |
434 } | |
435 if (classID == XFA_ELEMENT_Field) { | |
436 CXFA_WidgetData* pFieldWidgetData = GetWidgetData(); | |
437 if (pFieldWidgetData && | |
438 pFieldWidgetData->GetChoiceListOpen() == | |
439 XFA_ATTRIBUTEENUM_MultiSelect) { | |
440 return NULL; | |
441 } else { | |
442 CFX_WideString wsPicture; | |
443 if (pFieldWidgetData) { | |
444 pFieldWidgetData->GetPictureContent(wsPicture, | |
445 XFA_VALUEPICTURE_DataBind); | |
446 } | |
447 if (!wsPicture.IsEmpty()) { | |
448 return pFieldWidgetData; | |
449 } | |
450 CXFA_Node* pDataNode = GetBindData(); | |
451 if (!pDataNode) { | |
452 return NULL; | |
453 } | |
454 pFieldWidgetData = NULL; | |
455 CXFA_NodeArray formNodes; | |
456 pDataNode->GetBindItems(formNodes); | |
457 for (int32_t i = 0; i < formNodes.GetSize(); i++) { | |
458 CXFA_Node* pFormNode = formNodes.GetAt(i); | |
459 if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) { | |
460 continue; | |
461 } | |
462 pFieldWidgetData = pFormNode->GetWidgetData(); | |
463 if (pFieldWidgetData) { | |
464 pFieldWidgetData->GetPictureContent(wsPicture, | |
465 XFA_VALUEPICTURE_DataBind); | |
466 } | |
467 if (!wsPicture.IsEmpty()) { | |
468 break; | |
469 } | |
470 pFieldWidgetData = NULL; | |
471 } | |
472 return pFieldWidgetData; | |
473 } | |
474 } | |
475 CXFA_Node* pGrandNode = | |
476 pParentNode ? pParentNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL; | |
477 CXFA_Node* pValueNode = | |
478 (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Value) | |
479 ? pParentNode | |
480 : NULL; | |
481 if (!pValueNode) { | |
482 pValueNode = (pGrandNode && pGrandNode->GetClassID() == XFA_ELEMENT_Value) | |
483 ? pGrandNode | |
484 : NULL; | |
485 } | |
486 CXFA_Node* pParentOfValueNode = | |
487 pValueNode ? pValueNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL; | |
488 return pParentOfValueNode ? pParentOfValueNode->GetContainerWidgetData() | |
489 : NULL; | |
490 } | |
491 FX_BOOL CXFA_Node::GetLocaleName(CFX_WideString& wsLocaleName) { | |
492 CXFA_Node* pForm = GetDocument()->GetXFAObject(XFA_HASHCODE_Form)->AsNode(); | |
493 CXFA_Node* pTopSubform = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform); | |
494 FXSYS_assert(pTopSubform); | |
495 CXFA_Node* pLocaleNode = this; | |
496 FX_BOOL bLocale = FALSE; | |
497 do { | |
498 bLocale = pLocaleNode->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE); | |
499 if (!bLocale) { | |
500 pLocaleNode = pLocaleNode->GetNodeItem(XFA_NODEITEM_Parent); | |
501 } | |
502 } while (pLocaleNode && pLocaleNode != pTopSubform && !bLocale); | |
503 if (bLocale) { | |
504 return bLocale; | |
505 } | |
506 CXFA_Node* pConfig = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Config)); | |
507 wsLocaleName = GetDocument()->GetLocalMgr()->GetConfigLocaleName(pConfig); | |
508 if (!wsLocaleName.IsEmpty()) { | |
509 bLocale = TRUE; | |
510 } | |
511 if (bLocale) { | |
512 return bLocale; | |
513 } | |
514 if (pTopSubform) { | |
515 bLocale = pTopSubform->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE); | |
516 } | |
517 if (bLocale) { | |
518 return bLocale; | |
519 } | |
520 IFX_Locale* pLocale = GetDocument()->GetLocalMgr()->GetDefLocale(); | |
521 if (pLocale) { | |
522 wsLocaleName = pLocale->GetName(); | |
523 bLocale = TRUE; | |
524 } | |
525 return bLocale; | |
526 } | |
527 XFA_ATTRIBUTEENUM CXFA_Node::GetIntact() { | |
528 XFA_ELEMENT eElement = GetClassID(); | |
529 CXFA_Node* pKeep = GetFirstChildByClass(XFA_ELEMENT_Keep); | |
530 XFA_ATTRIBUTEENUM eLayoutType = GetEnum(XFA_ATTRIBUTE_Layout); | |
531 if (pKeep) { | |
532 XFA_ATTRIBUTEENUM eIntact; | |
533 if (pKeep->TryEnum(XFA_ATTRIBUTE_Intact, eIntact, FALSE)) { | |
534 if (eIntact == XFA_ATTRIBUTEENUM_None && | |
535 eLayoutType == XFA_ATTRIBUTEENUM_Row && | |
536 m_pDocument->GetCurVersionMode() < XFA_VERSION_208) { | |
537 CXFA_Node* pPreviewRow = | |
538 GetNodeItem(XFA_NODEITEM_PrevSibling, XFA_OBJECTTYPE_ContainerNode); | |
539 if (pPreviewRow && | |
540 pPreviewRow->GetEnum(XFA_ATTRIBUTE_Layout) == | |
541 XFA_ATTRIBUTEENUM_Row) { | |
542 XFA_ATTRIBUTEENUM eValue; | |
543 if (pKeep->TryEnum(XFA_ATTRIBUTE_Previous, eValue, FALSE)) { | |
544 if (eValue == XFA_ATTRIBUTEENUM_ContentArea || | |
545 eValue == XFA_ATTRIBUTEENUM_PageArea) { | |
546 return XFA_ATTRIBUTEENUM_ContentArea; | |
547 } | |
548 } | |
549 CXFA_Node* pKeep = | |
550 pPreviewRow->GetFirstChildByClass(XFA_ELEMENT_Keep); | |
551 if (pKeep) { | |
552 if (pKeep->TryEnum(XFA_ATTRIBUTE_Next, eValue, FALSE)) { | |
553 if (eValue == XFA_ATTRIBUTEENUM_ContentArea || | |
554 eValue == XFA_ATTRIBUTEENUM_PageArea) { | |
555 return XFA_ATTRIBUTEENUM_ContentArea; | |
556 } | |
557 } | |
558 } | |
559 } | |
560 } | |
561 return eIntact; | |
562 } | |
563 } | |
564 switch (eElement) { | |
565 case XFA_ELEMENT_Subform: | |
566 switch (eLayoutType) { | |
567 case XFA_ATTRIBUTEENUM_Position: | |
568 case XFA_ATTRIBUTEENUM_Row: | |
569 return XFA_ATTRIBUTEENUM_ContentArea; | |
570 case XFA_ATTRIBUTEENUM_Tb: | |
571 case XFA_ATTRIBUTEENUM_Table: | |
572 case XFA_ATTRIBUTEENUM_Lr_tb: | |
573 case XFA_ATTRIBUTEENUM_Rl_tb: | |
574 return XFA_ATTRIBUTEENUM_None; | |
575 default: | |
576 break; | |
577 } | |
578 break; | |
579 case XFA_ELEMENT_Field: { | |
580 CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent); | |
581 if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_PageArea) { | |
582 return XFA_ATTRIBUTEENUM_ContentArea; | |
583 } | |
584 if (pParentNode->GetIntact() == XFA_ATTRIBUTEENUM_None) { | |
585 XFA_ATTRIBUTEENUM eParLayout = | |
586 pParentNode->GetEnum(XFA_ATTRIBUTE_Layout); | |
587 if (eParLayout == XFA_ATTRIBUTEENUM_Position || | |
588 eParLayout == XFA_ATTRIBUTEENUM_Row || | |
589 eParLayout == XFA_ATTRIBUTEENUM_Table) { | |
590 return XFA_ATTRIBUTEENUM_None; | |
591 } | |
592 XFA_VERSION version = m_pDocument->GetCurVersionMode(); | |
593 if (eParLayout == XFA_ATTRIBUTEENUM_Tb && version < XFA_VERSION_208) { | |
594 CXFA_Measurement measureH; | |
595 if (TryMeasure(XFA_ATTRIBUTE_H, measureH, FALSE)) { | |
596 return XFA_ATTRIBUTEENUM_ContentArea; | |
597 } | |
598 } | |
599 return XFA_ATTRIBUTEENUM_None; | |
600 } | |
601 return XFA_ATTRIBUTEENUM_ContentArea; | |
602 } | |
603 case XFA_ELEMENT_Draw: | |
604 return XFA_ATTRIBUTEENUM_ContentArea; | |
605 default: | |
606 break; | |
607 } | |
608 return XFA_ATTRIBUTEENUM_None; | |
609 } | |
610 CXFA_Node* CXFA_Node::GetDataDescriptionNode() { | |
611 if (m_ePacket == XFA_XDPPACKET_Datasets) { | |
612 return m_pAuxNode; | |
613 } | |
614 return NULL; | |
615 } | |
616 void CXFA_Node::SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode) { | |
617 FXSYS_assert(m_ePacket == XFA_XDPPACKET_Datasets); | |
618 m_pAuxNode = pDataDescriptionNode; | |
619 } | |
620 void CXFA_Node::Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments) { | |
621 int32_t iLength = pArguments->GetLength(); | |
622 if (iLength != 1) { | |
623 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resolveNode"); | |
624 return; | |
625 } | |
626 CFX_WideString wsExpression; | |
627 CFX_ByteString bsExpression = pArguments->GetUTF8String(0); | |
628 wsExpression = | |
629 CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); | |
630 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); | |
631 if (!pScriptContext) { | |
632 return; | |
633 } | |
634 CXFA_Node* refNode = this; | |
635 if (refNode->GetClassID() == XFA_ELEMENT_Xfa) { | |
636 refNode = ToNode(pScriptContext->GetThisObject()); | |
637 } | |
638 FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | | |
639 XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | | |
640 XFA_RESOLVENODE_Siblings; | |
641 XFA_RESOLVENODE_RS resoveNodeRS; | |
642 int32_t iRet = pScriptContext->ResolveObjects(refNode, wsExpression, | |
643 resoveNodeRS, dwFlag); | |
644 if (iRet < 1) { | |
645 return FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
646 } | |
647 FXJSE_HVALUE hValue = NULL; | |
648 if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { | |
649 CXFA_Object* pNode = resoveNodeRS.nodes[0]; | |
650 hValue = pScriptContext->GetJSValueFromMap(pNode); | |
651 FXJSE_Value_Set(pArguments->GetReturnValue(), hValue); | |
652 } else { | |
653 const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = | |
654 resoveNodeRS.pScriptAttribute; | |
655 if (lpAttributeInfo && lpAttributeInfo->eValueType == XFA_SCRIPT_Object) { | |
656 hValue = FXJSE_Value_Create(pScriptContext->GetRuntime()); | |
657 (resoveNodeRS.nodes[0]->*(lpAttributeInfo->lpfnCallback))( | |
658 hValue, FALSE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); | |
659 FXJSE_Value_Set(pArguments->GetReturnValue(), hValue); | |
660 FXJSE_Value_Release(hValue); | |
661 } else { | |
662 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
663 } | |
664 } | |
665 } | |
666 void CXFA_Node::Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments) { | |
667 int32_t iLength = pArguments->GetLength(); | |
668 if (iLength != 1) { | |
669 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
670 L"resolveNodes"); | |
671 return; | |
672 } | |
673 CFX_WideString wsExpression; | |
674 CFX_ByteString bsExpression = pArguments->GetUTF8String(0); | |
675 wsExpression = | |
676 CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); | |
677 FXJSE_HVALUE hValue = pArguments->GetReturnValue(); | |
678 if (!hValue) { | |
679 return; | |
680 } | |
681 FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | | |
682 XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | | |
683 XFA_RESOLVENODE_Siblings; | |
684 CXFA_Node* refNode = this; | |
685 if (refNode->GetClassID() == XFA_ELEMENT_Xfa) { | |
686 refNode = ToNode(m_pDocument->GetScriptContext()->GetThisObject()); | |
687 } | |
688 Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag, refNode); | |
689 } | |
690 void CXFA_Node::Script_Som_ResolveNodeList(FXJSE_HVALUE hValue, | |
691 CFX_WideString wsExpression, | |
692 FX_DWORD dwFlag, | |
693 CXFA_Node* refNode) { | |
694 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); | |
695 if (!pScriptContext) { | |
696 return; | |
697 } | |
698 XFA_RESOLVENODE_RS resoveNodeRS; | |
699 if (refNode == NULL) { | |
700 refNode = this; | |
701 } | |
702 pScriptContext->ResolveObjects(refNode, wsExpression, resoveNodeRS, dwFlag); | |
703 CXFA_ArrayNodeList* pNodeList = new CXFA_ArrayNodeList(m_pDocument); | |
704 if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { | |
705 for (int32_t i = 0; i < resoveNodeRS.nodes.GetSize(); i++) { | |
706 if (resoveNodeRS.nodes[i]->IsNode()) | |
707 pNodeList->Append(resoveNodeRS.nodes[i]->AsNode()); | |
708 } | |
709 } else { | |
710 CXFA_HVALUEArray hValueArray(pScriptContext->GetRuntime()); | |
711 if (resoveNodeRS.GetAttributeResult(hValueArray) > 0) { | |
712 CXFA_ObjArray objectArray; | |
713 hValueArray.GetAttributeObject(objectArray); | |
714 for (int32_t i = 0; i < objectArray.GetSize(); i++) { | |
715 if (objectArray[i]->IsNode()) | |
716 pNodeList->Append(objectArray[i]->AsNode()); | |
717 } | |
718 } | |
719 } | |
720 FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList, | |
721 pScriptContext->GetJseNormalClass()); | |
722 } | |
723 void CXFA_Node::Script_TreeClass_All(FXJSE_HVALUE hValue, | |
724 FX_BOOL bSetting, | |
725 XFA_ATTRIBUTE eAttribute) { | |
726 if (bSetting) { | |
727 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
728 } else { | |
729 FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL; | |
730 CFX_WideString wsName; | |
731 GetAttribute(XFA_ATTRIBUTE_Name, wsName); | |
732 CFX_WideString wsExpression = wsName + FX_WSTRC(L"[*]"); | |
733 Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag); | |
734 } | |
735 } | |
736 void CXFA_Node::Script_TreeClass_Nodes(FXJSE_HVALUE hValue, | |
737 FX_BOOL bSetting, | |
738 XFA_ATTRIBUTE eAttribute) { | |
739 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); | |
740 if (!pScriptContext) { | |
741 return; | |
742 } | |
743 if (bSetting) { | |
744 IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider(); | |
745 FXSYS_assert(pAppProvider); | |
746 CFX_WideString wsMessage; | |
747 pAppProvider->LoadString(XFA_IDS_Unable_TO_SET, wsMessage); | |
748 FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength())); | |
749 } else { | |
750 CXFA_AttachNodeList* pNodeList = new CXFA_AttachNodeList(m_pDocument, this); | |
751 FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList, | |
752 pScriptContext->GetJseNormalClass()); | |
753 } | |
754 } | |
755 void CXFA_Node::Script_TreeClass_ClassAll(FXJSE_HVALUE hValue, | |
756 FX_BOOL bSetting, | |
757 XFA_ATTRIBUTE eAttribute) { | |
758 if (bSetting) { | |
759 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
760 } else { | |
761 FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL; | |
762 CFX_WideStringC wsName; | |
763 GetClassName(wsName); | |
764 CFX_WideString wsExpression = FX_WSTRC(L"#") + wsName + FX_WSTRC(L"[*]"); | |
765 Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag); | |
766 } | |
767 } | |
768 void CXFA_Node::Script_TreeClass_Parent(FXJSE_HVALUE hValue, | |
769 FX_BOOL bSetting, | |
770 XFA_ATTRIBUTE eAttribute) { | |
771 if (bSetting) { | |
772 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
773 } else { | |
774 CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent); | |
775 if (pParent) { | |
776 FXJSE_Value_Set( | |
777 hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(pParent)); | |
778 } else { | |
779 FXJSE_Value_SetNull(hValue); | |
780 } | |
781 } | |
782 } | |
783 void CXFA_Node::Script_TreeClass_Index(FXJSE_HVALUE hValue, | |
784 FX_BOOL bSetting, | |
785 XFA_ATTRIBUTE eAttribute) { | |
786 if (bSetting) { | |
787 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
788 } else { | |
789 FXJSE_Value_SetInteger(hValue, GetNodeSameNameIndex()); | |
790 } | |
791 } | |
792 void CXFA_Node::Script_TreeClass_ClassIndex(FXJSE_HVALUE hValue, | |
793 FX_BOOL bSetting, | |
794 XFA_ATTRIBUTE eAttribute) { | |
795 if (bSetting) { | |
796 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
797 } else { | |
798 FXJSE_Value_SetInteger(hValue, GetNodeSameClassIndex()); | |
799 } | |
800 } | |
801 void CXFA_Node::Script_TreeClass_SomExpression(FXJSE_HVALUE hValue, | |
802 FX_BOOL bSetting, | |
803 XFA_ATTRIBUTE eAttribute) { | |
804 if (bSetting) { | |
805 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
806 } else { | |
807 CFX_WideString wsSOMExpression; | |
808 GetSOMExpression(wsSOMExpression); | |
809 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsSOMExpression)); | |
810 } | |
811 } | |
812 void CXFA_Node::Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments) { | |
813 int32_t iLength = pArguments->GetLength(); | |
814 if (iLength != 1) { | |
815 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"applyXSL"); | |
816 return; | |
817 } | |
818 CFX_WideString wsExpression; | |
819 CFX_ByteString bsExpression = pArguments->GetUTF8String(0); | |
820 wsExpression = | |
821 CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); | |
822 } | |
823 void CXFA_Node::Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments) { | |
824 int32_t iLength = pArguments->GetLength(); | |
825 if (iLength < 1 || iLength > 3) { | |
826 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"assignNode"); | |
827 return; | |
828 } | |
829 CFX_WideString wsExpression; | |
830 CFX_WideString wsValue; | |
831 int32_t iAction = 0; | |
832 if (iLength >= 1) { | |
833 CFX_ByteString bsExpression = pArguments->GetUTF8String(0); | |
834 wsExpression = | |
835 CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); | |
836 } | |
837 if (iLength >= 2) { | |
838 CFX_ByteString bsValue = pArguments->GetUTF8String(1); | |
839 wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
840 } | |
841 if (iLength >= 3) { | |
842 iAction = pArguments->GetInt32(2); | |
843 } | |
844 } | |
845 void CXFA_Node::Script_NodeClass_Clone(CFXJSE_Arguments* pArguments) { | |
846 int32_t iLength = pArguments->GetLength(); | |
847 if (iLength != 1) { | |
848 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"clone"); | |
849 return; | |
850 } | |
851 FX_BOOL bClone = TRUE; | |
852 bClone = pArguments->GetInt32(0) == 0 ? FALSE : TRUE; | |
853 CXFA_Node* pCloneNode = Clone(bClone); | |
854 FXJSE_Value_Set( | |
855 pArguments->GetReturnValue(), | |
856 m_pDocument->GetScriptContext()->GetJSValueFromMap(pCloneNode)); | |
857 } | |
858 void CXFA_Node::Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments) { | |
859 int32_t iLength = pArguments->GetLength(); | |
860 if (iLength != 1) { | |
861 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
862 L"getAttribute"); | |
863 return; | |
864 } | |
865 CFX_WideString wsExpression; | |
866 CFX_ByteString bsExpression = pArguments->GetUTF8String(0); | |
867 wsExpression = | |
868 CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); | |
869 CFX_WideString wsValue; | |
870 GetAttribute(wsExpression, wsValue); | |
871 FXJSE_HVALUE hValue = pArguments->GetReturnValue(); | |
872 if (hValue) { | |
873 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); | |
874 } | |
875 } | |
876 void CXFA_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) { | |
877 int32_t iLength = pArguments->GetLength(); | |
878 if (iLength < 1 || iLength > 2) { | |
879 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getElement"); | |
880 return; | |
881 } | |
882 CFX_WideString wsExpression; | |
883 int32_t iValue = 0; | |
884 if (iLength >= 1) { | |
885 CFX_ByteString bsExpression = pArguments->GetUTF8String(0); | |
886 wsExpression = | |
887 CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); | |
888 } | |
889 if (iLength >= 2) { | |
890 iValue = pArguments->GetInt32(1); | |
891 } | |
892 const XFA_ELEMENTINFO* pElementInfo = XFA_GetElementByName(wsExpression); | |
893 CXFA_Node* pNode = GetProperty(iValue, pElementInfo->eName); | |
894 FXJSE_Value_Set(pArguments->GetReturnValue(), | |
895 m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode)); | |
896 } | |
897 void CXFA_Node::Script_NodeClass_IsPropertySpecified( | |
898 CFXJSE_Arguments* pArguments) { | |
899 int32_t iLength = pArguments->GetLength(); | |
900 if (iLength < 1 || iLength > 3) { | |
901 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
902 L"isPropertySpecified"); | |
903 return; | |
904 } | |
905 CFX_WideString wsExpression; | |
906 FX_BOOL bParent = TRUE; | |
907 int32_t iIndex = 0; | |
908 if (iLength >= 1) { | |
909 CFX_ByteString bsExpression = pArguments->GetUTF8String(0); | |
910 wsExpression = | |
911 CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); | |
912 } | |
913 if (iLength >= 2) { | |
914 bParent = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; | |
915 } | |
916 if (iLength >= 3) { | |
917 iIndex = pArguments->GetInt32(2); | |
918 } | |
919 FX_BOOL bHas = FALSE; | |
920 const XFA_ATTRIBUTEINFO* pAttributeInfo = | |
921 XFA_GetAttributeByName(wsExpression); | |
922 CFX_WideString wsValue; | |
923 if (pAttributeInfo) { | |
924 bHas = HasAttribute(pAttributeInfo->eName); | |
925 } | |
926 if (!bHas) { | |
927 const XFA_ELEMENTINFO* pElementInfo = XFA_GetElementByName(wsExpression); | |
928 bHas = (GetProperty(iIndex, pElementInfo->eName) != NULL); | |
929 } | |
930 FXJSE_HVALUE hValue = pArguments->GetReturnValue(); | |
931 if (hValue) { | |
932 FXJSE_Value_SetBoolean(hValue, bHas); | |
933 } | |
934 } | |
935 void CXFA_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) { | |
936 int32_t iLength = pArguments->GetLength(); | |
937 if (iLength < 1 || iLength > 3) { | |
938 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"loadXML"); | |
939 return; | |
940 } | |
941 CFX_WideString wsExpression; | |
942 FX_BOOL bIgnoreRoot = TRUE; | |
943 FX_BOOL bOverwrite = 0; | |
944 if (iLength >= 1) { | |
945 CFX_ByteString bsExpression = pArguments->GetUTF8String(0); | |
946 wsExpression = | |
947 CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength()); | |
948 if (wsExpression.IsEmpty()) { | |
949 return; | |
950 } | |
951 } | |
952 if (iLength >= 2) { | |
953 bIgnoreRoot = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; | |
954 } | |
955 if (iLength >= 3) { | |
956 bOverwrite = pArguments->GetInt32(2) == 0 ? FALSE : TRUE; | |
957 } | |
958 IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument); | |
959 if (!pParser) { | |
960 return; | |
961 } | |
962 IFDE_XMLNode* pXMLNode = NULL; | |
963 int32_t iParserStatus = pParser->ParseXMLData(wsExpression, pXMLNode, NULL); | |
964 if (iParserStatus != XFA_PARSESTATUS_Done || !pXMLNode) { | |
965 pParser->Release(); | |
966 pParser = NULL; | |
967 return; | |
968 } | |
969 if (bIgnoreRoot && (pXMLNode->GetType() != FDE_XMLNODE_Element || | |
970 XFA_RecognizeRichText((IFDE_XMLElement*)pXMLNode))) { | |
971 bIgnoreRoot = FALSE; | |
972 } | |
973 CXFA_Node* pFakeRoot = Clone(FALSE); | |
974 CFX_WideStringC wsContentType = GetCData(XFA_ATTRIBUTE_ContentType); | |
975 if (!wsContentType.IsEmpty()) { | |
976 pFakeRoot->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); | |
977 } | |
978 IFDE_XMLNode* pFakeXMLRoot = pFakeRoot->GetXMLMappingNode(); | |
979 if (!pFakeXMLRoot) { | |
980 IFDE_XMLNode* pThisXMLRoot = GetXMLMappingNode(); | |
981 pFakeXMLRoot = pThisXMLRoot ? pThisXMLRoot->Clone(FALSE) : NULL; | |
982 } | |
983 if (!pFakeXMLRoot) { | |
984 CFX_WideStringC wsClassName; | |
985 GetClassName(wsClassName); | |
986 pFakeXMLRoot = IFDE_XMLElement::Create(wsClassName); | |
987 } | |
988 if (bIgnoreRoot) { | |
989 IFDE_XMLNode* pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); | |
990 while (pXMLChild) { | |
991 IFDE_XMLNode* pXMLSibling = | |
992 pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling); | |
993 pXMLNode->RemoveChildNode(pXMLChild); | |
994 pFakeXMLRoot->InsertChildNode(pXMLChild); | |
995 pXMLChild = pXMLSibling; | |
996 } | |
997 } else { | |
998 IFDE_XMLNode* pXMLParent = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent); | |
999 if (pXMLParent) { | |
1000 pXMLParent->RemoveChildNode(pXMLNode); | |
1001 } | |
1002 pFakeXMLRoot->InsertChildNode(pXMLNode); | |
1003 } | |
1004 pParser->ConstructXFANode(pFakeRoot, pFakeXMLRoot); | |
1005 pFakeRoot = pParser->GetRootNode(); | |
1006 if (pFakeRoot) { | |
1007 if (bOverwrite) { | |
1008 CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); | |
1009 CXFA_Node* pNewChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild); | |
1010 int32_t index = 0; | |
1011 while (pNewChild) { | |
1012 CXFA_Node* pItem = pNewChild->GetNodeItem(XFA_NODEITEM_NextSibling); | |
1013 pFakeRoot->RemoveChild(pNewChild); | |
1014 InsertChild(index++, pNewChild); | |
1015 pNewChild->SetFlag(XFA_NODEFLAG_Initialized); | |
1016 pNewChild = pItem; | |
1017 } | |
1018 while (pChild) { | |
1019 CXFA_Node* pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); | |
1020 RemoveChild(pChild); | |
1021 pFakeRoot->InsertChild(pChild); | |
1022 pChild = pItem; | |
1023 } | |
1024 if (GetPacketID() == XFA_XDPPACKET_Form && | |
1025 GetClassID() == XFA_ELEMENT_ExData) { | |
1026 IFDE_XMLNode* pTempXMLNode = GetXMLMappingNode(); | |
1027 SetXMLMappingNode(pFakeXMLRoot); | |
1028 SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); | |
1029 if (pTempXMLNode && | |
1030 pTempXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL) { | |
1031 pFakeXMLRoot = pTempXMLNode; | |
1032 } else { | |
1033 pFakeXMLRoot = NULL; | |
1034 } | |
1035 } | |
1036 MoveBufferMapData(pFakeRoot, this, XFA_CalcData, TRUE); | |
1037 } else { | |
1038 CXFA_Node* pChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild); | |
1039 while (pChild) { | |
1040 CXFA_Node* pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); | |
1041 pFakeRoot->RemoveChild(pChild); | |
1042 InsertChild(pChild); | |
1043 pChild->SetFlag(XFA_NODEFLAG_Initialized); | |
1044 pChild = pItem; | |
1045 } | |
1046 } | |
1047 if (pFakeXMLRoot) { | |
1048 pFakeRoot->SetXMLMappingNode(pFakeXMLRoot); | |
1049 pFakeRoot->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); | |
1050 } | |
1051 pFakeRoot->SetFlag(XFA_NODEFLAG_HasRemoved, TRUE, FALSE); | |
1052 } else { | |
1053 if (pFakeXMLRoot) { | |
1054 pFakeXMLRoot->Release(); | |
1055 pFakeXMLRoot = NULL; | |
1056 } | |
1057 } | |
1058 pParser->Release(); | |
1059 pParser = NULL; | |
1060 } | |
1061 void CXFA_Node::Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments) { | |
1062 } | |
1063 | |
1064 void CXFA_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) { | |
1065 int32_t iLength = pArguments->GetLength(); | |
1066 if (iLength < 0 || iLength > 1) { | |
1067 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"saveXML"); | |
1068 return; | |
1069 } | |
1070 FX_BOOL bPrettyMode = FALSE; | |
1071 if (iLength == 1) { | |
1072 CFX_ByteString bsPretty = pArguments->GetUTF8String(0); | |
1073 if (!bsPretty.Equal("pretty")) { | |
1074 ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
1075 return; | |
1076 } | |
1077 bPrettyMode = TRUE; | |
1078 } | |
1079 CFX_ByteStringC bsXMLHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; | |
1080 if (GetPacketID() == XFA_XDPPACKET_Form) { | |
1081 IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE); | |
1082 IFX_Stream* pStream = IFX_Stream::CreateStream( | |
1083 (IFX_FileWrite*)pMemoryStream, | |
1084 FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); | |
1085 if (!pStream) { | |
1086 FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader); | |
1087 pMemoryStream->Release(); | |
1088 pMemoryStream = NULL; | |
1089 return; | |
1090 } | |
1091 pStream->SetCodePage(FX_CODEPAGE_UTF8); | |
1092 pStream->WriteData(bsXMLHeader.GetPtr(), bsXMLHeader.GetLength()); | |
1093 XFA_DataExporter_RegenerateFormFile(this, pStream, NULL, TRUE); | |
1094 FXJSE_Value_SetUTF8String( | |
1095 pArguments->GetReturnValue(), | |
1096 CFX_ByteStringC(pMemoryStream->GetBuffer(), pMemoryStream->GetSize())); | |
1097 pStream->Release(); | |
1098 pStream = NULL; | |
1099 if (pMemoryStream) { | |
1100 pMemoryStream->Release(); | |
1101 pMemoryStream = NULL; | |
1102 } | |
1103 return; | |
1104 } | |
1105 if (GetPacketID() == XFA_XDPPACKET_Datasets) { | |
1106 IFDE_XMLNode* pElement = GetXMLMappingNode(); | |
1107 if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) { | |
1108 FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader); | |
1109 return; | |
1110 } | |
1111 XFA_DataExporter_DealWithDataGroupNode(this); | |
1112 IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE); | |
1113 IFX_Stream* pStream = IFX_Stream::CreateStream( | |
1114 (IFX_FileWrite*)pMemoryStream, | |
1115 FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); | |
1116 if (pStream) { | |
1117 pStream->SetCodePage(FX_CODEPAGE_UTF8); | |
1118 pStream->WriteData(bsXMLHeader.GetPtr(), bsXMLHeader.GetLength()); | |
1119 pElement->SaveXMLNode(pStream); | |
1120 FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), | |
1121 CFX_ByteStringC(pMemoryStream->GetBuffer(), | |
1122 pMemoryStream->GetSize())); | |
1123 pStream->Release(); | |
1124 pStream = NULL; | |
1125 } | |
1126 if (pMemoryStream) { | |
1127 pMemoryStream->Release(); | |
1128 pMemoryStream = NULL; | |
1129 } | |
1130 return; | |
1131 } | |
1132 FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), ""); | |
1133 } | |
1134 | |
1135 void CXFA_Node::Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments) { | |
1136 int32_t iLength = pArguments->GetLength(); | |
1137 if (iLength != 2) { | |
1138 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1139 L"setAttribute"); | |
1140 return; | |
1141 } | |
1142 CFX_WideString wsAttribute; | |
1143 CFX_WideString wsAttributeValue; | |
1144 CFX_ByteString bsAttributeValue = pArguments->GetUTF8String(0); | |
1145 CFX_ByteString bsAttribute = pArguments->GetUTF8String(1); | |
1146 wsAttributeValue = | |
1147 CFX_WideString::FromUTF8(bsAttributeValue, bsAttributeValue.GetLength()); | |
1148 wsAttribute = CFX_WideString::FromUTF8(bsAttribute, bsAttribute.GetLength()); | |
1149 SetAttribute(wsAttribute, wsAttributeValue, TRUE); | |
1150 } | |
1151 void CXFA_Node::Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments) { | |
1152 int32_t iLength = pArguments->GetLength(); | |
1153 if (iLength != 1 && iLength != 2) { | |
1154 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setElement"); | |
1155 return; | |
1156 } | |
1157 CXFA_Node* pNode = NULL; | |
1158 CFX_WideString wsName; | |
1159 if (iLength >= 1) { | |
1160 pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0)); | |
1161 } | |
1162 if (iLength >= 2) { | |
1163 CFX_ByteString bsName = pArguments->GetUTF8String(1); | |
1164 wsName = CFX_WideString::FromUTF8(bsName, bsName.GetLength()); | |
1165 } | |
1166 } | |
1167 void CXFA_Node::Script_NodeClass_Ns(FXJSE_HVALUE hValue, | |
1168 FX_BOOL bSetting, | |
1169 XFA_ATTRIBUTE eAttribute) { | |
1170 if (bSetting) { | |
1171 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1172 } else { | |
1173 CFX_WideString wsNameSpace; | |
1174 TryNamespace(wsNameSpace); | |
1175 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsNameSpace)); | |
1176 } | |
1177 } | |
1178 void CXFA_Node::Script_NodeClass_Model(FXJSE_HVALUE hValue, | |
1179 FX_BOOL bSetting, | |
1180 XFA_ATTRIBUTE eAttribute) { | |
1181 if (bSetting) { | |
1182 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1183 } else { | |
1184 FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap( | |
1185 GetModelNode())); | |
1186 } | |
1187 } | |
1188 void CXFA_Node::Script_NodeClass_IsContainer(FXJSE_HVALUE hValue, | |
1189 FX_BOOL bSetting, | |
1190 XFA_ATTRIBUTE eAttribute) { | |
1191 if (bSetting) { | |
1192 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1193 } else { | |
1194 FXJSE_Value_SetBoolean(hValue, IsContainerNode()); | |
1195 } | |
1196 } | |
1197 void CXFA_Node::Script_NodeClass_IsNull(FXJSE_HVALUE hValue, | |
1198 FX_BOOL bSetting, | |
1199 XFA_ATTRIBUTE eAttribute) { | |
1200 if (bSetting) { | |
1201 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1202 } else { | |
1203 if (GetClassID() == XFA_ELEMENT_Subform) { | |
1204 FXJSE_Value_SetBoolean(hValue, FALSE); | |
1205 return; | |
1206 } | |
1207 CFX_WideString strValue; | |
1208 FXJSE_Value_SetBoolean(hValue, !TryContent(strValue) || strValue.IsEmpty()); | |
1209 } | |
1210 } | |
1211 void CXFA_Node::Script_NodeClass_OneOfChild(FXJSE_HVALUE hValue, | |
1212 FX_BOOL bSetting, | |
1213 XFA_ATTRIBUTE eAttribute) { | |
1214 if (bSetting) { | |
1215 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1216 } else { | |
1217 CXFA_NodeArray properts; | |
1218 int32_t iSize = GetNodeList(properts, XFA_NODEFILTER_OneOfProperty); | |
1219 if (iSize > 0) { | |
1220 FXJSE_Value_Set( | |
1221 hValue, | |
1222 m_pDocument->GetScriptContext()->GetJSValueFromMap(properts[0])); | |
1223 } | |
1224 } | |
1225 } | |
1226 void CXFA_Node::Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments) {} | |
1227 void CXFA_Node::Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments) { | |
1228 CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument); | |
1229 FXJSE_Value_SetObject(pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes, | |
1230 m_pDocument->GetScriptContext()->GetJseNormalClass()); | |
1231 } | |
1232 void CXFA_Node::Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments) { | |
1233 } | |
1234 void CXFA_Node::Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments) { | |
1235 Script_Template_CreateNode(pArguments); | |
1236 } | |
1237 void CXFA_Node::Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments) { | |
1238 int32_t iLength = pArguments->GetLength(); | |
1239 if (iLength < 1) { | |
1240 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1241 L"isCompatibleNS"); | |
1242 return; | |
1243 } | |
1244 CFX_WideString wsNameSpace; | |
1245 if (iLength >= 1) { | |
1246 CFX_ByteString bsNameSpace = pArguments->GetUTF8String(0); | |
1247 wsNameSpace = | |
1248 CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength()); | |
1249 } | |
1250 CFX_WideString wsNodeNameSpace; | |
1251 TryNamespace(wsNodeNameSpace); | |
1252 FXJSE_HVALUE hValue = pArguments->GetReturnValue(); | |
1253 if (hValue) { | |
1254 FXJSE_Value_SetBoolean(hValue, wsNodeNameSpace.Equal(wsNameSpace)); | |
1255 } | |
1256 } | |
1257 void CXFA_Node::Script_ModelClass_Context(FXJSE_HVALUE hValue, | |
1258 FX_BOOL bSetting, | |
1259 XFA_ATTRIBUTE eAttribute) {} | |
1260 void CXFA_Node::Script_ModelClass_AliasNode(FXJSE_HVALUE hValue, | |
1261 FX_BOOL bSetting, | |
1262 XFA_ATTRIBUTE eAttribute) {} | |
1263 void CXFA_Node::Script_Attribute_Integer(FXJSE_HVALUE hValue, | |
1264 FX_BOOL bSetting, | |
1265 XFA_ATTRIBUTE eAttribute) { | |
1266 if (bSetting) { | |
1267 SetInteger(eAttribute, FXJSE_Value_ToInteger(hValue), TRUE); | |
1268 } else { | |
1269 FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute)); | |
1270 } | |
1271 } | |
1272 void CXFA_Node::Script_Attribute_IntegerRead(FXJSE_HVALUE hValue, | |
1273 FX_BOOL bSetting, | |
1274 XFA_ATTRIBUTE eAttribute) { | |
1275 if (!bSetting) { | |
1276 FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute)); | |
1277 } else { | |
1278 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1279 } | |
1280 } | |
1281 void CXFA_Node::Script_Attribute_BOOL(FXJSE_HVALUE hValue, | |
1282 FX_BOOL bSetting, | |
1283 XFA_ATTRIBUTE eAttribute) { | |
1284 if (bSetting) { | |
1285 SetBoolean(eAttribute, FXJSE_Value_ToBoolean(hValue), TRUE); | |
1286 } else { | |
1287 FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? "1" : "0"); | |
1288 } | |
1289 } | |
1290 void CXFA_Node::Script_Attribute_BOOLRead(FXJSE_HVALUE hValue, | |
1291 FX_BOOL bSetting, | |
1292 XFA_ATTRIBUTE eAttribute) { | |
1293 if (!bSetting) { | |
1294 FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? "1" : "0"); | |
1295 } else { | |
1296 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1297 } | |
1298 } | |
1299 void CXFA_Node::Script_Attribute_SendAttributeChangeMessage( | |
1300 void* eAttribute, | |
1301 void* eValue, | |
1302 FX_BOOL bScriptModify) { | |
1303 CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); | |
1304 if (!pLayoutPro) { | |
1305 return; | |
1306 } | |
1307 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
1308 if (!pNotify) { | |
1309 return; | |
1310 } | |
1311 FX_DWORD dwPacket = GetPacketID(); | |
1312 if (dwPacket & XFA_XDPPACKET_Form) { | |
1313 FX_BOOL bNeedFindContainer = FALSE; | |
1314 XFA_ELEMENT eType = GetClassID(); | |
1315 switch (eType) { | |
1316 case XFA_ELEMENT_Caption: | |
1317 bNeedFindContainer = TRUE; | |
1318 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1319 eValue, this, GetNodeItem(XFA_NODEITEM_Parent)); | |
1320 break; | |
1321 case XFA_ELEMENT_Font: | |
1322 case XFA_ELEMENT_Para: { | |
1323 bNeedFindContainer = TRUE; | |
1324 CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent); | |
1325 if (pParentNode->GetClassID() == XFA_ELEMENT_Caption) { | |
1326 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1327 eValue, pParentNode, | |
1328 pParentNode->GetNodeItem(XFA_NODEITEM_Parent)); | |
1329 } else { | |
1330 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1331 eValue, this, pParentNode); | |
1332 } | |
1333 } break; | |
1334 case XFA_ELEMENT_Margin: { | |
1335 bNeedFindContainer = TRUE; | |
1336 CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent); | |
1337 XFA_ELEMENT eParentType = pParentNode->GetClassID(); | |
1338 if (pParentNode->IsContainerNode()) { | |
1339 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1340 eValue, this, pParentNode); | |
1341 } else if (eParentType == XFA_ELEMENT_Caption) { | |
1342 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1343 eValue, pParentNode, | |
1344 pParentNode->GetNodeItem(XFA_NODEITEM_Parent)); | |
1345 } else { | |
1346 CXFA_Node* pNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent); | |
1347 if (pNode && pNode->GetClassID() == XFA_ELEMENT_Ui) { | |
1348 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1349 eValue, pNode, | |
1350 pNode->GetNodeItem(XFA_NODEITEM_Parent)); | |
1351 } | |
1352 } | |
1353 } break; | |
1354 case XFA_ELEMENT_Comb: { | |
1355 CXFA_Node* pEditNode = GetNodeItem(XFA_NODEITEM_Parent); | |
1356 XFA_ELEMENT eUIType = pEditNode->GetClassID(); | |
1357 if (pEditNode && (eUIType == XFA_ELEMENT_DateTimeEdit || | |
1358 eUIType == XFA_ELEMENT_NumericEdit || | |
1359 eUIType == XFA_ELEMENT_TextEdit)) { | |
1360 CXFA_Node* pUINode = pEditNode->GetNodeItem(XFA_NODEITEM_Parent); | |
1361 if (pUINode) { | |
1362 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1363 eValue, pUINode, | |
1364 pUINode->GetNodeItem(XFA_NODEITEM_Parent)); | |
1365 } | |
1366 } | |
1367 } break; | |
1368 case XFA_ELEMENT_Button: | |
1369 case XFA_ELEMENT_Barcode: | |
1370 case XFA_ELEMENT_ChoiceList: | |
1371 case XFA_ELEMENT_DateTimeEdit: | |
1372 case XFA_ELEMENT_NumericEdit: | |
1373 case XFA_ELEMENT_PasswordEdit: | |
1374 case XFA_ELEMENT_TextEdit: { | |
1375 CXFA_Node* pUINode = GetNodeItem(XFA_NODEITEM_Parent); | |
1376 if (pUINode) { | |
1377 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1378 eValue, pUINode, | |
1379 pUINode->GetNodeItem(XFA_NODEITEM_Parent)); | |
1380 } | |
1381 } break; | |
1382 case XFA_ELEMENT_CheckButton: { | |
1383 bNeedFindContainer = TRUE; | |
1384 CXFA_Node* pUINode = GetNodeItem(XFA_NODEITEM_Parent); | |
1385 if (pUINode) { | |
1386 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1387 eValue, pUINode, | |
1388 pUINode->GetNodeItem(XFA_NODEITEM_Parent)); | |
1389 } | |
1390 } break; | |
1391 case XFA_ELEMENT_Keep: | |
1392 case XFA_ELEMENT_Bookend: | |
1393 case XFA_ELEMENT_Break: | |
1394 case XFA_ELEMENT_BreakAfter: | |
1395 case XFA_ELEMENT_BreakBefore: | |
1396 case XFA_ELEMENT_Overflow: | |
1397 bNeedFindContainer = TRUE; | |
1398 break; | |
1399 case XFA_ELEMENT_Area: | |
1400 case XFA_ELEMENT_Draw: | |
1401 case XFA_ELEMENT_ExclGroup: | |
1402 case XFA_ELEMENT_Field: | |
1403 case XFA_ELEMENT_Subform: | |
1404 case XFA_ELEMENT_SubformSet: | |
1405 pLayoutPro->AddChangedContainer(this); | |
1406 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1407 eValue, this, this); | |
1408 break; | |
1409 case XFA_ELEMENT_Sharptext: | |
1410 case XFA_ELEMENT_Sharpxml: | |
1411 case XFA_ELEMENT_SharpxHTML: { | |
1412 CXFA_Node* pTextNode = GetNodeItem(XFA_NODEITEM_Parent); | |
1413 if (!pTextNode) { | |
1414 return; | |
1415 } | |
1416 CXFA_Node* pValueNode = pTextNode->GetNodeItem(XFA_NODEITEM_Parent); | |
1417 if (!pValueNode) { | |
1418 return; | |
1419 } | |
1420 XFA_ELEMENT eType = pValueNode->GetClassID(); | |
1421 if (eType == XFA_ELEMENT_Value) { | |
1422 bNeedFindContainer = TRUE; | |
1423 CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent); | |
1424 if (pNode && pNode->IsContainerNode()) { | |
1425 if (bScriptModify) { | |
1426 pValueNode = pNode; | |
1427 } | |
1428 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1429 eValue, pValueNode, pNode); | |
1430 } else { | |
1431 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1432 eValue, pNode, | |
1433 pNode->GetNodeItem(XFA_NODEITEM_Parent)); | |
1434 } | |
1435 } else { | |
1436 if (eType == XFA_ELEMENT_Items) { | |
1437 CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent); | |
1438 if (pNode && pNode->IsContainerNode()) { | |
1439 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, | |
1440 eValue, pValueNode, pNode); | |
1441 } | |
1442 } | |
1443 } | |
1444 } break; | |
1445 default: | |
1446 break; | |
1447 } | |
1448 if (bNeedFindContainer) { | |
1449 CXFA_Node* pParent = this; | |
1450 while (pParent) { | |
1451 if (pParent->IsContainerNode()) { | |
1452 break; | |
1453 } | |
1454 pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent); | |
1455 } | |
1456 if (pParent) { | |
1457 pLayoutPro->AddChangedContainer(pParent); | |
1458 } | |
1459 } | |
1460 } else { | |
1461 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue, | |
1462 this, this); | |
1463 } | |
1464 } | |
1465 void CXFA_Node::Script_Attribute_String(FXJSE_HVALUE hValue, | |
1466 FX_BOOL bSetting, | |
1467 XFA_ATTRIBUTE eAttribute) { | |
1468 if (bSetting) { | |
1469 CFX_ByteString szValue; | |
1470 FXJSE_Value_ToUTF8String(hValue, szValue); | |
1471 CFX_WideString wsValue = | |
1472 CFX_WideString::FromUTF8(szValue, szValue.GetLength()); | |
1473 SetAttribute(eAttribute, wsValue, TRUE); | |
1474 if (eAttribute == XFA_ATTRIBUTE_Use && GetClassID() == XFA_ELEMENT_Desc) { | |
1475 CFX_WideString wsUseVal = wsValue, wsID, wsSOM; | |
1476 CXFA_Node* pTemplateNode = | |
1477 ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Template)); | |
1478 CXFA_Node* pProtoRoot = | |
1479 pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Subform) | |
1480 ->GetFirstChildByClass(XFA_ELEMENT_Proto); | |
1481 if (!wsUseVal.IsEmpty()) { | |
1482 if (wsUseVal[0] == '#') { | |
1483 wsID = CFX_WideString((const FX_WCHAR*)wsUseVal + 1, | |
1484 wsUseVal.GetLength() - 1); | |
1485 } else { | |
1486 wsSOM = | |
1487 CFX_WideString((const FX_WCHAR*)wsUseVal, wsUseVal.GetLength()); | |
1488 } | |
1489 } | |
1490 CXFA_Node* pProtoNode = NULL; | |
1491 if (!wsSOM.IsEmpty()) { | |
1492 FX_DWORD dwFlag = XFA_RESOLVENODE_Children | | |
1493 XFA_RESOLVENODE_Attributes | | |
1494 XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent | | |
1495 XFA_RESOLVENODE_Siblings; | |
1496 XFA_RESOLVENODE_RS resoveNodeRS; | |
1497 int32_t iRet = m_pDocument->GetScriptContext()->ResolveObjects( | |
1498 pProtoRoot, wsSOM, resoveNodeRS, dwFlag); | |
1499 if (iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) { | |
1500 pProtoNode = resoveNodeRS.nodes[0]->AsNode(); | |
1501 } | |
1502 } else if (!wsID.IsEmpty()) { | |
1503 pProtoNode = m_pDocument->GetNodeByID(pProtoRoot, wsID); | |
1504 } | |
1505 if (pProtoNode) { | |
1506 CXFA_Node* pHeadChild = GetNodeItem(XFA_NODEITEM_FirstChild); | |
1507 while (pHeadChild) { | |
1508 CXFA_Node* pSibling = | |
1509 pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling); | |
1510 RemoveChild(pHeadChild); | |
1511 pHeadChild = pSibling; | |
1512 } | |
1513 CXFA_Node* pProtoForm = pProtoNode->CloneTemplateToForm(TRUE); | |
1514 pHeadChild = pProtoForm->GetNodeItem(XFA_NODEITEM_FirstChild); | |
1515 while (pHeadChild) { | |
1516 CXFA_Node* pSibling = | |
1517 pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling); | |
1518 pProtoForm->RemoveChild(pHeadChild); | |
1519 InsertChild(pHeadChild); | |
1520 pHeadChild = pSibling; | |
1521 } | |
1522 m_pDocument->RemovePurgeNode(pProtoForm); | |
1523 delete pProtoForm; | |
1524 } | |
1525 } | |
1526 } else { | |
1527 CFX_WideString wsValue; | |
1528 GetAttribute(eAttribute, wsValue); | |
1529 FXJSE_Value_SetUTF8String(hValue, | |
1530 FX_UTF8Encode(wsValue, wsValue.GetLength())); | |
1531 } | |
1532 } | |
1533 void CXFA_Node::Script_Attribute_StringRead(FXJSE_HVALUE hValue, | |
1534 FX_BOOL bSetting, | |
1535 XFA_ATTRIBUTE eAttribute) { | |
1536 if (!bSetting) { | |
1537 CFX_WideString wsValue; | |
1538 GetAttribute(eAttribute, wsValue); | |
1539 FXJSE_Value_SetUTF8String(hValue, | |
1540 FX_UTF8Encode(wsValue, wsValue.GetLength())); | |
1541 } else { | |
1542 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1543 } | |
1544 } | |
1545 void CXFA_Node::Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments) { | |
1546 int32_t argc = pArguments->GetLength(); | |
1547 if ((argc == 0) || (argc == 1)) { | |
1548 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); | |
1549 } else { | |
1550 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execute"); | |
1551 } | |
1552 } | |
1553 void CXFA_Node::Script_Delta_Restore(CFXJSE_Arguments* pArguments) { | |
1554 int32_t argc = pArguments->GetLength(); | |
1555 if (argc == 0) { | |
1556 } else { | |
1557 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"restore"); | |
1558 } | |
1559 } | |
1560 void CXFA_Node::Script_Delta_CurrentValue(FXJSE_HVALUE hValue, | |
1561 FX_BOOL bSetting, | |
1562 XFA_ATTRIBUTE eAttribute) {} | |
1563 void CXFA_Node::Script_Delta_SavedValue(FXJSE_HVALUE hValue, | |
1564 FX_BOOL bSetting, | |
1565 XFA_ATTRIBUTE eAttribute) {} | |
1566 void CXFA_Node::Script_Delta_Target(FXJSE_HVALUE hValue, | |
1567 FX_BOOL bSetting, | |
1568 XFA_ATTRIBUTE eAttribute) {} | |
1569 void CXFA_Node::Script_Som_Message(FXJSE_HVALUE hValue, | |
1570 FX_BOOL bSetting, | |
1571 XFA_SOM_MESSAGETYPE iMessageType) { | |
1572 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
1573 if (!pWidgetData) { | |
1574 return; | |
1575 } | |
1576 FX_BOOL bNew = FALSE; | |
1577 CXFA_Validate validate = pWidgetData->GetValidate(); | |
1578 if (!validate) { | |
1579 validate = pWidgetData->GetValidate(TRUE); | |
1580 bNew = TRUE; | |
1581 } | |
1582 if (bSetting) { | |
1583 CFX_ByteString bsMessage; | |
1584 FXJSE_Value_ToUTF8String(hValue, bsMessage); | |
1585 switch (iMessageType) { | |
1586 case XFA_SOM_ValidationMessage: | |
1587 validate.SetScriptMessageText( | |
1588 CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength())); | |
1589 break; | |
1590 case XFA_SOM_FormatMessage: | |
1591 validate.SetFormatMessageText( | |
1592 CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength())); | |
1593 break; | |
1594 case XFA_SOM_MandatoryMessage: | |
1595 validate.SetNullMessageText( | |
1596 CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength())); | |
1597 break; | |
1598 default: | |
1599 break; | |
1600 } | |
1601 if (!bNew) { | |
1602 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
1603 if (!pNotify) { | |
1604 return; | |
1605 } | |
1606 pNotify->AddCalcValidate(this); | |
1607 } | |
1608 } else { | |
1609 CFX_WideString wsMessage; | |
1610 switch (iMessageType) { | |
1611 case XFA_SOM_ValidationMessage: | |
1612 validate.GetScriptMessageText(wsMessage); | |
1613 break; | |
1614 case XFA_SOM_FormatMessage: | |
1615 validate.GetFormatMessageText(wsMessage); | |
1616 break; | |
1617 case XFA_SOM_MandatoryMessage: | |
1618 validate.GetNullMessageText(wsMessage); | |
1619 break; | |
1620 default: | |
1621 break; | |
1622 } | |
1623 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsMessage)); | |
1624 } | |
1625 } | |
1626 void CXFA_Node::Script_Som_ValidationMessage(FXJSE_HVALUE hValue, | |
1627 FX_BOOL bSetting, | |
1628 XFA_ATTRIBUTE eAttribute) { | |
1629 Script_Som_Message(hValue, bSetting, XFA_SOM_ValidationMessage); | |
1630 } | |
1631 void CXFA_Node::Script_Field_Length(FXJSE_HVALUE hValue, | |
1632 FX_BOOL bSetting, | |
1633 XFA_ATTRIBUTE eAttribute) { | |
1634 if (bSetting) { | |
1635 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1636 } else { | |
1637 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
1638 if (!pWidgetData) { | |
1639 FXJSE_Value_SetInteger(hValue, 0); | |
1640 return; | |
1641 } | |
1642 FXJSE_Value_SetInteger(hValue, pWidgetData->CountChoiceListItems(TRUE)); | |
1643 } | |
1644 } | |
1645 void CXFA_Node::Script_Som_DefaultValue(FXJSE_HVALUE hValue, | |
1646 FX_BOOL bSetting, | |
1647 XFA_ATTRIBUTE eAttribute) { | |
1648 XFA_ELEMENT classID = GetClassID(); | |
1649 if (classID == XFA_ELEMENT_Field) { | |
1650 Script_Field_DefaultValue(hValue, bSetting, eAttribute); | |
1651 return; | |
1652 } else if (classID == XFA_ELEMENT_Draw) { | |
1653 Script_Draw_DefaultValue(hValue, bSetting, eAttribute); | |
1654 return; | |
1655 } else if (classID == XFA_ELEMENT_Boolean) { | |
1656 Script_Boolean_Value(hValue, bSetting, eAttribute); | |
1657 return; | |
1658 } | |
1659 if (bSetting) { | |
1660 CFX_ByteString newValue; | |
1661 if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) { | |
1662 FXJSE_Value_ToUTF8String(hValue, newValue); | |
1663 } | |
1664 CFX_WideString wsNewValue = | |
1665 CFX_WideString::FromUTF8(newValue, newValue.GetLength()); | |
1666 CFX_WideString wsFormatValue(wsNewValue); | |
1667 CXFA_WidgetData* pContainerWidgetData = NULL; | |
1668 if (GetPacketID() == XFA_XDPPACKET_Datasets) { | |
1669 CXFA_NodeArray formNodes; | |
1670 GetBindItems(formNodes); | |
1671 CFX_WideString wsPicture; | |
1672 for (int32_t i = 0; i < formNodes.GetSize(); i++) { | |
1673 CXFA_Node* pFormNode = formNodes.GetAt(i); | |
1674 if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) { | |
1675 continue; | |
1676 } | |
1677 pContainerWidgetData = pFormNode->GetContainerWidgetData(); | |
1678 if (pContainerWidgetData) { | |
1679 pContainerWidgetData->GetPictureContent(wsPicture, | |
1680 XFA_VALUEPICTURE_DataBind); | |
1681 } | |
1682 if (!wsPicture.IsEmpty()) { | |
1683 break; | |
1684 } | |
1685 pContainerWidgetData = NULL; | |
1686 } | |
1687 } else if (GetPacketID() == XFA_XDPPACKET_Form) { | |
1688 pContainerWidgetData = GetContainerWidgetData(); | |
1689 } | |
1690 if (pContainerWidgetData) { | |
1691 pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue); | |
1692 } | |
1693 SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE); | |
1694 } else { | |
1695 CFX_WideString content = GetScriptContent(TRUE); | |
1696 if (content.IsEmpty() && classID != XFA_ELEMENT_Text && | |
1697 classID != XFA_ELEMENT_SubmitUrl) { | |
1698 FXJSE_Value_SetNull(hValue); | |
1699 } else if (classID == XFA_ELEMENT_Integer) { | |
1700 FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content)); | |
1701 } else if (classID == XFA_ELEMENT_Float || classID == XFA_ELEMENT_Decimal) { | |
1702 CFX_Decimal decimal(content); | |
1703 FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal); | |
1704 } else { | |
1705 FXJSE_Value_SetUTF8String(hValue, | |
1706 FX_UTF8Encode(content, content.GetLength())); | |
1707 } | |
1708 } | |
1709 } | |
1710 void CXFA_Node::Script_Som_DefaultValue_Read(FXJSE_HVALUE hValue, | |
1711 FX_BOOL bSetting, | |
1712 XFA_ATTRIBUTE eAttribute) { | |
1713 if (bSetting) { | |
1714 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1715 return; | |
1716 } | |
1717 CFX_WideString content = GetScriptContent(TRUE); | |
1718 if (content.IsEmpty()) { | |
1719 FXJSE_Value_SetNull(hValue); | |
1720 } else { | |
1721 FXJSE_Value_SetUTF8String(hValue, | |
1722 FX_UTF8Encode(content, content.GetLength())); | |
1723 } | |
1724 } | |
1725 void CXFA_Node::Script_Boolean_Value(FXJSE_HVALUE hValue, | |
1726 FX_BOOL bSetting, | |
1727 XFA_ATTRIBUTE eAttribute) { | |
1728 if (bSetting) { | |
1729 CFX_ByteString newValue; | |
1730 if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) { | |
1731 FXJSE_Value_ToUTF8String(hValue, newValue); | |
1732 } | |
1733 int32_t iValue = FXSYS_atoi(newValue); | |
1734 CFX_WideString wsNewValue = (iValue == 0) ? FX_WSTRC(L"0") : FX_WSTRC(L"1"); | |
1735 CFX_WideString wsFormatValue(wsNewValue); | |
1736 CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData(); | |
1737 if (pContainerWidgetData) { | |
1738 pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue); | |
1739 } | |
1740 SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE); | |
1741 } else { | |
1742 CFX_WideString wsValue = GetScriptContent(TRUE); | |
1743 FXJSE_Value_SetBoolean(hValue, wsValue.Equal(FX_WSTRC(L"1"))); | |
1744 } | |
1745 } | |
1746 struct XFA_ExecEventParaInfo { | |
1747 public: | |
1748 uint32_t m_uHash; | |
1749 const FX_WCHAR* m_lpcEventName; | |
1750 XFA_EVENTTYPE m_eventType; | |
1751 uint32_t m_validFlags; | |
1752 }; | |
1753 static const XFA_ExecEventParaInfo gs_eventParaInfos[] = { | |
1754 {0x02a6c55a, L"postSubmit", XFA_EVENT_PostSubmit, 0}, | |
1755 {0x0ab466bb, L"preSubmit", XFA_EVENT_PreSubmit, 0}, | |
1756 {0x109d7ce7, L"mouseEnter", XFA_EVENT_MouseEnter, 5}, | |
1757 {0x17fad373, L"postPrint", XFA_EVENT_PostPrint, 0}, | |
1758 {0x1bfc72d9, L"preOpen", XFA_EVENT_PreOpen, 7}, | |
1759 {0x2196a452, L"initialize", XFA_EVENT_Initialize, 1}, | |
1760 {0x27410f03, L"mouseExit", XFA_EVENT_MouseExit, 5}, | |
1761 {0x33c43dec, L"docClose", XFA_EVENT_DocClose, 0}, | |
1762 {0x361fa1b6, L"preSave", XFA_EVENT_PreSave, 0}, | |
1763 {0x36f1c6d8, L"preSign", XFA_EVENT_PreSign, 6}, | |
1764 {0x4731d6ba, L"exit", XFA_EVENT_Exit, 2}, | |
1765 {0x56bf456b, L"docReady", XFA_EVENT_DocReady, 0}, | |
1766 {0x7233018a, L"validate", XFA_EVENT_Validate, 1}, | |
1767 {0x8808385e, L"indexChange", XFA_EVENT_IndexChange, 3}, | |
1768 {0x891f4606, L"change", XFA_EVENT_Change, 4}, | |
1769 {0x9528a7b4, L"prePrint", XFA_EVENT_PrePrint, 0}, | |
1770 {0x9f693b21, L"mouseDown", XFA_EVENT_MouseDown, 5}, | |
1771 {0xcdce56b3, L"full", XFA_EVENT_Full, 4}, | |
1772 {0xd576d08e, L"mouseUp", XFA_EVENT_MouseUp, 5}, | |
1773 {0xd95657a6, L"click", XFA_EVENT_Click, 4}, | |
1774 {0xdbfbe02e, L"calculate", XFA_EVENT_Calculate, 1}, | |
1775 {0xe25fa7b8, L"postOpen", XFA_EVENT_PostOpen, 7}, | |
1776 {0xe28dce7e, L"enter", XFA_EVENT_Enter, 2}, | |
1777 {0xfc82d695, L"postSave", XFA_EVENT_PostSave, 0}, | |
1778 {0xfd54fbb7, L"postSign", XFA_EVENT_PostSign, 6}, | |
1779 }; | |
1780 const XFA_ExecEventParaInfo* GetEventParaInfoByName( | |
1781 const CFX_WideStringC& wsEventName) { | |
1782 int32_t iLength = wsEventName.GetLength(); | |
1783 uint32_t uHash = FX_HashCode_String_GetW(wsEventName.GetPtr(), iLength); | |
1784 const XFA_ExecEventParaInfo* eventParaInfo = NULL; | |
1785 int32_t iStart = 0, | |
1786 iEnd = (sizeof(gs_eventParaInfos) / sizeof(gs_eventParaInfos[0])) - 1; | |
1787 int32_t iMid = (iStart + iEnd) / 2; | |
1788 do { | |
1789 iMid = (iStart + iEnd) / 2; | |
1790 eventParaInfo = &gs_eventParaInfos[iMid]; | |
1791 if (uHash == eventParaInfo->m_uHash) { | |
1792 return eventParaInfo; | |
1793 } else if (uHash < eventParaInfo->m_uHash) { | |
1794 iEnd = iMid - 1; | |
1795 } else { | |
1796 iStart = iMid + 1; | |
1797 } | |
1798 } while (iStart <= iEnd); | |
1799 return NULL; | |
1800 } | |
1801 void XFA_STRING_TO_RGB(CFX_WideString& strRGB, | |
1802 int32_t& r, | |
1803 int32_t& g, | |
1804 int32_t& b) { | |
1805 r = 0; | |
1806 g = 0; | |
1807 b = 0; | |
1808 FX_WCHAR zero = '0'; | |
1809 int32_t iIndex = 0; | |
1810 int32_t iLen = strRGB.GetLength(); | |
1811 for (int32_t i = 0; i < iLen; ++i) { | |
1812 FX_WCHAR ch = strRGB.GetAt(i); | |
1813 if (ch == L',') { | |
1814 ++iIndex; | |
1815 } | |
1816 if (iIndex > 2) { | |
1817 break; | |
1818 } | |
1819 int32_t iValue = ch - zero; | |
1820 if (iValue >= 0 && iValue <= 9) { | |
1821 switch (iIndex) { | |
1822 case 0: | |
1823 r = r * 10 + iValue; | |
1824 break; | |
1825 case 1: | |
1826 g = g * 10 + iValue; | |
1827 break; | |
1828 default: | |
1829 b = b * 10 + iValue; | |
1830 break; | |
1831 } | |
1832 } | |
1833 } | |
1834 } | |
1835 void CXFA_Node::Script_Som_BorderColor(FXJSE_HVALUE hValue, | |
1836 FX_BOOL bSetting, | |
1837 XFA_ATTRIBUTE eAttribute) { | |
1838 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
1839 if (!pWidgetData) { | |
1840 return; | |
1841 } | |
1842 CXFA_Border border = pWidgetData->GetBorder(TRUE); | |
1843 int32_t iSize = border.CountEdges(); | |
1844 CFX_WideString strColor; | |
1845 if (bSetting) { | |
1846 CFX_ByteString bsValue; | |
1847 FXJSE_Value_ToUTF8String(hValue, bsValue); | |
1848 strColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
1849 int32_t r = 0, g = 0, b = 0; | |
1850 XFA_STRING_TO_RGB(strColor, r, g, b); | |
1851 FX_ARGB rgb = ArgbEncode(100, r, g, b); | |
1852 for (int32_t i = 0; i < iSize; ++i) { | |
1853 CXFA_Edge edge = border.GetEdge(i); | |
1854 edge.SetColor(rgb); | |
1855 } | |
1856 } else { | |
1857 CXFA_Edge edge = border.GetEdge(0); | |
1858 FX_ARGB color = edge.GetColor(); | |
1859 int32_t a, r, g, b; | |
1860 ArgbDecode(color, a, r, g, b); | |
1861 strColor.Format(L"%d,%d,%d", r, g, b); | |
1862 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(strColor)); | |
1863 } | |
1864 } | |
1865 void CXFA_Node::Script_Som_BorderWidth(FXJSE_HVALUE hValue, | |
1866 FX_BOOL bSetting, | |
1867 XFA_ATTRIBUTE eAttribute) { | |
1868 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
1869 if (!pWidgetData) { | |
1870 return; | |
1871 } | |
1872 CXFA_Border border = pWidgetData->GetBorder(TRUE); | |
1873 int32_t iSize = border.CountEdges(); | |
1874 CFX_WideString wsThickness; | |
1875 if (bSetting) { | |
1876 CFX_ByteString bsValue; | |
1877 FXJSE_Value_ToUTF8String(hValue, bsValue); | |
1878 wsThickness = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
1879 for (int32_t i = 0; i < iSize; ++i) { | |
1880 CXFA_Edge edge = border.GetEdge(i); | |
1881 CXFA_Measurement thickness(wsThickness); | |
1882 edge.SetMSThickness(thickness); | |
1883 } | |
1884 } else { | |
1885 CXFA_Edge edge = border.GetEdge(0); | |
1886 CXFA_Measurement thickness = edge.GetMSThickness(); | |
1887 thickness.ToString(wsThickness); | |
1888 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsThickness)); | |
1889 } | |
1890 } | |
1891 void CXFA_Node::Script_Som_FillColor(FXJSE_HVALUE hValue, | |
1892 FX_BOOL bSetting, | |
1893 XFA_ATTRIBUTE eAttribute) { | |
1894 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
1895 if (!pWidgetData) { | |
1896 return; | |
1897 } | |
1898 CXFA_Border border = pWidgetData->GetBorder(TRUE); | |
1899 CXFA_Fill borderfill = border.GetFill(TRUE); | |
1900 CXFA_Node* pNode = borderfill.GetNode(); | |
1901 if (!pNode) { | |
1902 return; | |
1903 } | |
1904 CFX_WideString wsColor; | |
1905 if (bSetting) { | |
1906 CFX_ByteString bsValue; | |
1907 FXJSE_Value_ToUTF8String(hValue, bsValue); | |
1908 wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
1909 int32_t r, g, b; | |
1910 XFA_STRING_TO_RGB(wsColor, r, g, b); | |
1911 FX_ARGB color = ArgbEncode(0xff, r, g, b); | |
1912 borderfill.SetColor(color); | |
1913 } else { | |
1914 FX_ARGB color = borderfill.GetColor(); | |
1915 int32_t a, r, g, b; | |
1916 ArgbDecode(color, a, r, g, b); | |
1917 wsColor.Format(L"%d,%d,%d", r, g, b); | |
1918 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor)); | |
1919 } | |
1920 } | |
1921 void CXFA_Node::Script_Som_DataNode(FXJSE_HVALUE hValue, | |
1922 FX_BOOL bSetting, | |
1923 XFA_ATTRIBUTE eAttribute) { | |
1924 if (!bSetting) { | |
1925 CXFA_Node* pDataNode = GetBindData(); | |
1926 if (pDataNode) { | |
1927 FXJSE_Value_Set( | |
1928 hValue, | |
1929 m_pDocument->GetScriptContext()->GetJSValueFromMap(pDataNode)); | |
1930 } else { | |
1931 FXJSE_Value_SetNull(hValue); | |
1932 } | |
1933 } else { | |
1934 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
1935 } | |
1936 } | |
1937 void CXFA_Node::Script_Draw_DefaultValue(FXJSE_HVALUE hValue, | |
1938 FX_BOOL bSetting, | |
1939 XFA_ATTRIBUTE eAttribute) { | |
1940 if (bSetting) { | |
1941 if (FXJSE_Value_IsUTF8String(hValue)) { | |
1942 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
1943 FXSYS_assert(pWidgetData); | |
1944 XFA_ELEMENT uiType = pWidgetData->GetUIType(); | |
1945 if (uiType == XFA_ELEMENT_Text) { | |
1946 CFX_ByteString newValue; | |
1947 FXJSE_Value_ToUTF8String(hValue, newValue); | |
1948 CFX_WideString wsNewValue = | |
1949 CFX_WideString::FromUTF8(newValue, newValue.GetLength()); | |
1950 CFX_WideString wsFormatValue(wsNewValue); | |
1951 SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE); | |
1952 } else if (uiType != XFA_ELEMENT_Image) { | |
1953 } | |
1954 } | |
1955 } else { | |
1956 CFX_WideString content = GetScriptContent(TRUE); | |
1957 if (content.IsEmpty()) { | |
1958 FXJSE_Value_SetNull(hValue); | |
1959 } else { | |
1960 FXJSE_Value_SetUTF8String(hValue, | |
1961 FX_UTF8Encode(content, content.GetLength())); | |
1962 } | |
1963 } | |
1964 } | |
1965 void CXFA_Node::Script_Field_DefaultValue(FXJSE_HVALUE hValue, | |
1966 FX_BOOL bSetting, | |
1967 XFA_ATTRIBUTE eAttribute) { | |
1968 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
1969 if (!pWidgetData) { | |
1970 return; | |
1971 } | |
1972 if (bSetting) { | |
1973 if (FXJSE_Value_IsNull(hValue)) { | |
1974 pWidgetData->m_bPreNull = pWidgetData->m_bIsNull; | |
1975 pWidgetData->m_bIsNull = TRUE; | |
1976 } else { | |
1977 pWidgetData->m_bPreNull = pWidgetData->m_bIsNull; | |
1978 pWidgetData->m_bIsNull = FALSE; | |
1979 } | |
1980 CFX_ByteString newValue; | |
1981 if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) { | |
1982 FXJSE_Value_ToUTF8String(hValue, newValue); | |
1983 } | |
1984 CFX_WideString wsNewText = | |
1985 CFX_WideString::FromUTF8(newValue, newValue.GetLength()); | |
1986 CXFA_Node* pUIChild = pWidgetData->GetUIChild(); | |
1987 if (pUIChild->GetClassID() == XFA_ELEMENT_NumericEdit) { | |
1988 int32_t iLeadDigits = 0; | |
1989 int32_t iFracDigits = 0; | |
1990 pWidgetData->GetLeadDigits(iLeadDigits); | |
1991 pWidgetData->GetFracDigits(iFracDigits); | |
1992 wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits); | |
1993 } | |
1994 CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData(); | |
1995 CFX_WideString wsFormatText(wsNewText); | |
1996 if (pContainerWidgetData) { | |
1997 pContainerWidgetData->GetFormatDataValue(wsNewText, wsFormatText); | |
1998 } | |
1999 SetScriptContent(wsNewText, wsFormatText, TRUE, TRUE); | |
2000 } else { | |
2001 CFX_WideString content = GetScriptContent(TRUE); | |
2002 if (content.IsEmpty()) { | |
2003 FXJSE_Value_SetNull(hValue); | |
2004 } else { | |
2005 CXFA_Node* pUIChild = pWidgetData->GetUIChild(); | |
2006 XFA_ELEMENT eUI = pUIChild->GetClassID(); | |
2007 CXFA_Value defVal = pWidgetData->GetFormValue(); | |
2008 CXFA_Node* pNode = defVal.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild); | |
2009 if (pNode && pNode->GetClassID() == XFA_ELEMENT_Decimal) { | |
2010 if (eUI == XFA_ELEMENT_NumericEdit && | |
2011 (pNode->GetInteger(XFA_ATTRIBUTE_FracDigits) == -1)) { | |
2012 FXJSE_Value_SetUTF8String( | |
2013 hValue, FX_UTF8Encode(content, content.GetLength())); | |
2014 } else { | |
2015 CFX_Decimal decimal(content); | |
2016 FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal); | |
2017 } | |
2018 } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Integer) { | |
2019 FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content)); | |
2020 } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Boolean) { | |
2021 FXJSE_Value_SetBoolean(hValue, FXSYS_wtoi(content) == 0 ? FALSE : TRUE); | |
2022 } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Float) { | |
2023 CFX_Decimal decimal(content); | |
2024 FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal); | |
2025 } else { | |
2026 FXJSE_Value_SetUTF8String(hValue, | |
2027 FX_UTF8Encode(content, content.GetLength())); | |
2028 } | |
2029 } | |
2030 } | |
2031 } | |
2032 void CXFA_Node::Script_Field_EditValue(FXJSE_HVALUE hValue, | |
2033 FX_BOOL bSetting, | |
2034 XFA_ATTRIBUTE eAttribute) { | |
2035 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2036 if (!pWidgetData) { | |
2037 return; | |
2038 } | |
2039 CFX_WideString wsValue; | |
2040 if (bSetting) { | |
2041 CFX_ByteString bsValue; | |
2042 FXJSE_Value_ToUTF8String(hValue, bsValue); | |
2043 wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
2044 pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Edit); | |
2045 } else { | |
2046 pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Edit); | |
2047 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); | |
2048 } | |
2049 } | |
2050 void CXFA_Node::Script_Som_FontColor(FXJSE_HVALUE hValue, | |
2051 FX_BOOL bSetting, | |
2052 XFA_ATTRIBUTE eAttribute) { | |
2053 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2054 if (!pWidgetData) { | |
2055 return; | |
2056 } | |
2057 CXFA_Font font = pWidgetData->GetFont(TRUE); | |
2058 CXFA_Node* pNode = font.GetNode(); | |
2059 if (!pNode) { | |
2060 return; | |
2061 } | |
2062 CFX_WideString wsColor; | |
2063 if (bSetting) { | |
2064 CFX_ByteString bsValue; | |
2065 FXJSE_Value_ToUTF8String(hValue, bsValue); | |
2066 wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
2067 int32_t r, g, b; | |
2068 XFA_STRING_TO_RGB(wsColor, r, g, b); | |
2069 FX_ARGB color = ArgbEncode(0xff, r, g, b); | |
2070 font.SetColor(color); | |
2071 } else { | |
2072 FX_ARGB color = font.GetColor(); | |
2073 int32_t a, r, g, b; | |
2074 ArgbDecode(color, a, r, g, b); | |
2075 wsColor.Format(L"%d,%d,%d", r, g, b); | |
2076 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor)); | |
2077 } | |
2078 } | |
2079 void CXFA_Node::Script_Field_FormatMessage(FXJSE_HVALUE hValue, | |
2080 FX_BOOL bSetting, | |
2081 XFA_ATTRIBUTE eAttribute) { | |
2082 Script_Som_Message(hValue, bSetting, XFA_SOM_FormatMessage); | |
2083 } | |
2084 void CXFA_Node::Script_Field_FormattedValue(FXJSE_HVALUE hValue, | |
2085 FX_BOOL bSetting, | |
2086 XFA_ATTRIBUTE eAttribute) { | |
2087 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2088 if (!pWidgetData) { | |
2089 return; | |
2090 } | |
2091 CFX_WideString wsValue; | |
2092 if (bSetting) { | |
2093 CFX_ByteString bsValue; | |
2094 FXJSE_Value_ToUTF8String(hValue, bsValue); | |
2095 wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
2096 pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Display); | |
2097 } else { | |
2098 pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Display); | |
2099 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); | |
2100 } | |
2101 } | |
2102 void CXFA_Node::Script_Som_Mandatory(FXJSE_HVALUE hValue, | |
2103 FX_BOOL bSetting, | |
2104 XFA_ATTRIBUTE eAttribute) { | |
2105 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2106 if (!pWidgetData) { | |
2107 return; | |
2108 } | |
2109 CXFA_Validate validate = pWidgetData->GetValidate(TRUE); | |
2110 CFX_WideString wsValue; | |
2111 if (bSetting) { | |
2112 CFX_ByteString bsValue; | |
2113 FXJSE_Value_ToUTF8String(hValue, bsValue); | |
2114 wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
2115 validate.SetNullTest(wsValue); | |
2116 } else { | |
2117 int32_t iValue = validate.GetNullTest(); | |
2118 const XFA_ATTRIBUTEENUMINFO* pInfo = | |
2119 XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)iValue); | |
2120 if (pInfo) { | |
2121 wsValue = pInfo->pName; | |
2122 } | |
2123 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); | |
2124 } | |
2125 } | |
2126 void CXFA_Node::Script_Som_MandatoryMessage(FXJSE_HVALUE hValue, | |
2127 FX_BOOL bSetting, | |
2128 XFA_ATTRIBUTE eAttribute) { | |
2129 Script_Som_Message(hValue, bSetting, XFA_SOM_MandatoryMessage); | |
2130 } | |
2131 void CXFA_Node::Script_Field_ParentSubform(FXJSE_HVALUE hValue, | |
2132 FX_BOOL bSetting, | |
2133 XFA_ATTRIBUTE eAttribute) { | |
2134 if (bSetting) { | |
2135 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
2136 } else { | |
2137 FXJSE_Value_SetNull(hValue); | |
2138 } | |
2139 } | |
2140 void CXFA_Node::Script_Field_SelectedIndex(FXJSE_HVALUE hValue, | |
2141 FX_BOOL bSetting, | |
2142 XFA_ATTRIBUTE eAttribute) { | |
2143 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2144 if (!pWidgetData) { | |
2145 return; | |
2146 } | |
2147 if (bSetting) { | |
2148 int32_t iIndex = FXJSE_Value_ToInteger(hValue); | |
2149 if (iIndex == -1) { | |
2150 pWidgetData->ClearAllSelections(); | |
2151 return; | |
2152 } | |
2153 pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE); | |
2154 } else { | |
2155 FXJSE_Value_SetInteger(hValue, pWidgetData->GetSelectedItem()); | |
2156 } | |
2157 } | |
2158 void CXFA_Node::Script_Field_ClearItems(CFXJSE_Arguments* pArguments) { | |
2159 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2160 if (!pWidgetData) { | |
2161 return; | |
2162 } | |
2163 pWidgetData->DeleteItem(-1, TRUE); | |
2164 } | |
2165 void CXFA_Node::Script_Field_ExecEvent(CFXJSE_Arguments* pArguments) { | |
2166 int32_t argc = pArguments->GetLength(); | |
2167 if (argc == 1) { | |
2168 CFX_ByteString eventString = pArguments->GetUTF8String(0); | |
2169 int32_t iRet = execSingleEventByName( | |
2170 CFX_WideString::FromUTF8(eventString, eventString.GetLength()), | |
2171 XFA_ELEMENT_Field); | |
2172 if (eventString == "validate") { | |
2173 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), | |
2174 ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); | |
2175 } | |
2176 } else { | |
2177 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent"); | |
2178 } | |
2179 } | |
2180 void CXFA_Node::Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments) { | |
2181 int32_t argc = pArguments->GetLength(); | |
2182 if (argc == 0) { | |
2183 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2184 if (!pNotify) { | |
2185 return; | |
2186 } | |
2187 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize, FALSE, FALSE); | |
2188 } else { | |
2189 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2190 L"execInitialize"); | |
2191 } | |
2192 } | |
2193 void CXFA_Node::Script_Field_DeleteItem(CFXJSE_Arguments* pArguments) { | |
2194 int32_t iLength = pArguments->GetLength(); | |
2195 if (iLength != 1) { | |
2196 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"deleteItem"); | |
2197 return; | |
2198 } | |
2199 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2200 if (!pWidgetData) { | |
2201 return; | |
2202 } | |
2203 int32_t iIndex = pArguments->GetInt32(0); | |
2204 FX_BOOL bValue = pWidgetData->DeleteItem(iIndex, TRUE, TRUE); | |
2205 FXJSE_HVALUE hValue = pArguments->GetReturnValue(); | |
2206 if (hValue) { | |
2207 FXJSE_Value_SetBoolean(hValue, bValue); | |
2208 } | |
2209 } | |
2210 void CXFA_Node::Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments) { | |
2211 int32_t iLength = pArguments->GetLength(); | |
2212 if (iLength != 1) { | |
2213 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getSaveItem"); | |
2214 return; | |
2215 } | |
2216 int32_t iIndex = pArguments->GetInt32(0); | |
2217 if (iIndex < 0) { | |
2218 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
2219 return; | |
2220 } | |
2221 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2222 if (!pWidgetData) { | |
2223 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
2224 return; | |
2225 } | |
2226 CFX_WideString wsValue; | |
2227 FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, TRUE); | |
2228 if (bHasItem) { | |
2229 FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), | |
2230 FX_UTF8Encode(wsValue, wsValue.GetLength())); | |
2231 } else { | |
2232 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
2233 } | |
2234 } | |
2235 void CXFA_Node::Script_Field_BoundItem(CFXJSE_Arguments* pArguments) { | |
2236 int32_t iLength = pArguments->GetLength(); | |
2237 if (iLength != 1) { | |
2238 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"boundItem"); | |
2239 return; | |
2240 } | |
2241 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2242 if (!pWidgetData) { | |
2243 return; | |
2244 } | |
2245 CFX_ByteString bsValue = pArguments->GetUTF8String(0); | |
2246 CFX_WideString wsValue = | |
2247 CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
2248 CFX_WideString wsBoundValue; | |
2249 pWidgetData->GetItemValue(wsValue, wsBoundValue); | |
2250 FXJSE_HVALUE hValue = pArguments->GetReturnValue(); | |
2251 if (hValue) { | |
2252 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsBoundValue)); | |
2253 } | |
2254 } | |
2255 void CXFA_Node::Script_Field_GetItemState(CFXJSE_Arguments* pArguments) { | |
2256 int32_t iLength = pArguments->GetLength(); | |
2257 if (iLength != 1) { | |
2258 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2259 L"getItemState"); | |
2260 return; | |
2261 } | |
2262 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2263 if (!pWidgetData) { | |
2264 return; | |
2265 } | |
2266 int32_t iIndex = pArguments->GetInt32(0); | |
2267 FX_BOOL bValue = pWidgetData->GetItemState(iIndex); | |
2268 FXJSE_HVALUE hValue = pArguments->GetReturnValue(); | |
2269 if (hValue) { | |
2270 FXJSE_Value_SetBoolean(hValue, bValue); | |
2271 } | |
2272 } | |
2273 void CXFA_Node::Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments) { | |
2274 int32_t argc = pArguments->GetLength(); | |
2275 if (argc == 0) { | |
2276 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2277 if (!pNotify) { | |
2278 return; | |
2279 } | |
2280 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate, FALSE, FALSE); | |
2281 } else { | |
2282 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2283 L"execCalculate"); | |
2284 } | |
2285 } | |
2286 void CXFA_Node::Script_Field_SetItems(CFXJSE_Arguments* pArguments) {} | |
2287 void CXFA_Node::Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments) { | |
2288 int32_t iLength = pArguments->GetLength(); | |
2289 if (iLength != 1) { | |
2290 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2291 L"getDisplayItem"); | |
2292 return; | |
2293 } | |
2294 int32_t iIndex = pArguments->GetInt32(0); | |
2295 if (iIndex < 0) { | |
2296 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
2297 return; | |
2298 } | |
2299 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2300 if (!pWidgetData) { | |
2301 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
2302 return; | |
2303 } | |
2304 CFX_WideString wsValue; | |
2305 FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, FALSE); | |
2306 if (bHasItem) { | |
2307 FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), | |
2308 FX_UTF8Encode(wsValue, wsValue.GetLength())); | |
2309 } else { | |
2310 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
2311 } | |
2312 } | |
2313 void CXFA_Node::Script_Field_SetItemState(CFXJSE_Arguments* pArguments) { | |
2314 int32_t iLength = pArguments->GetLength(); | |
2315 if (iLength != 2) { | |
2316 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2317 L"setItemState"); | |
2318 return; | |
2319 } | |
2320 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2321 if (!pWidgetData) { | |
2322 return; | |
2323 } | |
2324 int32_t iIndex = pArguments->GetInt32(0); | |
2325 if (pArguments->GetInt32(1) != 0) { | |
2326 pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE); | |
2327 } else { | |
2328 if (pWidgetData->GetItemState(iIndex)) { | |
2329 pWidgetData->SetItemState(iIndex, FALSE, TRUE, TRUE); | |
2330 } | |
2331 } | |
2332 } | |
2333 void CXFA_Node::Script_Field_AddItem(CFXJSE_Arguments* pArguments) { | |
2334 int32_t iLength = pArguments->GetLength(); | |
2335 if (iLength < 1 || iLength > 2) { | |
2336 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addItem"); | |
2337 return; | |
2338 } | |
2339 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2340 if (!pWidgetData) { | |
2341 return; | |
2342 } | |
2343 CFX_WideString wsLabel; | |
2344 CFX_WideString wsValue; | |
2345 if (iLength >= 1) { | |
2346 CFX_ByteString bsLable = pArguments->GetUTF8String(0); | |
2347 wsLabel = CFX_WideString::FromUTF8(bsLable, bsLable.GetLength()); | |
2348 } | |
2349 if (iLength >= 2) { | |
2350 CFX_ByteString bsValue = pArguments->GetUTF8String(1); | |
2351 wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()); | |
2352 } | |
2353 pWidgetData->InsertItem(wsLabel, wsValue, -1, TRUE); | |
2354 } | |
2355 void CXFA_Node::Script_Field_ExecValidate(CFXJSE_Arguments* pArguments) { | |
2356 int32_t argc = pArguments->GetLength(); | |
2357 if (argc == 0) { | |
2358 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2359 if (!pNotify) { | |
2360 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); | |
2361 } else { | |
2362 int32_t iRet = | |
2363 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate, FALSE, FALSE); | |
2364 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), | |
2365 ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); | |
2366 } | |
2367 } else { | |
2368 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2369 L"execValidate"); | |
2370 } | |
2371 } | |
2372 void CXFA_Node::Script_ExclGroup_ErrorText(FXJSE_HVALUE hValue, | |
2373 FX_BOOL bSetting, | |
2374 XFA_ATTRIBUTE eAttribute) { | |
2375 if (!bSetting) { | |
2376 } else { | |
2377 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
2378 } | |
2379 } | |
2380 void CXFA_Node::Script_ExclGroup_DefaultAndRawValue(FXJSE_HVALUE hValue, | |
2381 FX_BOOL bSetting, | |
2382 XFA_ATTRIBUTE eAttribute) { | |
2383 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2384 if (!pWidgetData) { | |
2385 return; | |
2386 } | |
2387 if (bSetting) { | |
2388 CFX_ByteString bsValue; | |
2389 FXJSE_Value_ToUTF8String(hValue, bsValue); | |
2390 pWidgetData->SetSelectedMemberByValue( | |
2391 CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()), TRUE, TRUE); | |
2392 } else { | |
2393 CFX_WideString wsValue = GetScriptContent(TRUE); | |
2394 XFA_VERSION curVersion = GetDocument()->GetCurVersionMode(); | |
2395 if (wsValue.IsEmpty() && curVersion >= XFA_VERSION_300) { | |
2396 FXJSE_Value_SetNull(hValue); | |
2397 } else { | |
2398 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue)); | |
2399 } | |
2400 } | |
2401 } | |
2402 void CXFA_Node::Script_ExclGroup_Transient(FXJSE_HVALUE hValue, | |
2403 FX_BOOL bSetting, | |
2404 XFA_ATTRIBUTE eAttribute) {} | |
2405 void CXFA_Node::Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments) { | |
2406 int32_t argc = pArguments->GetLength(); | |
2407 if (argc == 1) { | |
2408 CFX_ByteString eventString = pArguments->GetUTF8String(0); | |
2409 execSingleEventByName( | |
2410 CFX_WideString::FromUTF8(eventString, eventString.GetLength()), | |
2411 XFA_ELEMENT_ExclGroup); | |
2412 } else { | |
2413 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent"); | |
2414 } | |
2415 } | |
2416 void CXFA_Node::Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments) { | |
2417 int32_t argc = pArguments->GetLength(); | |
2418 if ((argc == 0) || (argc == 1)) { | |
2419 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2420 if (!pWidgetData) { | |
2421 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
2422 } else { | |
2423 CXFA_Node* pReturnNode = NULL; | |
2424 if (argc == 0) { | |
2425 pReturnNode = pWidgetData->GetSelectedMember(); | |
2426 } else { | |
2427 CFX_ByteString szName; | |
2428 szName = pArguments->GetUTF8String(0); | |
2429 pReturnNode = pWidgetData->SetSelectedMember( | |
2430 CFX_WideString::FromUTF8(szName, szName.GetLength())); | |
2431 } | |
2432 if (pReturnNode) { | |
2433 FXJSE_Value_Set( | |
2434 pArguments->GetReturnValue(), | |
2435 m_pDocument->GetScriptContext()->GetJSValueFromMap(pReturnNode)); | |
2436 } else { | |
2437 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
2438 } | |
2439 } | |
2440 } else { | |
2441 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2442 L"selectedMember"); | |
2443 } | |
2444 } | |
2445 void CXFA_Node::Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments) { | |
2446 int32_t argc = pArguments->GetLength(); | |
2447 if (argc == 0) { | |
2448 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2449 if (!pNotify) { | |
2450 return; | |
2451 } | |
2452 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize); | |
2453 } else { | |
2454 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2455 L"execInitialize"); | |
2456 } | |
2457 } | |
2458 void CXFA_Node::Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments) { | |
2459 int32_t argc = pArguments->GetLength(); | |
2460 if (argc == 0) { | |
2461 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2462 if (!pNotify) { | |
2463 return; | |
2464 } | |
2465 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate); | |
2466 } else { | |
2467 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2468 L"execCalculate"); | |
2469 } | |
2470 } | |
2471 void CXFA_Node::Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments) { | |
2472 int32_t argc = pArguments->GetLength(); | |
2473 if (argc == 0) { | |
2474 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2475 if (!pNotify) { | |
2476 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); | |
2477 } else { | |
2478 int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate); | |
2479 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), | |
2480 ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); | |
2481 } | |
2482 } else { | |
2483 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2484 L"execValidate"); | |
2485 } | |
2486 } | |
2487 static CXFA_Node* XFA_ScriptInstanceManager_GetItem(CXFA_Node* pInstMgrNode, | |
2488 int32_t iIndex) { | |
2489 ASSERT(pInstMgrNode); | |
2490 int32_t iCount = 0; | |
2491 FX_DWORD dwNameHash = 0; | |
2492 for (CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling); | |
2493 pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
2494 XFA_ELEMENT eCurType = pNode->GetClassID(); | |
2495 if (eCurType == XFA_ELEMENT_InstanceManager) { | |
2496 break; | |
2497 } | |
2498 if ((eCurType != XFA_ELEMENT_Subform) && | |
2499 (eCurType != XFA_ELEMENT_SubformSet)) { | |
2500 continue; | |
2501 } | |
2502 if (iCount == 0) { | |
2503 CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name); | |
2504 CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name); | |
2505 if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' || | |
2506 wsInstName.Mid(1) != wsName) { | |
2507 return NULL; | |
2508 } | |
2509 dwNameHash = pNode->GetNameHash(); | |
2510 } | |
2511 if (dwNameHash != pNode->GetNameHash()) { | |
2512 break; | |
2513 } | |
2514 iCount++; | |
2515 if (iCount > iIndex) { | |
2516 return pNode; | |
2517 } | |
2518 } | |
2519 return NULL; | |
2520 } | |
2521 void CXFA_Node::Script_Som_InstanceIndex(FXJSE_HVALUE hValue, | |
2522 FX_BOOL bSetting, | |
2523 XFA_ATTRIBUTE eAttribute) { | |
2524 if (bSetting) { | |
2525 int32_t iTo = FXJSE_Value_ToInteger(hValue); | |
2526 int32_t iFrom = Subform_and_SubformSet_InstanceIndex(); | |
2527 CXFA_Node* pManagerNode = NULL; | |
2528 for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode; | |
2529 pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) { | |
2530 if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) { | |
2531 pManagerNode = pNode; | |
2532 break; | |
2533 } | |
2534 } | |
2535 if (pManagerNode) { | |
2536 pManagerNode->InstanceManager_MoveInstance(iTo, iFrom); | |
2537 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2538 if (!pNotify) { | |
2539 return; | |
2540 } | |
2541 CXFA_Node* pToInstance = | |
2542 XFA_ScriptInstanceManager_GetItem(pManagerNode, iTo); | |
2543 if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) { | |
2544 pNotify->RunSubformIndexChange(pToInstance); | |
2545 } | |
2546 CXFA_Node* pFromInstance = | |
2547 XFA_ScriptInstanceManager_GetItem(pManagerNode, iFrom); | |
2548 if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) { | |
2549 pNotify->RunSubformIndexChange(pFromInstance); | |
2550 } | |
2551 } | |
2552 } else { | |
2553 FXJSE_Value_SetInteger(hValue, Subform_and_SubformSet_InstanceIndex()); | |
2554 } | |
2555 } | |
2556 void CXFA_Node::Script_Subform_InstanceManager(FXJSE_HVALUE hValue, | |
2557 FX_BOOL bSetting, | |
2558 XFA_ATTRIBUTE eAttribute) { | |
2559 if (!bSetting) { | |
2560 CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name); | |
2561 CXFA_Node* pInstanceMgr = NULL; | |
2562 for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode; | |
2563 pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) { | |
2564 if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) { | |
2565 CFX_WideStringC wsInstMgrName = pNode->GetCData(XFA_ATTRIBUTE_Name); | |
2566 if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName.GetAt(0) == '_' && | |
2567 wsInstMgrName.Mid(1) == wsName) { | |
2568 pInstanceMgr = pNode; | |
2569 } | |
2570 break; | |
2571 } | |
2572 } | |
2573 if (pInstanceMgr) { | |
2574 FXJSE_Value_Set( | |
2575 hValue, | |
2576 m_pDocument->GetScriptContext()->GetJSValueFromMap(pInstanceMgr)); | |
2577 } else { | |
2578 FXJSE_Value_SetNull(hValue); | |
2579 } | |
2580 } else { | |
2581 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
2582 } | |
2583 } | |
2584 void CXFA_Node::Script_Subform_Locale(FXJSE_HVALUE hValue, | |
2585 FX_BOOL bSetting, | |
2586 XFA_ATTRIBUTE eAttribute) { | |
2587 if (bSetting) { | |
2588 CFX_ByteString bsLocaleName; | |
2589 FXJSE_Value_ToUTF8String(hValue, bsLocaleName); | |
2590 SetCData(XFA_ATTRIBUTE_Locale, | |
2591 CFX_WideString::FromUTF8(bsLocaleName, bsLocaleName.GetLength()), | |
2592 TRUE, TRUE); | |
2593 } else { | |
2594 CFX_WideString wsLocaleName; | |
2595 GetLocaleName(wsLocaleName); | |
2596 FXJSE_Value_SetUTF8String( | |
2597 hValue, FX_UTF8Encode(wsLocaleName, wsLocaleName.GetLength())); | |
2598 } | |
2599 } | |
2600 void CXFA_Node::Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments) { | |
2601 int32_t argc = pArguments->GetLength(); | |
2602 if (argc == 1) { | |
2603 CFX_ByteString eventString = pArguments->GetUTF8String(0); | |
2604 execSingleEventByName( | |
2605 CFX_WideString::FromUTF8(eventString, eventString.GetLength()), | |
2606 XFA_ELEMENT_Subform); | |
2607 } else { | |
2608 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent"); | |
2609 } | |
2610 } | |
2611 void CXFA_Node::Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments) { | |
2612 int32_t argc = pArguments->GetLength(); | |
2613 if (argc == 0) { | |
2614 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2615 if (!pNotify) { | |
2616 return; | |
2617 } | |
2618 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize); | |
2619 } else { | |
2620 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2621 L"execInitialize"); | |
2622 } | |
2623 } | |
2624 void CXFA_Node::Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments) { | |
2625 int32_t argc = pArguments->GetLength(); | |
2626 if (argc == 0) { | |
2627 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2628 if (!pNotify) { | |
2629 return; | |
2630 } | |
2631 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate); | |
2632 } else { | |
2633 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2634 L"execCalculate"); | |
2635 } | |
2636 } | |
2637 void CXFA_Node::Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments) { | |
2638 int32_t argc = pArguments->GetLength(); | |
2639 if (argc == 0) { | |
2640 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
2641 if (!pNotify) { | |
2642 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); | |
2643 } else { | |
2644 int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate); | |
2645 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), | |
2646 ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); | |
2647 } | |
2648 } else { | |
2649 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2650 L"execValidate"); | |
2651 } | |
2652 } | |
2653 void CXFA_Node::Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments) { | |
2654 int32_t argc = pArguments->GetLength(); | |
2655 if (argc == 0) { | |
2656 } else { | |
2657 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2658 L"getInvalidObjects"); | |
2659 } | |
2660 } | |
2661 int32_t CXFA_Node::Subform_and_SubformSet_InstanceIndex() { | |
2662 int32_t index = 0; | |
2663 for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode; | |
2664 pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) { | |
2665 if ((pNode->GetClassID() == XFA_ELEMENT_Subform) || | |
2666 (pNode->GetClassID() == XFA_ELEMENT_SubformSet)) { | |
2667 index++; | |
2668 } else { | |
2669 break; | |
2670 } | |
2671 } | |
2672 return index; | |
2673 } | |
2674 void CXFA_Node::Script_Template_FormNodes(CFXJSE_Arguments* pArguments) { | |
2675 int32_t argc = pArguments->GetLength(); | |
2676 if (argc == 1) { | |
2677 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); | |
2678 } else { | |
2679 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes"); | |
2680 } | |
2681 } | |
2682 void CXFA_Node::Script_Template_Remerge(CFXJSE_Arguments* pArguments) { | |
2683 int32_t argc = pArguments->GetLength(); | |
2684 if (argc == 0) { | |
2685 m_pDocument->DoDataRemerge(TRUE); | |
2686 } else { | |
2687 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge"); | |
2688 } | |
2689 } | |
2690 void CXFA_Node::Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments) { | |
2691 int32_t argc = pArguments->GetLength(); | |
2692 if (argc == 0) { | |
2693 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2694 if (!pWidgetData) { | |
2695 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); | |
2696 } else { | |
2697 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); | |
2698 } | |
2699 } else { | |
2700 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2701 L"execInitialize"); | |
2702 } | |
2703 } | |
2704 void CXFA_Node::Script_Template_CreateNode(CFXJSE_Arguments* pArguments) { | |
2705 int32_t argc = pArguments->GetLength(); | |
2706 if ((argc > 0) && (argc < 4)) { | |
2707 CFX_WideString strTagName; | |
2708 CFX_WideString strName; | |
2709 CFX_WideString strNameSpace; | |
2710 CFX_ByteString bsTagName = pArguments->GetUTF8String(0); | |
2711 strTagName = CFX_WideString::FromUTF8(bsTagName, bsTagName.GetLength()); | |
2712 if (argc > 1) { | |
2713 CFX_ByteString bsName = pArguments->GetUTF8String(1); | |
2714 strName = CFX_WideString::FromUTF8(bsName, bsName.GetLength()); | |
2715 if (argc == 3) { | |
2716 CFX_ByteString bsNameSpace = pArguments->GetUTF8String(2); | |
2717 strNameSpace = | |
2718 CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength()); | |
2719 } | |
2720 } | |
2721 const XFA_ELEMENTINFO* pElement = XFA_GetElementByName(strTagName); | |
2722 CXFA_Node* pNewNode = CreateSamePacketNode(pElement->eName); | |
2723 if (!pNewNode) { | |
2724 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
2725 } else { | |
2726 if (!strName.IsEmpty()) { | |
2727 if (XFA_GetAttributeOfElement(pElement->eName, XFA_ATTRIBUTE_Name, | |
2728 XFA_XDPPACKET_UNKNOWN)) { | |
2729 pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, strName, TRUE); | |
2730 if (pNewNode->GetPacketID() == XFA_XDPPACKET_Datasets) { | |
2731 pNewNode->CreateXMLMappingNode(); | |
2732 } | |
2733 FXJSE_Value_Set( | |
2734 pArguments->GetReturnValue(), | |
2735 m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode)); | |
2736 } else { | |
2737 ThrowScriptErrorMessage(XFA_IDS_NOT_HAVE_PROPERTY, | |
2738 (const FX_WCHAR*)strTagName, L"name"); | |
2739 } | |
2740 } else { | |
2741 FXJSE_Value_Set( | |
2742 pArguments->GetReturnValue(), | |
2743 m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode)); | |
2744 } | |
2745 } | |
2746 } else { | |
2747 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"createNode"); | |
2748 } | |
2749 } | |
2750 void CXFA_Node::Script_Template_Recalculate(CFXJSE_Arguments* pArguments) { | |
2751 if (pArguments->GetLength() == 1) { | |
2752 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); | |
2753 } else { | |
2754 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate"); | |
2755 } | |
2756 } | |
2757 void CXFA_Node::Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments) { | |
2758 int32_t argc = pArguments->GetLength(); | |
2759 if (argc == 0) { | |
2760 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2761 if (!pWidgetData) { | |
2762 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); | |
2763 } else { | |
2764 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); | |
2765 } | |
2766 } else { | |
2767 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2768 L"execCalculate"); | |
2769 } | |
2770 } | |
2771 void CXFA_Node::Script_Template_ExecValidate(CFXJSE_Arguments* pArguments) { | |
2772 int32_t argc = pArguments->GetLength(); | |
2773 if (argc == 0) { | |
2774 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2775 if (!pWidgetData) { | |
2776 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); | |
2777 } else { | |
2778 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); | |
2779 } | |
2780 } else { | |
2781 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2782 L"execValidate"); | |
2783 } | |
2784 } | |
2785 void CXFA_Node::Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments) { | |
2786 int32_t argc = pArguments->GetLength(); | |
2787 if (argc == 0) { | |
2788 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
2789 if (!pWidgetData) { | |
2790 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); | |
2791 } else { | |
2792 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE); | |
2793 } | |
2794 } else { | |
2795 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"evaluate"); | |
2796 } | |
2797 } | |
2798 void CXFA_Node::Script_InstanceManager_Max(FXJSE_HVALUE hValue, | |
2799 FX_BOOL bSetting, | |
2800 XFA_ATTRIBUTE eAttribute) { | |
2801 if (bSetting) { | |
2802 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
2803 return; | |
2804 } | |
2805 CXFA_Occur nodeOccur(GetOccurNode()); | |
2806 FXJSE_Value_SetInteger(hValue, nodeOccur.GetMax()); | |
2807 } | |
2808 void CXFA_Node::Script_InstanceManager_Min(FXJSE_HVALUE hValue, | |
2809 FX_BOOL bSetting, | |
2810 XFA_ATTRIBUTE eAttribute) { | |
2811 if (bSetting) { | |
2812 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
2813 return; | |
2814 } | |
2815 CXFA_Occur nodeOccur(GetOccurNode()); | |
2816 FXJSE_Value_SetInteger(hValue, nodeOccur.GetMin()); | |
2817 } | |
2818 static int32_t XFA_ScriptInstanceManager_GetCount(CXFA_Node* pInstMgrNode) { | |
2819 ASSERT(pInstMgrNode); | |
2820 int32_t iCount = 0; | |
2821 FX_DWORD dwNameHash = 0; | |
2822 for (CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling); | |
2823 pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
2824 XFA_ELEMENT eCurType = pNode->GetClassID(); | |
2825 if (eCurType == XFA_ELEMENT_InstanceManager) { | |
2826 break; | |
2827 } | |
2828 if ((eCurType != XFA_ELEMENT_Subform) && | |
2829 (eCurType != XFA_ELEMENT_SubformSet)) { | |
2830 continue; | |
2831 } | |
2832 if (iCount == 0) { | |
2833 CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name); | |
2834 CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name); | |
2835 if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' || | |
2836 wsInstName.Mid(1) != wsName) { | |
2837 return iCount; | |
2838 } | |
2839 dwNameHash = pNode->GetNameHash(); | |
2840 } | |
2841 if (dwNameHash != pNode->GetNameHash()) { | |
2842 break; | |
2843 } | |
2844 iCount++; | |
2845 } | |
2846 return iCount; | |
2847 } | |
2848 static void | |
2849 XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx( | |
2850 const CXFA_NodeSet& rgNodeSet, | |
2851 CXFA_NodeArray& rgNodeArray, | |
2852 CFX_ArrayTemplate<int32_t>& rgIdxArray) { | |
2853 int32_t iCount = rgNodeSet.GetCount(); | |
2854 rgNodeArray.SetSize(iCount); | |
2855 rgIdxArray.SetSize(iCount); | |
2856 if (iCount == 0) { | |
2857 return; | |
2858 } | |
2859 int32_t iIndex = -1, iTotalIndex = -1; | |
2860 CXFA_Node* pNode = NULL; | |
2861 FX_POSITION pos = rgNodeSet.GetStartPosition(); | |
2862 rgNodeSet.GetNextAssoc(pos, pNode); | |
2863 for (pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent) | |
2864 ->GetNodeItem(XFA_NODEITEM_FirstChild); | |
2865 pNode && iIndex < iCount; | |
2866 pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
2867 iTotalIndex++; | |
2868 if (rgNodeSet.Lookup(pNode)) { | |
2869 iIndex++; | |
2870 rgNodeArray[iIndex] = pNode; | |
2871 rgIdxArray[iIndex] = iTotalIndex; | |
2872 } | |
2873 } | |
2874 } | |
2875 struct CXFA_DualNodeArray { | |
2876 CXFA_NodeSet firstNodeList; | |
2877 CXFA_NodeSet secondNodeList; | |
2878 }; | |
2879 static void XFA_ScriptInstanceManager_ReorderDataNodes(CXFA_NodeSet& sSet1, | |
2880 CXFA_NodeSet& sSet2, | |
2881 FX_BOOL bInsertBefore) { | |
2882 CFX_MapPtrTemplate<CXFA_Node*, | |
2883 CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>*> | |
2884 rgNodeListMap; | |
2885 FX_POSITION pos; | |
2886 pos = sSet1.GetStartPosition(); | |
2887 while (pos) { | |
2888 CXFA_Node* pNode = NULL; | |
2889 sSet1.GetNextAssoc(pos, pNode); | |
2890 CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); | |
2891 FX_DWORD dwNameHash = pNode->GetNameHash(); | |
2892 if (!pParentNode || !dwNameHash) { | |
2893 continue; | |
2894 } | |
2895 CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap = | |
2896 rgNodeListMap[pParentNode]; | |
2897 if (!pNodeListChildMap) { | |
2898 rgNodeListMap[pParentNode] = pNodeListChildMap = | |
2899 new CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>; | |
2900 } | |
2901 CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash]; | |
2902 if (!pDualNodeArray) { | |
2903 (*pNodeListChildMap)[dwNameHash] = pDualNodeArray = | |
2904 new CXFA_DualNodeArray; | |
2905 } | |
2906 pDualNodeArray->firstNodeList.Add(pNode); | |
2907 } | |
2908 pos = sSet2.GetStartPosition(); | |
2909 while (pos) { | |
2910 CXFA_Node* pNode = NULL; | |
2911 sSet2.GetNextAssoc(pos, pNode); | |
2912 CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); | |
2913 FX_DWORD dwNameHash = pNode->GetNameHash(); | |
2914 if (!pParentNode || !dwNameHash) { | |
2915 continue; | |
2916 } | |
2917 CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap = | |
2918 rgNodeListMap[pParentNode]; | |
2919 if (!pNodeListChildMap) { | |
2920 rgNodeListMap[pParentNode] = pNodeListChildMap = | |
2921 new CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>; | |
2922 } | |
2923 CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash]; | |
2924 if (!pDualNodeArray) { | |
2925 (*pNodeListChildMap)[dwNameHash] = pDualNodeArray = | |
2926 new CXFA_DualNodeArray; | |
2927 } | |
2928 if (pDualNodeArray->firstNodeList.Lookup(pNode)) { | |
2929 pDualNodeArray->firstNodeList.RemoveKey(pNode); | |
2930 } else { | |
2931 pDualNodeArray->secondNodeList.Add(pNode); | |
2932 } | |
2933 } | |
2934 pos = rgNodeListMap.GetStartPosition(); | |
2935 while (pos) { | |
2936 CXFA_Node* pParentNode = NULL; | |
2937 CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap = NULL; | |
2938 rgNodeListMap.GetNextAssoc(pos, pParentNode, pNodeListChildMap); | |
2939 if (!pNodeListChildMap) { | |
2940 continue; | |
2941 } | |
2942 FX_POSITION childpos = pNodeListChildMap->GetStartPosition(); | |
2943 while (childpos) { | |
2944 FX_DWORD dwNameHash = 0; | |
2945 CXFA_DualNodeArray* pDualNodeArray = NULL; | |
2946 pNodeListChildMap->GetNextAssoc(childpos, dwNameHash, pDualNodeArray); | |
2947 if (!pDualNodeArray) { | |
2948 continue; | |
2949 } | |
2950 if (pDualNodeArray->firstNodeList.GetCount() != 0 && | |
2951 pDualNodeArray->secondNodeList.GetCount() != 0) { | |
2952 CXFA_NodeArray rgNodeArray1, rgNodeArray2; | |
2953 CFX_ArrayTemplate<int32_t> rgIdxArray1, rgIdxArray2; | |
2954 XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx( | |
2955 pDualNodeArray->firstNodeList, rgNodeArray1, rgIdxArray1); | |
2956 XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx( | |
2957 pDualNodeArray->secondNodeList, rgNodeArray2, rgIdxArray2); | |
2958 CXFA_Node *pParentNode = NULL, *pBeforeNode = NULL; | |
2959 if (bInsertBefore) { | |
2960 pBeforeNode = rgNodeArray2[0]; | |
2961 pParentNode = pBeforeNode->GetNodeItem(XFA_NODEITEM_Parent); | |
2962 } else { | |
2963 CXFA_Node* pLastNode = rgNodeArray2[rgIdxArray2.GetSize() - 1]; | |
2964 pParentNode = pLastNode->GetNodeItem(XFA_NODEITEM_Parent); | |
2965 pBeforeNode = pLastNode->GetNodeItem(XFA_NODEITEM_NextSibling); | |
2966 } | |
2967 for (int32_t iIdx = 0, iCount = rgIdxArray1.GetSize(); iIdx < iCount; | |
2968 iIdx++) { | |
2969 CXFA_Node* pCurNode = rgNodeArray1[iIdx]; | |
2970 pParentNode->RemoveChild(pCurNode); | |
2971 pParentNode->InsertChild(pCurNode, pBeforeNode); | |
2972 } | |
2973 } | |
2974 delete pDualNodeArray; | |
2975 } | |
2976 pNodeListChildMap->RemoveAll(); | |
2977 } | |
2978 rgNodeListMap.RemoveAll(); | |
2979 } | |
2980 static void XFA_ScriptInstanceManager_InsertItem( | |
2981 CXFA_Node* pInstMgrNode, | |
2982 CXFA_Node* pNewInstance, | |
2983 int32_t iPos, | |
2984 int32_t iCount = -1, | |
2985 FX_BOOL bMoveDataBindingNodes = TRUE) { | |
2986 if (iCount < 0) { | |
2987 iCount = XFA_ScriptInstanceManager_GetCount(pInstMgrNode); | |
2988 } | |
2989 if (iPos < 0) { | |
2990 iPos = iCount; | |
2991 } | |
2992 if (iPos == iCount) { | |
2993 CXFA_Node* pNextSibling = | |
2994 iCount > 0 | |
2995 ? XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iCount - 1) | |
2996 ->GetNodeItem(XFA_NODEITEM_NextSibling) | |
2997 : pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling); | |
2998 pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent) | |
2999 ->InsertChild(pNewInstance, pNextSibling); | |
3000 if (bMoveDataBindingNodes) { | |
3001 CXFA_NodeSet sNew, sAfter; | |
3002 CXFA_NodeIteratorTemplate<CXFA_Node, | |
3003 CXFA_TraverseStrategy_XFAContainerNode> | |
3004 sIteratorNew(pNewInstance); | |
3005 for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode; | |
3006 pNode = sIteratorNew.MoveToNext()) { | |
3007 CXFA_Node* pDataNode = pNode->GetBindData(); | |
3008 if (!pDataNode) { | |
3009 continue; | |
3010 } | |
3011 sNew.Add(pDataNode); | |
3012 } | |
3013 CXFA_NodeIteratorTemplate<CXFA_Node, | |
3014 CXFA_TraverseStrategy_XFAContainerNode> | |
3015 sIteratorAfter(pNextSibling); | |
3016 for (CXFA_Node* pNode = sIteratorAfter.GetCurrent(); pNode; | |
3017 pNode = sIteratorAfter.MoveToNext()) { | |
3018 CXFA_Node* pDataNode = pNode->GetBindData(); | |
3019 if (!pDataNode) { | |
3020 continue; | |
3021 } | |
3022 sAfter.Add(pDataNode); | |
3023 } | |
3024 XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sAfter, FALSE); | |
3025 } | |
3026 } else { | |
3027 CXFA_Node* pBeforeInstance = | |
3028 XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iPos); | |
3029 pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent) | |
3030 ->InsertChild(pNewInstance, pBeforeInstance); | |
3031 if (bMoveDataBindingNodes) { | |
3032 CXFA_NodeSet sNew, sBefore; | |
3033 CXFA_NodeIteratorTemplate<CXFA_Node, | |
3034 CXFA_TraverseStrategy_XFAContainerNode> | |
3035 sIteratorNew(pNewInstance); | |
3036 for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode; | |
3037 pNode = sIteratorNew.MoveToNext()) { | |
3038 CXFA_Node* pDataNode = pNode->GetBindData(); | |
3039 if (!pDataNode) { | |
3040 continue; | |
3041 } | |
3042 sNew.Add(pDataNode); | |
3043 } | |
3044 CXFA_NodeIteratorTemplate<CXFA_Node, | |
3045 CXFA_TraverseStrategy_XFAContainerNode> | |
3046 sIteratorBefore(pBeforeInstance); | |
3047 for (CXFA_Node* pNode = sIteratorBefore.GetCurrent(); pNode; | |
3048 pNode = sIteratorBefore.MoveToNext()) { | |
3049 CXFA_Node* pDataNode = pNode->GetBindData(); | |
3050 if (!pDataNode) { | |
3051 continue; | |
3052 } | |
3053 sBefore.Add(pDataNode); | |
3054 } | |
3055 XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sBefore, TRUE); | |
3056 } | |
3057 } | |
3058 } | |
3059 static void XFA_ScriptInstanceManager_RemoveItem( | |
3060 CXFA_Node* pInstMgrNode, | |
3061 CXFA_Node* pRemoveInstance, | |
3062 FX_BOOL bRemoveDataBinding = TRUE) { | |
3063 pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pRemoveInstance); | |
3064 if (!bRemoveDataBinding) { | |
3065 return; | |
3066 } | |
3067 CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode> | |
3068 sIterator(pRemoveInstance); | |
3069 for (CXFA_Node* pFormNode = sIterator.GetCurrent(); pFormNode; | |
3070 pFormNode = sIterator.MoveToNext()) { | |
3071 CXFA_Node* pDataNode = pFormNode->GetBindData(); | |
3072 if (!pDataNode) { | |
3073 continue; | |
3074 } | |
3075 if (pDataNode->RemoveBindItem(pFormNode) == 0) { | |
3076 if (CXFA_Node* pDataParent = | |
3077 pDataNode->GetNodeItem(XFA_NODEITEM_Parent)) { | |
3078 pDataParent->RemoveChild(pDataNode); | |
3079 } | |
3080 } | |
3081 pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL); | |
3082 } | |
3083 } | |
3084 static CXFA_Node* XFA_ScriptInstanceManager_CreateInstance( | |
3085 CXFA_Node* pInstMgrNode, | |
3086 FX_BOOL bDataMerge) { | |
3087 CXFA_Document* pDocument = pInstMgrNode->GetDocument(); | |
3088 CXFA_Node* pTemplateNode = pInstMgrNode->GetTemplateNode(); | |
3089 CXFA_Node* pFormParent = pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent); | |
3090 CXFA_Node* pDataScope = NULL; | |
3091 for (CXFA_Node* pRootBoundNode = pFormParent; | |
3092 pRootBoundNode && | |
3093 pRootBoundNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode; | |
3094 pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) { | |
3095 pDataScope = pRootBoundNode->GetBindData(); | |
3096 if (pDataScope) { | |
3097 break; | |
3098 } | |
3099 } | |
3100 if (!pDataScope) { | |
3101 pDataScope = ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record)); | |
3102 ASSERT(pDataScope); | |
3103 } | |
3104 CXFA_Node* pInstance = pDocument->DataMerge_CopyContainer( | |
3105 pTemplateNode, pFormParent, pDataScope, TRUE, bDataMerge); | |
3106 if (pInstance) { | |
3107 pDocument->DataMerge_UpdateBindingRelations(pInstance); | |
3108 pFormParent->RemoveChild(pInstance); | |
3109 } | |
3110 return pInstance; | |
3111 } | |
3112 void CXFA_Node::Script_InstanceManager_Count(FXJSE_HVALUE hValue, | |
3113 FX_BOOL bSetting, | |
3114 XFA_ATTRIBUTE eAttribute) { | |
3115 if (bSetting) { | |
3116 int32_t iDesired = FXJSE_Value_ToInteger(hValue); | |
3117 InstanceManager_SetInstances(iDesired); | |
3118 } else { | |
3119 FXJSE_Value_SetInteger(hValue, XFA_ScriptInstanceManager_GetCount(this)); | |
3120 } | |
3121 } | |
3122 void CXFA_Node::Script_InstanceManager_MoveInstance( | |
3123 CFXJSE_Arguments* pArguments) { | |
3124 int32_t argc = pArguments->GetLength(); | |
3125 if (argc != 2) { | |
3126 FXJSE_Value_SetUndefined(pArguments->GetReturnValue()); | |
3127 return; | |
3128 } | |
3129 int32_t iFrom = pArguments->GetInt32(0); | |
3130 int32_t iTo = pArguments->GetInt32(1); | |
3131 InstanceManager_MoveInstance(iTo, iFrom); | |
3132 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
3133 if (!pNotify) { | |
3134 return; | |
3135 } | |
3136 CXFA_Node* pToInstance = XFA_ScriptInstanceManager_GetItem(this, iTo); | |
3137 if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) { | |
3138 pNotify->RunSubformIndexChange(pToInstance); | |
3139 } | |
3140 CXFA_Node* pFromInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom); | |
3141 if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) { | |
3142 pNotify->RunSubformIndexChange(pFromInstance); | |
3143 } | |
3144 } | |
3145 void CXFA_Node::Script_InstanceManager_RemoveInstance( | |
3146 CFXJSE_Arguments* pArguments) { | |
3147 int32_t argc = pArguments->GetLength(); | |
3148 if (argc != 1) { | |
3149 FXJSE_Value_SetUndefined(pArguments->GetReturnValue()); | |
3150 return; | |
3151 } | |
3152 int32_t iIndex = pArguments->GetInt32(0); | |
3153 int32_t iCount = XFA_ScriptInstanceManager_GetCount(this); | |
3154 if (iIndex < 0 || iIndex >= iCount) { | |
3155 ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS); | |
3156 return; | |
3157 } | |
3158 CXFA_Occur nodeOccur(GetOccurNode()); | |
3159 int32_t iMin = nodeOccur.GetMin(); | |
3160 if (iCount - 1 < iMin) { | |
3161 ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"min"); | |
3162 return; | |
3163 } | |
3164 CXFA_Node* pRemoveInstance = XFA_ScriptInstanceManager_GetItem(this, iIndex); | |
3165 XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance); | |
3166 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
3167 if (pNotify) { | |
3168 for (int32_t i = iIndex; i < iCount - 1; i++) { | |
3169 CXFA_Node* pSubformInstance = XFA_ScriptInstanceManager_GetItem(this, i); | |
3170 if (pSubformInstance && | |
3171 pSubformInstance->GetClassID() == XFA_ELEMENT_Subform) { | |
3172 pNotify->RunSubformIndexChange(pSubformInstance); | |
3173 } | |
3174 } | |
3175 } | |
3176 CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); | |
3177 if (!pLayoutPro) { | |
3178 return; | |
3179 } | |
3180 pLayoutPro->AddChangedContainer( | |
3181 ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form))); | |
3182 } | |
3183 void CXFA_Node::Script_InstanceManager_SetInstances( | |
3184 CFXJSE_Arguments* pArguments) { | |
3185 int32_t argc = pArguments->GetLength(); | |
3186 if (argc != 1) { | |
3187 FXJSE_Value_SetUndefined(pArguments->GetReturnValue()); | |
3188 return; | |
3189 } | |
3190 int32_t iDesired = pArguments->GetInt32(0); | |
3191 InstanceManager_SetInstances(iDesired); | |
3192 } | |
3193 void CXFA_Node::Script_InstanceManager_AddInstance( | |
3194 CFXJSE_Arguments* pArguments) { | |
3195 int32_t argc = pArguments->GetLength(); | |
3196 if ((argc != 0) && (argc != 1)) { | |
3197 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addInstance"); | |
3198 return; | |
3199 } | |
3200 FX_BOOL fFlags = TRUE; | |
3201 if (argc == 1) { | |
3202 fFlags = pArguments->GetInt32(0) == 0 ? FALSE : TRUE; | |
3203 } | |
3204 int32_t iCount = XFA_ScriptInstanceManager_GetCount(this); | |
3205 CXFA_Occur nodeOccur(GetOccurNode()); | |
3206 int32_t iMax = nodeOccur.GetMax(); | |
3207 if (iMax >= 0 && iCount >= iMax) { | |
3208 ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max"); | |
3209 return; | |
3210 } | |
3211 CXFA_Node* pNewInstance = | |
3212 XFA_ScriptInstanceManager_CreateInstance(this, fFlags); | |
3213 XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount, | |
3214 FALSE); | |
3215 FXJSE_Value_Set( | |
3216 pArguments->GetReturnValue(), | |
3217 m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance)); | |
3218 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
3219 if (!pNotify) { | |
3220 return; | |
3221 } | |
3222 pNotify->RunNodeInitialize(pNewInstance); | |
3223 CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); | |
3224 if (!pLayoutPro) { | |
3225 return; | |
3226 } | |
3227 pLayoutPro->AddChangedContainer( | |
3228 ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form))); | |
3229 } | |
3230 void CXFA_Node::Script_InstanceManager_InsertInstance( | |
3231 CFXJSE_Arguments* pArguments) { | |
3232 int32_t argc = pArguments->GetLength(); | |
3233 if ((argc != 1) && (argc != 2)) { | |
3234 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3235 L"insertInstance"); | |
3236 return; | |
3237 } | |
3238 int32_t iIndex = pArguments->GetInt32(0); | |
3239 FX_BOOL bBind = FALSE; | |
3240 if (argc == 2) { | |
3241 bBind = pArguments->GetInt32(1) == 0 ? FALSE : TRUE; | |
3242 } | |
3243 CXFA_Occur nodeOccur(GetOccurNode()); | |
3244 int32_t iCount = XFA_ScriptInstanceManager_GetCount(this); | |
3245 if (iIndex < 0 || iIndex > iCount) { | |
3246 ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS); | |
3247 return; | |
3248 } | |
3249 int32_t iMax = nodeOccur.GetMax(); | |
3250 if (iMax >= 0 && iCount >= iMax) { | |
3251 ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max"); | |
3252 return; | |
3253 } | |
3254 CXFA_Node* pNewInstance = | |
3255 XFA_ScriptInstanceManager_CreateInstance(this, bBind); | |
3256 XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iIndex, iCount, | |
3257 TRUE); | |
3258 FXJSE_Value_Set( | |
3259 pArguments->GetReturnValue(), | |
3260 m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance)); | |
3261 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
3262 if (!pNotify) { | |
3263 return; | |
3264 } | |
3265 pNotify->RunNodeInitialize(pNewInstance); | |
3266 CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); | |
3267 if (!pLayoutPro) { | |
3268 return; | |
3269 } | |
3270 pLayoutPro->AddChangedContainer( | |
3271 ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form))); | |
3272 } | |
3273 int32_t CXFA_Node::InstanceManager_SetInstances(int32_t iDesired) { | |
3274 CXFA_Occur nodeOccur(GetOccurNode()); | |
3275 int32_t iMax = nodeOccur.GetMax(); | |
3276 int32_t iMin = nodeOccur.GetMin(); | |
3277 if (iDesired < iMin) { | |
3278 ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"min"); | |
3279 return 1; | |
3280 } | |
3281 if ((iMax >= 0) && (iDesired > iMax)) { | |
3282 ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max"); | |
3283 return 2; | |
3284 } | |
3285 int32_t iCount = XFA_ScriptInstanceManager_GetCount(this); | |
3286 if (iDesired == iCount) { | |
3287 return 0; | |
3288 } | |
3289 if (iDesired < iCount) { | |
3290 CFX_WideStringC wsInstManagerName = GetCData(XFA_ATTRIBUTE_Name); | |
3291 CFX_WideString wsInstanceName = wsInstManagerName.IsEmpty() | |
3292 ? wsInstManagerName | |
3293 : wsInstManagerName.Mid(1); | |
3294 FX_DWORD dInstanceNameHash = | |
3295 wsInstanceName.IsEmpty() ? 0 : FX_HashCode_String_GetW( | |
3296 wsInstanceName, | |
3297 wsInstanceName.GetLength()); | |
3298 CXFA_Node* pPrevSibling = | |
3299 (iDesired == 0) ? this | |
3300 : XFA_ScriptInstanceManager_GetItem(this, iDesired - 1); | |
3301 while (iCount > iDesired) { | |
3302 CXFA_Node* pRemoveInstance = | |
3303 pPrevSibling->GetNodeItem(XFA_NODEITEM_NextSibling); | |
3304 if (pRemoveInstance->GetClassID() != XFA_ELEMENT_Subform && | |
3305 pRemoveInstance->GetClassID() != XFA_ELEMENT_SubformSet) { | |
3306 continue; | |
3307 } | |
3308 if (pRemoveInstance->GetClassID() == XFA_ELEMENT_InstanceManager) { | |
3309 FXSYS_assert(FALSE); | |
3310 break; | |
3311 } | |
3312 if (pRemoveInstance->GetNameHash() == dInstanceNameHash) { | |
3313 XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance); | |
3314 iCount--; | |
3315 } | |
3316 } | |
3317 } else if (iDesired > iCount) { | |
3318 while (iCount < iDesired) { | |
3319 CXFA_Node* pNewInstance = | |
3320 XFA_ScriptInstanceManager_CreateInstance(this, TRUE); | |
3321 XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount, | |
3322 FALSE); | |
3323 iCount++; | |
3324 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
3325 if (!pNotify) { | |
3326 return 0; | |
3327 } | |
3328 pNotify->RunNodeInitialize(pNewInstance); | |
3329 } | |
3330 } | |
3331 CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); | |
3332 if (pLayoutPro) { | |
3333 pLayoutPro->AddChangedContainer( | |
3334 ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form))); | |
3335 } | |
3336 return 0; | |
3337 } | |
3338 int32_t CXFA_Node::InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom) { | |
3339 int32_t iCount = XFA_ScriptInstanceManager_GetCount(this); | |
3340 if (iFrom > iCount || iTo > iCount - 1) { | |
3341 ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS); | |
3342 return 1; | |
3343 } | |
3344 if (iFrom < 0 || iTo < 0 || iFrom == iTo) { | |
3345 return 0; | |
3346 } | |
3347 CXFA_Node* pMoveInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom); | |
3348 XFA_ScriptInstanceManager_RemoveItem(this, pMoveInstance, FALSE); | |
3349 XFA_ScriptInstanceManager_InsertItem(this, pMoveInstance, iTo, iCount - 1, | |
3350 TRUE); | |
3351 CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor(); | |
3352 if (pLayoutPro) { | |
3353 pLayoutPro->AddChangedContainer( | |
3354 ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form))); | |
3355 } | |
3356 return 0; | |
3357 } | |
3358 void CXFA_Node::Script_Occur_Max(FXJSE_HVALUE hValue, | |
3359 FX_BOOL bSetting, | |
3360 XFA_ATTRIBUTE eAttribute) { | |
3361 CXFA_Occur occur(this); | |
3362 if (bSetting) { | |
3363 int32_t iMax = FXJSE_Value_ToInteger(hValue); | |
3364 occur.SetMax(iMax); | |
3365 } else { | |
3366 FXJSE_Value_SetInteger(hValue, occur.GetMax()); | |
3367 } | |
3368 } | |
3369 void CXFA_Node::Script_Occur_Min(FXJSE_HVALUE hValue, | |
3370 FX_BOOL bSetting, | |
3371 XFA_ATTRIBUTE eAttribute) { | |
3372 CXFA_Occur occur(this); | |
3373 if (bSetting) { | |
3374 int32_t iMin = FXJSE_Value_ToInteger(hValue); | |
3375 occur.SetMin(iMin); | |
3376 } else { | |
3377 FXJSE_Value_SetInteger(hValue, occur.GetMin()); | |
3378 } | |
3379 } | |
3380 void CXFA_Node::Script_Desc_Metadata(CFXJSE_Arguments* pArguments) { | |
3381 int32_t argc = pArguments->GetLength(); | |
3382 if ((argc == 0) || (argc == 1)) { | |
3383 FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), ""); | |
3384 } else { | |
3385 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"metadata"); | |
3386 } | |
3387 } | |
3388 void CXFA_Node::Script_Form_FormNodes(CFXJSE_Arguments* pArguments) { | |
3389 int32_t argc = pArguments->GetLength(); | |
3390 if (argc == 1) { | |
3391 CXFA_Node* pDataNode = static_cast<CXFA_Node*>(pArguments->GetObject(0)); | |
3392 if (pDataNode) { | |
3393 CXFA_NodeArray formItems; | |
3394 CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument); | |
3395 pFormNodes->SetArrayNodeList(formItems); | |
3396 FXJSE_Value_SetObject( | |
3397 pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes, | |
3398 m_pDocument->GetScriptContext()->GetJseNormalClass()); | |
3399 } else { | |
3400 ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
3401 } | |
3402 } else { | |
3403 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes"); | |
3404 } | |
3405 } | |
3406 void CXFA_Node::Script_Form_Remerge(CFXJSE_Arguments* pArguments) { | |
3407 int32_t argc = pArguments->GetLength(); | |
3408 if (argc == 0) { | |
3409 m_pDocument->DoDataRemerge(TRUE); | |
3410 } else { | |
3411 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge"); | |
3412 } | |
3413 } | |
3414 void CXFA_Node::Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments) { | |
3415 int32_t argc = pArguments->GetLength(); | |
3416 if (argc == 0) { | |
3417 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
3418 if (!pNotify) { | |
3419 return; | |
3420 } | |
3421 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize); | |
3422 } else { | |
3423 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3424 L"execInitialize"); | |
3425 } | |
3426 } | |
3427 void CXFA_Node::Script_Form_Recalculate(CFXJSE_Arguments* pArguments) { | |
3428 CXFA_EventParam* pEventParam = | |
3429 m_pDocument->GetScriptContext()->GetEventParam(); | |
3430 if (pEventParam->m_eType == XFA_EVENT_Calculate || | |
3431 pEventParam->m_eType == XFA_EVENT_InitCalculate) { | |
3432 return; | |
3433 } | |
3434 int32_t argc = pArguments->GetLength(); | |
3435 if (argc == 1) { | |
3436 const bool bScriptFlags = pArguments->GetInt32(0) != 0; | |
3437 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
3438 if (!pNotify) { | |
3439 return; | |
3440 } | |
3441 if (bScriptFlags) { | |
3442 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate); | |
3443 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate); | |
3444 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Ready, TRUE); | |
3445 } else { | |
3446 } | |
3447 } else { | |
3448 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate"); | |
3449 } | |
3450 } | |
3451 void CXFA_Node::Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments) { | |
3452 int32_t argc = pArguments->GetLength(); | |
3453 if (argc == 0) { | |
3454 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
3455 if (!pNotify) { | |
3456 return; | |
3457 } | |
3458 pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate); | |
3459 } else { | |
3460 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3461 L"execCalculate"); | |
3462 } | |
3463 } | |
3464 void CXFA_Node::Script_Form_ExecValidate(CFXJSE_Arguments* pArguments) { | |
3465 int32_t argc = pArguments->GetLength(); | |
3466 if (argc == 0) { | |
3467 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
3468 if (!pNotify) { | |
3469 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE); | |
3470 } else { | |
3471 int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate); | |
3472 FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), | |
3473 ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE)); | |
3474 } | |
3475 } else { | |
3476 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3477 L"execValidate"); | |
3478 } | |
3479 } | |
3480 void CXFA_Node::Script_Form_Checksum(FXJSE_HVALUE hValue, | |
3481 FX_BOOL bSetting, | |
3482 XFA_ATTRIBUTE eAttribute) { | |
3483 if (bSetting) { | |
3484 CFX_ByteString bsChecksum; | |
3485 FXJSE_Value_ToUTF8String(hValue, bsChecksum); | |
3486 SetAttribute(XFA_ATTRIBUTE_Checksum, | |
3487 CFX_WideString::FromUTF8(bsChecksum, bsChecksum.GetLength())); | |
3488 } else { | |
3489 CFX_WideString wsChecksum; | |
3490 GetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum, FALSE); | |
3491 FXJSE_Value_SetUTF8String( | |
3492 hValue, FX_UTF8Encode(wsChecksum, wsChecksum.GetLength())); | |
3493 } | |
3494 } | |
3495 void CXFA_Node::Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments) { | |
3496 int32_t argc = pArguments->GetLength(); | |
3497 if (argc == 1) { | |
3498 CFX_ByteString bsAttributeName = pArguments->GetUTF8String(0); | |
3499 CFX_WideString wsAttributeValue; | |
3500 IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); | |
3501 if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { | |
3502 ((IFDE_XMLElement*)pXMLNode) | |
3503 ->GetString(CFX_WideString::FromUTF8(bsAttributeName, | |
3504 bsAttributeName.GetLength()), | |
3505 wsAttributeValue); | |
3506 } | |
3507 FXJSE_Value_SetUTF8String( | |
3508 pArguments->GetReturnValue(), | |
3509 FX_UTF8Encode(wsAttributeValue, wsAttributeValue.GetLength())); | |
3510 } else { | |
3511 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3512 L"getAttribute"); | |
3513 } | |
3514 } | |
3515 void CXFA_Node::Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments) { | |
3516 int32_t argc = pArguments->GetLength(); | |
3517 if (argc == 2) { | |
3518 CFX_ByteString bsValue = pArguments->GetUTF8String(0); | |
3519 CFX_ByteString bsName = pArguments->GetUTF8String(1); | |
3520 IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); | |
3521 if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { | |
3522 ((IFDE_XMLElement*)pXMLNode) | |
3523 ->SetString(CFX_WideString::FromUTF8(bsName, bsName.GetLength()), | |
3524 CFX_WideString::FromUTF8(bsValue, bsValue.GetLength())); | |
3525 } | |
3526 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
3527 } else { | |
3528 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3529 L"setAttribute"); | |
3530 } | |
3531 } | |
3532 void CXFA_Node::Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments) { | |
3533 int32_t argc = pArguments->GetLength(); | |
3534 if (argc == 1) { | |
3535 CFX_ByteString bsName = pArguments->GetUTF8String(0); | |
3536 CFX_WideString wsName = | |
3537 CFX_WideString::FromUTF8(bsName, bsName.GetLength()); | |
3538 IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); | |
3539 if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { | |
3540 IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode; | |
3541 if (pXMLElement->HasAttribute(wsName)) { | |
3542 pXMLElement->RemoveAttribute(wsName); | |
3543 } | |
3544 } | |
3545 FXJSE_Value_SetNull(pArguments->GetReturnValue()); | |
3546 } else { | |
3547 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3548 L"removeAttribute"); | |
3549 } | |
3550 } | |
3551 void CXFA_Node::Script_Packet_Content(FXJSE_HVALUE hValue, | |
3552 FX_BOOL bSetting, | |
3553 XFA_ATTRIBUTE eAttribute) { | |
3554 if (bSetting) { | |
3555 CFX_ByteString bsNewContent; | |
3556 FXJSE_Value_ToUTF8String(hValue, bsNewContent); | |
3557 IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); | |
3558 if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { | |
3559 IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode; | |
3560 pXMLElement->SetTextData( | |
3561 CFX_WideString::FromUTF8(bsNewContent, bsNewContent.GetLength())); | |
3562 } | |
3563 } else { | |
3564 CFX_WideString wsTextData; | |
3565 IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); | |
3566 if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) { | |
3567 IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode; | |
3568 pXMLElement->GetTextData(wsTextData); | |
3569 } | |
3570 FXJSE_Value_SetUTF8String( | |
3571 hValue, FX_UTF8Encode(wsTextData, wsTextData.GetLength())); | |
3572 } | |
3573 } | |
3574 void CXFA_Node::Script_Source_Next(CFXJSE_Arguments* pArguments) { | |
3575 int32_t argc = pArguments->GetLength(); | |
3576 if (argc == 0) { | |
3577 } else { | |
3578 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"next"); | |
3579 } | |
3580 } | |
3581 void CXFA_Node::Script_Source_CancelBatch(CFXJSE_Arguments* pArguments) { | |
3582 int32_t argc = pArguments->GetLength(); | |
3583 if (argc == 0) { | |
3584 } else { | |
3585 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancelBatch"); | |
3586 } | |
3587 } | |
3588 void CXFA_Node::Script_Source_First(CFXJSE_Arguments* pArguments) { | |
3589 int32_t argc = pArguments->GetLength(); | |
3590 if (argc == 0) { | |
3591 } else { | |
3592 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"first"); | |
3593 } | |
3594 } | |
3595 void CXFA_Node::Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments) { | |
3596 int32_t argc = pArguments->GetLength(); | |
3597 if (argc == 0) { | |
3598 } else { | |
3599 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"updateBatch"); | |
3600 } | |
3601 } | |
3602 void CXFA_Node::Script_Source_Previous(CFXJSE_Arguments* pArguments) { | |
3603 int32_t argc = pArguments->GetLength(); | |
3604 if (argc == 0) { | |
3605 } else { | |
3606 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"previous"); | |
3607 } | |
3608 } | |
3609 void CXFA_Node::Script_Source_IsBOF(CFXJSE_Arguments* pArguments) { | |
3610 int32_t argc = pArguments->GetLength(); | |
3611 if (argc == 0) { | |
3612 } else { | |
3613 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isBOF"); | |
3614 } | |
3615 } | |
3616 void CXFA_Node::Script_Source_IsEOF(CFXJSE_Arguments* pArguments) { | |
3617 int32_t argc = pArguments->GetLength(); | |
3618 if (argc == 0) { | |
3619 } else { | |
3620 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isEOF"); | |
3621 } | |
3622 } | |
3623 void CXFA_Node::Script_Source_Cancel(CFXJSE_Arguments* pArguments) { | |
3624 int32_t argc = pArguments->GetLength(); | |
3625 if (argc == 0) { | |
3626 } else { | |
3627 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancel"); | |
3628 } | |
3629 } | |
3630 void CXFA_Node::Script_Source_Update(CFXJSE_Arguments* pArguments) { | |
3631 int32_t argc = pArguments->GetLength(); | |
3632 if (argc == 0) { | |
3633 } else { | |
3634 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"update"); | |
3635 } | |
3636 } | |
3637 void CXFA_Node::Script_Source_Open(CFXJSE_Arguments* pArguments) { | |
3638 int32_t argc = pArguments->GetLength(); | |
3639 if (argc == 0) { | |
3640 } else { | |
3641 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"open"); | |
3642 } | |
3643 } | |
3644 void CXFA_Node::Script_Source_Delete(CFXJSE_Arguments* pArguments) { | |
3645 int32_t argc = pArguments->GetLength(); | |
3646 if (argc == 0) { | |
3647 } else { | |
3648 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"delete"); | |
3649 } | |
3650 } | |
3651 void CXFA_Node::Script_Source_AddNew(CFXJSE_Arguments* pArguments) { | |
3652 int32_t argc = pArguments->GetLength(); | |
3653 if (argc == 0) { | |
3654 } else { | |
3655 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addNew"); | |
3656 } | |
3657 } | |
3658 void CXFA_Node::Script_Source_Requery(CFXJSE_Arguments* pArguments) { | |
3659 int32_t argc = pArguments->GetLength(); | |
3660 if (argc == 0) { | |
3661 } else { | |
3662 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"requery"); | |
3663 } | |
3664 } | |
3665 void CXFA_Node::Script_Source_Resync(CFXJSE_Arguments* pArguments) { | |
3666 int32_t argc = pArguments->GetLength(); | |
3667 if (argc == 0) { | |
3668 } else { | |
3669 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resync"); | |
3670 } | |
3671 } | |
3672 void CXFA_Node::Script_Source_Close(CFXJSE_Arguments* pArguments) { | |
3673 int32_t argc = pArguments->GetLength(); | |
3674 if (argc == 0) { | |
3675 } else { | |
3676 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"close"); | |
3677 } | |
3678 } | |
3679 void CXFA_Node::Script_Source_Last(CFXJSE_Arguments* pArguments) { | |
3680 int32_t argc = pArguments->GetLength(); | |
3681 if (argc == 0) { | |
3682 } else { | |
3683 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"last"); | |
3684 } | |
3685 } | |
3686 void CXFA_Node::Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments) { | |
3687 int32_t argc = pArguments->GetLength(); | |
3688 if (argc == 0) { | |
3689 } else { | |
3690 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3691 L"hasDataChanged"); | |
3692 } | |
3693 } | |
3694 void CXFA_Node::Script_Source_Db(FXJSE_HVALUE hValue, | |
3695 FX_BOOL bSetting, | |
3696 XFA_ATTRIBUTE eAttribute) {} | |
3697 void CXFA_Node::Script_Xfa_This(FXJSE_HVALUE hValue, | |
3698 FX_BOOL bSetting, | |
3699 XFA_ATTRIBUTE eAttribute) { | |
3700 if (!bSetting) { | |
3701 CXFA_Object* pThis = m_pDocument->GetScriptContext()->GetThisObject(); | |
3702 FXSYS_assert(pThis); | |
3703 FXJSE_Value_Set(hValue, | |
3704 m_pDocument->GetScriptContext()->GetJSValueFromMap(pThis)); | |
3705 } | |
3706 } | |
3707 void CXFA_Node::Script_Handler_Version(FXJSE_HVALUE hValue, | |
3708 FX_BOOL bSetting, | |
3709 XFA_ATTRIBUTE eAttribute) {} | |
3710 void CXFA_Node::Script_SubmitFormat_Mode(FXJSE_HVALUE hValue, | |
3711 FX_BOOL bSetting, | |
3712 XFA_ATTRIBUTE eAttribute) {} | |
3713 void CXFA_Node::Script_Extras_Type(FXJSE_HVALUE hValue, | |
3714 FX_BOOL bSetting, | |
3715 XFA_ATTRIBUTE eAttribute) {} | |
3716 void CXFA_Node::Script_Script_Stateless(FXJSE_HVALUE hValue, | |
3717 FX_BOOL bSetting, | |
3718 XFA_ATTRIBUTE eAttribute) { | |
3719 if (bSetting) { | |
3720 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
3721 return; | |
3722 } | |
3723 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(FX_WSTRC(L"0"))); | |
3724 } | |
3725 void CXFA_Node::Script_Encrypt_Format(FXJSE_HVALUE hValue, | |
3726 FX_BOOL bSetting, | |
3727 XFA_ATTRIBUTE eAttribute) {} | |
3728 enum XFA_KEYTYPE { | |
3729 XFA_KEYTYPE_Custom, | |
3730 XFA_KEYTYPE_Element, | |
3731 }; | |
3732 void* XFA_GetMapKey_Custom(const CFX_WideStringC& wsKey) { | |
3733 FX_DWORD dwKey = FX_HashCode_String_GetW(wsKey.GetPtr(), wsKey.GetLength()); | |
3734 return (void*)(uintptr_t)((dwKey << 1) | XFA_KEYTYPE_Custom); | |
3735 } | |
3736 void* XFA_GetMapKey_Element(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute) { | |
3737 return (void*)(uintptr_t)((eElement << 16) | (eAttribute << 8) | | |
3738 XFA_KEYTYPE_Element); | |
3739 } | |
3740 FX_BOOL CXFA_Node::HasAttribute(XFA_ATTRIBUTE eAttr, FX_BOOL bCanInherit) { | |
3741 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
3742 return HasMapModuleKey(pKey, bCanInherit); | |
3743 } | |
3744 FX_BOOL CXFA_Node::SetAttribute(XFA_ATTRIBUTE eAttr, | |
3745 const CFX_WideStringC& wsValue, | |
3746 FX_BOOL bNotify) { | |
3747 const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr); | |
3748 if (pAttr == NULL) { | |
3749 return FALSE; | |
3750 } | |
3751 XFA_ATTRIBUTETYPE eType = pAttr->eType; | |
3752 if (eType == XFA_ATTRIBUTETYPE_NOTSURE) { | |
3753 const XFA_NOTSUREATTRIBUTE* pNotsure = | |
3754 XFA_GetNotsureAttribute(GetClassID(), pAttr->eName); | |
3755 eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata; | |
3756 } | |
3757 switch (eType) { | |
3758 case XFA_ATTRIBUTETYPE_Enum: { | |
3759 const XFA_ATTRIBUTEENUMINFO* pEnum = XFA_GetAttributeEnumByName(wsValue); | |
3760 return SetEnum(pAttr->eName, | |
3761 pEnum ? pEnum->eName | |
3762 : (XFA_ATTRIBUTEENUM)(intptr_t)(pAttr->pDefValue), | |
3763 bNotify); | |
3764 } break; | |
3765 case XFA_ATTRIBUTETYPE_Cdata: | |
3766 return SetCData(pAttr->eName, wsValue, bNotify); | |
3767 case XFA_ATTRIBUTETYPE_Boolean: | |
3768 return SetBoolean(pAttr->eName, wsValue != FX_WSTRC(L"0"), bNotify); | |
3769 case XFA_ATTRIBUTETYPE_Integer: | |
3770 return SetInteger( | |
3771 pAttr->eName, | |
3772 FXSYS_round(FX_wcstof(wsValue.GetPtr(), wsValue.GetLength())), | |
3773 bNotify); | |
3774 case XFA_ATTRIBUTETYPE_Measure: | |
3775 return SetMeasure(pAttr->eName, CXFA_Measurement(wsValue), bNotify); | |
3776 default: | |
3777 break; | |
3778 } | |
3779 return FALSE; | |
3780 } | |
3781 FX_BOOL CXFA_Node::GetAttribute(XFA_ATTRIBUTE eAttr, | |
3782 CFX_WideString& wsValue, | |
3783 FX_BOOL bUseDefault) { | |
3784 const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr); | |
3785 if (pAttr == NULL) { | |
3786 return FALSE; | |
3787 } | |
3788 XFA_ATTRIBUTETYPE eType = pAttr->eType; | |
3789 if (eType == XFA_ATTRIBUTETYPE_NOTSURE) { | |
3790 const XFA_NOTSUREATTRIBUTE* pNotsure = | |
3791 XFA_GetNotsureAttribute(GetClassID(), pAttr->eName); | |
3792 eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata; | |
3793 } | |
3794 switch (eType) { | |
3795 case XFA_ATTRIBUTETYPE_Enum: { | |
3796 XFA_ATTRIBUTEENUM eValue; | |
3797 if (!TryEnum(pAttr->eName, eValue, bUseDefault)) { | |
3798 return FALSE; | |
3799 } | |
3800 wsValue = XFA_GetAttributeEnumByID(eValue)->pName; | |
3801 return TRUE; | |
3802 } break; | |
3803 case XFA_ATTRIBUTETYPE_Cdata: { | |
3804 CFX_WideStringC wsValueC; | |
3805 if (!TryCData(pAttr->eName, wsValueC, bUseDefault)) { | |
3806 return FALSE; | |
3807 } | |
3808 wsValue = wsValueC; | |
3809 return TRUE; | |
3810 } break; | |
3811 case XFA_ATTRIBUTETYPE_Boolean: { | |
3812 FX_BOOL bValue; | |
3813 if (!TryBoolean(pAttr->eName, bValue, bUseDefault)) { | |
3814 return FALSE; | |
3815 } | |
3816 wsValue = bValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0"); | |
3817 return TRUE; | |
3818 } break; | |
3819 case XFA_ATTRIBUTETYPE_Integer: { | |
3820 int32_t iValue; | |
3821 if (!TryInteger(pAttr->eName, iValue, bUseDefault)) { | |
3822 return FALSE; | |
3823 } | |
3824 wsValue.Format(L"%d", iValue); | |
3825 return TRUE; | |
3826 } break; | |
3827 case XFA_ATTRIBUTETYPE_Measure: { | |
3828 CXFA_Measurement mValue; | |
3829 if (!TryMeasure(pAttr->eName, mValue, bUseDefault)) { | |
3830 return FALSE; | |
3831 } | |
3832 mValue.ToString(wsValue); | |
3833 return TRUE; | |
3834 } break; | |
3835 default: | |
3836 break; | |
3837 } | |
3838 return FALSE; | |
3839 } | |
3840 FX_BOOL CXFA_Node::SetAttribute(const CFX_WideStringC& wsAttr, | |
3841 const CFX_WideStringC& wsValue, | |
3842 FX_BOOL bNotify) { | |
3843 const XFA_ATTRIBUTEINFO* pAttributeInfo = XFA_GetAttributeByName(wsValue); | |
3844 if (pAttributeInfo) { | |
3845 return SetAttribute(pAttributeInfo->eName, wsValue, bNotify); | |
3846 } | |
3847 void* pKey = XFA_GetMapKey_Custom(wsAttr); | |
3848 SetMapModuleString(pKey, wsValue); | |
3849 return TRUE; | |
3850 } | |
3851 FX_BOOL CXFA_Node::GetAttribute(const CFX_WideStringC& wsAttr, | |
3852 CFX_WideString& wsValue, | |
3853 FX_BOOL bUseDefault) { | |
3854 const XFA_ATTRIBUTEINFO* pAttributeInfo = XFA_GetAttributeByName(wsAttr); | |
3855 if (pAttributeInfo) { | |
3856 return GetAttribute(pAttributeInfo->eName, wsValue, bUseDefault); | |
3857 } | |
3858 void* pKey = XFA_GetMapKey_Custom(wsAttr); | |
3859 CFX_WideStringC wsValueC; | |
3860 if (GetMapModuleString(pKey, wsValueC)) { | |
3861 wsValue = wsValueC; | |
3862 } | |
3863 return TRUE; | |
3864 } | |
3865 FX_BOOL CXFA_Node::RemoveAttribute(const CFX_WideStringC& wsAttr) { | |
3866 void* pKey = XFA_GetMapKey_Custom(wsAttr); | |
3867 RemoveMapModuleKey(pKey); | |
3868 return TRUE; | |
3869 } | |
3870 FX_BOOL CXFA_Node::TryBoolean(XFA_ATTRIBUTE eAttr, | |
3871 FX_BOOL& bValue, | |
3872 FX_BOOL bUseDefault) { | |
3873 void* pValue = NULL; | |
3874 if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, bUseDefault, pValue)) { | |
3875 return FALSE; | |
3876 } | |
3877 bValue = (FX_BOOL)(uintptr_t)pValue; | |
3878 return TRUE; | |
3879 } | |
3880 FX_BOOL CXFA_Node::TryInteger(XFA_ATTRIBUTE eAttr, | |
3881 int32_t& iValue, | |
3882 FX_BOOL bUseDefault) { | |
3883 void* pValue = NULL; | |
3884 if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, bUseDefault, pValue)) { | |
3885 return FALSE; | |
3886 } | |
3887 iValue = (int32_t)(uintptr_t)pValue; | |
3888 return TRUE; | |
3889 } | |
3890 FX_BOOL CXFA_Node::TryEnum(XFA_ATTRIBUTE eAttr, | |
3891 XFA_ATTRIBUTEENUM& eValue, | |
3892 FX_BOOL bUseDefault) { | |
3893 void* pValue = NULL; | |
3894 if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, bUseDefault, pValue)) { | |
3895 return FALSE; | |
3896 } | |
3897 eValue = (XFA_ATTRIBUTEENUM)(uintptr_t)pValue; | |
3898 return TRUE; | |
3899 } | |
3900 FX_BOOL CXFA_Node::SetMeasure(XFA_ATTRIBUTE eAttr, | |
3901 CXFA_Measurement mValue, | |
3902 FX_BOOL bNotify) { | |
3903 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
3904 OnChanging(eAttr, &mValue, bNotify); | |
3905 SetMapModuleBuffer(pKey, &mValue, sizeof(CXFA_Measurement)); | |
3906 OnChanged(eAttr, &mValue, bNotify); | |
3907 return TRUE; | |
3908 } | |
3909 FX_BOOL CXFA_Node::TryMeasure(XFA_ATTRIBUTE eAttr, | |
3910 CXFA_Measurement& mValue, | |
3911 FX_BOOL bUseDefault) const { | |
3912 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
3913 void* pValue; | |
3914 int32_t iBytes; | |
3915 if (GetMapModuleBuffer(pKey, pValue, iBytes) && iBytes == sizeof(mValue)) { | |
3916 FXSYS_memcpy(&mValue, pValue, sizeof(mValue)); | |
3917 return TRUE; | |
3918 } | |
3919 if (bUseDefault && | |
3920 XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, | |
3921 XFA_ATTRIBUTETYPE_Measure, m_ePacket)) { | |
3922 FXSYS_memcpy(&mValue, pValue, sizeof(mValue)); | |
3923 return TRUE; | |
3924 } | |
3925 return FALSE; | |
3926 } | |
3927 | |
3928 CXFA_Measurement CXFA_Node::GetMeasure(XFA_ATTRIBUTE eAttr) const { | |
3929 CXFA_Measurement mValue; | |
3930 return TryMeasure(eAttr, mValue, TRUE) ? mValue : CXFA_Measurement(); | |
3931 } | |
3932 | |
3933 FX_BOOL CXFA_Node::SetCData(XFA_ATTRIBUTE eAttr, | |
3934 const CFX_WideString& wsValue, | |
3935 FX_BOOL bNotify, | |
3936 FX_BOOL bScriptModify) { | |
3937 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
3938 OnChanging(eAttr, (void*)(const FX_WCHAR*)wsValue, bNotify); | |
3939 if (eAttr == XFA_ATTRIBUTE_Value) { | |
3940 CFX_WideString* pClone = new CFX_WideString(wsValue); | |
3941 SetUserData(pKey, pClone, &deleteWideStringCallBack); | |
3942 } else { | |
3943 SetMapModuleString(pKey, wsValue); | |
3944 if (eAttr == XFA_ATTRIBUTE_Name) | |
3945 UpdateNameHash(); | |
3946 } | |
3947 OnChanged(eAttr, (void*)(const FX_WCHAR*)wsValue, bNotify, bScriptModify); | |
3948 if (IsNeedSavingXMLNode() && eAttr != XFA_ATTRIBUTE_QualifiedName && | |
3949 eAttr != XFA_ATTRIBUTE_BindingNode) { | |
3950 if (eAttr == XFA_ATTRIBUTE_Name && | |
3951 (m_eNodeClass == XFA_ELEMENT_DataValue || | |
3952 m_eNodeClass == XFA_ELEMENT_DataGroup)) { | |
3953 return TRUE; | |
3954 } | |
3955 if (eAttr == XFA_ATTRIBUTE_Value) { | |
3956 FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType(); | |
3957 switch (eXMLType) { | |
3958 case FDE_XMLNODE_Element: | |
3959 if (IsAttributeInXML()) { | |
3960 ((IFDE_XMLElement*)m_pXMLNode) | |
3961 ->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsValue); | |
3962 } else { | |
3963 FX_BOOL bDeleteChildren = TRUE; | |
3964 if (GetPacketID() == XFA_XDPPACKET_Datasets) { | |
3965 for (CXFA_Node* pChildDataNode = | |
3966 GetNodeItem(XFA_NODEITEM_FirstChild); | |
3967 pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem( | |
3968 XFA_NODEITEM_NextSibling)) { | |
3969 CXFA_NodeArray formNodes; | |
3970 if (pChildDataNode->GetBindItems(formNodes) > 0) { | |
3971 bDeleteChildren = FALSE; | |
3972 break; | |
3973 } | |
3974 } | |
3975 } | |
3976 if (bDeleteChildren) { | |
3977 ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren(); | |
3978 } | |
3979 ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsValue); | |
3980 } | |
3981 break; | |
3982 case FDE_XMLNODE_Text: | |
3983 ((IFDE_XMLText*)m_pXMLNode)->SetText(wsValue); | |
3984 break; | |
3985 default: | |
3986 FXSYS_assert(0); | |
3987 } | |
3988 return TRUE; | |
3989 } | |
3990 const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttr); | |
3991 if (pInfo) { | |
3992 FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element); | |
3993 CFX_WideString wsAttrName = pInfo->pName; | |
3994 if (pInfo->eName == XFA_ATTRIBUTE_ContentType) { | |
3995 wsAttrName = FX_WSTRC(L"xfa:") + wsAttrName; | |
3996 } | |
3997 ((IFDE_XMLElement*)m_pXMLNode)->SetString(wsAttrName, wsValue); | |
3998 } | |
3999 } | |
4000 return TRUE; | |
4001 } | |
4002 FX_BOOL CXFA_Node::SetAttributeValue(const CFX_WideString& wsValue, | |
4003 const CFX_WideString& wsXMLValue, | |
4004 FX_BOOL bNotify, | |
4005 FX_BOOL bScriptModify) { | |
4006 void* pKey = XFA_GetMapKey_Element(GetClassID(), XFA_ATTRIBUTE_Value); | |
4007 OnChanging(XFA_ATTRIBUTE_Value, (void*)(const FX_WCHAR*)wsValue, bNotify); | |
4008 CFX_WideString* pClone = new CFX_WideString(wsValue); | |
4009 SetUserData(pKey, pClone, &deleteWideStringCallBack); | |
4010 OnChanged(XFA_ATTRIBUTE_Value, (void*)(const FX_WCHAR*)wsValue, bNotify, | |
4011 bScriptModify); | |
4012 if (IsNeedSavingXMLNode()) { | |
4013 FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType(); | |
4014 switch (eXMLType) { | |
4015 case FDE_XMLNODE_Element: | |
4016 if (IsAttributeInXML()) { | |
4017 ((IFDE_XMLElement*)m_pXMLNode) | |
4018 ->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsXMLValue); | |
4019 } else { | |
4020 FX_BOOL bDeleteChildren = TRUE; | |
4021 if (GetPacketID() == XFA_XDPPACKET_Datasets) { | |
4022 for (CXFA_Node* pChildDataNode = | |
4023 GetNodeItem(XFA_NODEITEM_FirstChild); | |
4024 pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem( | |
4025 XFA_NODEITEM_NextSibling)) { | |
4026 CXFA_NodeArray formNodes; | |
4027 if (pChildDataNode->GetBindItems(formNodes) > 0) { | |
4028 bDeleteChildren = FALSE; | |
4029 break; | |
4030 } | |
4031 } | |
4032 } | |
4033 if (bDeleteChildren) { | |
4034 ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren(); | |
4035 } | |
4036 ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsXMLValue); | |
4037 } | |
4038 break; | |
4039 case FDE_XMLNODE_Text: | |
4040 ((IFDE_XMLText*)m_pXMLNode)->SetText(wsXMLValue); | |
4041 break; | |
4042 default: | |
4043 FXSYS_assert(0); | |
4044 } | |
4045 } | |
4046 return TRUE; | |
4047 } | |
4048 FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr, | |
4049 CFX_WideString& wsValue, | |
4050 FX_BOOL bUseDefault, | |
4051 FX_BOOL bProto) { | |
4052 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
4053 if (eAttr == XFA_ATTRIBUTE_Value) { | |
4054 CFX_WideString* pStr = (CFX_WideString*)GetUserData(pKey, bProto); | |
4055 if (pStr) { | |
4056 wsValue = *pStr; | |
4057 return TRUE; | |
4058 } | |
4059 } else { | |
4060 CFX_WideStringC wsValueC; | |
4061 if (GetMapModuleString(pKey, wsValueC)) { | |
4062 wsValue = wsValueC; | |
4063 return TRUE; | |
4064 } | |
4065 } | |
4066 if (!bUseDefault) { | |
4067 return FALSE; | |
4068 } | |
4069 void* pValue = NULL; | |
4070 if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, | |
4071 XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) { | |
4072 wsValue = (const FX_WCHAR*)pValue; | |
4073 return TRUE; | |
4074 } | |
4075 return FALSE; | |
4076 } | |
4077 FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr, | |
4078 CFX_WideStringC& wsValue, | |
4079 FX_BOOL bUseDefault, | |
4080 FX_BOOL bProto) { | |
4081 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
4082 if (eAttr == XFA_ATTRIBUTE_Value) { | |
4083 CFX_WideString* pStr = (CFX_WideString*)GetUserData(pKey, bProto); | |
4084 if (pStr) { | |
4085 wsValue = *pStr; | |
4086 return TRUE; | |
4087 } | |
4088 } else { | |
4089 if (GetMapModuleString(pKey, wsValue)) { | |
4090 return TRUE; | |
4091 } | |
4092 } | |
4093 if (!bUseDefault) { | |
4094 return FALSE; | |
4095 } | |
4096 void* pValue = NULL; | |
4097 if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, | |
4098 XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) { | |
4099 wsValue = (CFX_WideStringC)(const FX_WCHAR*)pValue; | |
4100 return TRUE; | |
4101 } | |
4102 return FALSE; | |
4103 } | |
4104 FX_BOOL CXFA_Node::SetObject(XFA_ATTRIBUTE eAttr, | |
4105 void* pData, | |
4106 XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) { | |
4107 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
4108 return SetUserData(pKey, pData, pCallbackInfo); | |
4109 } | |
4110 FX_BOOL CXFA_Node::TryObject(XFA_ATTRIBUTE eAttr, void*& pData) { | |
4111 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
4112 pData = GetUserData(pKey); | |
4113 return pData != NULL; | |
4114 } | |
4115 FX_BOOL CXFA_Node::SetValue(XFA_ATTRIBUTE eAttr, | |
4116 XFA_ATTRIBUTETYPE eType, | |
4117 void* pValue, | |
4118 FX_BOOL bNotify) { | |
4119 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
4120 OnChanging(eAttr, pValue, bNotify); | |
4121 SetMapModuleValue(pKey, pValue); | |
4122 OnChanged(eAttr, pValue, bNotify); | |
4123 if (IsNeedSavingXMLNode()) { | |
4124 FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element); | |
4125 const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttr); | |
4126 if (pInfo) { | |
4127 switch (eType) { | |
4128 case XFA_ATTRIBUTETYPE_Enum: | |
4129 ((IFDE_XMLElement*)m_pXMLNode) | |
4130 ->SetString( | |
4131 pInfo->pName, | |
4132 XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)(uintptr_t)pValue) | |
4133 ->pName); | |
4134 break; | |
4135 case XFA_ATTRIBUTETYPE_Boolean: | |
4136 ((IFDE_XMLElement*)m_pXMLNode) | |
4137 ->SetString(pInfo->pName, | |
4138 pValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0")); | |
4139 break; | |
4140 case XFA_ATTRIBUTETYPE_Integer: | |
4141 ((IFDE_XMLElement*)m_pXMLNode) | |
4142 ->SetInteger(pInfo->pName, (int32_t)(uintptr_t)pValue); | |
4143 break; | |
4144 default: | |
4145 FXSYS_assert(0); | |
4146 } | |
4147 } | |
4148 } | |
4149 return TRUE; | |
4150 } | |
4151 FX_BOOL CXFA_Node::GetValue(XFA_ATTRIBUTE eAttr, | |
4152 XFA_ATTRIBUTETYPE eType, | |
4153 FX_BOOL bUseDefault, | |
4154 void*& pValue) { | |
4155 void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr); | |
4156 if (GetMapModuleValue(pKey, pValue)) { | |
4157 return TRUE; | |
4158 } | |
4159 if (!bUseDefault) { | |
4160 return FALSE; | |
4161 } | |
4162 return XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, eType, | |
4163 m_ePacket); | |
4164 } | |
4165 static void XFA_DefaultFreeData(void* pData) {} | |
4166 static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADefaultFreeData = { | |
4167 XFA_DefaultFreeData, NULL}; | |
4168 FX_BOOL CXFA_Node::SetUserData(void* pKey, | |
4169 void* pData, | |
4170 XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) { | |
4171 SetMapModuleBuffer(pKey, &pData, sizeof(void*), | |
4172 pCallbackInfo ? pCallbackInfo : &gs_XFADefaultFreeData); | |
4173 return TRUE; | |
4174 } | |
4175 FX_BOOL CXFA_Node::TryUserData(void* pKey, void*& pData, FX_BOOL bProtoAlso) { | |
4176 int32_t iBytes = 0; | |
4177 if (!GetMapModuleBuffer(pKey, pData, iBytes, bProtoAlso)) { | |
4178 return FALSE; | |
4179 } | |
4180 return iBytes == sizeof(void*) && FXSYS_memcpy(&pData, pData, iBytes); | |
4181 } | |
4182 FX_BOOL CXFA_Node::SetScriptContent(const CFX_WideString& wsContent, | |
4183 const CFX_WideString& wsXMLValue, | |
4184 FX_BOOL bNotify, | |
4185 FX_BOOL bScriptModify, | |
4186 FX_BOOL bSyncData) { | |
4187 CXFA_Node* pNode = NULL; | |
4188 CXFA_Node* pBindNode = NULL; | |
4189 switch (GetObjectType()) { | |
4190 case XFA_OBJECTTYPE_ContainerNode: { | |
4191 if (XFA_FieldIsMultiListBox(this)) { | |
4192 CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value); | |
4193 CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild); | |
4194 FXSYS_assert(pChildValue); | |
4195 pChildValue->SetCData(XFA_ATTRIBUTE_ContentType, FX_WSTRC(L"text/xml")); | |
4196 pChildValue->SetScriptContent(wsContent, wsContent, bNotify, | |
4197 bScriptModify, FALSE); | |
4198 CXFA_Node* pBind = GetBindData(); | |
4199 if (bSyncData && pBind) { | |
4200 CFX_WideStringArray wsSaveTextArray; | |
4201 int32_t iSize = 0; | |
4202 if (!wsContent.IsEmpty()) { | |
4203 int32_t iStart = 0; | |
4204 int32_t iLength = wsContent.GetLength(); | |
4205 int32_t iEnd = wsContent.Find(L'\n', iStart); | |
4206 iEnd = (iEnd == -1) ? iLength : iEnd; | |
4207 while (iEnd >= iStart) { | |
4208 wsSaveTextArray.Add(wsContent.Mid(iStart, iEnd - iStart)); | |
4209 iStart = iEnd + 1; | |
4210 if (iStart >= iLength) { | |
4211 break; | |
4212 } | |
4213 iEnd = wsContent.Find(L'\n', iStart); | |
4214 if (iEnd < 0) { | |
4215 wsSaveTextArray.Add(wsContent.Mid(iStart, iLength - iStart)); | |
4216 } | |
4217 } | |
4218 iSize = wsSaveTextArray.GetSize(); | |
4219 } | |
4220 if (iSize == 0) { | |
4221 while (CXFA_Node* pChildNode = | |
4222 pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) { | |
4223 pBind->RemoveChild(pChildNode); | |
4224 } | |
4225 } else { | |
4226 CXFA_NodeArray valueNodes; | |
4227 int32_t iDatas = pBind->GetNodeList( | |
4228 valueNodes, XFA_NODEFILTER_Children, XFA_ELEMENT_DataValue); | |
4229 if (iDatas < iSize) { | |
4230 int32_t iAddNodes = iSize - iDatas; | |
4231 CXFA_Node* pValueNodes = NULL; | |
4232 while (iAddNodes-- > 0) { | |
4233 pValueNodes = | |
4234 pBind->CreateSamePacketNode(XFA_ELEMENT_DataValue); | |
4235 pValueNodes->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"value")); | |
4236 pValueNodes->CreateXMLMappingNode(); | |
4237 pBind->InsertChild(pValueNodes); | |
4238 } | |
4239 pValueNodes = NULL; | |
4240 } else if (iDatas > iSize) { | |
4241 int32_t iDelNodes = iDatas - iSize; | |
4242 while (iDelNodes-- > 0) { | |
4243 pBind->RemoveChild(pBind->GetNodeItem(XFA_NODEITEM_FirstChild)); | |
4244 } | |
4245 } | |
4246 int32_t i = 0; | |
4247 for (CXFA_Node* pValueNode = | |
4248 pBind->GetNodeItem(XFA_NODEITEM_FirstChild); | |
4249 pValueNode; pValueNode = pValueNode->GetNodeItem( | |
4250 XFA_NODEITEM_NextSibling)) { | |
4251 pValueNode->SetAttributeValue(wsSaveTextArray[i], | |
4252 wsSaveTextArray[i], FALSE); | |
4253 i++; | |
4254 } | |
4255 } | |
4256 CXFA_NodeArray nodeArray; | |
4257 pBind->GetBindItems(nodeArray); | |
4258 for (int32_t i = 0; i < nodeArray.GetSize(); i++) { | |
4259 CXFA_Node* pNode = nodeArray[i]; | |
4260 if (pNode == this) { | |
4261 continue; | |
4262 } | |
4263 pNode->SetScriptContent(wsContent, wsContent, bNotify, | |
4264 bScriptModify, FALSE); | |
4265 } | |
4266 } | |
4267 break; | |
4268 } else if (GetClassID() == XFA_ELEMENT_ExclGroup) { | |
4269 pNode = this; | |
4270 } else { | |
4271 CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value); | |
4272 CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild); | |
4273 FXSYS_assert(pChildValue); | |
4274 pChildValue->SetScriptContent(wsContent, wsContent, bNotify, | |
4275 bScriptModify, FALSE); | |
4276 } | |
4277 pBindNode = GetBindData(); | |
4278 if (pBindNode && bSyncData) { | |
4279 pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify, | |
4280 bScriptModify, FALSE); | |
4281 CXFA_NodeArray nodeArray; | |
4282 pBindNode->GetBindItems(nodeArray); | |
4283 for (int32_t i = 0; i < nodeArray.GetSize(); i++) { | |
4284 CXFA_Node* pNode = nodeArray[i]; | |
4285 if (pNode == this) { | |
4286 continue; | |
4287 } | |
4288 pNode->SetScriptContent(wsContent, wsContent, bNotify, TRUE, FALSE); | |
4289 } | |
4290 } | |
4291 pBindNode = NULL; | |
4292 break; | |
4293 } | |
4294 case XFA_OBJECTTYPE_ContentNode: { | |
4295 CFX_WideString wsContentType; | |
4296 if (GetClassID() == XFA_ELEMENT_ExData) { | |
4297 GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); | |
4298 if (wsContentType.Equal(FX_WSTRC(L"text/html"))) { | |
4299 wsContentType = FX_WSTRC(L""); | |
4300 SetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType); | |
4301 } | |
4302 } | |
4303 CXFA_Node* pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild); | |
4304 if (!pContentRawDataNode) { | |
4305 pContentRawDataNode = | |
4306 CreateSamePacketNode((wsContentType.Equal(FX_WSTRC(L"text/xml"))) | |
4307 ? XFA_ELEMENT_Sharpxml | |
4308 : XFA_ELEMENT_Sharptext); | |
4309 InsertChild(pContentRawDataNode); | |
4310 } | |
4311 return pContentRawDataNode->SetScriptContent( | |
4312 wsContent, wsXMLValue, bNotify, bScriptModify, bSyncData); | |
4313 } break; | |
4314 case XFA_OBJECTTYPE_NodeC: | |
4315 case XFA_OBJECTTYPE_TextNode: | |
4316 pNode = this; | |
4317 break; | |
4318 case XFA_OBJECTTYPE_NodeV: | |
4319 pNode = this; | |
4320 if (bSyncData && GetPacketID() == XFA_XDPPACKET_Form) { | |
4321 CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent); | |
4322 if (pParent) { | |
4323 pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent); | |
4324 } | |
4325 if (pParent && pParent->GetClassID() == XFA_ELEMENT_Value) { | |
4326 pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent); | |
4327 if (pParent && pParent->IsContainerNode()) { | |
4328 pBindNode = pParent->GetBindData(); | |
4329 if (pBindNode) { | |
4330 pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify, | |
4331 bScriptModify, FALSE); | |
4332 } | |
4333 } | |
4334 } | |
4335 } | |
4336 break; | |
4337 default: | |
4338 if (GetClassID() == XFA_ELEMENT_DataValue) { | |
4339 pNode = this; | |
4340 pBindNode = this; | |
4341 } | |
4342 break; | |
4343 } | |
4344 if (pNode) { | |
4345 SetAttributeValue(wsContent, wsXMLValue, bNotify, bScriptModify); | |
4346 if (pBindNode && bSyncData) { | |
4347 CXFA_NodeArray nodeArray; | |
4348 pBindNode->GetBindItems(nodeArray); | |
4349 for (int32_t i = 0; i < nodeArray.GetSize(); i++) { | |
4350 CXFA_Node* pNode = nodeArray[i]; | |
4351 pNode->SetScriptContent(wsContent, wsContent, bNotify, bScriptModify, | |
4352 FALSE); | |
4353 } | |
4354 } | |
4355 return TRUE; | |
4356 } | |
4357 return FALSE; | |
4358 } | |
4359 FX_BOOL CXFA_Node::SetContent(const CFX_WideString& wsContent, | |
4360 const CFX_WideString& wsXMLValue, | |
4361 FX_BOOL bNotify, | |
4362 FX_BOOL bScriptModify, | |
4363 FX_BOOL bSyncData) { | |
4364 return SetScriptContent(wsContent, wsXMLValue, bNotify, bScriptModify, | |
4365 bSyncData); | |
4366 } | |
4367 CFX_WideString CXFA_Node::GetScriptContent(FX_BOOL bScriptModify) { | |
4368 CFX_WideString wsContent; | |
4369 return TryContent(wsContent, bScriptModify) ? wsContent : CFX_WideString(); | |
4370 } | |
4371 CFX_WideString CXFA_Node::GetContent() { | |
4372 return GetScriptContent(); | |
4373 } | |
4374 FX_BOOL CXFA_Node::TryContent(CFX_WideString& wsContent, | |
4375 FX_BOOL bScriptModify, | |
4376 FX_BOOL bProto) { | |
4377 CXFA_Node* pNode = NULL; | |
4378 switch (GetObjectType()) { | |
4379 case XFA_OBJECTTYPE_ContainerNode: | |
4380 if (GetClassID() == XFA_ELEMENT_ExclGroup) { | |
4381 pNode = this; | |
4382 } else { | |
4383 CXFA_Node* pValue = GetChild(0, XFA_ELEMENT_Value); | |
4384 if (!pValue) { | |
4385 return FALSE; | |
4386 } | |
4387 CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild); | |
4388 if (pChildValue && XFA_FieldIsMultiListBox(this)) { | |
4389 pChildValue->SetAttribute(XFA_ATTRIBUTE_ContentType, | |
4390 FX_WSTRC(L"text/xml")); | |
4391 } | |
4392 return pChildValue | |
4393 ? pChildValue->TryContent(wsContent, bScriptModify, bProto) | |
4394 : FALSE; | |
4395 } | |
4396 break; | |
4397 case XFA_OBJECTTYPE_ContentNode: { | |
4398 CXFA_Node* pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild); | |
4399 if (!pContentRawDataNode) { | |
4400 XFA_ELEMENT element = XFA_ELEMENT_Sharptext; | |
4401 if (GetClassID() == XFA_ELEMENT_ExData) { | |
4402 CFX_WideString wsContentType; | |
4403 GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); | |
4404 if (wsContentType.Equal(FX_WSTRC(L"text/html"))) { | |
4405 element = XFA_ELEMENT_SharpxHTML; | |
4406 } else if (wsContentType.Equal(FX_WSTRC(L"text/xml"))) { | |
4407 element = XFA_ELEMENT_Sharpxml; | |
4408 } | |
4409 } | |
4410 pContentRawDataNode = CreateSamePacketNode(element); | |
4411 InsertChild(pContentRawDataNode); | |
4412 } | |
4413 return pContentRawDataNode->TryContent(wsContent, bScriptModify, bProto); | |
4414 } | |
4415 case XFA_OBJECTTYPE_NodeC: | |
4416 case XFA_OBJECTTYPE_NodeV: | |
4417 case XFA_OBJECTTYPE_TextNode: | |
4418 pNode = this; | |
4419 default: | |
4420 if (GetClassID() == XFA_ELEMENT_DataValue) { | |
4421 pNode = this; | |
4422 } | |
4423 break; | |
4424 } | |
4425 if (pNode) { | |
4426 if (bScriptModify) { | |
4427 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); | |
4428 if (pScriptContext) { | |
4429 m_pDocument->GetScriptContext()->AddNodesOfRunScript(this); | |
4430 } | |
4431 } | |
4432 return TryCData(XFA_ATTRIBUTE_Value, wsContent, FALSE, bProto); | |
4433 } | |
4434 return FALSE; | |
4435 } | |
4436 CXFA_Node* CXFA_Node::GetModelNode() { | |
4437 switch (GetPacketID()) { | |
4438 case XFA_XDPPACKET_XDP: | |
4439 return m_pDocument->GetRoot(); | |
4440 case XFA_XDPPACKET_Config: | |
4441 return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config)); | |
4442 case XFA_XDPPACKET_Template: | |
4443 return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Template)); | |
4444 case XFA_XDPPACKET_Form: | |
4445 return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)); | |
4446 case XFA_XDPPACKET_Datasets: | |
4447 return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Datasets)); | |
4448 case XFA_XDPPACKET_LocaleSet: | |
4449 return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_LocaleSet)); | |
4450 case XFA_XDPPACKET_ConnectionSet: | |
4451 return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_ConnectionSet)); | |
4452 case XFA_XDPPACKET_SourceSet: | |
4453 return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_SourceSet)); | |
4454 case XFA_XDPPACKET_Xdc: | |
4455 return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Xdc)); | |
4456 default: | |
4457 return this; | |
4458 } | |
4459 } | |
4460 FX_BOOL CXFA_Node::TryNamespace(CFX_WideString& wsNamespace) { | |
4461 wsNamespace.Empty(); | |
4462 if (GetObjectType() == XFA_OBJECTTYPE_ModelNode || | |
4463 GetClassID() == XFA_ELEMENT_Packet) { | |
4464 IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); | |
4465 if (!pXMLNode || pXMLNode->GetType() != FDE_XMLNODE_Element) { | |
4466 return FALSE; | |
4467 } | |
4468 ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace); | |
4469 return TRUE; | |
4470 } else if (GetPacketID() == XFA_XDPPACKET_Datasets) { | |
4471 IFDE_XMLNode* pXMLNode = GetXMLMappingNode(); | |
4472 if (!pXMLNode) { | |
4473 return FALSE; | |
4474 } | |
4475 if (pXMLNode->GetType() != FDE_XMLNODE_Element) { | |
4476 return TRUE; | |
4477 } | |
4478 if (GetClassID() == XFA_ELEMENT_DataValue && | |
4479 GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData) { | |
4480 return XFA_FDEExtension_ResolveNamespaceQualifier( | |
4481 (IFDE_XMLElement*)pXMLNode, GetCData(XFA_ATTRIBUTE_QualifiedName), | |
4482 wsNamespace); | |
4483 } | |
4484 ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace); | |
4485 return TRUE; | |
4486 } else { | |
4487 CXFA_Node* pModelNode = GetModelNode(); | |
4488 return pModelNode->TryNamespace(wsNamespace); | |
4489 } | |
4490 } | |
4491 CXFA_Node* CXFA_Node::GetProperty(int32_t index, | |
4492 XFA_ELEMENT eProperty, | |
4493 FX_BOOL bCreateProperty) { | |
4494 XFA_ELEMENT eElement = GetClassID(); | |
4495 FX_DWORD dwPacket = GetPacketID(); | |
4496 const XFA_PROPERTY* pProperty = | |
4497 XFA_GetPropertyOfElement(eElement, eProperty, dwPacket); | |
4498 if (pProperty == NULL || index >= pProperty->uOccur) { | |
4499 return NULL; | |
4500 } | |
4501 CXFA_Node* pNode = m_pChild; | |
4502 int32_t iCount = 0; | |
4503 for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
4504 if (pNode->GetClassID() == eProperty) { | |
4505 iCount++; | |
4506 if (iCount > index) { | |
4507 return pNode; | |
4508 } | |
4509 } | |
4510 } | |
4511 if (!bCreateProperty) { | |
4512 return NULL; | |
4513 } | |
4514 if (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf) { | |
4515 pNode = m_pChild; | |
4516 for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
4517 const XFA_PROPERTY* pExistProperty = | |
4518 XFA_GetPropertyOfElement(eElement, pNode->GetClassID(), dwPacket); | |
4519 if (pExistProperty && (pExistProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) { | |
4520 return NULL; | |
4521 } | |
4522 } | |
4523 } | |
4524 IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory(); | |
4525 const XFA_PACKETINFO* pPacket = XFA_GetPacketByID(dwPacket); | |
4526 CXFA_Node* pNewNode; | |
4527 for (; iCount <= index; iCount++) { | |
4528 pNewNode = pFactory->CreateNode(pPacket, eProperty); | |
4529 if (!pNewNode) { | |
4530 return NULL; | |
4531 } | |
4532 InsertChild(pNewNode, nullptr); | |
4533 pNewNode->SetFlag(XFA_NODEFLAG_Initialized); | |
4534 } | |
4535 return pNewNode; | |
4536 } | |
4537 int32_t CXFA_Node::CountChildren(XFA_ELEMENT eElement, FX_BOOL bOnlyChild) { | |
4538 CXFA_Node* pNode = m_pChild; | |
4539 int32_t iCount = 0; | |
4540 for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
4541 if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) { | |
4542 if (bOnlyChild) { | |
4543 const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement( | |
4544 GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN); | |
4545 if (pProperty) { | |
4546 continue; | |
4547 } | |
4548 } | |
4549 iCount++; | |
4550 } | |
4551 } | |
4552 return iCount; | |
4553 } | |
4554 CXFA_Node* CXFA_Node::GetChild(int32_t index, | |
4555 XFA_ELEMENT eElement, | |
4556 FX_BOOL bOnlyChild) { | |
4557 FXSYS_assert(index > -1); | |
4558 CXFA_Node* pNode = m_pChild; | |
4559 int32_t iCount = 0; | |
4560 for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
4561 if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) { | |
4562 if (bOnlyChild) { | |
4563 const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement( | |
4564 GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN); | |
4565 if (pProperty) { | |
4566 continue; | |
4567 } | |
4568 } | |
4569 iCount++; | |
4570 if (iCount > index) { | |
4571 return pNode; | |
4572 } | |
4573 } | |
4574 } | |
4575 return NULL; | |
4576 } | |
4577 int32_t CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) { | |
4578 ASSERT(!pNode->m_pNext); | |
4579 pNode->m_pParent = this; | |
4580 FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode); | |
4581 if (!bWasPurgeNode) | |
4582 FXSYS_assert(false); | |
4583 | |
4584 if (m_pChild == NULL || index == 0) { | |
4585 if (index > 0) { | |
4586 return -1; | |
4587 } | |
4588 pNode->m_pNext = m_pChild; | |
4589 m_pChild = pNode; | |
4590 index = 0; | |
4591 } else if (index < 0) { | |
4592 m_pLastChild->m_pNext = pNode; | |
4593 } else { | |
4594 CXFA_Node* pPrev = m_pChild; | |
4595 int32_t iCount = 0; | |
4596 while (++iCount != index && pPrev->m_pNext) { | |
4597 pPrev = pPrev->m_pNext; | |
4598 } | |
4599 if (index > 0 && index != iCount) { | |
4600 return -1; | |
4601 } | |
4602 pNode->m_pNext = pPrev->m_pNext; | |
4603 pPrev->m_pNext = pNode; | |
4604 index = iCount; | |
4605 } | |
4606 if (pNode->m_pNext == NULL) { | |
4607 m_pLastChild = pNode; | |
4608 } | |
4609 ASSERT(m_pLastChild); | |
4610 ASSERT(m_pLastChild->m_pNext == NULL); | |
4611 pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE); | |
4612 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
4613 if (pNotify) { | |
4614 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode); | |
4615 } | |
4616 if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) { | |
4617 FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL); | |
4618 m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, index); | |
4619 pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE); | |
4620 } | |
4621 return index; | |
4622 } | |
4623 FX_BOOL CXFA_Node::InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode) { | |
4624 if (!pNode || pNode->m_pParent || | |
4625 (pBeforeNode && pBeforeNode->m_pParent != this)) { | |
4626 FXSYS_assert(false); | |
4627 return FALSE; | |
4628 } | |
4629 FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode); | |
4630 if (!bWasPurgeNode) | |
4631 FXSYS_assert(false); | |
4632 | |
4633 int32_t nIndex = -1; | |
4634 pNode->m_pParent = this; | |
4635 if (m_pChild == NULL || pBeforeNode == m_pChild) { | |
4636 pNode->m_pNext = m_pChild; | |
4637 m_pChild = pNode; | |
4638 nIndex = 0; | |
4639 } else if (!pBeforeNode) { | |
4640 pNode->m_pNext = m_pLastChild->m_pNext; | |
4641 m_pLastChild->m_pNext = pNode; | |
4642 } else { | |
4643 nIndex = 1; | |
4644 CXFA_Node* pPrev = m_pChild; | |
4645 while (pPrev->m_pNext != pBeforeNode) { | |
4646 pPrev = pPrev->m_pNext; | |
4647 nIndex++; | |
4648 } | |
4649 pNode->m_pNext = pPrev->m_pNext; | |
4650 pPrev->m_pNext = pNode; | |
4651 } | |
4652 if (pNode->m_pNext == NULL) { | |
4653 m_pLastChild = pNode; | |
4654 } | |
4655 ASSERT(m_pLastChild); | |
4656 ASSERT(m_pLastChild->m_pNext == NULL); | |
4657 pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE); | |
4658 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
4659 if (pNotify) { | |
4660 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode); | |
4661 } | |
4662 if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) { | |
4663 FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL); | |
4664 m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, nIndex); | |
4665 pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE); | |
4666 } | |
4667 return TRUE; | |
4668 } | |
4669 CXFA_Node* CXFA_Node::Deprecated_GetPrevSibling() { | |
4670 if (!m_pParent) { | |
4671 return NULL; | |
4672 } | |
4673 for (CXFA_Node* pSibling = m_pParent->m_pChild; pSibling; | |
4674 pSibling = pSibling->m_pNext) { | |
4675 if (pSibling->m_pNext == this) { | |
4676 return pSibling; | |
4677 } | |
4678 } | |
4679 return NULL; | |
4680 } | |
4681 FX_BOOL CXFA_Node::RemoveChild(CXFA_Node* pNode, FX_BOOL bNotify) { | |
4682 if (pNode == NULL || pNode->m_pParent != this) { | |
4683 FXSYS_assert(FALSE); | |
4684 return FALSE; | |
4685 } | |
4686 if (m_pChild == pNode) { | |
4687 m_pChild = pNode->m_pNext; | |
4688 if (m_pLastChild == pNode) { | |
4689 m_pLastChild = pNode->m_pNext; | |
4690 } | |
4691 pNode->m_pNext = NULL; | |
4692 pNode->m_pParent = NULL; | |
4693 } else { | |
4694 CXFA_Node* pPrev = pNode->Deprecated_GetPrevSibling(); | |
4695 pPrev->m_pNext = pNode->m_pNext; | |
4696 if (m_pLastChild == pNode) { | |
4697 m_pLastChild = pNode->m_pNext ? pNode->m_pNext : pPrev; | |
4698 } | |
4699 pNode->m_pNext = NULL; | |
4700 pNode->m_pParent = NULL; | |
4701 } | |
4702 ASSERT(m_pLastChild == NULL || m_pLastChild->m_pNext == NULL); | |
4703 OnRemoved(this, pNode, bNotify); | |
4704 pNode->SetFlag(XFA_NODEFLAG_HasRemoved); | |
4705 m_pDocument->AddPurgeNode(pNode); | |
4706 if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) { | |
4707 if (pNode->IsAttributeInXML()) { | |
4708 FXSYS_assert(pNode->m_pXMLNode == m_pXMLNode && | |
4709 m_pXMLNode->GetType() == FDE_XMLNODE_Element); | |
4710 if (pNode->m_pXMLNode->GetType() == FDE_XMLNODE_Element) { | |
4711 IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)(pNode->m_pXMLNode); | |
4712 CFX_WideStringC wsAttributeName = | |
4713 pNode->GetCData(XFA_ATTRIBUTE_QualifiedName); | |
4714 pXMLElement->RemoveAttribute(wsAttributeName.GetPtr()); | |
4715 } | |
4716 CFX_WideString wsName; | |
4717 pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE); | |
4718 IFDE_XMLElement* pNewXMLElement = IFDE_XMLElement::Create(wsName); | |
4719 CFX_WideStringC wsValue = GetCData(XFA_ATTRIBUTE_Value); | |
4720 if (!wsValue.IsEmpty()) { | |
4721 pNewXMLElement->SetTextData(wsValue); | |
4722 } | |
4723 pNode->m_pXMLNode = pNewXMLElement; | |
4724 pNode->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown); | |
4725 } else { | |
4726 m_pXMLNode->RemoveChildNode(pNode->m_pXMLNode); | |
4727 } | |
4728 pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); | |
4729 } | |
4730 return TRUE; | |
4731 } | |
4732 CXFA_Node* CXFA_Node::GetFirstChildByName(const CFX_WideStringC& wsName) const { | |
4733 return GetFirstChildByName( | |
4734 wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(), | |
4735 wsName.GetLength())); | |
4736 } | |
4737 CXFA_Node* CXFA_Node::GetFirstChildByName(FX_DWORD dwNameHash) const { | |
4738 for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode; | |
4739 pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
4740 if (pNode->GetNameHash() == dwNameHash) { | |
4741 return pNode; | |
4742 } | |
4743 } | |
4744 return NULL; | |
4745 } | |
4746 CXFA_Node* CXFA_Node::GetFirstChildByClass(XFA_ELEMENT eElement) const { | |
4747 for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode; | |
4748 pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
4749 if (pNode->GetClassID() == eElement) { | |
4750 return pNode; | |
4751 } | |
4752 } | |
4753 return NULL; | |
4754 } | |
4755 CXFA_Node* CXFA_Node::GetNextSameNameSibling(FX_DWORD dwNameHash) const { | |
4756 for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode; | |
4757 pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
4758 if (pNode->GetNameHash() == dwNameHash) { | |
4759 return pNode; | |
4760 } | |
4761 } | |
4762 return NULL; | |
4763 } | |
4764 CXFA_Node* CXFA_Node::GetNextSameNameSibling( | |
4765 const CFX_WideStringC& wsNodeName) const { | |
4766 return GetNextSameNameSibling( | |
4767 wsNodeName.IsEmpty() ? 0 | |
4768 : FX_HashCode_String_GetW(wsNodeName.GetPtr(), | |
4769 wsNodeName.GetLength())); | |
4770 } | |
4771 CXFA_Node* CXFA_Node::GetNextSameClassSibling(XFA_ELEMENT eElement) const { | |
4772 for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode; | |
4773 pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
4774 if (pNode->GetClassID() == eElement) { | |
4775 return pNode; | |
4776 } | |
4777 } | |
4778 return NULL; | |
4779 } | |
4780 int32_t CXFA_Node::GetNodeSameNameIndex() const { | |
4781 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); | |
4782 if (!pScriptContext) { | |
4783 return -1; | |
4784 } | |
4785 return pScriptContext->GetIndexByName(const_cast<CXFA_Node*>(this)); | |
4786 } | |
4787 int32_t CXFA_Node::GetNodeSameClassIndex() const { | |
4788 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); | |
4789 if (!pScriptContext) { | |
4790 return -1; | |
4791 } | |
4792 return pScriptContext->GetIndexByClassName(const_cast<CXFA_Node*>(this)); | |
4793 } | |
4794 void CXFA_Node::GetSOMExpression(CFX_WideString& wsSOMExpression) { | |
4795 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext(); | |
4796 if (!pScriptContext) { | |
4797 return; | |
4798 } | |
4799 pScriptContext->GetSomExpression(this, wsSOMExpression); | |
4800 } | |
4801 CXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() { | |
4802 CXFA_Node* pInstanceMgr = NULL; | |
4803 if (m_ePacket == XFA_XDPPACKET_Form) { | |
4804 CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent); | |
4805 if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_Area) { | |
4806 return pInstanceMgr; | |
4807 } | |
4808 for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode; | |
4809 pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) { | |
4810 XFA_ELEMENT eType = pNode->GetClassID(); | |
4811 if ((eType == XFA_ELEMENT_Subform || eType == XFA_ELEMENT_SubformSet) && | |
4812 pNode->m_dwNameHash != m_dwNameHash) { | |
4813 break; | |
4814 } | |
4815 if (eType == XFA_ELEMENT_InstanceManager) { | |
4816 CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name); | |
4817 CFX_WideStringC wsInstName = pNode->GetCData(XFA_ATTRIBUTE_Name); | |
4818 if (wsInstName.GetLength() > 0 && wsInstName.GetAt(0) == '_' && | |
4819 wsInstName.Mid(1) == wsName) { | |
4820 pInstanceMgr = pNode; | |
4821 } | |
4822 break; | |
4823 } | |
4824 } | |
4825 } | |
4826 return pInstanceMgr; | |
4827 } | |
4828 CXFA_Node* CXFA_Node::GetOccurNode() { | |
4829 return GetFirstChildByClass(XFA_ELEMENT_Occur); | |
4830 } | |
4831 FX_BOOL CXFA_Node::HasFlag(FX_DWORD dwFlag) const { | |
4832 if (m_uFlags & dwFlag) { | |
4833 return TRUE; | |
4834 } | |
4835 switch (dwFlag) { | |
4836 case XFA_NODEFLAG_HasRemoved: | |
4837 return m_pParent && m_pParent->HasFlag(dwFlag); | |
4838 default: | |
4839 break; | |
4840 } | |
4841 return FALSE; | |
4842 } | |
4843 void CXFA_Node::SetFlag(FX_DWORD dwFlag, FX_BOOL bOn, FX_BOOL bNotify) { | |
4844 if (bOn) { | |
4845 switch (dwFlag) { | |
4846 case XFA_NODEFLAG_Initialized: | |
4847 if (bNotify && !HasFlag(XFA_NODEFLAG_Initialized)) { | |
4848 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
4849 if (pNotify) { | |
4850 pNotify->OnNodeEvent(this, XFA_NODEEVENT_Ready); | |
4851 } | |
4852 } | |
4853 break; | |
4854 default: | |
4855 break; | |
4856 } | |
4857 m_uFlags |= dwFlag; | |
4858 } else { | |
4859 m_uFlags &= ~dwFlag; | |
4860 } | |
4861 } | |
4862 FX_BOOL CXFA_Node::IsAttributeInXML() { | |
4863 return GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData; | |
4864 } | |
4865 void CXFA_Node::OnRemoved(CXFA_Node* pParent, | |
4866 CXFA_Node* pRemoved, | |
4867 FX_BOOL bNotify) { | |
4868 if (bNotify && pParent) { | |
4869 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
4870 if (pNotify) { | |
4871 pNotify->OnNodeEvent(pParent, XFA_NODEEVENT_ChildRemoved, pRemoved); | |
4872 } | |
4873 } | |
4874 } | |
4875 void CXFA_Node::OnChanging(XFA_ATTRIBUTE eAttr, | |
4876 void* pNewValue, | |
4877 FX_BOOL bNotify) { | |
4878 if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) { | |
4879 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
4880 if (pNotify) { | |
4881 pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanging, | |
4882 (void*)(uintptr_t)eAttr, pNewValue); | |
4883 } | |
4884 } | |
4885 } | |
4886 void CXFA_Node::OnChanged(XFA_ATTRIBUTE eAttr, | |
4887 void* pNewValue, | |
4888 FX_BOOL bNotify, | |
4889 FX_BOOL bScriptModify) { | |
4890 if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) { | |
4891 Script_Attribute_SendAttributeChangeMessage((void*)(uintptr_t)eAttr, | |
4892 pNewValue, bScriptModify); | |
4893 } | |
4894 } | |
4895 int32_t CXFA_Node::execSingleEventByName(const CFX_WideStringC& wsEventName, | |
4896 XFA_ELEMENT eElementType) { | |
4897 int32_t iRet = XFA_EVENTERROR_NotExist; | |
4898 const XFA_ExecEventParaInfo* eventParaInfo = | |
4899 GetEventParaInfoByName(wsEventName); | |
4900 if (eventParaInfo) { | |
4901 uint32_t validFlags = eventParaInfo->m_validFlags; | |
4902 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify(); | |
4903 if (!pNotify) { | |
4904 return iRet; | |
4905 } | |
4906 if (validFlags == 1) { | |
4907 iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType); | |
4908 } else if (validFlags == 2) { | |
4909 iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, | |
4910 FALSE, FALSE); | |
4911 } else if (validFlags == 3) { | |
4912 if (eElementType == XFA_ELEMENT_Subform) { | |
4913 iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, | |
4914 FALSE, FALSE); | |
4915 } | |
4916 } else if (validFlags == 4) { | |
4917 if (eElementType == XFA_ELEMENT_ExclGroup || | |
4918 eElementType == XFA_ELEMENT_Field) { | |
4919 CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent); | |
4920 if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) { | |
4921 iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, | |
4922 FALSE, FALSE); | |
4923 } | |
4924 iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, | |
4925 FALSE, FALSE); | |
4926 } | |
4927 } else if (validFlags == 5) { | |
4928 if (eElementType == XFA_ELEMENT_Field) { | |
4929 iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, | |
4930 FALSE, FALSE); | |
4931 } | |
4932 } else if (validFlags == 6) { | |
4933 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
4934 if (pWidgetData) { | |
4935 CXFA_Node* pUINode = pWidgetData->GetUIChild(); | |
4936 if (pUINode->m_eNodeClass == XFA_ELEMENT_Signature) { | |
4937 iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, | |
4938 FALSE, FALSE); | |
4939 } | |
4940 } | |
4941 } else if (validFlags == 7) { | |
4942 CXFA_WidgetData* pWidgetData = GetWidgetData(); | |
4943 if (pWidgetData) { | |
4944 CXFA_Node* pUINode = pWidgetData->GetUIChild(); | |
4945 if ((pUINode->m_eNodeClass == XFA_ELEMENT_ChoiceList) && | |
4946 (!pWidgetData->IsListBox())) { | |
4947 iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType, | |
4948 FALSE, FALSE); | |
4949 } | |
4950 } | |
4951 } | |
4952 } | |
4953 return iRet; | |
4954 } | |
4955 void CXFA_Node::UpdateNameHash() { | |
4956 const XFA_NOTSUREATTRIBUTE* pNotsure = | |
4957 XFA_GetNotsureAttribute(GetClassID(), XFA_ATTRIBUTE_Name); | |
4958 if (!pNotsure || pNotsure->eType == XFA_ATTRIBUTETYPE_Cdata) { | |
4959 CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name); | |
4960 m_dwNameHash = | |
4961 wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(), | |
4962 wsName.GetLength()); | |
4963 } else if (pNotsure->eType == XFA_ATTRIBUTETYPE_Enum) { | |
4964 CFX_WideStringC wsName = | |
4965 XFA_GetAttributeEnumByID(GetEnum(XFA_ATTRIBUTE_Name))->pName; | |
4966 m_dwNameHash = | |
4967 wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(), | |
4968 wsName.GetLength()); | |
4969 } | |
4970 } | |
4971 IFDE_XMLNode* CXFA_Node::CreateXMLMappingNode() { | |
4972 if (!m_pXMLNode) { | |
4973 CFX_WideStringC wsTag = GetCData(XFA_ATTRIBUTE_Name); | |
4974 m_pXMLNode = IFDE_XMLElement::Create(wsTag); | |
4975 SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); | |
4976 } | |
4977 return m_pXMLNode; | |
4978 } | |
4979 FX_BOOL CXFA_Node::IsNeedSavingXMLNode() { | |
4980 return m_pXMLNode && (GetPacketID() == XFA_XDPPACKET_Datasets || | |
4981 GetClassID() == XFA_ELEMENT_Xfa); | |
4982 } | |
4983 | |
4984 XFA_MAPMODULEDATA* CXFA_Node::CreateMapModuleData() { | |
4985 if (!m_pMapModuleData) | |
4986 m_pMapModuleData = new XFA_MAPMODULEDATA; | |
4987 return m_pMapModuleData; | |
4988 } | |
4989 | |
4990 XFA_MAPMODULEDATA* CXFA_Node::GetMapModuleData() const { | |
4991 return m_pMapModuleData; | |
4992 } | |
4993 | |
4994 void CXFA_Node::SetMapModuleValue(void* pKey, void* pValue) { | |
4995 XFA_MAPMODULEDATA* pModule = CreateMapModuleData(); | |
4996 pModule->m_ValueMap.SetAt(pKey, pValue); | |
4997 } | |
4998 | |
4999 FX_BOOL CXFA_Node::GetMapModuleValue(void* pKey, void*& pValue) { | |
5000 CXFA_Node* pNode = this; | |
5001 while (pNode) { | |
5002 XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData(); | |
5003 if (pModule && pModule->m_ValueMap.Lookup(pKey, pValue)) { | |
5004 return TRUE; | |
5005 } | |
5006 pNode = pNode->GetPacketID() != XFA_XDPPACKET_Datasets | |
5007 ? pNode->GetTemplateNode() | |
5008 : NULL; | |
5009 } | |
5010 return FALSE; | |
5011 } | |
5012 void CXFA_Node::SetMapModuleString(void* pKey, const CFX_WideStringC& wsValue) { | |
5013 SetMapModuleBuffer(pKey, (void*)wsValue.GetPtr(), | |
5014 wsValue.GetLength() * sizeof(FX_WCHAR)); | |
5015 } | |
5016 FX_BOOL CXFA_Node::GetMapModuleString(void* pKey, CFX_WideStringC& wsValue) { | |
5017 void* pValue; | |
5018 int32_t iBytes; | |
5019 if (!GetMapModuleBuffer(pKey, pValue, iBytes)) { | |
5020 return FALSE; | |
5021 } | |
5022 wsValue = CFX_WideStringC((const FX_WCHAR*)pValue, iBytes / sizeof(FX_WCHAR)); | |
5023 return TRUE; | |
5024 } | |
5025 void CXFA_Node::SetMapModuleBuffer( | |
5026 void* pKey, | |
5027 void* pValue, | |
5028 int32_t iBytes, | |
5029 XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) { | |
5030 XFA_MAPMODULEDATA* pModule = CreateMapModuleData(); | |
5031 XFA_MAPDATABLOCK*& pBuffer = pModule->m_BufferMap[pKey]; | |
5032 if (pBuffer == NULL) { | |
5033 pBuffer = | |
5034 (XFA_MAPDATABLOCK*)FX_Alloc(uint8_t, sizeof(XFA_MAPDATABLOCK) + iBytes); | |
5035 } else if (pBuffer->iBytes != iBytes) { | |
5036 if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { | |
5037 pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); | |
5038 } | |
5039 pBuffer = (XFA_MAPDATABLOCK*)FX_Realloc(uint8_t, pBuffer, | |
5040 sizeof(XFA_MAPDATABLOCK) + iBytes); | |
5041 } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { | |
5042 pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); | |
5043 } | |
5044 if (pBuffer == NULL) { | |
5045 return; | |
5046 } | |
5047 pBuffer->pCallbackInfo = pCallbackInfo; | |
5048 pBuffer->iBytes = iBytes; | |
5049 FXSYS_memcpy(pBuffer->GetData(), pValue, iBytes); | |
5050 } | |
5051 FX_BOOL CXFA_Node::GetMapModuleBuffer(void* pKey, | |
5052 void*& pValue, | |
5053 int32_t& iBytes, | |
5054 FX_BOOL bProtoAlso) const { | |
5055 XFA_MAPDATABLOCK* pBuffer = NULL; | |
5056 const CXFA_Node* pNode = this; | |
5057 while (pNode) { | |
5058 XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData(); | |
5059 if (pModule && pModule->m_BufferMap.Lookup(pKey, pBuffer)) { | |
5060 break; | |
5061 } | |
5062 pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets) | |
5063 ? pNode->GetTemplateNode() | |
5064 : NULL; | |
5065 } | |
5066 if (pBuffer == NULL) { | |
5067 return FALSE; | |
5068 } | |
5069 pValue = pBuffer->GetData(); | |
5070 iBytes = pBuffer->iBytes; | |
5071 return TRUE; | |
5072 } | |
5073 FX_BOOL CXFA_Node::HasMapModuleKey(void* pKey, FX_BOOL bProtoAlso) { | |
5074 CXFA_Node* pNode = this; | |
5075 while (pNode) { | |
5076 void* pVal; | |
5077 XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData(); | |
5078 if (pModule && | |
5079 (pModule->m_ValueMap.Lookup(pKey, pVal) || | |
5080 pModule->m_BufferMap.Lookup(pKey, (XFA_MAPDATABLOCK*&)pVal))) { | |
5081 return TRUE; | |
5082 } | |
5083 pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets) | |
5084 ? pNode->GetTemplateNode() | |
5085 : NULL; | |
5086 } | |
5087 return FALSE; | |
5088 } | |
5089 void CXFA_Node::RemoveMapModuleKey(void* pKey) { | |
5090 XFA_MAPMODULEDATA* pModule = GetMapModuleData(); | |
5091 if (!pModule) | |
5092 return; | |
5093 | |
5094 if (pKey) { | |
5095 XFA_MAPDATABLOCK* pBuffer = NULL; | |
5096 pModule->m_BufferMap.Lookup(pKey, pBuffer); | |
5097 if (pBuffer) { | |
5098 if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { | |
5099 pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); | |
5100 } | |
5101 FX_Free(pBuffer); | |
5102 } | |
5103 pModule->m_BufferMap.RemoveKey(pKey); | |
5104 pModule->m_ValueMap.RemoveKey(pKey); | |
5105 } else { | |
5106 XFA_MAPDATABLOCK* pBuffer; | |
5107 FX_POSITION posBuffer = pModule->m_BufferMap.GetStartPosition(); | |
5108 while (posBuffer) { | |
5109 pModule->m_BufferMap.GetNextAssoc(posBuffer, pKey, pBuffer); | |
5110 if (pBuffer) { | |
5111 if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { | |
5112 pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); | |
5113 } | |
5114 FX_Free(pBuffer); | |
5115 } | |
5116 } | |
5117 pModule->m_BufferMap.RemoveAll(); | |
5118 pModule->m_ValueMap.RemoveAll(); | |
5119 delete pModule; | |
5120 } | |
5121 } | |
5122 void CXFA_Node::MergeAllData(void* pDstModule, FX_BOOL bUseSrcAttr) { | |
5123 XFA_MAPMODULEDATA* pDstModuleData = | |
5124 static_cast<CXFA_Node*>(pDstModule)->CreateMapModuleData(); | |
5125 XFA_MAPMODULEDATA* pSrcModuleData = GetMapModuleData(); | |
5126 if (!pSrcModuleData) { | |
5127 return; | |
5128 } | |
5129 FX_POSITION psValue = pSrcModuleData->m_ValueMap.GetStartPosition(); | |
5130 while (psValue) { | |
5131 void* pKey; | |
5132 void* pValue; | |
5133 pSrcModuleData->m_ValueMap.GetNextAssoc(psValue, pKey, pValue); | |
5134 if (bUseSrcAttr || !pDstModuleData->m_ValueMap.GetValueAt(pKey)) { | |
5135 pDstModuleData->m_ValueMap.SetAt(pKey, pValue); | |
5136 } | |
5137 } | |
5138 FX_POSITION psBuffer = pSrcModuleData->m_BufferMap.GetStartPosition(); | |
5139 while (psBuffer) { | |
5140 void* pKey; | |
5141 XFA_MAPDATABLOCK* pSrcBuffer; | |
5142 pSrcModuleData->m_BufferMap.GetNextAssoc(psBuffer, pKey, pSrcBuffer); | |
5143 XFA_MAPDATABLOCK*& pBuffer = pDstModuleData->m_BufferMap[pKey]; | |
5144 if (pBuffer && !bUseSrcAttr) { | |
5145 continue; | |
5146 } | |
5147 if (pSrcBuffer->pCallbackInfo && pSrcBuffer->pCallbackInfo->pFree && | |
5148 !pSrcBuffer->pCallbackInfo->pCopy) { | |
5149 if (pBuffer) { | |
5150 pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); | |
5151 pDstModuleData->m_BufferMap.RemoveKey(pKey); | |
5152 } | |
5153 continue; | |
5154 } | |
5155 if (pBuffer == NULL) { | |
5156 pBuffer = (XFA_MAPDATABLOCK*)FX_Alloc( | |
5157 uint8_t, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes); | |
5158 } else if (pBuffer->iBytes != pSrcBuffer->iBytes) { | |
5159 if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { | |
5160 pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); | |
5161 } | |
5162 pBuffer = (XFA_MAPDATABLOCK*)FX_Realloc( | |
5163 uint8_t, pBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes); | |
5164 } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) { | |
5165 pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData()); | |
5166 } | |
5167 if (pBuffer == NULL) { | |
5168 continue; | |
5169 } | |
5170 pBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo; | |
5171 pBuffer->iBytes = pSrcBuffer->iBytes; | |
5172 FXSYS_memcpy(pBuffer->GetData(), pSrcBuffer->GetData(), pSrcBuffer->iBytes); | |
5173 if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pCopy) { | |
5174 pBuffer->pCallbackInfo->pCopy(*(void**)pBuffer->GetData()); | |
5175 } | |
5176 } | |
5177 } | |
5178 void CXFA_Node::MoveBufferMapData(CXFA_Node* pDstModule, void* pKey) { | |
5179 if (!pDstModule) { | |
5180 return; | |
5181 } | |
5182 FX_BOOL bNeedMove = TRUE; | |
5183 if (!pKey) { | |
5184 bNeedMove = FALSE; | |
5185 } | |
5186 if (pDstModule->GetClassID() != GetClassID()) { | |
5187 bNeedMove = FALSE; | |
5188 } | |
5189 XFA_MAPMODULEDATA* pSrcModuleData = NULL; | |
5190 XFA_MAPMODULEDATA* pDstModuleData = NULL; | |
5191 if (bNeedMove) { | |
5192 pSrcModuleData = GetMapModuleData(); | |
5193 if (!pSrcModuleData) { | |
5194 bNeedMove = FALSE; | |
5195 } | |
5196 pDstModuleData = pDstModule->CreateMapModuleData(); | |
5197 } | |
5198 if (bNeedMove) { | |
5199 void* pBufferBlockData = pSrcModuleData->m_BufferMap.GetValueAt(pKey); | |
5200 if (pBufferBlockData) { | |
5201 pSrcModuleData->m_BufferMap.RemoveKey(pKey); | |
5202 pDstModuleData->m_BufferMap.RemoveKey(pKey); | |
5203 pDstModuleData->m_BufferMap.SetAt(pKey, | |
5204 (XFA_MAPDATABLOCK*)pBufferBlockData); | |
5205 } | |
5206 } | |
5207 if (pDstModule->GetObjectType() == XFA_OBJECTTYPE_NodeV) { | |
5208 CFX_WideString wsValue = pDstModule->GetScriptContent(FALSE); | |
5209 CFX_WideString wsFormatValue(wsValue); | |
5210 CXFA_WidgetData* pWidgetData = pDstModule->GetContainerWidgetData(); | |
5211 if (pWidgetData) { | |
5212 pWidgetData->GetFormatDataValue(wsValue, wsFormatValue); | |
5213 } | |
5214 pDstModule->SetScriptContent(wsValue, wsFormatValue, TRUE, TRUE); | |
5215 } | |
5216 } | |
5217 void CXFA_Node::MoveBufferMapData(CXFA_Node* pSrcModule, | |
5218 CXFA_Node* pDstModule, | |
5219 void* pKey, | |
5220 FX_BOOL bRecursive) { | |
5221 if (!pSrcModule || !pDstModule || !pKey) { | |
5222 return; | |
5223 } | |
5224 if (bRecursive) { | |
5225 CXFA_Node* pSrcChild = pSrcModule->GetNodeItem(XFA_NODEITEM_FirstChild); | |
5226 CXFA_Node* pDstChild = pDstModule->GetNodeItem(XFA_NODEITEM_FirstChild); | |
5227 for (; pSrcChild && pDstChild; | |
5228 pSrcChild = pSrcChild->GetNodeItem(XFA_NODEITEM_NextSibling), | |
5229 pDstChild = pDstChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { | |
5230 MoveBufferMapData(pSrcChild, pDstChild, pKey, TRUE); | |
5231 } | |
5232 } | |
5233 pSrcModule->MoveBufferMapData(pDstModule, pKey); | |
5234 } | |
5235 CXFA_NodeList::CXFA_NodeList(CXFA_Document* pDocument) | |
5236 : CXFA_Object(pDocument, XFA_OBJECTTYPE_NodeList) { | |
5237 m_pDocument->GetScriptContext()->CacheList(this); | |
5238 } | |
5239 CXFA_Node* CXFA_NodeList::NamedItem(const CFX_WideStringC& wsName) { | |
5240 int32_t iCount = GetLength(); | |
5241 FX_DWORD dwHashCode = | |
5242 FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength()); | |
5243 for (int32_t i = 0; i < iCount; i++) { | |
5244 CXFA_Node* ret = Item(i); | |
5245 if (dwHashCode == ret->GetNameHash()) { | |
5246 return ret; | |
5247 } | |
5248 } | |
5249 return NULL; | |
5250 } | |
5251 void CXFA_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) { | |
5252 int32_t argc = pArguments->GetLength(); | |
5253 if (argc == 1) { | |
5254 CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0)); | |
5255 if (pNode) { | |
5256 Append(pNode); | |
5257 } else { | |
5258 ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
5259 } | |
5260 } else { | |
5261 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"append"); | |
5262 } | |
5263 } | |
5264 void CXFA_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) { | |
5265 int32_t argc = pArguments->GetLength(); | |
5266 if (argc == 2) { | |
5267 CXFA_Node* pNewNode = static_cast<CXFA_Node*>(pArguments->GetObject(0)); | |
5268 CXFA_Node* pBeforeNode = static_cast<CXFA_Node*>(pArguments->GetObject(1)); | |
5269 if (pNewNode) { | |
5270 Insert(pNewNode, pBeforeNode); | |
5271 } else { | |
5272 ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
5273 } | |
5274 } else { | |
5275 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"insert"); | |
5276 } | |
5277 } | |
5278 void CXFA_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) { | |
5279 int32_t argc = pArguments->GetLength(); | |
5280 if (argc == 1) { | |
5281 CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0)); | |
5282 if (pNode) { | |
5283 Remove(pNode); | |
5284 } else { | |
5285 ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
5286 } | |
5287 } else { | |
5288 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remove"); | |
5289 } | |
5290 } | |
5291 void CXFA_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) { | |
5292 int32_t argc = pArguments->GetLength(); | |
5293 if (argc == 1) { | |
5294 int32_t iIndex = pArguments->GetInt32(0); | |
5295 if ((iIndex >= 0) && (iIndex + 1 <= GetLength())) { | |
5296 FXJSE_Value_Set( | |
5297 pArguments->GetReturnValue(), | |
5298 m_pDocument->GetScriptContext()->GetJSValueFromMap(Item(iIndex))); | |
5299 } else { | |
5300 ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS); | |
5301 } | |
5302 } else { | |
5303 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"item"); | |
5304 } | |
5305 } | |
5306 void CXFA_NodeList::Script_TreelistClass_NamedItem( | |
5307 CFXJSE_Arguments* pArguments) { | |
5308 int32_t argc = pArguments->GetLength(); | |
5309 if (argc == 1) { | |
5310 CFX_ByteString szName = pArguments->GetUTF8String(0); | |
5311 CXFA_Node* pNode = | |
5312 NamedItem(CFX_WideString::FromUTF8(szName, szName.GetLength())); | |
5313 if (!pNode) { | |
5314 return; | |
5315 } | |
5316 FXJSE_Value_Set(pArguments->GetReturnValue(), | |
5317 m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode)); | |
5318 } else { | |
5319 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"namedItem"); | |
5320 } | |
5321 } | |
5322 void CXFA_NodeList::Script_ListClass_Length(FXJSE_HVALUE hValue, | |
5323 FX_BOOL bSetting, | |
5324 XFA_ATTRIBUTE eAttribute) { | |
5325 if (!bSetting) { | |
5326 FXJSE_Value_SetInteger(hValue, GetLength()); | |
5327 } else { | |
5328 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET); | |
5329 } | |
5330 } | |
5331 CXFA_ArrayNodeList::CXFA_ArrayNodeList(CXFA_Document* pDocument) | |
5332 : CXFA_NodeList(pDocument) {} | |
5333 void CXFA_ArrayNodeList::SetArrayNodeList(const CXFA_NodeArray& srcArray) { | |
5334 if (srcArray.GetSize() > 0) { | |
5335 m_array.Copy(srcArray); | |
5336 } | |
5337 } | |
5338 int32_t CXFA_ArrayNodeList::GetLength() { | |
5339 return m_array.GetSize(); | |
5340 } | |
5341 FX_BOOL CXFA_ArrayNodeList::Append(CXFA_Node* pNode) { | |
5342 m_array.Add(pNode); | |
5343 return TRUE; | |
5344 } | |
5345 FX_BOOL CXFA_ArrayNodeList::Insert(CXFA_Node* pNewNode, | |
5346 CXFA_Node* pBeforeNode) { | |
5347 if (pBeforeNode == NULL) { | |
5348 m_array.Add(pNewNode); | |
5349 } else { | |
5350 int32_t iSize = m_array.GetSize(); | |
5351 for (int32_t i = 0; i < iSize; ++i) { | |
5352 if (m_array[i] == pBeforeNode) { | |
5353 m_array.InsertAt(i, pNewNode); | |
5354 break; | |
5355 } | |
5356 } | |
5357 } | |
5358 return TRUE; | |
5359 } | |
5360 FX_BOOL CXFA_ArrayNodeList::Remove(CXFA_Node* pNode) { | |
5361 int32_t iSize = m_array.GetSize(); | |
5362 for (int32_t i = 0; i < iSize; ++i) { | |
5363 if (m_array[i] == pNode) { | |
5364 m_array.RemoveAt(i); | |
5365 break; | |
5366 } | |
5367 } | |
5368 return TRUE; | |
5369 } | |
5370 CXFA_Node* CXFA_ArrayNodeList::Item(int32_t iIndex) { | |
5371 int32_t iSize = m_array.GetSize(); | |
5372 if (iIndex >= 0 && iIndex < iSize) { | |
5373 return m_array[iIndex]; | |
5374 } | |
5375 return NULL; | |
5376 } | |
5377 CXFA_AttachNodeList::CXFA_AttachNodeList(CXFA_Document* pDocument, | |
5378 CXFA_Node* pAttachNode) | |
5379 : CXFA_NodeList(pDocument) { | |
5380 m_pAttachNode = pAttachNode; | |
5381 } | |
5382 int32_t CXFA_AttachNodeList::GetLength() { | |
5383 return m_pAttachNode->CountChildren( | |
5384 XFA_ELEMENT_UNKNOWN, m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform); | |
5385 } | |
5386 FX_BOOL CXFA_AttachNodeList::Append(CXFA_Node* pNode) { | |
5387 CXFA_Node* pParent = pNode->GetNodeItem(XFA_NODEITEM_Parent); | |
5388 if (pParent) { | |
5389 pParent->RemoveChild(pNode); | |
5390 } | |
5391 return m_pAttachNode->InsertChild(pNode); | |
5392 } | |
5393 FX_BOOL CXFA_AttachNodeList::Insert(CXFA_Node* pNewNode, | |
5394 CXFA_Node* pBeforeNode) { | |
5395 CXFA_Node* pParent = pNewNode->GetNodeItem(XFA_NODEITEM_Parent); | |
5396 if (pParent) { | |
5397 pParent->RemoveChild(pNewNode); | |
5398 } | |
5399 return m_pAttachNode->InsertChild(pNewNode, pBeforeNode); | |
5400 } | |
5401 FX_BOOL CXFA_AttachNodeList::Remove(CXFA_Node* pNode) { | |
5402 return m_pAttachNode->RemoveChild(pNode); | |
5403 } | |
5404 CXFA_Node* CXFA_AttachNodeList::Item(int32_t iIndex) { | |
5405 return m_pAttachNode->GetChild( | |
5406 iIndex, XFA_ELEMENT_UNKNOWN, | |
5407 m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform); | |
5408 } | |
OLD | NEW |