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/foxitlib.h"
8 #include "xfa/src/fxfa/src/common/xfa_utils.h"
9 #include "xfa/src/fxfa/src/common/xfa_object.h"
10 #include "xfa/src/fxfa/src/common/xfa_document.h"
11 #include "xfa/src/fxfa/src/common/xfa_parser.h"
12 #include "xfa/src/fxfa/src/common/xfa_script.h"
13 #include "xfa/src/fxfa/src/common/xfa_docdata.h"
14 #include "xfa/src/fxfa/src/common/xfa_doclayout.h"
15 #include "xfa/src/fxfa/src/common/xfa_localemgr.h"
16 #include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
XFA_WStringToColor(const CFX_WideStringC & wsValue)17 static FX_ARGB XFA_WStringToColor(const CFX_WideStringC& wsValue) {
18   uint8_t r = 0, g = 0, b = 0;
19   if (wsValue.GetLength() == 0) {
20     return 0xff000000;
21   }
22   int cc = 0;
23   const FX_WCHAR* str = wsValue.GetPtr();
24   int len = wsValue.GetLength();
25   while (XFA_IsSpace(str[cc]) && cc < len) {
26     cc++;
27   }
28   if (cc >= len) {
29     return 0xff000000;
30   }
31   while (cc < len) {
32     if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
33       break;
34     }
35     r = r * 10 + str[cc] - '0';
36     cc++;
37   }
38   if (cc < len && str[cc] == ',') {
39     cc++;
40     while (XFA_IsSpace(str[cc]) && cc < len) {
41       cc++;
42     }
43     while (cc < len) {
44       if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
45         break;
46       }
47       g = g * 10 + str[cc] - '0';
48       cc++;
49     }
50     if (cc < len && str[cc] == ',') {
51       cc++;
52       while (XFA_IsSpace(str[cc]) && cc < len) {
53         cc++;
54       }
55       while (cc < len) {
56         if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
57           break;
58         }
59         b = b * 10 + str[cc] - '0';
60         cc++;
61       }
62     }
63   }
64   return (0xff << 24) | (r << 16) | (g << 8) | b;
65 }
GetClassID() const66 XFA_ELEMENT CXFA_Data::GetClassID() const {
67   return m_pNode ? m_pNode->GetClassID() : XFA_ELEMENT_UNKNOWN;
68 }
TryMeasure(XFA_ATTRIBUTE eAttr,FX_FLOAT & fValue,FX_BOOL bUseDefault) const69 FX_BOOL CXFA_Data::TryMeasure(XFA_ATTRIBUTE eAttr,
70                               FX_FLOAT& fValue,
71                               FX_BOOL bUseDefault) const {
72   CXFA_Measurement ms;
73   if (m_pNode->TryMeasure(eAttr, ms, bUseDefault)) {
74     fValue = ms.ToUnit(XFA_UNIT_Pt);
75     return TRUE;
76   }
77   return FALSE;
78 }
SetMeasure(XFA_ATTRIBUTE eAttr,FX_FLOAT fValue)79 FX_BOOL CXFA_Data::SetMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT fValue) {
80   CXFA_Measurement ms(fValue, XFA_UNIT_Pt);
81   return m_pNode->SetMeasure(eAttr, ms);
82 }
CXFA_Fill(CXFA_Node * pNode)83 CXFA_Fill::CXFA_Fill(CXFA_Node* pNode) : CXFA_Data(pNode) {}
~CXFA_Fill()84 CXFA_Fill::~CXFA_Fill() {}
GetPresence()85 int32_t CXFA_Fill::GetPresence() {
86   return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
87 }
SetColor(FX_ARGB color)88 void CXFA_Fill::SetColor(FX_ARGB color) {
89   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
90   CFX_WideString wsColor;
91   int a, r, g, b;
92   ArgbDecode(color, a, r, g, b);
93   wsColor.Format(L"%d,%d,%d", r, g, b);
94   pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
95 }
GetColor(FX_BOOL bText)96 FX_ARGB CXFA_Fill::GetColor(FX_BOOL bText) {
97   if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color)) {
98     CFX_WideStringC wsColor;
99     if (pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE)) {
100       return XFA_WStringToColor(wsColor);
101     }
102   }
103   if (bText) {
104     return 0xFF000000;
105   }
106   return 0xFFFFFFFF;
107 }
GetFillType()108 int32_t CXFA_Fill::GetFillType() {
109   CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
110   while (pChild) {
111     int32_t eType = pChild->GetClassID();
112     if (eType != XFA_ELEMENT_Color && eType != XFA_ELEMENT_Extras) {
113       return eType;
114     }
115     pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
116   }
117   return XFA_ELEMENT_Solid;
118 }
GetPattern(FX_ARGB & foreColor)119 int32_t CXFA_Fill::GetPattern(FX_ARGB& foreColor) {
120   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern);
121   if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
122     CFX_WideStringC wsColor;
123     pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
124     foreColor = XFA_WStringToColor(wsColor);
125   } else {
126     foreColor = 0xFF000000;
127   }
128   return pNode->GetEnum(XFA_ATTRIBUTE_Type);
129 }
GetStipple(FX_ARGB & stippleColor)130 int32_t CXFA_Fill::GetStipple(FX_ARGB& stippleColor) {
131   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple);
132   int32_t eAttr = 50;
133   pNode->TryInteger(XFA_ATTRIBUTE_Rate, eAttr);
134   if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
135     CFX_WideStringC wsColor;
136     pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
137     stippleColor = XFA_WStringToColor(wsColor);
138   } else {
139     stippleColor = 0xFF000000;
140   }
141   return eAttr;
142 }
GetLinear(FX_ARGB & endColor)143 int32_t CXFA_Fill::GetLinear(FX_ARGB& endColor) {
144   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear);
145   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToRight;
146   pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
147   if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
148     CFX_WideStringC wsColor;
149     pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
150     endColor = XFA_WStringToColor(wsColor);
151   } else {
152     endColor = 0xFF000000;
153   }
154   return eAttr;
155 }
GetRadial(FX_ARGB & endColor)156 int32_t CXFA_Fill::GetRadial(FX_ARGB& endColor) {
157   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial);
158   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToEdge;
159   pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
160   if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
161     CFX_WideStringC wsColor;
162     pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
163     endColor = XFA_WStringToColor(wsColor);
164   } else {
165     endColor = 0xFF000000;
166   }
167   return eAttr;
168 }
SetPresence(int32_t iPresence)169 FX_BOOL CXFA_Fill::SetPresence(int32_t iPresence) {
170   return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence);
171 }
SetFillType(int32_t iType)172 FX_BOOL CXFA_Fill::SetFillType(int32_t iType) {
173   return FALSE;
174 }
SetPattern(int32_t iPattern,FX_ARGB foreColor)175 FX_BOOL CXFA_Fill::SetPattern(int32_t iPattern, FX_ARGB foreColor) {
176   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern);
177   CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
178   CFX_WideString wsColor;
179   int a, r, g, b;
180   ArgbDecode(foreColor, a, r, g, b);
181   wsColor.Format(L"%d,%d,%d", r, g, b);
182   pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
183   return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iPattern);
184 }
SetStipple(int32_t iStipple,FX_ARGB stippleColor)185 FX_BOOL CXFA_Fill::SetStipple(int32_t iStipple, FX_ARGB stippleColor) {
186   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple);
187   CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
188   CFX_WideString wsColor;
189   int a, r, g, b;
190   ArgbDecode(stippleColor, a, r, g, b);
191   wsColor.Format(L"%d,%d,%d", r, g, b);
192   pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
193   return pNode->SetEnum(XFA_ATTRIBUTE_Rate, (XFA_ATTRIBUTEENUM)iStipple);
194 }
SetLinear(int32_t iLinear,FX_ARGB endColor)195 FX_BOOL CXFA_Fill::SetLinear(int32_t iLinear, FX_ARGB endColor) {
196   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear);
197   CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
198   CFX_WideString wsColor;
199   int a, r, g, b;
200   ArgbDecode(endColor, a, r, g, b);
201   wsColor.Format(L"%d,%d,%d", r, g, b);
202   pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
203   return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iLinear);
204 }
SetRadial(int32_t iRadial,FX_ARGB endColor)205 FX_BOOL CXFA_Fill::SetRadial(int32_t iRadial, FX_ARGB endColor) {
206   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial);
207   CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
208   CFX_WideString wsColor;
209   int a, r, g, b;
210   ArgbDecode(endColor, a, r, g, b);
211   wsColor.Format(L"%d,%d,%d", r, g, b);
212   pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
213   return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iRadial);
214 }
CXFA_Margin(CXFA_Node * pNode)215 CXFA_Margin::CXFA_Margin(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetLeftInset(FX_FLOAT & fInset,FX_FLOAT fDefInset) const216 FX_BOOL CXFA_Margin::GetLeftInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
217   fInset = fDefInset;
218   return TryMeasure(XFA_ATTRIBUTE_LeftInset, fInset);
219 }
GetTopInset(FX_FLOAT & fInset,FX_FLOAT fDefInset) const220 FX_BOOL CXFA_Margin::GetTopInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
221   fInset = fDefInset;
222   return TryMeasure(XFA_ATTRIBUTE_TopInset, fInset);
223 }
GetRightInset(FX_FLOAT & fInset,FX_FLOAT fDefInset) const224 FX_BOOL CXFA_Margin::GetRightInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
225   fInset = fDefInset;
226   return TryMeasure(XFA_ATTRIBUTE_RightInset, fInset);
227 }
GetBottomInset(FX_FLOAT & fInset,FX_FLOAT fDefInset) const228 FX_BOOL CXFA_Margin::GetBottomInset(FX_FLOAT& fInset,
229                                     FX_FLOAT fDefInset) const {
230   fInset = fDefInset;
231   return TryMeasure(XFA_ATTRIBUTE_BottomInset, fInset);
232 }
SetLeftInset(FX_FLOAT fInset)233 FX_BOOL CXFA_Margin::SetLeftInset(FX_FLOAT fInset) {
234   return SetMeasure(XFA_ATTRIBUTE_LeftInset, fInset);
235 }
SetTopInset(FX_FLOAT fInset)236 FX_BOOL CXFA_Margin::SetTopInset(FX_FLOAT fInset) {
237   return SetMeasure(XFA_ATTRIBUTE_TopInset, fInset);
238 }
SetRightInset(FX_FLOAT fInset)239 FX_BOOL CXFA_Margin::SetRightInset(FX_FLOAT fInset) {
240   return SetMeasure(XFA_ATTRIBUTE_RightInset, fInset);
241 }
SetBottomInset(FX_FLOAT fInset)242 FX_BOOL CXFA_Margin::SetBottomInset(FX_FLOAT fInset) {
243   return SetMeasure(XFA_ATTRIBUTE_BottomInset, fInset);
244 }
CXFA_Font(CXFA_Node * pNode)245 CXFA_Font::CXFA_Font(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetBaselineShift()246 FX_FLOAT CXFA_Font::GetBaselineShift() {
247   return m_pNode->GetMeasure(XFA_ATTRIBUTE_BaselineShift).ToUnit(XFA_UNIT_Pt);
248 }
GetHorizontalScale()249 FX_FLOAT CXFA_Font::GetHorizontalScale() {
250   CFX_WideString wsValue;
251   m_pNode->TryCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue);
252   int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
253   return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
254 }
GetVerticalScale()255 FX_FLOAT CXFA_Font::GetVerticalScale() {
256   CFX_WideString wsValue;
257   m_pNode->TryCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue);
258   int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
259   return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
260 }
GetLetterSpacing()261 FX_FLOAT CXFA_Font::GetLetterSpacing() {
262   CFX_WideStringC wsValue;
263   if (!m_pNode->TryCData(XFA_ATTRIBUTE_LetterSpacing, wsValue)) {
264     return 0;
265   }
266   CXFA_Measurement ms(wsValue);
267   if (ms.GetUnit() == XFA_UNIT_Em) {
268     return ms.GetValue() * GetFontSize();
269   }
270   return ms.ToUnit(XFA_UNIT_Pt);
271 }
GetLineThrough()272 int32_t CXFA_Font::GetLineThrough() {
273   int32_t iValue = 0;
274   m_pNode->TryInteger(XFA_ATTRIBUTE_LineThrough, iValue);
275   return iValue;
276 }
GetLineThroughPeriod()277 int32_t CXFA_Font::GetLineThroughPeriod() {
278   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
279   m_pNode->TryEnum(XFA_ATTRIBUTE_LineThroughPeriod, eAttr);
280   return eAttr;
281 }
GetOverline()282 int32_t CXFA_Font::GetOverline() {
283   int32_t iValue = 0;
284   m_pNode->TryInteger(XFA_ATTRIBUTE_Overline, iValue);
285   return iValue;
286 }
GetOverlinePeriod()287 int32_t CXFA_Font::GetOverlinePeriod() {
288   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
289   m_pNode->TryEnum(XFA_ATTRIBUTE_OverlinePeriod, eAttr);
290   return eAttr;
291 }
GetUnderline()292 int32_t CXFA_Font::GetUnderline() {
293   int32_t iValue = 0;
294   m_pNode->TryInteger(XFA_ATTRIBUTE_Underline, iValue);
295   return iValue;
296 }
GetUnderlinePeriod()297 int32_t CXFA_Font::GetUnderlinePeriod() {
298   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
299   m_pNode->TryEnum(XFA_ATTRIBUTE_UnderlinePeriod, eAttr);
300   return eAttr;
301 }
GetFontSize()302 FX_FLOAT CXFA_Font::GetFontSize() {
303   CXFA_Measurement ms;
304   m_pNode->TryMeasure(XFA_ATTRIBUTE_Size, ms);
305   return ms.ToUnit(XFA_UNIT_Pt);
306 }
GetTypeface(CFX_WideStringC & wsTypeFace)307 void CXFA_Font::GetTypeface(CFX_WideStringC& wsTypeFace) {
308   m_pNode->TryCData(XFA_ATTRIBUTE_Typeface, wsTypeFace);
309 }
IsBold()310 FX_BOOL CXFA_Font::IsBold() {
311   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
312   m_pNode->TryEnum(XFA_ATTRIBUTE_Weight, eAttr);
313   return eAttr == XFA_ATTRIBUTEENUM_Bold;
314 }
IsItalic()315 FX_BOOL CXFA_Font::IsItalic() {
316   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
317   m_pNode->TryEnum(XFA_ATTRIBUTE_Posture, eAttr);
318   return eAttr == XFA_ATTRIBUTEENUM_Italic;
319 }
IsUseKerning()320 FX_BOOL CXFA_Font::IsUseKerning() {
321   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
322   m_pNode->TryEnum(XFA_ATTRIBUTE_KerningMode, eAttr);
323   return eAttr == XFA_ATTRIBUTEENUM_Pair;
324 }
SetColor(FX_ARGB color)325 void CXFA_Font::SetColor(FX_ARGB color) {
326   CXFA_Fill fill = m_pNode->GetProperty(0, XFA_ELEMENT_Fill);
327   fill.SetColor(color);
328 }
GetColor()329 FX_ARGB CXFA_Font::GetColor() {
330   if (CXFA_Fill fill = m_pNode->GetChild(0, XFA_ELEMENT_Fill)) {
331     return fill.GetColor(TRUE);
332   }
333   return 0xFF000000;
334 }
SetBaselineShift(FX_FLOAT fBaselineShift)335 FX_BOOL CXFA_Font::SetBaselineShift(FX_FLOAT fBaselineShift) {
336   CXFA_Measurement ms(fBaselineShift, XFA_UNIT_Pt);
337   return m_pNode->SetMeasure(XFA_ATTRIBUTE_BaselineShift, ms);
338 }
SetHorizontalScale(FX_FLOAT fHorizontalScale)339 FX_BOOL CXFA_Font::SetHorizontalScale(FX_FLOAT fHorizontalScale) {
340   CFX_WideString wsValue;
341   wsValue.Format(L"%d", (int32_t)fHorizontalScale);
342   return m_pNode->SetCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue);
343 }
SetVerticalScale(FX_FLOAT fVerticalScale)344 FX_BOOL CXFA_Font::SetVerticalScale(FX_FLOAT fVerticalScale) {
345   CFX_WideString wsValue;
346   wsValue.Format(L"%d", (int32_t)fVerticalScale);
347   return m_pNode->SetCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue);
348 }
SetLetterSpacing(FX_FLOAT fLetterSpacing,XFA_UNIT eUnit)349 FX_BOOL CXFA_Font::SetLetterSpacing(FX_FLOAT fLetterSpacing, XFA_UNIT eUnit) {
350   return FALSE;
351 }
SetLineThrough(int32_t iLineThrough)352 FX_BOOL CXFA_Font::SetLineThrough(int32_t iLineThrough) {
353   return m_pNode->SetInteger(XFA_ATTRIBUTE_LineThrough, iLineThrough);
354 }
SetLineThroughPeriod(int32_t iLineThroughPeriod)355 FX_BOOL CXFA_Font::SetLineThroughPeriod(int32_t iLineThroughPeriod) {
356   return m_pNode->SetEnum(XFA_ATTRIBUTE_LineThroughPeriod,
357                           (XFA_ATTRIBUTEENUM)iLineThroughPeriod);
358 }
SetOverline(int32_t iOverline)359 FX_BOOL CXFA_Font::SetOverline(int32_t iOverline) {
360   return m_pNode->SetInteger(XFA_ATTRIBUTE_Overline, iOverline);
361 }
SetOverlinePeriod(int32_t iOverlinePeriod)362 FX_BOOL CXFA_Font::SetOverlinePeriod(int32_t iOverlinePeriod) {
363   return m_pNode->SetEnum(XFA_ATTRIBUTE_OverlinePeriod,
364                           (XFA_ATTRIBUTEENUM)iOverlinePeriod);
365 }
SetUnderline(int32_t iUnderline)366 FX_BOOL CXFA_Font::SetUnderline(int32_t iUnderline) {
367   return m_pNode->SetInteger(XFA_ATTRIBUTE_Underline, iUnderline);
368 }
SetUnderlinePeriod(int32_t iUnderlinePeriod)369 FX_BOOL CXFA_Font::SetUnderlinePeriod(int32_t iUnderlinePeriod) {
370   return m_pNode->SetEnum(XFA_ATTRIBUTE_UnderlinePeriod,
371                           (XFA_ATTRIBUTEENUM)iUnderlinePeriod);
372 }
CXFA_Caption(CXFA_Node * pNode)373 CXFA_Caption::CXFA_Caption(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetPresence()374 int32_t CXFA_Caption::GetPresence() {
375   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Visible;
376   m_pNode->TryEnum(XFA_ATTRIBUTE_Presence, eAttr);
377   return eAttr;
378 }
GetPlacementType()379 int32_t CXFA_Caption::GetPlacementType() {
380   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
381   m_pNode->TryEnum(XFA_ATTRIBUTE_Placement, eAttr);
382   return eAttr;
383 }
GetReserve()384 FX_FLOAT CXFA_Caption::GetReserve() {
385   CXFA_Measurement ms;
386   m_pNode->TryMeasure(XFA_ATTRIBUTE_Reserve, ms);
387   return ms.ToUnit(XFA_UNIT_Pt);
388 }
GetMargin()389 CXFA_Margin CXFA_Caption::GetMargin() {
390   return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin) : NULL);
391 }
GetFont()392 CXFA_Font CXFA_Caption::GetFont() {
393   return CXFA_Font(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Font) : NULL);
394 }
GetValue()395 CXFA_Value CXFA_Caption::GetValue() {
396   return CXFA_Value(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Value) : NULL);
397 }
GetPara()398 CXFA_Para CXFA_Caption::GetPara() {
399   return CXFA_Para(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Para) : NULL);
400 }
SetPresence(int32_t iPresence)401 FX_BOOL CXFA_Caption::SetPresence(int32_t iPresence) {
402   return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence);
403 }
SetPlacementType(int32_t iType)404 FX_BOOL CXFA_Caption::SetPlacementType(int32_t iType) {
405   return m_pNode->SetEnum(XFA_ATTRIBUTE_Placement, (XFA_ATTRIBUTEENUM)iType);
406 }
SetReserve(FX_FLOAT fReserve)407 FX_BOOL CXFA_Caption::SetReserve(FX_FLOAT fReserve) {
408   CXFA_Measurement ms(fReserve, XFA_UNIT_Pt);
409   return m_pNode->SetMeasure(XFA_ATTRIBUTE_Reserve, ms);
410 }
CXFA_Para(CXFA_Node * pNode)411 CXFA_Para::CXFA_Para(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetHorizontalAlign()412 int32_t CXFA_Para::GetHorizontalAlign() {
413   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
414   m_pNode->TryEnum(XFA_ATTRIBUTE_HAlign, eAttr);
415   return eAttr;
416 }
GetVerticalAlign()417 int32_t CXFA_Para::GetVerticalAlign() {
418   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Top;
419   m_pNode->TryEnum(XFA_ATTRIBUTE_VAlign, eAttr);
420   return eAttr;
421 }
GetLineHeight()422 FX_FLOAT CXFA_Para::GetLineHeight() {
423   CXFA_Measurement ms;
424   m_pNode->TryMeasure(XFA_ATTRIBUTE_LineHeight, ms);
425   return ms.ToUnit(XFA_UNIT_Pt);
426 }
GetMarginLeft()427 FX_FLOAT CXFA_Para::GetMarginLeft() {
428   CXFA_Measurement ms;
429   m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginLeft, ms);
430   return ms.ToUnit(XFA_UNIT_Pt);
431 }
GetMarginRight()432 FX_FLOAT CXFA_Para::GetMarginRight() {
433   CXFA_Measurement ms;
434   m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginRight, ms);
435   return ms.ToUnit(XFA_UNIT_Pt);
436 }
GetOrphans()437 int32_t CXFA_Para::GetOrphans() {
438   int32_t iValue = 0;
439   m_pNode->TryInteger(XFA_ATTRIBUTE_Orphans, iValue);
440   return iValue;
441 }
GetRadixOffset()442 FX_FLOAT CXFA_Para::GetRadixOffset() {
443   CXFA_Measurement ms;
444   m_pNode->TryMeasure(XFA_ATTRIBUTE_RadixOffset, ms);
445   return ms.ToUnit(XFA_UNIT_Pt);
446 }
GetSpaceAbove()447 FX_FLOAT CXFA_Para::GetSpaceAbove() {
448   CXFA_Measurement ms;
449   m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceAbove, ms);
450   return ms.ToUnit(XFA_UNIT_Pt);
451 }
GetSpaceBelow()452 FX_FLOAT CXFA_Para::GetSpaceBelow() {
453   CXFA_Measurement ms;
454   m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceBelow, ms);
455   return ms.ToUnit(XFA_UNIT_Pt);
456 }
GetTextIndent()457 FX_FLOAT CXFA_Para::GetTextIndent() {
458   CXFA_Measurement ms;
459   m_pNode->TryMeasure(XFA_ATTRIBUTE_TextIndent, ms);
460   return ms.ToUnit(XFA_UNIT_Pt);
461 }
GetWidows()462 int32_t CXFA_Para::GetWidows() {
463   int32_t iValue = 0;
464   m_pNode->TryInteger(XFA_ATTRIBUTE_Widows, iValue);
465   return iValue;
466 }
SetHorizontalAlign(int32_t iHorizontalAlign)467 FX_BOOL CXFA_Para::SetHorizontalAlign(int32_t iHorizontalAlign) {
468   return m_pNode->SetEnum(XFA_ATTRIBUTE_HAlign,
469                           (XFA_ATTRIBUTEENUM)iHorizontalAlign);
470 }
SetVerticalAlign(int32_t iVerticalAlign)471 FX_BOOL CXFA_Para::SetVerticalAlign(int32_t iVerticalAlign) {
472   return m_pNode->SetEnum(XFA_ATTRIBUTE_VAlign,
473                           (XFA_ATTRIBUTEENUM)iVerticalAlign);
474 }
SetLineHeight(FX_FLOAT fLineHeight)475 FX_BOOL CXFA_Para::SetLineHeight(FX_FLOAT fLineHeight) {
476   CXFA_Measurement ms;
477   return m_pNode->SetMeasure(XFA_ATTRIBUTE_LineHeight, ms);
478 }
SetMarginLeft(FX_FLOAT fMarginLeft)479 FX_BOOL CXFA_Para::SetMarginLeft(FX_FLOAT fMarginLeft) {
480   CXFA_Measurement ms(fMarginLeft, XFA_UNIT_Pt);
481   return m_pNode->SetMeasure(XFA_ATTRIBUTE_MarginLeft, ms);
482 }
SetMarginRight(FX_FLOAT fMarginRight)483 FX_BOOL CXFA_Para::SetMarginRight(FX_FLOAT fMarginRight) {
484   CXFA_Measurement ms(fMarginRight, XFA_UNIT_Pt);
485   return m_pNode->SetMeasure(XFA_ATTRIBUTE_MarginRight, ms);
486 }
SetOrphans(int32_t iOrphans)487 FX_BOOL CXFA_Para::SetOrphans(int32_t iOrphans) {
488   return m_pNode->SetInteger(XFA_ATTRIBUTE_Orphans, iOrphans);
489 }
SetRadixOffset(FX_FLOAT fRadixOffset)490 FX_BOOL CXFA_Para::SetRadixOffset(FX_FLOAT fRadixOffset) {
491   CXFA_Measurement ms(fRadixOffset, XFA_UNIT_Pt);
492   return m_pNode->SetMeasure(XFA_ATTRIBUTE_RadixOffset, ms);
493 }
SetSpaceAbove(FX_FLOAT fSpaceAbove)494 FX_BOOL CXFA_Para::SetSpaceAbove(FX_FLOAT fSpaceAbove) {
495   CXFA_Measurement ms(fSpaceAbove, XFA_UNIT_Pt);
496   return m_pNode->SetMeasure(XFA_ATTRIBUTE_SpaceAbove, ms);
497 }
SetSpaceBelow(FX_FLOAT fSpaceBelow)498 FX_BOOL CXFA_Para::SetSpaceBelow(FX_FLOAT fSpaceBelow) {
499   CXFA_Measurement ms(fSpaceBelow, XFA_UNIT_Pt);
500   return m_pNode->SetMeasure(XFA_ATTRIBUTE_SpaceBelow, ms);
501 }
SetTextIndent(FX_FLOAT fTextIndent)502 FX_BOOL CXFA_Para::SetTextIndent(FX_FLOAT fTextIndent) {
503   CXFA_Measurement ms(fTextIndent, XFA_UNIT_Pt);
504   return m_pNode->SetMeasure(XFA_ATTRIBUTE_TextIndent, ms);
505 }
SetWidows(int32_t iWidows)506 FX_BOOL CXFA_Para::SetWidows(int32_t iWidows) {
507   return m_pNode->SetInteger(XFA_ATTRIBUTE_Widows, iWidows);
508 }
CXFA_Keep(CXFA_Node * pNode,CXFA_Node * pParent)509 CXFA_Keep::CXFA_Keep(CXFA_Node* pNode, CXFA_Node* pParent)
510     : CXFA_Data(pNode), m_pParent(pParent) {}
GetIntact()511 int32_t CXFA_Keep::GetIntact() {
512   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
513   switch (m_pParent->GetClassID()) {
514     case XFA_ELEMENT_Subform: {
515       XFA_ATTRIBUTEENUM eAttrSubForm;
516       m_pParent->TryEnum(XFA_ATTRIBUTE_Layout, eAttrSubForm);
517       if (eAttrSubForm == XFA_ATTRIBUTEENUM_Position ||
518           eAttrSubForm == XFA_ATTRIBUTEENUM_Row) {
519         eAttr = XFA_ATTRIBUTEENUM_ContentArea;
520       }
521     } break;
522     case XFA_ELEMENT_Draw:
523       eAttr = XFA_ATTRIBUTEENUM_ContentArea;
524       break;
525     default:
526       break;
527   }
528   m_pNode->TryEnum(XFA_ATTRIBUTE_Intact, eAttr, FALSE);
529   return eAttr;
530 }
GetNext()531 int32_t CXFA_Keep::GetNext() {
532   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
533   m_pNode->TryEnum(XFA_ATTRIBUTE_Next, eAttr);
534   return eAttr;
535 }
GetPrevious()536 int32_t CXFA_Keep::GetPrevious() {
537   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
538   m_pNode->TryEnum(XFA_ATTRIBUTE_Previous, eAttr);
539   return eAttr;
540 }
SetIntact(int32_t iIntact)541 FX_BOOL CXFA_Keep::SetIntact(int32_t iIntact) {
542   return m_pNode->SetEnum(XFA_ATTRIBUTE_Intact, (XFA_ATTRIBUTEENUM)iIntact);
543 }
SetNext(int32_t iNext)544 FX_BOOL CXFA_Keep::SetNext(int32_t iNext) {
545   return m_pNode->SetEnum(XFA_ATTRIBUTE_Next, (XFA_ATTRIBUTEENUM)iNext);
546 }
SetPrevious(int32_t iPrevious)547 FX_BOOL CXFA_Keep::SetPrevious(int32_t iPrevious) {
548   return m_pNode->SetEnum(XFA_ATTRIBUTE_Previous, (XFA_ATTRIBUTEENUM)iPrevious);
549 }
CXFA_Event(CXFA_Node * pNode)550 CXFA_Event::CXFA_Event(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetActivity()551 int32_t CXFA_Event::GetActivity() {
552   return m_pNode->GetEnum(XFA_ATTRIBUTE_Activity);
553 }
GetEventType()554 int32_t CXFA_Event::GetEventType() {
555   CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
556   while (pChild) {
557     int32_t eType = pChild->GetClassID();
558     if (eType != XFA_ELEMENT_Extras) {
559       return eType;
560     }
561     pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
562   }
563   return XFA_ELEMENT_UNKNOWN;
564 }
GetRef(CFX_WideStringC & wsRef)565 void CXFA_Event::GetRef(CFX_WideStringC& wsRef) {
566   m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
567 }
GetExecuteRunAt()568 int32_t CXFA_Event::GetExecuteRunAt() {
569   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
570   return pNode->GetEnum(XFA_ATTRIBUTE_RunAt);
571 }
GetExecuteType()572 int32_t CXFA_Event::GetExecuteType() {
573   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
574   return pNode->GetEnum(XFA_ATTRIBUTE_ExecuteType);
575 }
GetExecuteConnection(CFX_WideString & wsConnection)576 void CXFA_Event::GetExecuteConnection(CFX_WideString& wsConnection) {
577   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
578   CFX_WideStringC cData;
579   pNode->TryCData(XFA_ATTRIBUTE_Connection, cData);
580   wsConnection = cData;
581 }
GetScript()582 CXFA_Script CXFA_Event::GetScript() {
583   return m_pNode->GetChild(0, XFA_ELEMENT_Script);
584 }
GetSubmit()585 CXFA_Submit CXFA_Event::GetSubmit() {
586   return m_pNode->GetChild(0, XFA_ELEMENT_Submit);
587 }
GetSignDataOperation()588 int32_t CXFA_Event::GetSignDataOperation() {
589   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData);
590   return pNode->GetEnum(XFA_ATTRIBUTE_Operation);
591 }
GetSignDataTarget(CFX_WideString & wsTarget)592 void CXFA_Event::GetSignDataTarget(CFX_WideString& wsTarget) {
593   if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData)) {
594     CFX_WideStringC wsCData;
595     pNode->TryCData(XFA_ATTRIBUTE_Target, wsCData);
596     wsTarget = wsCData;
597   }
598 }
SetActivity(int32_t iActivity)599 FX_BOOL CXFA_Event::SetActivity(int32_t iActivity) {
600   return m_pNode->SetEnum(XFA_ATTRIBUTE_Activity, (XFA_ATTRIBUTEENUM)iActivity);
601 }
SetEventType(int32_t iEventType)602 FX_BOOL CXFA_Event::SetEventType(int32_t iEventType) {
603   return FALSE;
604 }
SetExecuteRunAt(int32_t iExecuteRunAt)605 FX_BOOL CXFA_Event::SetExecuteRunAt(int32_t iExecuteRunAt) {
606   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
607   return pNode->SetEnum(XFA_ATTRIBUTE_RunAt, (XFA_ATTRIBUTEENUM)iExecuteRunAt);
608 }
SetExecuteType(int32_t iExecuteType)609 FX_BOOL CXFA_Event::SetExecuteType(int32_t iExecuteType) {
610   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
611   return pNode->SetEnum(XFA_ATTRIBUTE_ExecuteType,
612                         (XFA_ATTRIBUTEENUM)iExecuteType);
613 }
SetExecuteConnection(const CFX_WideString & wsConnection)614 FX_BOOL CXFA_Event::SetExecuteConnection(const CFX_WideString& wsConnection) {
615   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
616   return pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection);
617 }
SetSignDataOperation(int32_t iOperation)618 FX_BOOL CXFA_Event::SetSignDataOperation(int32_t iOperation) {
619   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData);
620   return pNode->SetEnum(XFA_ATTRIBUTE_Operation, (XFA_ATTRIBUTEENUM)iOperation);
621 }
SetSignDataTarget(const CFX_WideString & wsTarget)622 FX_BOOL CXFA_Event::SetSignDataTarget(const CFX_WideString& wsTarget) {
623   if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData)) {
624     return pNode->SetCData(XFA_ATTRIBUTE_Target, wsTarget);
625   }
626   return FALSE;
627 }
CXFA_Script(CXFA_Node * pNode)628 CXFA_Script::CXFA_Script(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetBinding(CFX_WideString & wsBinding)629 void CXFA_Script::GetBinding(CFX_WideString& wsBinding) {
630   CFX_WideStringC cData;
631   m_pNode->TryCData(XFA_ATTRIBUTE_Binding, cData);
632   wsBinding = cData;
633 }
GetContentType()634 XFA_SCRIPTTYPE CXFA_Script::GetContentType() {
635   CFX_WideStringC cData;
636   if (m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, cData, FALSE)) {
637     if (cData == FX_WSTRC(L"application/x-javascript")) {
638       return XFA_SCRIPTTYPE_Javascript;
639     } else if (cData == FX_WSTRC(L"application/x-formcalc")) {
640       return XFA_SCRIPTTYPE_Formcalc;
641     } else {
642       return XFA_SCRIPTTYPE_Unkown;
643     }
644   }
645   return XFA_SCRIPTTYPE_Formcalc;
646 }
GetRunAt()647 int32_t CXFA_Script::GetRunAt() {
648   return m_pNode->GetEnum(XFA_ATTRIBUTE_RunAt);
649 }
GetExpression(CFX_WideString & wsExpression)650 void CXFA_Script::GetExpression(CFX_WideString& wsExpression) {
651   m_pNode->TryContent(wsExpression);
652 }
SetBinding(const CFX_WideString & wsBinding)653 FX_BOOL CXFA_Script::SetBinding(const CFX_WideString& wsBinding) {
654   return m_pNode->SetCData(XFA_ATTRIBUTE_Binding, wsBinding);
655 }
SetContentType(XFA_SCRIPTTYPE eType)656 FX_BOOL CXFA_Script::SetContentType(XFA_SCRIPTTYPE eType) {
657   CFX_WideString wsType;
658   switch (eType) {
659     case XFA_SCRIPTTYPE_Javascript:
660       wsType = L"application/x-javascript";
661       break;
662     case XFA_SCRIPTTYPE_Formcalc:
663       wsType = L"application/x-formcalc";
664       break;
665     default:
666       break;
667   }
668   return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsType);
669 }
SetRunAt(int32_t iRunAt)670 FX_BOOL CXFA_Script::SetRunAt(int32_t iRunAt) {
671   return m_pNode->SetEnum(XFA_ATTRIBUTE_RunAt, (XFA_ATTRIBUTEENUM)iRunAt);
672 }
SetExpression(const CFX_WideString & wsExpression)673 FX_BOOL CXFA_Script::SetExpression(const CFX_WideString& wsExpression) {
674   return m_pNode->SetContent(wsExpression, wsExpression);
675 }
CXFA_Submit(CXFA_Node * pNode)676 CXFA_Submit::CXFA_Submit(CXFA_Node* pNode) : CXFA_Data(pNode) {}
IsSubmitEmbedPDF()677 FX_BOOL CXFA_Submit::IsSubmitEmbedPDF() {
678   return m_pNode->GetBoolean(XFA_ATTRIBUTE_EmbedPDF);
679 }
GetSubmitFormat()680 int32_t CXFA_Submit::GetSubmitFormat() {
681   return m_pNode->GetEnum(XFA_ATTRIBUTE_Format);
682 }
GetSubmitTarget(CFX_WideStringC & wsTarget)683 void CXFA_Submit::GetSubmitTarget(CFX_WideStringC& wsTarget) {
684   m_pNode->TryCData(XFA_ATTRIBUTE_Target, wsTarget);
685 }
GetSubmitTextEncoding()686 XFA_TEXTENCODING CXFA_Submit::GetSubmitTextEncoding() {
687   CFX_WideStringC wsCData;
688   if (!m_pNode->TryCData(XFA_ATTRIBUTE_TextEncoding, wsCData)) {
689     return XFA_TEXTENCODING_None;
690   }
691   CFX_WideString wsValue(wsCData);
692   if (wsValue == L"Big-Five") {
693     return XFA_TEXTENCODING_Big5;
694   } else if (wsValue == L"fontSpecific") {
695     return XFA_TEXTENCODING_FontSpecific;
696   } else if (wsValue == L"GBK") {
697     return XFA_TEXTENCODING_GBK;
698   } else if (wsValue == L"GB-18030") {
699     return XFA_TEXTENCODING_GB18030;
700   } else if (wsValue == L"GB-2312") {
701     return XFA_TEXTENCODING_GB2312;
702   } else if (wsValue == L"ISO-8859-NN") {
703     return XFA_TEXTENCODING_ISO8859NN;
704   } else if (wsValue == L"KSC-5601") {
705     return XFA_TEXTENCODING_KSC5601;
706   } else if (wsValue == L"Shift-JIS") {
707     return XFA_TEXTENCODING_ShiftJIS;
708   } else if (wsValue == L"UCS-2") {
709     return XFA_TEXTENCODING_UCS2;
710   } else if (wsValue == L"UTF-16") {
711     return XFA_TEXTENCODING_UTF16;
712   } else if (wsValue == L"UTF-8") {
713     return XFA_TEXTENCODING_UTF8;
714   }
715   return XFA_TEXTENCODING_None;
716 }
GetSubmitXDPContent(CFX_WideStringC & wsContent)717 void CXFA_Submit::GetSubmitXDPContent(CFX_WideStringC& wsContent) {
718   m_pNode->TryCData(XFA_ATTRIBUTE_XdpContent, wsContent);
719 }
SetSubmitFormat(int32_t iSubmitFormat)720 FX_BOOL CXFA_Submit::SetSubmitFormat(int32_t iSubmitFormat) {
721   return m_pNode->SetEnum(XFA_ATTRIBUTE_Format,
722                           (XFA_ATTRIBUTEENUM)iSubmitFormat);
723 }
SetSubmitTarget(const CFX_WideString & wsTarget)724 FX_BOOL CXFA_Submit::SetSubmitTarget(const CFX_WideString& wsTarget) {
725   return m_pNode->SetCData(XFA_ATTRIBUTE_Target, wsTarget);
726 }
SetSubmitTextEncoding(XFA_TEXTENCODING eTextEncoding)727 FX_BOOL CXFA_Submit::SetSubmitTextEncoding(XFA_TEXTENCODING eTextEncoding) {
728   CFX_WideString wsValue;
729   switch (eTextEncoding) {
730     case XFA_TEXTENCODING_Big5:
731       wsValue = L"Big-Five";
732       break;
733     case XFA_TEXTENCODING_FontSpecific:
734       wsValue = L"fontSpecific";
735       break;
736     case XFA_TEXTENCODING_GBK:
737       wsValue = L"GBK";
738       break;
739     case XFA_TEXTENCODING_GB18030:
740       wsValue = L"GB-18030";
741       break;
742     case XFA_TEXTENCODING_GB2312:
743       wsValue = L"GB-2312";
744       break;
745     case XFA_TEXTENCODING_ISO8859NN:
746       wsValue = L"ISO-8859-NN";
747       break;
748     case XFA_TEXTENCODING_KSC5601:
749       wsValue = L"KSC-5601";
750       break;
751     case XFA_TEXTENCODING_ShiftJIS:
752       wsValue = L"Shift-JIS";
753       break;
754     case XFA_TEXTENCODING_UCS2:
755       wsValue = L"UCS-2";
756       break;
757     case XFA_TEXTENCODING_UTF16:
758       wsValue = L"UTF-16";
759       break;
760     case XFA_TEXTENCODING_UTF8:
761       wsValue = L"UTF-8";
762       break;
763     default:
764       break;
765   }
766   return m_pNode->SetCData(XFA_ATTRIBUTE_TextEncoding, wsValue);
767 }
SetSubmitXDPContent(const CFX_WideString & wsContent)768 FX_BOOL CXFA_Submit::SetSubmitXDPContent(const CFX_WideString& wsContent) {
769   return m_pNode->SetCData(XFA_ATTRIBUTE_XdpContent, wsContent);
770 }
GetChildValueClassID()771 XFA_ELEMENT CXFA_Value::GetChildValueClassID() {
772   if (!m_pNode) {
773     return XFA_ELEMENT_UNKNOWN;
774   }
775   if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
776     return pNode->GetClassID();
777   }
778   return XFA_ELEMENT_UNKNOWN;
779 }
GetChildValueContent(CFX_WideString & wsContent)780 FX_BOOL CXFA_Value::GetChildValueContent(CFX_WideString& wsContent) {
781   if (!m_pNode) {
782     return FALSE;
783   }
784   if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
785     return pNode->TryContent(wsContent);
786   }
787   return FALSE;
788 }
GetArc()789 CXFA_Arc CXFA_Value::GetArc() {
790   return m_pNode ? CXFA_Arc(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
791                  : NULL;
792 }
GetLine()793 CXFA_Line CXFA_Value::GetLine() {
794   return m_pNode ? CXFA_Line(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
795                  : NULL;
796 }
GetRectangle()797 CXFA_Rectangle CXFA_Value::GetRectangle() {
798   return m_pNode ? CXFA_Rectangle(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
799                  : NULL;
800 }
GetText()801 CXFA_Text CXFA_Value::GetText() {
802   return m_pNode ? CXFA_Text(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
803                  : NULL;
804 }
GetExData()805 CXFA_ExData CXFA_Value::GetExData() {
806   return m_pNode ? CXFA_ExData(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
807                  : NULL;
808 }
GetImage()809 CXFA_Image CXFA_Value::GetImage() {
810   return CXFA_Image(
811       m_pNode ? (m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : NULL, TRUE);
812 }
SetChildValueContent(const CFX_WideString & wsContent,FX_BOOL bNotify,XFA_ELEMENT iType)813 FX_BOOL CXFA_Value::SetChildValueContent(const CFX_WideString& wsContent,
814                                          FX_BOOL bNotify,
815                                          XFA_ELEMENT iType) {
816   if (!m_pNode) {
817     return FALSE;
818   }
819   CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
820   if (!pNode) {
821     if (iType == XFA_ELEMENT_UNKNOWN) {
822       return FALSE;
823     }
824     pNode = m_pNode->GetProperty(0, iType);
825   }
826   CFX_WideString wsFormatContent(wsContent);
827   CXFA_WidgetData* pContainerWidgetData = pNode->GetContainerWidgetData();
828   if (pContainerWidgetData) {
829     pContainerWidgetData->GetFormatDataValue(wsContent, wsFormatContent);
830   }
831   return pNode->SetContent(wsContent, wsFormatContent, bNotify);
832 }
GetHand()833 int32_t CXFA_Line::GetHand() {
834   return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
835 }
GetSlop()836 FX_BOOL CXFA_Line::GetSlop() {
837   XFA_ATTRIBUTEENUM eSlop = m_pNode->GetEnum(XFA_ATTRIBUTE_Slope);
838   return eSlop == XFA_ATTRIBUTEENUM_Slash;
839 }
GetEdge()840 CXFA_Edge CXFA_Line::GetEdge() {
841   return CXFA_Edge(m_pNode->GetChild(0, XFA_ELEMENT_Edge));
842 }
SetHand(int32_t iHand)843 FX_BOOL CXFA_Line::SetHand(int32_t iHand) {
844   return m_pNode->SetEnum(XFA_ATTRIBUTE_Hand, (XFA_ATTRIBUTEENUM)iHand);
845 }
SetSlop(int32_t iSlop)846 FX_BOOL CXFA_Line::SetSlop(int32_t iSlop) {
847   return m_pNode->SetEnum(XFA_ATTRIBUTE_Slope, (XFA_ATTRIBUTEENUM)iSlop);
848 }
CXFA_Text(CXFA_Node * pNode)849 CXFA_Text::CXFA_Text(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetName(CFX_WideStringC & wsName)850 void CXFA_Text::GetName(CFX_WideStringC& wsName) {
851   m_pNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
852 }
GetMaxChars()853 int32_t CXFA_Text::GetMaxChars() {
854   return m_pNode->GetInteger(XFA_ATTRIBUTE_MaxChars);
855 }
GetRid(CFX_WideStringC & wsRid)856 void CXFA_Text::GetRid(CFX_WideStringC& wsRid) {
857   m_pNode->TryCData(XFA_ATTRIBUTE_Rid, wsRid);
858 }
GetContent(CFX_WideString & wsText)859 void CXFA_Text::GetContent(CFX_WideString& wsText) {
860   m_pNode->TryContent(wsText);
861 }
SetContent(CFX_WideString wsText,FX_BOOL bNotify)862 void CXFA_Text::SetContent(CFX_WideString wsText, FX_BOOL bNotify) {
863   CFX_WideString wsFormatValue(wsText);
864   CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
865   if (pContainerWidgetData) {
866     pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue);
867   }
868   m_pNode->SetContent(wsText, wsFormatValue, bNotify);
869 }
SetName(const CFX_WideString & wsName)870 FX_BOOL CXFA_Text::SetName(const CFX_WideString& wsName) {
871   return m_pNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
872 }
SetMaxChars(int32_t iMaxChars)873 FX_BOOL CXFA_Text::SetMaxChars(int32_t iMaxChars) {
874   return m_pNode->SetInteger(XFA_ATTRIBUTE_MaxChars, iMaxChars);
875 }
SetRid(const CFX_WideString & wsRid)876 FX_BOOL CXFA_Text::SetRid(const CFX_WideString& wsRid) {
877   return m_pNode->SetCData(XFA_ATTRIBUTE_Rid, wsRid);
878 }
CXFA_ExData(CXFA_Node * pNode)879 CXFA_ExData::CXFA_ExData(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetContentType(CFX_WideStringC & wsContentType)880 void CXFA_ExData::GetContentType(CFX_WideStringC& wsContentType) {
881   m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType);
882 }
GetHref(CFX_WideStringC & wsHref)883 void CXFA_ExData::GetHref(CFX_WideStringC& wsHref) {
884   m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref);
885 }
GetMaxLength()886 int32_t CXFA_ExData::GetMaxLength() {
887   return m_pNode->GetInteger(XFA_ATTRIBUTE_MaxLength);
888 }
GetRid(CFX_WideStringC & wsRid)889 void CXFA_ExData::GetRid(CFX_WideStringC& wsRid) {
890   m_pNode->TryCData(XFA_ATTRIBUTE_Rid, wsRid);
891 }
GetTransferEncoding()892 int32_t CXFA_ExData::GetTransferEncoding() {
893   return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding);
894 }
GetContent(CFX_WideString & wsText)895 void CXFA_ExData::GetContent(CFX_WideString& wsText) {
896   m_pNode->TryContent(wsText);
897 }
SetContentType(const CFX_WideString & wsContentType)898 FX_BOOL CXFA_ExData::SetContentType(const CFX_WideString& wsContentType) {
899   return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
900 }
SetHref(const CFX_WideString & wsHref)901 FX_BOOL CXFA_ExData::SetHref(const CFX_WideString& wsHref) {
902   return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref);
903 }
SetMaxLength(int32_t iMaxLength)904 FX_BOOL CXFA_ExData::SetMaxLength(int32_t iMaxLength) {
905   return m_pNode->SetInteger(XFA_ATTRIBUTE_MaxLength, iMaxLength);
906 }
SetRid(const CFX_WideString & wsRid)907 FX_BOOL CXFA_ExData::SetRid(const CFX_WideString& wsRid) {
908   return m_pNode->SetCData(XFA_ATTRIBUTE_Rid, wsRid);
909 }
SetTransferEncoding(int32_t iTransferEncoding)910 FX_BOOL CXFA_ExData::SetTransferEncoding(int32_t iTransferEncoding) {
911   return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding,
912                           (XFA_ATTRIBUTEENUM)iTransferEncoding);
913 }
SetContent(const CFX_WideString & wsText,FX_BOOL bNotify,FX_BOOL bScriptModify,FX_BOOL bSyncData)914 FX_BOOL CXFA_ExData::SetContent(const CFX_WideString& wsText,
915                                 FX_BOOL bNotify,
916                                 FX_BOOL bScriptModify,
917                                 FX_BOOL bSyncData) {
918   CFX_WideString wsFormatValue(wsText);
919   CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
920   if (pContainerWidgetData) {
921     pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue);
922   }
923   return m_pNode->SetContent(wsText, wsFormatValue, bNotify, bScriptModify,
924                              bSyncData);
925 }
CXFA_Image(CXFA_Node * pNode,FX_BOOL bDefValue)926 CXFA_Image::CXFA_Image(CXFA_Node* pNode, FX_BOOL bDefValue)
927     : CXFA_Data(pNode), m_bDefValue(bDefValue) {}
GetAspect()928 int32_t CXFA_Image::GetAspect() {
929   return m_pNode->GetEnum(XFA_ATTRIBUTE_Aspect);
930 }
GetContentType(CFX_WideString & wsContentType)931 FX_BOOL CXFA_Image::GetContentType(CFX_WideString& wsContentType) {
932   return m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType);
933 }
GetHref(CFX_WideString & wsHref)934 FX_BOOL CXFA_Image::GetHref(CFX_WideString& wsHref) {
935   if (m_bDefValue) {
936     return m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref);
937   }
938   return m_pNode->GetAttribute(FX_WSTRC(L"href"), wsHref);
939 }
GetTransferEncoding()940 int32_t CXFA_Image::GetTransferEncoding() {
941   if (m_bDefValue) {
942     return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding);
943   }
944   return XFA_ATTRIBUTEENUM_Base64;
945 }
GetContent(CFX_WideString & wsText)946 FX_BOOL CXFA_Image::GetContent(CFX_WideString& wsText) {
947   return m_pNode->TryContent(wsText);
948 }
SetAspect(int32_t iAspect)949 FX_BOOL CXFA_Image::SetAspect(int32_t iAspect) {
950   return m_pNode->SetEnum(XFA_ATTRIBUTE_Aspect, (XFA_ATTRIBUTEENUM)iAspect);
951 }
SetContentType(const CFX_WideString & wsContentType)952 FX_BOOL CXFA_Image::SetContentType(const CFX_WideString& wsContentType) {
953   return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
954 }
SetHref(const CFX_WideString & wsHref)955 FX_BOOL CXFA_Image::SetHref(const CFX_WideString& wsHref) {
956   if (m_bDefValue) {
957     return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref);
958   }
959   return m_pNode->SetAttribute(XFA_ATTRIBUTE_Href, wsHref);
960 }
SetTransferEncoding(int32_t iTransferEncoding)961 FX_BOOL CXFA_Image::SetTransferEncoding(int32_t iTransferEncoding) {
962   if (m_bDefValue) {
963     return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding,
964                             (XFA_ATTRIBUTEENUM)iTransferEncoding);
965   }
966   return TRUE;
967 }
SetContent(const CFX_WideString & wsText)968 FX_BOOL CXFA_Image::SetContent(const CFX_WideString& wsText) {
969   CFX_WideString wsFormatValue(wsText);
970   CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
971   if (pContainerWidgetData) {
972     pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue);
973   }
974   return m_pNode->SetContent(wsText, wsFormatValue);
975 }
CXFA_Calculate(CXFA_Node * pNode)976 CXFA_Calculate::CXFA_Calculate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetOverride()977 int32_t CXFA_Calculate::GetOverride() {
978   XFA_ATTRIBUTEENUM eAtt = XFA_ATTRIBUTEENUM_Error;
979   m_pNode->TryEnum(XFA_ATTRIBUTE_Override, eAtt, FALSE);
980   return eAtt;
981 }
GetScript()982 CXFA_Script CXFA_Calculate::GetScript() {
983   return m_pNode->GetChild(0, XFA_ELEMENT_Script);
984 }
GetMessageText(CFX_WideString & wsMessage)985 void CXFA_Calculate::GetMessageText(CFX_WideString& wsMessage) {
986   if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message)) {
987     CXFA_Text text(pNode->GetChild(0, XFA_ELEMENT_Text));
988     if (text) {
989       text.GetContent(wsMessage);
990     }
991   }
992 }
SetOverride(int32_t iOverride)993 FX_BOOL CXFA_Calculate::SetOverride(int32_t iOverride) {
994   return m_pNode->SetEnum(XFA_ATTRIBUTE_Override, (XFA_ATTRIBUTEENUM)iOverride);
995 }
SetMessageText(const CFX_WideString & wsMessage)996 FX_BOOL CXFA_Calculate::SetMessageText(const CFX_WideString& wsMessage) {
997   if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message)) {
998     CXFA_Node* pChildNode = pNode->GetProperty(0, XFA_ELEMENT_Text);
999     return pChildNode->SetContent(wsMessage, wsMessage);
1000   }
1001   return FALSE;
1002 }
CXFA_Validate(CXFA_Node * pNode)1003 CXFA_Validate::CXFA_Validate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetFormatTest()1004 int32_t CXFA_Validate::GetFormatTest() {
1005   return m_pNode->GetEnum(XFA_ATTRIBUTE_FormatTest);
1006 }
SetTestValue(int32_t iType,CFX_WideString & wsValue,XFA_ATTRIBUTEENUM eName)1007 FX_BOOL CXFA_Validate::SetTestValue(int32_t iType,
1008                                     CFX_WideString& wsValue,
1009                                     XFA_ATTRIBUTEENUM eName) {
1010   XFA_LPCATTRIBUTEENUMINFO pInfo = XFA_GetAttributeEnumByName(wsValue);
1011   if (pInfo) {
1012     eName = pInfo->eName;
1013   }
1014   m_pNode->SetEnum((XFA_ATTRIBUTE)iType, eName, FALSE);
1015   return TRUE;
1016 }
SetFormatTest(CFX_WideString wsValue)1017 FX_BOOL CXFA_Validate::SetFormatTest(CFX_WideString wsValue) {
1018   return SetTestValue(XFA_ATTRIBUTE_FormatTest, wsValue,
1019                       XFA_ATTRIBUTEENUM_Warning);
1020 }
SetNullTest(CFX_WideString wsValue)1021 FX_BOOL CXFA_Validate::SetNullTest(CFX_WideString wsValue) {
1022   return SetTestValue(XFA_ATTRIBUTE_NullTest, wsValue,
1023                       XFA_ATTRIBUTEENUM_Disabled);
1024 }
GetNullTest()1025 int32_t CXFA_Validate::GetNullTest() {
1026   return m_pNode->GetEnum(XFA_ATTRIBUTE_NullTest);
1027 }
GetScriptTest()1028 int32_t CXFA_Validate::GetScriptTest() {
1029   return m_pNode->GetEnum(XFA_ATTRIBUTE_ScriptTest);
1030 }
GetMessageText(CFX_WideString & wsMessage,const CFX_WideStringC & wsMessageType)1031 void CXFA_Validate::GetMessageText(CFX_WideString& wsMessage,
1032                                    const CFX_WideStringC& wsMessageType) {
1033   if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, FALSE)) {
1034     CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
1035     for (; pItemNode;
1036          pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
1037       if (pItemNode->GetClassID() != XFA_ELEMENT_Text) {
1038         continue;
1039       }
1040       CFX_WideStringC wsName;
1041       pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
1042       if (wsName.IsEmpty() || wsName == wsMessageType) {
1043         pItemNode->TryContent(wsMessage);
1044         return;
1045       }
1046     }
1047   }
1048 }
SetFormatMessageText(CFX_WideString wsMessage)1049 void CXFA_Validate::SetFormatMessageText(CFX_WideString wsMessage) {
1050   SetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
1051 }
GetFormatMessageText(CFX_WideString & wsMessage)1052 void CXFA_Validate::GetFormatMessageText(CFX_WideString& wsMessage) {
1053   GetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
1054 }
SetNullMessageText(CFX_WideString wsMessage)1055 void CXFA_Validate::SetNullMessageText(CFX_WideString wsMessage) {
1056   SetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
1057 }
GetNullMessageText(CFX_WideString & wsMessage)1058 void CXFA_Validate::GetNullMessageText(CFX_WideString& wsMessage) {
1059   GetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
1060 }
SetMessageText(CFX_WideString & wsMessage,const CFX_WideStringC & wsMessageType)1061 void CXFA_Validate::SetMessageText(CFX_WideString& wsMessage,
1062                                    const CFX_WideStringC& wsMessageType) {
1063   if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, TRUE)) {
1064     CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
1065     for (; pItemNode;
1066          pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
1067       if (pItemNode->GetClassID() != XFA_ELEMENT_Text) {
1068         continue;
1069       }
1070       CFX_WideStringC wsName;
1071       pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
1072       if (wsName.IsEmpty() || wsName == wsMessageType) {
1073         pItemNode->SetContent(wsMessage, wsMessage, FALSE);
1074         return;
1075       }
1076     }
1077     CXFA_Node* pTextNode = pNode->CreateSamePacketNode(XFA_ELEMENT_Text);
1078     pNode->InsertChild(pTextNode);
1079     pTextNode->SetCData(XFA_ATTRIBUTE_Name, wsMessageType, FALSE);
1080     pTextNode->SetContent(wsMessage, wsMessage, FALSE);
1081   }
1082 }
GetScriptMessageText(CFX_WideString & wsMessage)1083 void CXFA_Validate::GetScriptMessageText(CFX_WideString& wsMessage) {
1084   GetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
1085 }
SetScriptMessageText(CFX_WideString wsMessage)1086 void CXFA_Validate::SetScriptMessageText(CFX_WideString wsMessage) {
1087   SetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
1088 }
GetPicture(CFX_WideString & wsPicture)1089 void CXFA_Validate::GetPicture(CFX_WideString& wsPicture) {
1090   if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
1091     pNode->TryContent(wsPicture);
1092   }
1093 }
GetScript()1094 CXFA_Script CXFA_Validate::GetScript() {
1095   return m_pNode->GetChild(0, XFA_ELEMENT_Script);
1096 }
CXFA_Variables(CXFA_Node * pNode)1097 CXFA_Variables::CXFA_Variables(CXFA_Node* pNode) : CXFA_Data(pNode) {}
CountScripts()1098 int32_t CXFA_Variables::CountScripts() {
1099   return m_pNode->CountChildren(XFA_ELEMENT_Script);
1100 }
GetScript(int32_t nIndex)1101 CXFA_Script CXFA_Variables::GetScript(int32_t nIndex) {
1102   return m_pNode->GetChild(nIndex, XFA_ELEMENT_Script);
1103 }
CXFA_Bind(CXFA_Node * pNode)1104 CXFA_Bind::CXFA_Bind(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetMatch()1105 int32_t CXFA_Bind::GetMatch() {
1106   return m_pNode->GetEnum(XFA_ATTRIBUTE_Match);
1107 }
GetRef(CFX_WideStringC & wsRef)1108 void CXFA_Bind::GetRef(CFX_WideStringC& wsRef) {
1109   m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
1110 }
GetPicture(CFX_WideString & wsPicture)1111 void CXFA_Bind::GetPicture(CFX_WideString& wsPicture) {
1112   if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
1113     pPicture->TryContent(wsPicture);
1114   }
1115 }
SetMatch(int32_t iMatch)1116 FX_BOOL CXFA_Bind::SetMatch(int32_t iMatch) {
1117   return m_pNode->SetEnum(XFA_ATTRIBUTE_Match, (XFA_ATTRIBUTEENUM)iMatch);
1118 }
SetRef(const CFX_WideString & wsRef)1119 FX_BOOL CXFA_Bind::SetRef(const CFX_WideString& wsRef) {
1120   return m_pNode->SetCData(XFA_ATTRIBUTE_Ref, wsRef);
1121 }
SetPicture(const CFX_WideString & wsPicture)1122 FX_BOOL CXFA_Bind::SetPicture(const CFX_WideString& wsPicture) {
1123   if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
1124     return pPicture->SetContent(wsPicture, wsPicture);
1125   }
1126   return FALSE;
1127 }
CXFA_Assist(CXFA_Node * pNode)1128 CXFA_Assist::CXFA_Assist(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetToolTip()1129 CXFA_ToolTip CXFA_Assist::GetToolTip() {
1130   return m_pNode->GetChild(0, XFA_ELEMENT_ToolTip);
1131 }
CXFA_ToolTip(CXFA_Node * pNode)1132 CXFA_ToolTip::CXFA_ToolTip(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetTip(CFX_WideString & wsTip)1133 FX_BOOL CXFA_ToolTip::GetTip(CFX_WideString& wsTip) {
1134   return m_pNode->TryContent(wsTip);
1135 }
SetTip(const CFX_WideString & wsTip)1136 FX_BOOL CXFA_ToolTip::SetTip(const CFX_WideString& wsTip) {
1137   return m_pNode->SetContent(wsTip, wsTip);
1138 }
CXFA_BindItems(CXFA_Node * pNode)1139 CXFA_BindItems::CXFA_BindItems(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetConnection(CFX_WideStringC & wsConnection)1140 void CXFA_BindItems::GetConnection(CFX_WideStringC& wsConnection) {
1141   m_pNode->TryCData(XFA_ATTRIBUTE_Connection, wsConnection);
1142 }
GetLabelRef(CFX_WideStringC & wsLabelRef)1143 void CXFA_BindItems::GetLabelRef(CFX_WideStringC& wsLabelRef) {
1144   m_pNode->TryCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef);
1145 }
GetValueRef(CFX_WideStringC & wsValueRef)1146 void CXFA_BindItems::GetValueRef(CFX_WideStringC& wsValueRef) {
1147   m_pNode->TryCData(XFA_ATTRIBUTE_ValueRef, wsValueRef);
1148 }
GetRef(CFX_WideStringC & wsRef)1149 void CXFA_BindItems::GetRef(CFX_WideStringC& wsRef) {
1150   m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
1151 }
SetConnection(const CFX_WideString & wsConnection)1152 FX_BOOL CXFA_BindItems::SetConnection(const CFX_WideString& wsConnection) {
1153   return m_pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection);
1154 }
SetLabelRef(const CFX_WideString & wsLabelRef)1155 FX_BOOL CXFA_BindItems::SetLabelRef(const CFX_WideString& wsLabelRef) {
1156   return m_pNode->SetCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef);
1157 }
SetValueRef(const CFX_WideString & wsValueRef)1158 FX_BOOL CXFA_BindItems::SetValueRef(const CFX_WideString& wsValueRef) {
1159   return m_pNode->SetCData(XFA_ATTRIBUTE_ValueRef, wsValueRef);
1160 }
SetRef(const CFX_WideString & wsRef)1161 FX_BOOL CXFA_BindItems::SetRef(const CFX_WideString& wsRef) {
1162   return m_pNode->SetCData(XFA_ATTRIBUTE_Ref, wsRef);
1163 }
GetBreak() const1164 int32_t CXFA_Box::GetBreak() const {
1165   if (!m_pNode) {
1166     return XFA_ATTRIBUTEENUM_Close;
1167   }
1168   return m_pNode->GetEnum(XFA_ATTRIBUTE_Break);
1169 }
GetHand() const1170 int32_t CXFA_Box::GetHand() const {
1171   if (!m_pNode) {
1172     return XFA_ATTRIBUTEENUM_Even;
1173   }
1174   return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
1175 }
GetPresence() const1176 int32_t CXFA_Box::GetPresence() const {
1177   if (!m_pNode) {
1178     return XFA_ATTRIBUTEENUM_Hidden;
1179   }
1180   return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
1181 }
CountCorners() const1182 int32_t CXFA_Box::CountCorners() const {
1183   if (!m_pNode) {
1184     return 0;
1185   }
1186   return m_pNode->CountChildren(XFA_ELEMENT_Corner);
1187 }
GetCorner(int32_t nIndex) const1188 CXFA_Corner CXFA_Box::GetCorner(int32_t nIndex) const {
1189   if (!m_pNode) {
1190     return NULL;
1191   }
1192   return CXFA_Corner(
1193       m_pNode->GetProperty(nIndex, XFA_ELEMENT_Corner, nIndex == 0));
1194 }
CountEdges() const1195 int32_t CXFA_Box::CountEdges() const {
1196   if (!m_pNode) {
1197     return 0;
1198   }
1199   return m_pNode->CountChildren(XFA_ELEMENT_Edge);
1200 }
GetEdge(int32_t nIndex) const1201 CXFA_Edge CXFA_Box::GetEdge(int32_t nIndex) const {
1202   if (!m_pNode) {
1203     return NULL;
1204   }
1205   return CXFA_Edge(m_pNode->GetProperty(nIndex, XFA_ELEMENT_Edge, nIndex == 0));
1206 }
XFA_BOX_GetStrokes(CXFA_Node * pNode,CXFA_StrokeArray & strokes,FX_BOOL bNULL)1207 static void XFA_BOX_GetStrokes(CXFA_Node* pNode,
1208                                CXFA_StrokeArray& strokes,
1209                                FX_BOOL bNULL) {
1210   strokes.RemoveAll();
1211   if (!pNode) {
1212     return;
1213   }
1214   strokes.SetSize(8);
1215   int32_t i, j;
1216   for (i = 0, j = 0; i < 4; i++) {
1217     CXFA_Corner corner =
1218         CXFA_Corner(pNode->GetProperty(i, XFA_ELEMENT_Corner, i == 0));
1219     if (corner.IsExistInXML() || i == 0) {
1220       strokes.SetAt(j, corner);
1221     } else if (bNULL) {
1222       strokes.SetAt(j, NULL);
1223     } else if (i == 1) {
1224       strokes.SetAt(j, strokes[0]);
1225     } else if (i == 2) {
1226       strokes.SetAt(j, strokes[0]);
1227     } else {
1228       strokes.SetAt(j, strokes[2]);
1229     }
1230     j++;
1231     CXFA_Edge edge = CXFA_Edge(pNode->GetProperty(i, XFA_ELEMENT_Edge, i == 0));
1232     if (edge.IsExistInXML() || i == 0) {
1233       strokes.SetAt(j, edge);
1234     } else if (bNULL) {
1235       strokes.SetAt(j, NULL);
1236     } else if (i == 1) {
1237       strokes.SetAt(j, strokes[1]);
1238     } else if (i == 2) {
1239       strokes.SetAt(j, strokes[1]);
1240     } else {
1241       strokes.SetAt(j, strokes[3]);
1242     }
1243     j++;
1244   }
1245 }
GetStrokes(CXFA_StrokeArray & strokes) const1246 void CXFA_Box::GetStrokes(CXFA_StrokeArray& strokes) const {
1247   XFA_BOX_GetStrokes(m_pNode, strokes, FALSE);
1248 }
IsCircular() const1249 FX_BOOL CXFA_Box::IsCircular() const {
1250   if (!m_pNode) {
1251     return FALSE;
1252   }
1253   return m_pNode->GetBoolean(XFA_ATTRIBUTE_Circular);
1254 }
GetStartAngle(FX_FLOAT & fStartAngle) const1255 FX_BOOL CXFA_Box::GetStartAngle(FX_FLOAT& fStartAngle) const {
1256   fStartAngle = 0;
1257   if (!m_pNode) {
1258     return FALSE;
1259   }
1260   CXFA_Measurement ms;
1261   FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_StartAngle, ms, FALSE);
1262   if (bRet) {
1263     fStartAngle = ms.GetValue();
1264   }
1265   return bRet;
1266 }
GetSweepAngle(FX_FLOAT & fSweepAngle) const1267 FX_BOOL CXFA_Box::GetSweepAngle(FX_FLOAT& fSweepAngle) const {
1268   fSweepAngle = 360;
1269   if (!m_pNode) {
1270     return FALSE;
1271   }
1272   CXFA_Measurement ms;
1273   FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_SweepAngle, ms, FALSE);
1274   if (bRet) {
1275     fSweepAngle = ms.GetValue();
1276   }
1277   return bRet;
1278 }
GetFill(FX_BOOL bModified) const1279 CXFA_Fill CXFA_Box::GetFill(FX_BOOL bModified) const {
1280   if (!m_pNode) {
1281     return NULL;
1282   }
1283   CXFA_Node* pFillNode = m_pNode->GetProperty(0, XFA_ELEMENT_Fill, bModified);
1284   return CXFA_Fill(pFillNode);
1285 }
GetMargin() const1286 CXFA_Margin CXFA_Box::GetMargin() const {
1287   if (!m_pNode) {
1288     return NULL;
1289   }
1290   return CXFA_Margin(m_pNode->GetChild(0, XFA_ELEMENT_Margin));
1291 }
XFA_BOX_SameStyles(const CXFA_StrokeArray & strokes)1292 static FX_BOOL XFA_BOX_SameStyles(const CXFA_StrokeArray& strokes) {
1293   int32_t iCount = strokes.GetSize();
1294   if (iCount < 1) {
1295     return TRUE;
1296   }
1297   CXFA_Stroke stroke1 = strokes[0];
1298   for (int32_t i = 1; i < iCount; i++) {
1299     CXFA_Stroke stroke2 = strokes[i];
1300     if (!stroke2.IsExistInXML()) {
1301       continue;
1302     }
1303     if (!stroke1.IsExistInXML()) {
1304       stroke1 = stroke2;
1305     } else if (!stroke1.SameStyles(stroke2)) {
1306       return FALSE;
1307     }
1308   }
1309   return TRUE;
1310 }
SameStyles() const1311 FX_BOOL CXFA_Box::SameStyles() const {
1312   if (IsArc()) {
1313     return TRUE;
1314   }
1315   CXFA_StrokeArray strokes;
1316   XFA_BOX_GetStrokes(m_pNode, strokes, TRUE);
1317   return XFA_BOX_SameStyles(strokes);
1318 }
XFA_BOX_3DStyle(const CXFA_StrokeArray & strokes,CXFA_Stroke & stroke)1319 static int32_t XFA_BOX_3DStyle(const CXFA_StrokeArray& strokes,
1320                                CXFA_Stroke& stroke) {
1321   int32_t iCount = strokes.GetSize();
1322   if (iCount < 1) {
1323     return 0;
1324   }
1325   stroke = strokes[0];
1326   for (int32_t i = 1; i < iCount; i++) {
1327     CXFA_Stroke find = strokes[i];
1328     if (!find.IsExistInXML()) {
1329       continue;
1330     }
1331     if (!stroke.IsExistInXML()) {
1332       stroke = find;
1333     } else if (stroke.GetStrokeType() != find.GetStrokeType()) {
1334       stroke = find;
1335       break;
1336     }
1337   }
1338   int32_t iType = stroke.GetStrokeType();
1339   if (iType == XFA_ATTRIBUTEENUM_Lowered || iType == XFA_ATTRIBUTEENUM_Raised ||
1340       iType == XFA_ATTRIBUTEENUM_Etched ||
1341       iType == XFA_ATTRIBUTEENUM_Embossed) {
1342     return iType;
1343   }
1344   return 0;
1345 }
Get3DStyle(FX_BOOL & bVisible,FX_FLOAT & fThickness) const1346 int32_t CXFA_Box::Get3DStyle(FX_BOOL& bVisible, FX_FLOAT& fThickness) const {
1347   if (IsArc()) {
1348     return 0;
1349   }
1350   CXFA_StrokeArray strokes;
1351   XFA_BOX_GetStrokes(m_pNode, strokes, TRUE);
1352   CXFA_Stroke stroke(NULL);
1353   int32_t iType = XFA_BOX_3DStyle(strokes, stroke);
1354   if (iType) {
1355     bVisible = stroke.IsVisible();
1356     fThickness = stroke.GetThickness();
1357   }
1358   return iType;
1359 }
GetPresence() const1360 int32_t CXFA_Stroke::GetPresence() const {
1361   return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Presence)
1362                  : XFA_ATTRIBUTEENUM_Invisible;
1363 }
GetCapType() const1364 int32_t CXFA_Stroke::GetCapType() const {
1365   if (!m_pNode) {
1366     return XFA_ATTRIBUTEENUM_Square;
1367   }
1368   return m_pNode->GetEnum(XFA_ATTRIBUTE_Cap);
1369 }
GetStrokeType() const1370 int32_t CXFA_Stroke::GetStrokeType() const {
1371   return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Stroke)
1372                  : XFA_ATTRIBUTEENUM_Solid;
1373 }
GetThickness() const1374 FX_FLOAT CXFA_Stroke::GetThickness() const {
1375   return GetMSThickness().ToUnit(XFA_UNIT_Pt);
1376 }
GetMSThickness() const1377 CXFA_Measurement CXFA_Stroke::GetMSThickness() const {
1378   return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Thickness)
1379                  : XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT_Edge,
1380                                                         XFA_ATTRIBUTE_Thickness,
1381                                                         XFA_XDPPACKET_Form);
1382 }
SetThickness(FX_FLOAT fThickness)1383 void CXFA_Stroke::SetThickness(FX_FLOAT fThickness) {
1384   if (!m_pNode) {
1385     return;
1386   }
1387   CXFA_Measurement thickness(fThickness, XFA_UNIT_Pt);
1388   m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, thickness);
1389 }
SetMSThickness(CXFA_Measurement msThinkness)1390 void CXFA_Stroke::SetMSThickness(CXFA_Measurement msThinkness) {
1391   if (!m_pNode) {
1392     return;
1393   }
1394   m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, msThinkness);
1395 }
GetColor() const1396 FX_ARGB CXFA_Stroke::GetColor() const {
1397   if (!m_pNode) {
1398     return 0xFF000000;
1399   }
1400   CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color);
1401   if (!pNode) {
1402     return 0xFF000000;
1403   }
1404   CFX_WideStringC wsColor;
1405   pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor);
1406   return XFA_WStringToColor(wsColor);
1407 }
SetColor(FX_ARGB argb)1408 void CXFA_Stroke::SetColor(FX_ARGB argb) {
1409   if (!m_pNode) {
1410     return;
1411   }
1412   CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
1413   CFX_WideString wsColor;
1414   int a, r, g, b;
1415   ArgbDecode(argb, a, r, g, b);
1416   wsColor.Format(L"%d,%d,%d", r, g, b);
1417   pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
1418 }
GetJoinType() const1419 int32_t CXFA_Stroke::GetJoinType() const {
1420   return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Join)
1421                  : XFA_ATTRIBUTEENUM_Square;
1422 }
IsInverted() const1423 FX_BOOL CXFA_Stroke::IsInverted() const {
1424   return m_pNode ? m_pNode->GetBoolean(XFA_ATTRIBUTE_Inverted) : FALSE;
1425 }
GetRadius() const1426 FX_FLOAT CXFA_Stroke::GetRadius() const {
1427   return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Radius).ToUnit(XFA_UNIT_Pt)
1428                  : 0;
1429 }
SameStyles(CXFA_Stroke stroke,FX_DWORD dwFlags) const1430 FX_BOOL CXFA_Stroke::SameStyles(CXFA_Stroke stroke, FX_DWORD dwFlags) const {
1431   if (m_pNode == (CXFA_Node*)stroke) {
1432     return TRUE;
1433   }
1434   if (FXSYS_fabs(GetThickness() - stroke.GetThickness()) >= 0.01f) {
1435     return FALSE;
1436   }
1437   if ((dwFlags & XFA_STROKE_SAMESTYLE_NoPresence) == 0 &&
1438       IsVisible() != stroke.IsVisible()) {
1439     return FALSE;
1440   }
1441   if (GetStrokeType() != stroke.GetStrokeType()) {
1442     return FALSE;
1443   }
1444   if (GetColor() != stroke.GetColor()) {
1445     return FALSE;
1446   }
1447   if ((dwFlags & XFA_STROKE_SAMESTYLE_Corner) != 0 &&
1448       FXSYS_fabs(GetRadius() - stroke.GetRadius()) >= 0.01f) {
1449     return FALSE;
1450   }
1451   return TRUE;
1452 }
XFA_GetEdgeThickness(const CXFA_StrokeArray & strokes,FX_BOOL b3DStyle,int32_t nIndex)1453 FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray& strokes,
1454                               FX_BOOL b3DStyle,
1455                               int32_t nIndex) {
1456   FX_FLOAT fThickness = 0;
1457   {
1458     if (strokes[nIndex * 2 + 1].GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
1459       if (nIndex == 0) {
1460         fThickness += 2.5f;
1461       }
1462       fThickness += strokes[nIndex * 2 + 1].GetThickness() * (b3DStyle ? 4 : 2);
1463     }
1464   }
1465   return fThickness;
1466 }
CXFA_WidgetData(CXFA_Node * pNode)1467 CXFA_WidgetData::CXFA_WidgetData(CXFA_Node* pNode)
1468     : CXFA_Data(pNode),
1469       m_bIsNull(TRUE),
1470       m_bPreNull(TRUE),
1471       m_pUiChildNode(NULL),
1472       m_eUIType(XFA_ELEMENT_UNKNOWN) {}
GetUIChild()1473 CXFA_Node* CXFA_WidgetData::GetUIChild() {
1474   if (m_eUIType == XFA_ELEMENT_UNKNOWN) {
1475     m_pUiChildNode = XFA_CreateUIChild(m_pNode, m_eUIType);
1476   }
1477   return m_pUiChildNode;
1478 }
GetUIType()1479 XFA_ELEMENT CXFA_WidgetData::GetUIType() {
1480   GetUIChild();
1481   return m_eUIType;
1482 }
GetRawValue()1483 CFX_WideString CXFA_WidgetData::GetRawValue() {
1484   return m_pNode->GetContent();
1485 }
GetAccess(FX_BOOL bTemplate)1486 int32_t CXFA_WidgetData::GetAccess(FX_BOOL bTemplate) {
1487   if (bTemplate) {
1488     CXFA_Node* pNode = m_pNode->GetTemplateNode();
1489     if (pNode) {
1490       return pNode->GetEnum(XFA_ATTRIBUTE_Access);
1491     }
1492     return XFA_ATTRIBUTEENUM_Open;
1493   }
1494   CXFA_Node* pNode = m_pNode;
1495   while (pNode) {
1496     int32_t iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Access);
1497     if (iAcc != XFA_ATTRIBUTEENUM_Open) {
1498       return iAcc;
1499     }
1500     pNode =
1501         pNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
1502   }
1503   return XFA_ATTRIBUTEENUM_Open;
1504 }
GetAccessKey(CFX_WideStringC & wsAccessKey)1505 FX_BOOL CXFA_WidgetData::GetAccessKey(CFX_WideStringC& wsAccessKey) {
1506   return m_pNode->TryCData(XFA_ATTRIBUTE_AccessKey, wsAccessKey);
1507 }
GetAnchorType()1508 int32_t CXFA_WidgetData::GetAnchorType() {
1509   return m_pNode->GetEnum(XFA_ATTRIBUTE_AnchorType);
1510 }
GetColSpan()1511 int32_t CXFA_WidgetData::GetColSpan() {
1512   return m_pNode->GetInteger(XFA_ATTRIBUTE_ColSpan);
1513 }
GetPresence()1514 int32_t CXFA_WidgetData::GetPresence() {
1515   return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
1516   CXFA_Node* pNode = m_pNode;
1517   while (pNode && pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) {
1518     int32_t iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Presence);
1519     if (iAcc != XFA_ATTRIBUTEENUM_Visible) {
1520       return iAcc;
1521     }
1522     pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
1523   }
1524   return XFA_ATTRIBUTEENUM_Visible;
1525 }
GetRotate()1526 int32_t CXFA_WidgetData::GetRotate() {
1527   CXFA_Measurement ms;
1528   if (!m_pNode->TryMeasure(XFA_ATTRIBUTE_Rotate, ms, FALSE)) {
1529     return 0;
1530   }
1531   int32_t iRotate = FXSYS_round(ms.GetValue());
1532   iRotate = XFA_MapRotation(iRotate);
1533   return iRotate / 90 * 90;
1534 }
GetBorder(FX_BOOL bModified)1535 CXFA_Border CXFA_WidgetData::GetBorder(FX_BOOL bModified) {
1536   return CXFA_Border(m_pNode->GetProperty(0, XFA_ELEMENT_Border, bModified));
1537 }
GetCaption(FX_BOOL bModified)1538 CXFA_Caption CXFA_WidgetData::GetCaption(FX_BOOL bModified) {
1539   return CXFA_Caption(m_pNode->GetProperty(0, XFA_ELEMENT_Caption, bModified));
1540 }
GetFont(FX_BOOL bModified)1541 CXFA_Font CXFA_WidgetData::GetFont(FX_BOOL bModified) {
1542   return CXFA_Font(m_pNode->GetProperty(0, XFA_ELEMENT_Font, bModified));
1543 }
GetMargin(FX_BOOL bModified)1544 CXFA_Margin CXFA_WidgetData::GetMargin(FX_BOOL bModified) {
1545   return CXFA_Margin(m_pNode->GetProperty(0, XFA_ELEMENT_Margin, bModified));
1546 }
GetPara(FX_BOOL bModified)1547 CXFA_Para CXFA_WidgetData::GetPara(FX_BOOL bModified) {
1548   return CXFA_Para(m_pNode->GetProperty(0, XFA_ELEMENT_Para, bModified));
1549 }
GetKeep(FX_BOOL bModified)1550 CXFA_Keep CXFA_WidgetData::GetKeep(FX_BOOL bModified) {
1551   return CXFA_Keep(m_pNode->GetProperty(0, XFA_ELEMENT_Keep, bModified),
1552                    m_pNode);
1553 }
GetEventList(CXFA_NodeArray & events)1554 void CXFA_WidgetData::GetEventList(CXFA_NodeArray& events) {
1555   m_pNode->GetNodeList(events, 0, XFA_ELEMENT_Event);
1556 }
GetEventByActivity(int32_t iActivity,CXFA_NodeArray & events,FX_BOOL bIsFormReady)1557 int32_t CXFA_WidgetData::GetEventByActivity(int32_t iActivity,
1558                                             CXFA_NodeArray& events,
1559                                             FX_BOOL bIsFormReady) {
1560   CXFA_NodeArray allEvents;
1561   GetEventList(allEvents);
1562   int32_t iCount = allEvents.GetSize();
1563   for (int32_t i = 0; i < iCount; i++) {
1564     CXFA_Event event(allEvents[i]);
1565     if (event.GetActivity() == iActivity) {
1566       if (iActivity == XFA_ATTRIBUTEENUM_Ready) {
1567         CFX_WideStringC wsRef;
1568         event.GetRef(wsRef);
1569         if (bIsFormReady) {
1570           if (wsRef == CFX_WideStringC(L"$form")) {
1571             events.Add(allEvents[i]);
1572           }
1573         } else {
1574           if (wsRef == CFX_WideStringC(L"$layout")) {
1575             events.Add(allEvents[i]);
1576           }
1577         }
1578       } else {
1579         events.Add(allEvents[i]);
1580       }
1581     }
1582   }
1583   return events.GetSize();
1584 }
GetDefaultValue(FX_BOOL bModified)1585 CXFA_Value CXFA_WidgetData::GetDefaultValue(FX_BOOL bModified) {
1586   CXFA_Node* pTemNode = m_pNode->GetTemplateNode();
1587   return pTemNode ? pTemNode->GetProperty(0, XFA_ELEMENT_Value, bModified)
1588                   : NULL;
1589 }
GetFormValue(FX_BOOL bModified)1590 CXFA_Value CXFA_WidgetData::GetFormValue(FX_BOOL bModified) {
1591   return m_pNode->GetProperty(0, XFA_ELEMENT_Value, bModified);
1592 }
GetCalculate(FX_BOOL bModified)1593 CXFA_Calculate CXFA_WidgetData::GetCalculate(FX_BOOL bModified) {
1594   return m_pNode->GetProperty(0, XFA_ELEMENT_Calculate, bModified);
1595 }
GetValidate(FX_BOOL bModified)1596 CXFA_Validate CXFA_WidgetData::GetValidate(FX_BOOL bModified) {
1597   return m_pNode->GetProperty(0, XFA_ELEMENT_Validate, bModified);
1598 }
GetVariables(FX_BOOL bModified)1599 CXFA_Variables CXFA_WidgetData::GetVariables(FX_BOOL bModified) {
1600   return m_pNode->GetProperty(0, XFA_ELEMENT_Variables, bModified);
1601 }
GetBind(FX_BOOL bModified)1602 CXFA_Bind CXFA_WidgetData::GetBind(FX_BOOL bModified) {
1603   return m_pNode->GetProperty(0, XFA_ELEMENT_Bind, bModified);
1604 }
GetAssist(FX_BOOL bModified)1605 CXFA_Assist CXFA_WidgetData::GetAssist(FX_BOOL bModified) {
1606   return m_pNode->GetProperty(0, XFA_ELEMENT_Assist, bModified);
1607 }
GetRelevant(CFX_WideStringC & wsRelevant)1608 void CXFA_WidgetData::GetRelevant(CFX_WideStringC& wsRelevant) {
1609   m_pNode->TryCData(XFA_ATTRIBUTE_Relevant, wsRelevant);
1610 }
GetWidth(FX_FLOAT & fWidth)1611 FX_BOOL CXFA_WidgetData::GetWidth(FX_FLOAT& fWidth) {
1612   return TryMeasure(XFA_ATTRIBUTE_W, fWidth);
1613 }
GetHeight(FX_FLOAT & fHeight)1614 FX_BOOL CXFA_WidgetData::GetHeight(FX_FLOAT& fHeight) {
1615   return TryMeasure(XFA_ATTRIBUTE_H, fHeight);
1616 }
GetMinWidth(FX_FLOAT & fMinWidth)1617 FX_BOOL CXFA_WidgetData::GetMinWidth(FX_FLOAT& fMinWidth) {
1618   return TryMeasure(XFA_ATTRIBUTE_MinW, fMinWidth);
1619 }
GetMinHeight(FX_FLOAT & fMinHeight)1620 FX_BOOL CXFA_WidgetData::GetMinHeight(FX_FLOAT& fMinHeight) {
1621   return TryMeasure(XFA_ATTRIBUTE_MinH, fMinHeight);
1622 }
GetMaxWidth(FX_FLOAT & fMaxWidth)1623 FX_BOOL CXFA_WidgetData::GetMaxWidth(FX_FLOAT& fMaxWidth) {
1624   return TryMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth);
1625 }
GetMaxHeight(FX_FLOAT & fMaxHeight)1626 FX_BOOL CXFA_WidgetData::GetMaxHeight(FX_FLOAT& fMaxHeight) {
1627   return TryMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight);
1628 }
GetBindItems()1629 CXFA_BindItems CXFA_WidgetData::GetBindItems() {
1630   return m_pNode->GetChild(0, XFA_ELEMENT_BindItems);
1631 }
SetAccess(int32_t iAccess,FX_BOOL bNotify)1632 FX_BOOL CXFA_WidgetData::SetAccess(int32_t iAccess, FX_BOOL bNotify) {
1633   return m_pNode->SetEnum(XFA_ATTRIBUTE_Access, (XFA_ATTRIBUTEENUM)iAccess,
1634                           bNotify);
1635 }
SetAccessKey(const CFX_WideString & wsAccessKey)1636 FX_BOOL CXFA_WidgetData::SetAccessKey(const CFX_WideString& wsAccessKey) {
1637   return m_pNode->SetCData(XFA_ATTRIBUTE_AccessKey, wsAccessKey);
1638 }
SetAnchorType(int32_t iType)1639 FX_BOOL CXFA_WidgetData::SetAnchorType(int32_t iType) {
1640   return m_pNode->SetEnum(XFA_ATTRIBUTE_AnchorType, (XFA_ATTRIBUTEENUM)iType);
1641 }
SetColSpan(int32_t iColSpan)1642 FX_BOOL CXFA_WidgetData::SetColSpan(int32_t iColSpan) {
1643   return m_pNode->SetInteger(XFA_ATTRIBUTE_ColSpan,
1644                              (XFA_ATTRIBUTEENUM)iColSpan);
1645 }
SetPresence(int32_t iPresence)1646 FX_BOOL CXFA_WidgetData::SetPresence(int32_t iPresence) {
1647   return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence);
1648 }
SetRotate(int32_t iRotate)1649 FX_BOOL CXFA_WidgetData::SetRotate(int32_t iRotate) {
1650   iRotate = XFA_MapRotation(iRotate);
1651   CXFA_Measurement ms((FX_FLOAT)iRotate, XFA_UNIT_Angle);
1652   return m_pNode->SetMeasure(XFA_ATTRIBUTE_Rotate, ms);
1653 }
SetRelevant(const CFX_WideString & wsRelevant)1654 FX_BOOL CXFA_WidgetData::SetRelevant(const CFX_WideString& wsRelevant) {
1655   return m_pNode->SetCData(XFA_ATTRIBUTE_Relevant, wsRelevant);
1656 }
SetStatus(FX_DWORD dwStatus)1657 FX_BOOL CXFA_WidgetData::SetStatus(FX_DWORD dwStatus) {
1658   return FALSE;
1659 }
SetWidth(FX_FLOAT fWidth)1660 FX_BOOL CXFA_WidgetData::SetWidth(FX_FLOAT fWidth) {
1661   return SetMeasure(XFA_ATTRIBUTE_W, fWidth);
1662 }
SetHeight(FX_FLOAT fHeight)1663 FX_BOOL CXFA_WidgetData::SetHeight(FX_FLOAT fHeight) {
1664   return SetMeasure(XFA_ATTRIBUTE_H, fHeight);
1665 }
SetMinWidth(FX_FLOAT fMinWidth)1666 FX_BOOL CXFA_WidgetData::SetMinWidth(FX_FLOAT fMinWidth) {
1667   return SetMeasure(XFA_ATTRIBUTE_MinW, fMinWidth);
1668 }
SetMinHeight(FX_FLOAT fMinHeight)1669 FX_BOOL CXFA_WidgetData::SetMinHeight(FX_FLOAT fMinHeight) {
1670   return SetMeasure(XFA_ATTRIBUTE_MinH, fMinHeight);
1671 }
SetMaxWidth(FX_FLOAT fMaxWidth)1672 FX_BOOL CXFA_WidgetData::SetMaxWidth(FX_FLOAT fMaxWidth) {
1673   return SetMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth);
1674 }
SetMaxHeight(FX_FLOAT fMaxHeight)1675 FX_BOOL CXFA_WidgetData::SetMaxHeight(FX_FLOAT fMaxHeight) {
1676   return SetMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight);
1677 }
SetPos(FX_FLOAT x,FX_FLOAT y)1678 FX_BOOL CXFA_WidgetData::SetPos(FX_FLOAT x, FX_FLOAT y) {
1679   return SetMeasure(XFA_ATTRIBUTE_X, x) && SetMeasure(XFA_ATTRIBUTE_Y, y);
1680 }
SetName(const CFX_WideString & wsName)1681 FX_BOOL CXFA_WidgetData::SetName(const CFX_WideString& wsName) {
1682   return m_pNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
1683 }
SetButtonHighlight(int32_t iButtonHighlight)1684 FX_BOOL CXFA_WidgetData::SetButtonHighlight(int32_t iButtonHighlight) {
1685   CXFA_Node* pUiChildNode = GetUIChild();
1686   return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Highlight,
1687                                (XFA_ATTRIBUTEENUM)iButtonHighlight);
1688 }
SetButtonRollover(const CFX_WideString & wsRollover,FX_BOOL bRichText)1689 FX_BOOL CXFA_WidgetData::SetButtonRollover(const CFX_WideString& wsRollover,
1690                                            FX_BOOL bRichText) {
1691   return FALSE;
1692 }
SetButtonDown(const CFX_WideString & wsDown,FX_BOOL bRichText)1693 FX_BOOL CXFA_WidgetData::SetButtonDown(const CFX_WideString& wsDown,
1694                                        FX_BOOL bRichText) {
1695   return FALSE;
1696 }
SetCheckButtonShape(int32_t iCheckButtonShape)1697 FX_BOOL CXFA_WidgetData::SetCheckButtonShape(int32_t iCheckButtonShape) {
1698   CXFA_Node* pUiChildNode = GetUIChild();
1699   return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Shape,
1700                                (XFA_ATTRIBUTEENUM)iCheckButtonShape);
1701 }
SetCheckButtonMark(int32_t iCheckButtonMark)1702 FX_BOOL CXFA_WidgetData::SetCheckButtonMark(int32_t iCheckButtonMark) {
1703   CXFA_Node* pUiChildNode = GetUIChild();
1704   return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Mark,
1705                                (XFA_ATTRIBUTEENUM)iCheckButtonMark);
1706 }
SetCheckButtonSize(FX_FLOAT fCheckButtonMark)1707 FX_BOOL CXFA_WidgetData::SetCheckButtonSize(FX_FLOAT fCheckButtonMark) {
1708   CXFA_Node* pUiChildNode = GetUIChild();
1709   if (pUiChildNode) {
1710     CXFA_Measurement ms(fCheckButtonMark, XFA_UNIT_Pt);
1711     return pUiChildNode->SetMeasure(XFA_ATTRIBUTE_Size, ms);
1712   }
1713   return FALSE;
1714 }
GetUIBorder(FX_BOOL bModified)1715 CXFA_Border CXFA_WidgetData::GetUIBorder(FX_BOOL bModified) {
1716   CXFA_Node* pUIChild = GetUIChild();
1717   return pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Border, bModified)
1718                   : NULL;
1719 }
GetUIMargin(FX_BOOL bModified)1720 CXFA_Margin CXFA_WidgetData::GetUIMargin(FX_BOOL bModified) {
1721   CXFA_Node* pUIChild = GetUIChild();
1722   return pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Margin, bModified)
1723                   : NULL;
1724 }
GetUIMargin(CFX_RectF & rtUIMargin)1725 void CXFA_WidgetData::GetUIMargin(CFX_RectF& rtUIMargin) {
1726   rtUIMargin.Reset();
1727   CXFA_Margin mgUI = GetUIMargin();
1728   if (!mgUI) {
1729     return;
1730   }
1731   CXFA_Border border = GetUIBorder();
1732   if (border && border.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
1733     return;
1734   }
1735   FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
1736   FX_BOOL bLeft = mgUI.GetLeftInset(fLeftInset);
1737   FX_BOOL bTop = mgUI.GetTopInset(fTopInset);
1738   FX_BOOL bRight = mgUI.GetRightInset(fRightInset);
1739   FX_BOOL bBottom = mgUI.GetBottomInset(fBottomInset);
1740   if (border) {
1741     FX_BOOL bVisible = FALSE;
1742     FX_FLOAT fThickness = 0;
1743     border.Get3DStyle(bVisible, fThickness);
1744     if (!bLeft || !bTop || !bRight || !bBottom) {
1745       CXFA_StrokeArray strokes;
1746       border.GetStrokes(strokes);
1747       if (!bTop) {
1748         fTopInset = XFA_GetEdgeThickness(strokes, bVisible, 0);
1749       }
1750       if (!bRight) {
1751         fRightInset = XFA_GetEdgeThickness(strokes, bVisible, 1);
1752       }
1753       if (!bBottom) {
1754         fBottomInset = XFA_GetEdgeThickness(strokes, bVisible, 2);
1755       }
1756       if (!bLeft) {
1757         fLeftInset = XFA_GetEdgeThickness(strokes, bVisible, 3);
1758       }
1759     }
1760   }
1761   rtUIMargin.Set(fLeftInset, fTopInset, fRightInset, fBottomInset);
1762 }
GetButtonHighlight()1763 int32_t CXFA_WidgetData::GetButtonHighlight() {
1764   CXFA_Node* pUIChild = GetUIChild();
1765   if (pUIChild) {
1766     return pUIChild->GetEnum(XFA_ATTRIBUTE_Highlight);
1767   }
1768   return XFA_GetAttributeDefaultValue_Enum(
1769       XFA_ELEMENT_Button, XFA_ATTRIBUTE_Highlight, XFA_XDPPACKET_Form);
1770 }
GetButtonRollover(CFX_WideString & wsRollover,FX_BOOL & bRichText)1771 FX_BOOL CXFA_WidgetData::GetButtonRollover(CFX_WideString& wsRollover,
1772                                            FX_BOOL& bRichText) {
1773   if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
1774     CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
1775     while (pText) {
1776       CFX_WideStringC wsName;
1777       pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
1778       if (wsName == FX_WSTRC(L"rollover")) {
1779         pText->TryContent(wsRollover);
1780         bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
1781         return !wsRollover.IsEmpty();
1782       }
1783       pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
1784     }
1785   }
1786   return FALSE;
1787 }
GetButtonDown(CFX_WideString & wsDown,FX_BOOL & bRichText)1788 FX_BOOL CXFA_WidgetData::GetButtonDown(CFX_WideString& wsDown,
1789                                        FX_BOOL& bRichText) {
1790   if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
1791     CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
1792     while (pText) {
1793       CFX_WideStringC wsName;
1794       pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
1795       if (wsName == FX_WSTRC(L"down")) {
1796         pText->TryContent(wsDown);
1797         bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
1798         return !wsDown.IsEmpty();
1799       }
1800       pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
1801     }
1802   }
1803   return FALSE;
1804 }
GetCheckButtonShape()1805 int32_t CXFA_WidgetData::GetCheckButtonShape() {
1806   CXFA_Node* pUIChild = GetUIChild();
1807   if (pUIChild) {
1808     return pUIChild->GetEnum(XFA_ATTRIBUTE_Shape);
1809   }
1810   return XFA_GetAttributeDefaultValue_Enum(
1811       XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Shape, XFA_XDPPACKET_Form);
1812 }
GetCheckButtonMark()1813 int32_t CXFA_WidgetData::GetCheckButtonMark() {
1814   CXFA_Node* pUIChild = GetUIChild();
1815   if (pUIChild) {
1816     return pUIChild->GetEnum(XFA_ATTRIBUTE_Mark);
1817   }
1818   return XFA_GetAttributeDefaultValue_Enum(
1819       XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Mark, XFA_XDPPACKET_Form);
1820 }
IsRadioButton()1821 FX_BOOL CXFA_WidgetData::IsRadioButton() {
1822   if (CXFA_Node* pParent = m_pNode->GetNodeItem(XFA_NODEITEM_Parent)) {
1823     return pParent->GetClassID() == XFA_ELEMENT_ExclGroup;
1824   }
1825   return FALSE;
1826 }
GetCheckButtonSize()1827 FX_FLOAT CXFA_WidgetData::GetCheckButtonSize() {
1828   CXFA_Node* pUIChild = GetUIChild();
1829   if (pUIChild) {
1830     return pUIChild->GetMeasure(XFA_ATTRIBUTE_Size).ToUnit(XFA_UNIT_Pt);
1831   }
1832   return XFA_GetAttributeDefaultValue_Measure(
1833              XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Size, XFA_XDPPACKET_Form)
1834       .ToUnit(XFA_UNIT_Pt);
1835 }
IsAllowNeutral()1836 FX_BOOL CXFA_WidgetData::IsAllowNeutral() {
1837   CXFA_Node* pUIChild = GetUIChild();
1838   if (pUIChild) {
1839     return pUIChild->GetBoolean(XFA_ATTRIBUTE_AllowNeutral);
1840   }
1841   return XFA_GetAttributeDefaultValue_Boolean(
1842       XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_AllowNeutral, XFA_XDPPACKET_Form);
1843 }
GetCheckState()1844 XFA_CHECKSTATE CXFA_WidgetData::GetCheckState() {
1845   CFX_WideString wsValue = GetRawValue();
1846   if (wsValue.IsEmpty()) {
1847     return XFA_CHECKSTATE_Off;
1848   }
1849   if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
1850     CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
1851     int32_t i = 0;
1852     while (pText) {
1853       CFX_WideString wsContent;
1854       if (pText->TryContent(wsContent) && (wsContent == wsValue)) {
1855         return (XFA_CHECKSTATE)i;
1856       }
1857       i++;
1858       pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
1859     }
1860   }
1861   return XFA_CHECKSTATE_Off;
1862 }
SetCheckState(XFA_CHECKSTATE eCheckState,FX_BOOL bNotify)1863 void CXFA_WidgetData::SetCheckState(XFA_CHECKSTATE eCheckState,
1864                                     FX_BOOL bNotify) {
1865   if (CXFA_WidgetData exclGroup = GetExclGroupNode()) {
1866     CFX_WideString wsValue;
1867     if (eCheckState != XFA_CHECKSTATE_Off) {
1868       if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
1869         CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
1870         if (pText) {
1871           pText->TryContent(wsValue);
1872         }
1873       }
1874     }
1875     CXFA_Node* pChild =
1876         ((CXFA_Node*)exclGroup)->GetNodeItem(XFA_NODEITEM_FirstChild);
1877     for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
1878       if (pChild->GetClassID() != XFA_ELEMENT_Field) {
1879         continue;
1880       }
1881       CXFA_Node* pItem = pChild->GetChild(0, XFA_ELEMENT_Items);
1882       if (!pItem) {
1883         continue;
1884       }
1885       CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
1886       if (!pItemchild) {
1887         continue;
1888       }
1889       CFX_WideString text = pItemchild->GetContent();
1890       CFX_WideString wsChildValue = text;
1891       if (wsValue != text) {
1892         pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
1893         if (pItemchild) {
1894           wsChildValue = pItemchild->GetContent();
1895         } else {
1896           wsChildValue.Empty();
1897         }
1898       }
1899       CXFA_WidgetData ch(pChild);
1900       ch.SyncValue(wsChildValue, bNotify);
1901     }
1902     exclGroup.SyncValue(wsValue, bNotify);
1903   } else {
1904     CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items);
1905     if (!pItems) {
1906       return;
1907     }
1908     int32_t i = -1;
1909     CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
1910     CFX_WideString wsContent;
1911     while (pText) {
1912       i++;
1913       if (i == eCheckState) {
1914         pText->TryContent(wsContent);
1915         break;
1916       }
1917       pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
1918     }
1919     SyncValue(wsContent, bNotify);
1920   }
1921 }
GetExclGroupNode()1922 CXFA_Node* CXFA_WidgetData::GetExclGroupNode() {
1923   CXFA_Node* pExcl = (CXFA_Node*)m_pNode->GetNodeItem(XFA_NODEITEM_Parent);
1924   if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup) {
1925     return NULL;
1926   }
1927   return pExcl;
1928 }
GetSelectedMember()1929 CXFA_Node* CXFA_WidgetData::GetSelectedMember() {
1930   CXFA_Node* pSelectedMember = NULL;
1931   CFX_WideString wsState = GetRawValue();
1932   if (wsState.IsEmpty()) {
1933     return pSelectedMember;
1934   }
1935   for (CXFA_Node* pNode =
1936            (CXFA_Node*)m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
1937        pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
1938     CXFA_WidgetData widgetData(pNode);
1939     if (widgetData.GetCheckState() == XFA_CHECKSTATE_On) {
1940       pSelectedMember = pNode;
1941       break;
1942     }
1943   }
1944   return pSelectedMember;
1945 }
SetSelectedMember(const CFX_WideStringC & wsName,FX_BOOL bNotify)1946 CXFA_Node* CXFA_WidgetData::SetSelectedMember(const CFX_WideStringC& wsName,
1947                                               FX_BOOL bNotify) {
1948   CXFA_Node* pSelectedMember = NULL;
1949   FX_DWORD nameHash =
1950       FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength());
1951   for (CXFA_Node* pNode =
1952            (CXFA_Node*)m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
1953        pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
1954     if (pNode->GetNameHash() == nameHash) {
1955       CXFA_WidgetData widgetData(pNode);
1956       widgetData.SetCheckState(XFA_CHECKSTATE_On, bNotify);
1957       pSelectedMember = pNode;
1958       break;
1959     }
1960   }
1961   return pSelectedMember;
1962 }
SetSelectedMemberByValue(const CFX_WideStringC & wsValue,FX_BOOL bNotify,FX_BOOL bScriptModify,FX_BOOL bSyncData)1963 void CXFA_WidgetData::SetSelectedMemberByValue(const CFX_WideStringC& wsValue,
1964                                                FX_BOOL bNotify,
1965                                                FX_BOOL bScriptModify,
1966                                                FX_BOOL bSyncData) {
1967   CFX_WideString wsExclGroup;
1968   for (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
1969        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
1970     if (pNode->GetClassID() != XFA_ELEMENT_Field) {
1971       continue;
1972     }
1973     CXFA_Node* pItem = pNode->GetChild(0, XFA_ELEMENT_Items);
1974     if (!pItem) {
1975       continue;
1976     }
1977     CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
1978     if (!pItemchild) {
1979       continue;
1980     }
1981     CFX_WideString wsChildValue = pItemchild->GetContent();
1982     if (wsValue != wsChildValue) {
1983       pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
1984       if (pItemchild) {
1985         wsChildValue = pItemchild->GetContent();
1986       } else {
1987         wsChildValue.Empty();
1988       }
1989     } else {
1990       wsExclGroup = wsValue;
1991     }
1992     pNode->SetContent(wsChildValue, wsChildValue, bNotify, bScriptModify,
1993                       FALSE);
1994   }
1995   if (m_pNode) {
1996     m_pNode->SetContent(wsExclGroup, wsExclGroup, bNotify, bScriptModify,
1997                         bSyncData);
1998   }
1999 }
GetExclGroupFirstMember()2000 CXFA_Node* CXFA_WidgetData::GetExclGroupFirstMember() {
2001   CXFA_Node* pExcl = GetNode();
2002   if (!pExcl) {
2003     return NULL;
2004   }
2005   CXFA_Node* pNode = pExcl->GetNodeItem(XFA_NODEITEM_FirstChild);
2006   while (pNode) {
2007     if (pNode->GetClassID() == XFA_ELEMENT_Field) {
2008       return pNode;
2009     }
2010     pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
2011   }
2012   return NULL;
2013 }
GetExclGroupNextMember(CXFA_Node * pNode)2014 CXFA_Node* CXFA_WidgetData::GetExclGroupNextMember(CXFA_Node* pNode) {
2015   if (!pNode) {
2016     return NULL;
2017   }
2018   CXFA_Node* pNodeField = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
2019   while (pNodeField) {
2020     if (pNodeField->GetClassID() == XFA_ELEMENT_Field) {
2021       return pNodeField;
2022     }
2023     pNodeField = pNodeField->GetNodeItem(XFA_NODEITEM_NextSibling);
2024   }
2025   return NULL;
2026 }
GetChoiceListCommitOn()2027 int32_t CXFA_WidgetData::GetChoiceListCommitOn() {
2028   CXFA_Node* pUIChild = GetUIChild();
2029   if (pUIChild) {
2030     return pUIChild->GetEnum(XFA_ATTRIBUTE_CommitOn);
2031   }
2032   return XFA_GetAttributeDefaultValue_Enum(
2033       XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_CommitOn, XFA_XDPPACKET_Form);
2034 }
IsChoiceListAllowTextEntry()2035 FX_BOOL CXFA_WidgetData::IsChoiceListAllowTextEntry() {
2036   CXFA_Node* pUIChild = GetUIChild();
2037   if (pUIChild) {
2038     return pUIChild->GetBoolean(XFA_ATTRIBUTE_TextEntry);
2039   }
2040   return XFA_GetAttributeDefaultValue_Boolean(
2041       XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_TextEntry, XFA_XDPPACKET_Form);
2042 }
GetChoiceListOpen()2043 int32_t CXFA_WidgetData::GetChoiceListOpen() {
2044   CXFA_Node* pUIChild = GetUIChild();
2045   if (pUIChild) {
2046     return pUIChild->GetEnum(XFA_ATTRIBUTE_Open);
2047   }
2048   return XFA_GetAttributeDefaultValue_Enum(
2049       XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_Open, XFA_XDPPACKET_Form);
2050 }
IsListBox()2051 FX_BOOL CXFA_WidgetData::IsListBox() {
2052   int32_t iOpenMode = GetChoiceListOpen();
2053   return (iOpenMode == XFA_ATTRIBUTEENUM_Always ||
2054           iOpenMode == XFA_ATTRIBUTEENUM_MultiSelect);
2055 }
CountChoiceListItems(FX_BOOL bSaveValue)2056 int32_t CXFA_WidgetData::CountChoiceListItems(FX_BOOL bSaveValue) {
2057   CXFA_NodeArray pItems;
2058   CXFA_Node* pItem = NULL;
2059   int32_t iCount = 0;
2060   CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
2061   for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2062     if (pNode->GetClassID() != XFA_ELEMENT_Items) {
2063       continue;
2064     }
2065     iCount++;
2066     pItems.Add(pNode);
2067     if (iCount == 2) {
2068       break;
2069     }
2070   }
2071   if (iCount == 0) {
2072     return 0;
2073   }
2074   pItem = pItems[0];
2075   if (iCount > 1) {
2076     FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
2077     FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
2078     if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
2079       pItem = pItems[1];
2080     }
2081   }
2082   pItems.RemoveAll();
2083   return pItem->CountChildren(XFA_ELEMENT_UNKNOWN);
2084 }
GetChoiceListItem(CFX_WideString & wsText,int32_t nIndex,FX_BOOL bSaveValue)2085 FX_BOOL CXFA_WidgetData::GetChoiceListItem(CFX_WideString& wsText,
2086                                            int32_t nIndex,
2087                                            FX_BOOL bSaveValue) {
2088   wsText.Empty();
2089   CXFA_NodeArray pItemsArray;
2090   CXFA_Node* pItems = NULL;
2091   int32_t iCount = 0;
2092   CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
2093   for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2094     if (pNode->GetClassID() != XFA_ELEMENT_Items) {
2095       continue;
2096     }
2097     iCount++;
2098     pItemsArray.Add(pNode);
2099     if (iCount == 2) {
2100       break;
2101     }
2102   }
2103   if (iCount == 0) {
2104     return FALSE;
2105   }
2106   pItems = pItemsArray[0];
2107   if (iCount > 1) {
2108     FX_BOOL bItemOneHasSave = pItemsArray[0]->GetBoolean(XFA_ATTRIBUTE_Save);
2109     FX_BOOL bItemTwoHasSave = pItemsArray[1]->GetBoolean(XFA_ATTRIBUTE_Save);
2110     if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
2111       pItems = pItemsArray[1];
2112     }
2113   }
2114   if (pItems) {
2115     CXFA_Node* pItem = pItems->GetChild(nIndex, XFA_ELEMENT_UNKNOWN);
2116     if (pItem != NULL) {
2117       pItem->TryContent(wsText);
2118       return TRUE;
2119     }
2120   }
2121   return FALSE;
2122 }
GetChoiceListItems(CFX_WideStringArray & wsTextArray,FX_BOOL bSaveValue)2123 void CXFA_WidgetData::GetChoiceListItems(CFX_WideStringArray& wsTextArray,
2124                                          FX_BOOL bSaveValue) {
2125   CXFA_NodeArray pItems;
2126   CXFA_Node* pItem = NULL;
2127   int32_t iCount = 0;
2128   CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
2129   for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2130     if (pNode->GetClassID() != XFA_ELEMENT_Items) {
2131       continue;
2132     }
2133     iCount++;
2134     pItems.Add(pNode);
2135     if (iCount == 2) {
2136       break;
2137     }
2138   }
2139   if (iCount == 0) {
2140     return;
2141   }
2142   pItem = pItems[0];
2143   if (iCount > 1) {
2144     FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
2145     FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
2146     if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
2147       pItem = pItems[1];
2148     }
2149   }
2150   pItems.RemoveAll();
2151   pNode = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
2152   for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2153     pNode->TryContent(wsTextArray.Add());
2154   }
2155 }
CountSelectedItems()2156 int32_t CXFA_WidgetData::CountSelectedItems() {
2157   CFX_WideStringArray wsValueArray;
2158   GetSelectedItemsValue(wsValueArray);
2159   if (IsListBox() || !IsChoiceListAllowTextEntry()) {
2160     return wsValueArray.GetSize();
2161   }
2162   int32_t iSelected = 0;
2163   CFX_WideStringArray wsSaveTextArray;
2164   GetChoiceListItems(wsSaveTextArray, TRUE);
2165   int32_t iValues = wsValueArray.GetSize();
2166   for (int32_t i = 0; i < iValues; i++) {
2167     int32_t iSaves = wsSaveTextArray.GetSize();
2168     for (int32_t j = 0; j < iSaves; j++) {
2169       if (wsValueArray[i] == wsSaveTextArray[j]) {
2170         iSelected++;
2171         break;
2172       }
2173     }
2174   }
2175   return iSelected;
2176 }
GetSelectedItem(int32_t nIndex)2177 int32_t CXFA_WidgetData::GetSelectedItem(int32_t nIndex) {
2178   CFX_WideStringArray wsValueArray;
2179   GetSelectedItemsValue(wsValueArray);
2180   CFX_WideStringArray wsSaveTextArray;
2181   GetChoiceListItems(wsSaveTextArray, TRUE);
2182   int32_t iSaves = wsSaveTextArray.GetSize();
2183   for (int32_t j = 0; j < iSaves; j++) {
2184     if (wsValueArray[nIndex] == wsSaveTextArray[j]) {
2185       return j;
2186     }
2187   }
2188   return -1;
2189 }
GetSelectedItems(CFX_Int32Array & iSelArray)2190 void CXFA_WidgetData::GetSelectedItems(CFX_Int32Array& iSelArray) {
2191   CFX_WideStringArray wsValueArray;
2192   GetSelectedItemsValue(wsValueArray);
2193   int32_t iValues = wsValueArray.GetSize();
2194   if (iValues < 1) {
2195     return;
2196   }
2197   CFX_WideStringArray wsSaveTextArray;
2198   GetChoiceListItems(wsSaveTextArray, TRUE);
2199   int32_t iSaves = wsSaveTextArray.GetSize();
2200   for (int32_t i = 0; i < iValues; i++) {
2201     for (int32_t j = 0; j < iSaves; j++) {
2202       if (wsValueArray[i] == wsSaveTextArray[j]) {
2203         iSelArray.Add(j);
2204         break;
2205       }
2206     }
2207   }
2208 }
GetSelectedItemsValue(CFX_WideStringArray & wsSelTextArray)2209 void CXFA_WidgetData::GetSelectedItemsValue(
2210     CFX_WideStringArray& wsSelTextArray) {
2211   CFX_WideString wsValue = GetRawValue();
2212   if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
2213     if (!wsValue.IsEmpty()) {
2214       int32_t iStart = 0;
2215       int32_t iLength = wsValue.GetLength();
2216       int32_t iEnd = wsValue.Find(L'\n', iStart);
2217       iEnd = (iEnd == -1) ? iLength : iEnd;
2218       while (iEnd >= iStart) {
2219         wsSelTextArray.Add(wsValue.Mid(iStart, iEnd - iStart));
2220         iStart = iEnd + 1;
2221         if (iStart >= iLength) {
2222           break;
2223         }
2224         iEnd = wsValue.Find(L'\n', iStart);
2225         if (iEnd < 0) {
2226           wsSelTextArray.Add(wsValue.Mid(iStart, iLength - iStart));
2227         }
2228       }
2229     }
2230   } else {
2231     wsSelTextArray.Add(wsValue);
2232   }
2233 }
GetItemState(int32_t nIndex)2234 FX_BOOL CXFA_WidgetData::GetItemState(int32_t nIndex) {
2235   if (nIndex < 0) {
2236     return FALSE;
2237   }
2238   CFX_WideStringArray wsSaveTextArray;
2239   GetChoiceListItems(wsSaveTextArray, TRUE);
2240   if (wsSaveTextArray.GetSize() <= nIndex) {
2241     return FALSE;
2242   }
2243   CFX_WideStringArray wsValueArray;
2244   GetSelectedItemsValue(wsValueArray);
2245   int32_t iValues = wsValueArray.GetSize();
2246   for (int32_t j = 0; j < iValues; j++) {
2247     if (wsValueArray[j] == wsSaveTextArray[nIndex]) {
2248       return TRUE;
2249     }
2250   }
2251   return FALSE;
2252 }
SetItemState(int32_t nIndex,FX_BOOL bSelected,FX_BOOL bNotify,FX_BOOL bScriptModify,FX_BOOL bSyncData)2253 void CXFA_WidgetData::SetItemState(int32_t nIndex,
2254                                    FX_BOOL bSelected,
2255                                    FX_BOOL bNotify,
2256                                    FX_BOOL bScriptModify,
2257                                    FX_BOOL bSyncData) {
2258   if (nIndex < 0) {
2259     return;
2260   }
2261   CFX_WideStringArray wsSaveTextArray;
2262   GetChoiceListItems(wsSaveTextArray, TRUE);
2263   if (wsSaveTextArray.GetSize() <= nIndex) {
2264     return;
2265   }
2266   int32_t iSel = -1;
2267   CFX_WideStringArray wsValueArray;
2268   GetSelectedItemsValue(wsValueArray);
2269   int32_t iValues = wsValueArray.GetSize();
2270   for (int32_t j = 0; j < iValues; j++) {
2271     if (wsValueArray[j] == wsSaveTextArray[nIndex]) {
2272       iSel = j;
2273       break;
2274     }
2275   }
2276   if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
2277     if (bSelected) {
2278       if (iSel < 0) {
2279         CFX_WideString wsValue = GetRawValue();
2280         if (!wsValue.IsEmpty()) {
2281           wsValue += L"\n";
2282         }
2283         wsValue += wsSaveTextArray[nIndex];
2284         m_pNode->SetContent(wsValue, wsValue, bNotify, bScriptModify,
2285                             bSyncData);
2286       }
2287     } else if (iSel >= 0) {
2288       CFX_Int32Array iSelArray;
2289       GetSelectedItems(iSelArray);
2290       for (int32_t i = 0; i < iSelArray.GetSize(); i++) {
2291         if (iSelArray[i] == nIndex) {
2292           iSelArray.RemoveAt(i);
2293           break;
2294         }
2295       }
2296       SetSelectdItems(iSelArray, bNotify, bScriptModify, bSyncData);
2297     }
2298   } else {
2299     if (bSelected) {
2300       if (iSel < 0) {
2301         CFX_WideString wsSaveText = wsSaveTextArray[nIndex];
2302         CFX_WideString wsFormatText(wsSaveText);
2303         GetFormatDataValue(wsSaveText, wsFormatText);
2304         m_pNode->SetContent(wsSaveText, wsFormatText, bNotify, bScriptModify,
2305                             bSyncData);
2306       }
2307     } else if (iSel >= 0) {
2308       m_pNode->SetContent(CFX_WideString(), CFX_WideString(), bNotify,
2309                           bScriptModify, bSyncData);
2310     }
2311   }
2312 }
SetSelectdItems(CFX_Int32Array & iSelArray,FX_BOOL bNotify,FX_BOOL bScriptModify,FX_BOOL bSyncData)2313 void CXFA_WidgetData::SetSelectdItems(CFX_Int32Array& iSelArray,
2314                                       FX_BOOL bNotify,
2315                                       FX_BOOL bScriptModify,
2316                                       FX_BOOL bSyncData) {
2317   CFX_WideString wsValue;
2318   int32_t iSize = iSelArray.GetSize();
2319   if (iSize >= 1) {
2320     CFX_WideStringArray wsSaveTextArray;
2321     GetChoiceListItems(wsSaveTextArray, TRUE);
2322     CFX_WideString wsItemValue;
2323     for (int32_t i = 0; i < iSize; i++) {
2324       wsItemValue = (iSize == 1)
2325                         ? wsSaveTextArray[iSelArray[i]]
2326                         : wsSaveTextArray[iSelArray[i]] + FX_WSTRC(L"\n");
2327       wsValue += wsItemValue;
2328     }
2329   }
2330   CFX_WideString wsFormat(wsValue);
2331   if (GetChoiceListOpen() != XFA_ATTRIBUTEENUM_MultiSelect) {
2332     GetFormatDataValue(wsValue, wsFormat);
2333   }
2334   m_pNode->SetContent(wsValue, wsFormat, bNotify, bScriptModify, bSyncData);
2335 }
ClearAllSelections()2336 void CXFA_WidgetData::ClearAllSelections() {
2337   CXFA_Node* pBind = m_pNode->GetBindData();
2338   if (pBind && GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
2339     while (CXFA_Node* pChildNode =
2340                pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) {
2341       pBind->RemoveChild(pChildNode);
2342     }
2343   } else {
2344     SyncValue(CFX_WideString(), FALSE);
2345   }
2346 }
InsertItem(const CFX_WideString & wsLabel,const CFX_WideString & wsValue,int32_t nIndex,FX_BOOL bNotify)2347 void CXFA_WidgetData::InsertItem(const CFX_WideString& wsLabel,
2348                                  const CFX_WideString& wsValue,
2349                                  int32_t nIndex,
2350                                  FX_BOOL bNotify) {
2351   CFX_WideString wsNewValue(wsValue);
2352   if (wsNewValue.IsEmpty()) {
2353     wsNewValue = wsLabel;
2354   }
2355   CXFA_NodeArray listitems;
2356   int32_t iCount = 0;
2357   CXFA_Node* pItemNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
2358   for (; pItemNode;
2359        pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2360     if (pItemNode->GetClassID() != XFA_ELEMENT_Items) {
2361       continue;
2362     }
2363     listitems.Add(pItemNode);
2364     iCount++;
2365   }
2366   if (iCount < 1) {
2367     CXFA_Node* pItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
2368     m_pNode->InsertChild(-1, pItems);
2369     InsertListTextItem(pItems, wsLabel, nIndex);
2370     CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
2371     m_pNode->InsertChild(-1, pSaveItems);
2372     pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
2373     InsertListTextItem(pSaveItems, wsNewValue, nIndex);
2374   } else if (iCount > 1) {
2375     for (int32_t i = 0; i < 2; i++) {
2376       CXFA_Node* pNode = listitems[i];
2377       FX_BOOL bHasSave = pNode->GetBoolean(XFA_ATTRIBUTE_Save);
2378       if (bHasSave) {
2379         InsertListTextItem(pNode, wsNewValue, nIndex);
2380       } else {
2381         InsertListTextItem(pNode, wsLabel, nIndex);
2382       }
2383     }
2384   } else {
2385     CXFA_Node* pNode = listitems[0];
2386     pNode->SetBoolean(XFA_ATTRIBUTE_Save, FALSE);
2387     pNode->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Visible);
2388     CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
2389     m_pNode->InsertChild(-1, pSaveItems);
2390     pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
2391     pSaveItems->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Hidden);
2392     listitems.RemoveAll();
2393     CXFA_Node* pListNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
2394     int32_t i = 0;
2395     while (pListNode) {
2396       CFX_WideString wsOldValue;
2397       pListNode->TryContent(wsOldValue);
2398       InsertListTextItem(pSaveItems, wsOldValue, i);
2399       i++;
2400       pListNode = pListNode->GetNodeItem(XFA_NODEITEM_NextSibling);
2401     }
2402     InsertListTextItem(pNode, wsLabel, nIndex);
2403     InsertListTextItem(pSaveItems, wsNewValue, nIndex);
2404   }
2405   if (!bNotify) {
2406     return;
2407   }
2408   m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
2409       this, XFA_WIDGETEVENT_ListItemAdded, (void*)(const FX_WCHAR*)wsLabel,
2410       (void*)(const FX_WCHAR*)wsValue, (void*)(uintptr_t)nIndex);
2411 }
GetItemLabel(const CFX_WideStringC & wsValue,CFX_WideString & wsLabel)2412 void CXFA_WidgetData::GetItemLabel(const CFX_WideStringC& wsValue,
2413                                    CFX_WideString& wsLabel) {
2414   int32_t iCount = 0;
2415   CXFA_NodeArray listitems;
2416   CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
2417   for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2418     if (pItems->GetClassID() != XFA_ELEMENT_Items) {
2419       continue;
2420     }
2421     iCount++;
2422     listitems.Add(pItems);
2423   }
2424   if (iCount <= 1) {
2425     wsLabel = wsValue;
2426   } else {
2427     CXFA_Node* pLabelItems = listitems[0];
2428     FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
2429     CXFA_Node* pSaveItems = NULL;
2430     if (bSave) {
2431       pSaveItems = pLabelItems;
2432       pLabelItems = listitems[1];
2433     } else {
2434       pSaveItems = listitems[1];
2435     }
2436     iCount = 0;
2437     int32_t iSearch = -1;
2438     CFX_WideString wsContent;
2439     CXFA_Node* pChildItem = pSaveItems->GetNodeItem(XFA_NODEITEM_FirstChild);
2440     for (; pChildItem;
2441          pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2442       pChildItem->TryContent(wsContent);
2443       if (wsContent == wsValue) {
2444         iSearch = iCount;
2445         break;
2446       }
2447       iCount++;
2448     }
2449     if (iSearch < 0) {
2450       return;
2451     }
2452     if (CXFA_Node* pText =
2453             pLabelItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) {
2454       pText->TryContent(wsLabel);
2455     }
2456   }
2457 }
GetItemValue(const CFX_WideStringC & wsLabel,CFX_WideString & wsValue)2458 void CXFA_WidgetData::GetItemValue(const CFX_WideStringC& wsLabel,
2459                                    CFX_WideString& wsValue) {
2460   int32_t iCount = 0;
2461   CXFA_NodeArray listitems;
2462   CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
2463   for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2464     if (pItems->GetClassID() != XFA_ELEMENT_Items) {
2465       continue;
2466     }
2467     iCount++;
2468     listitems.Add(pItems);
2469   }
2470   if (iCount <= 1) {
2471     wsValue = wsLabel;
2472   } else {
2473     CXFA_Node* pLabelItems = listitems[0];
2474     FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
2475     CXFA_Node* pSaveItems = NULL;
2476     if (bSave) {
2477       pSaveItems = pLabelItems;
2478       pLabelItems = listitems[1];
2479     } else {
2480       pSaveItems = listitems[1];
2481     }
2482     iCount = 0;
2483     int32_t iSearch = -1;
2484     CFX_WideString wsContent;
2485     CXFA_Node* pChildItem = pLabelItems->GetNodeItem(XFA_NODEITEM_FirstChild);
2486     for (; pChildItem;
2487          pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2488       pChildItem->TryContent(wsContent);
2489       if (wsContent == wsLabel) {
2490         iSearch = iCount;
2491         break;
2492       }
2493       iCount++;
2494     }
2495     if (iSearch < 0) {
2496       return;
2497     }
2498     if (CXFA_Node* pText = pSaveItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) {
2499       pText->TryContent(wsValue);
2500     }
2501   }
2502 }
DeleteItem(int32_t nIndex,FX_BOOL bNotify,FX_BOOL bScriptModify,FX_BOOL bSyncData)2503 FX_BOOL CXFA_WidgetData::DeleteItem(int32_t nIndex,
2504                                     FX_BOOL bNotify,
2505                                     FX_BOOL bScriptModify,
2506                                     FX_BOOL bSyncData) {
2507   FX_BOOL bSetValue = FALSE;
2508   CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
2509   for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
2510     if (pItems->GetClassID() != XFA_ELEMENT_Items) {
2511       continue;
2512     }
2513     if (nIndex < 0) {
2514       while (CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild)) {
2515         pItems->RemoveChild(pNode);
2516       }
2517     } else {
2518       if (!bSetValue && pItems->GetBoolean(XFA_ATTRIBUTE_Save)) {
2519         SetItemState(nIndex, FALSE, TRUE, bScriptModify, bSyncData);
2520         bSetValue = TRUE;
2521       }
2522       int32_t i = 0;
2523       CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
2524       while (pNode) {
2525         if (i == nIndex) {
2526           pItems->RemoveChild(pNode);
2527           break;
2528         }
2529         i++;
2530         pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
2531       }
2532     }
2533   }
2534   if (!bNotify) {
2535     return TRUE;
2536   }
2537   m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
2538       this, XFA_WIDGETEVENT_ListItemRemoved, (void*)(uintptr_t)nIndex);
2539   return TRUE;
2540 }
GetHorizontalScrollPolicy()2541 int32_t CXFA_WidgetData::GetHorizontalScrollPolicy() {
2542   CXFA_Node* pUIChild = GetUIChild();
2543   if (pUIChild) {
2544     return pUIChild->GetEnum(XFA_ATTRIBUTE_HScrollPolicy);
2545   }
2546   return XFA_ATTRIBUTEENUM_Auto;
2547 }
GetNumberOfCells()2548 int32_t CXFA_WidgetData::GetNumberOfCells() {
2549   CXFA_Node* pUIChild = GetUIChild();
2550   if (!pUIChild) {
2551     return -1;
2552   }
2553   if (CXFA_Node* pNode = pUIChild->GetChild(0, XFA_ELEMENT_Comb)) {
2554     return pNode->GetInteger(XFA_ATTRIBUTE_NumberOfCells);
2555   }
2556   return -1;
2557 }
IsDateTimeEditUsePicker()2558 FX_BOOL CXFA_WidgetData::IsDateTimeEditUsePicker() {
2559   return TRUE;
2560 }
GetBarcodeType()2561 CFX_WideString CXFA_WidgetData::GetBarcodeType() {
2562   CXFA_Node* pUIChild = GetUIChild();
2563   return pUIChild ? pUIChild->GetCData(XFA_ATTRIBUTE_Type) : NULL;
2564 }
GetBarcodeAttribute_CharEncoding(int32_t & val)2565 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_CharEncoding(int32_t& val) {
2566   CXFA_Node* pUIChild = GetUIChild();
2567   CFX_WideString wsCharEncoding;
2568   if (pUIChild->TryCData(XFA_ATTRIBUTE_CharEncoding, wsCharEncoding)) {
2569     if (wsCharEncoding.CompareNoCase(L"UTF-16")) {
2570       val = CHAR_ENCODING_UNICODE;
2571       return TRUE;
2572     } else if (wsCharEncoding.CompareNoCase(L"UTF-8")) {
2573       val = CHAR_ENCODING_UTF8;
2574       return TRUE;
2575     }
2576   }
2577   return FALSE;
2578 }
GetBarcodeAttribute_Checksum(int32_t & val)2579 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Checksum(int32_t& val) {
2580   CXFA_Node* pUIChild = GetUIChild();
2581   XFA_ATTRIBUTEENUM eChecksum;
2582   if (pUIChild->TryEnum(XFA_ATTRIBUTE_Checksum, eChecksum)) {
2583     switch (eChecksum) {
2584       case XFA_ATTRIBUTEENUM_None:
2585         val = 0;
2586         return TRUE;
2587       case XFA_ATTRIBUTEENUM_Auto:
2588         val = 1;
2589         return TRUE;
2590       case XFA_ATTRIBUTEENUM_1mod10:
2591         break;
2592       case XFA_ATTRIBUTEENUM_1mod10_1mod11:
2593         break;
2594       case XFA_ATTRIBUTEENUM_2mod10:
2595         break;
2596       default:
2597         break;
2598     }
2599   }
2600   return FALSE;
2601 }
GetBarcodeAttribute_DataLength(int32_t & val)2602 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_DataLength(int32_t& val) {
2603   CXFA_Node* pUIChild = GetUIChild();
2604   CFX_WideString wsDataLength;
2605   if (pUIChild->TryCData(XFA_ATTRIBUTE_DataLength, wsDataLength)) {
2606     val = FXSYS_wtoi(wsDataLength);
2607     return TRUE;
2608   }
2609   return FALSE;
2610 }
GetBarcodeAttribute_StartChar(FX_CHAR & val)2611 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_StartChar(FX_CHAR& val) {
2612   CXFA_Node* pUIChild = GetUIChild();
2613   CFX_WideStringC wsStartEndChar;
2614   if (pUIChild->TryCData(XFA_ATTRIBUTE_StartChar, wsStartEndChar)) {
2615     if (wsStartEndChar.GetLength()) {
2616       val = (FX_CHAR)wsStartEndChar.GetAt(0);
2617       return TRUE;
2618     }
2619   }
2620   return FALSE;
2621 }
GetBarcodeAttribute_EndChar(FX_CHAR & val)2622 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_EndChar(FX_CHAR& val) {
2623   CXFA_Node* pUIChild = GetUIChild();
2624   CFX_WideStringC wsStartEndChar;
2625   if (pUIChild->TryCData(XFA_ATTRIBUTE_EndChar, wsStartEndChar)) {
2626     if (wsStartEndChar.GetLength()) {
2627       val = (FX_CHAR)wsStartEndChar.GetAt(0);
2628       return TRUE;
2629     }
2630   }
2631   return FALSE;
2632 }
GetBarcodeAttribute_ECLevel(int32_t & val)2633 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ECLevel(int32_t& val) {
2634   CXFA_Node* pUIChild = GetUIChild();
2635   CFX_WideString wsECLevel;
2636   if (pUIChild->TryCData(XFA_ATTRIBUTE_ErrorCorrectionLevel, wsECLevel)) {
2637     val = FXSYS_wtoi(wsECLevel);
2638     return TRUE;
2639   }
2640   return FALSE;
2641 }
GetBarcodeAttribute_ModuleWidth(int32_t & val)2642 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleWidth(int32_t& val) {
2643   CXFA_Node* pUIChild = GetUIChild();
2644   CXFA_Measurement mModuleWidthHeight;
2645   if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleWidth, mModuleWidthHeight)) {
2646     val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
2647     return TRUE;
2648   }
2649   return FALSE;
2650 }
GetBarcodeAttribute_ModuleHeight(int32_t & val)2651 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleHeight(int32_t& val) {
2652   CXFA_Node* pUIChild = GetUIChild();
2653   CXFA_Measurement mModuleWidthHeight;
2654   if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleHeight, mModuleWidthHeight)) {
2655     val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
2656     return TRUE;
2657   }
2658   return FALSE;
2659 }
GetBarcodeAttribute_PrintChecksum(FX_BOOL & val)2660 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_PrintChecksum(FX_BOOL& val) {
2661   CXFA_Node* pUIChild = GetUIChild();
2662   FX_BOOL bPrintCheckDigit;
2663   if (pUIChild->TryBoolean(XFA_ATTRIBUTE_PrintCheckDigit, bPrintCheckDigit)) {
2664     val = bPrintCheckDigit;
2665     return TRUE;
2666   }
2667   return FALSE;
2668 }
GetBarcodeAttribute_TextLocation(int32_t & val)2669 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_TextLocation(int32_t& val) {
2670   CXFA_Node* pUIChild = GetUIChild();
2671   XFA_ATTRIBUTEENUM eTextLocation;
2672   if (pUIChild->TryEnum(XFA_ATTRIBUTE_TextLocation, eTextLocation)) {
2673     switch (eTextLocation) {
2674       case XFA_ATTRIBUTEENUM_None:
2675         val = BC_TEXT_LOC_NONE;
2676         return TRUE;
2677       case XFA_ATTRIBUTEENUM_Above:
2678         val = BC_TEXT_LOC_ABOVE;
2679         return TRUE;
2680       case XFA_ATTRIBUTEENUM_Below:
2681         val = BC_TEXT_LOC_BELOW;
2682         return TRUE;
2683       case XFA_ATTRIBUTEENUM_AboveEmbedded:
2684         val = BC_TEXT_LOC_ABOVEEMBED;
2685         return TRUE;
2686       case XFA_ATTRIBUTEENUM_BelowEmbedded:
2687         val = BC_TEXT_LOC_BELOWEMBED;
2688         return TRUE;
2689       default:
2690         break;
2691     }
2692   }
2693   return FALSE;
2694 }
GetBarcodeAttribute_Truncate(FX_BOOL & val)2695 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Truncate(FX_BOOL& val) {
2696   CXFA_Node* pUIChild = GetUIChild();
2697   FX_BOOL bTruncate;
2698   if (pUIChild->TryBoolean(XFA_ATTRIBUTE_Truncate, bTruncate)) {
2699     val = bTruncate;
2700     return TRUE;
2701   }
2702   return FALSE;
2703 }
GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT & val)2704 FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT& val) {
2705   CXFA_Node* pUIChild = GetUIChild();
2706   CFX_WideString wsWideNarrowRatio;
2707   if (pUIChild->TryCData(XFA_ATTRIBUTE_WideNarrowRatio, wsWideNarrowRatio)) {
2708     FX_STRSIZE ptPos = wsWideNarrowRatio.Find(':');
2709     FX_FLOAT fRatio = 0;
2710     if (ptPos >= 0) {
2711       fRatio = (FX_FLOAT)FXSYS_wtoi(wsWideNarrowRatio);
2712     } else {
2713       int32_t fA, fB;
2714       fA = FXSYS_wtoi(wsWideNarrowRatio.Left(ptPos));
2715       fB = FXSYS_wtoi(wsWideNarrowRatio.Mid(ptPos + 1));
2716       if (fB) {
2717         fRatio = (FX_FLOAT)fA / fB;
2718       }
2719     }
2720     val = fRatio;
2721     return TRUE;
2722   }
2723   return FALSE;
2724 }
GetPasswordChar(CFX_WideString & wsPassWord)2725 void CXFA_WidgetData::GetPasswordChar(CFX_WideString& wsPassWord) {
2726   CXFA_Node* pUIChild = GetUIChild();
2727   if (pUIChild) {
2728     pUIChild->TryCData(XFA_ATTRIBUTE_PasswordChar, wsPassWord);
2729   } else {
2730     wsPassWord = XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT_PasswordEdit,
2731                                                     XFA_ATTRIBUTE_PasswordChar,
2732                                                     XFA_XDPPACKET_Form);
2733   }
2734 }
IsAllowRichText()2735 FX_BOOL CXFA_WidgetData::IsAllowRichText() {
2736   CXFA_Node* pUIChild = GetUIChild();
2737   FX_BOOL bValue = FALSE;
2738   if (pUIChild &&
2739       pUIChild->TryBoolean(XFA_ATTRIBUTE_AllowRichText, bValue, FALSE)) {
2740     return bValue;
2741   }
2742   if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
2743     if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
2744       return pChild->GetClassID() == XFA_ELEMENT_ExData;
2745     }
2746   }
2747   return FALSE;
2748 }
IsMultiLine()2749 FX_BOOL CXFA_WidgetData::IsMultiLine() {
2750   CXFA_Node* pUIChild = GetUIChild();
2751   if (pUIChild) {
2752     return pUIChild->GetBoolean(XFA_ATTRIBUTE_MultiLine);
2753   }
2754   return XFA_GetAttributeDefaultValue_Boolean(
2755       XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_MultiLine, XFA_XDPPACKET_Form);
2756 }
GetVerticalScrollPolicy()2757 int32_t CXFA_WidgetData::GetVerticalScrollPolicy() {
2758   CXFA_Node* pUIChild = GetUIChild();
2759   if (pUIChild) {
2760     return pUIChild->GetEnum(XFA_ATTRIBUTE_VScrollPolicy);
2761   }
2762   return XFA_GetAttributeDefaultValue_Enum(
2763       XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_VScrollPolicy, XFA_XDPPACKET_Form);
2764 }
GetMaxChars(XFA_ELEMENT & eType)2765 int32_t CXFA_WidgetData::GetMaxChars(XFA_ELEMENT& eType) {
2766   if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
2767     if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
2768       switch (pChild->GetClassID()) {
2769         case XFA_ELEMENT_Text:
2770           eType = XFA_ELEMENT_Text;
2771           return pChild->GetInteger(XFA_ATTRIBUTE_MaxChars);
2772         case XFA_ELEMENT_ExData: {
2773           eType = XFA_ELEMENT_ExData;
2774           int32_t iMax = pChild->GetInteger(XFA_ATTRIBUTE_MaxLength);
2775           return iMax < 0 ? 0 : iMax;
2776         }
2777         default:
2778           break;
2779       }
2780     }
2781   }
2782   return 0;
2783 }
GetFracDigits(int32_t & iFracDigits)2784 FX_BOOL CXFA_WidgetData::GetFracDigits(int32_t& iFracDigits) {
2785   if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
2786     if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) {
2787       return pChild->TryInteger(XFA_ATTRIBUTE_FracDigits, iFracDigits);
2788     }
2789   }
2790   iFracDigits = -1;
2791   return FALSE;
2792 }
GetLeadDigits(int32_t & iLeadDigits)2793 FX_BOOL CXFA_WidgetData::GetLeadDigits(int32_t& iLeadDigits) {
2794   if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
2795     if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) {
2796       return pChild->TryInteger(XFA_ATTRIBUTE_LeadDigits, iLeadDigits);
2797     }
2798   }
2799   iLeadDigits = -1;
2800   return FALSE;
2801 }
XFA_NumericLimit(const CFX_WideString & wsValue,int32_t iLead,int32_t iTread)2802 CFX_WideString XFA_NumericLimit(const CFX_WideString& wsValue,
2803                                 int32_t iLead,
2804                                 int32_t iTread) {
2805   if ((iLead == -1) && (iTread == -1)) {
2806     return wsValue;
2807   }
2808   CFX_WideString wsRet;
2809   int32_t iLead_ = 0, iTread_ = -1;
2810   int32_t iCount = wsValue.GetLength();
2811   if (iCount == 0) {
2812     return wsValue;
2813   }
2814   int32_t i = 0;
2815   if (wsValue[i] == L'-') {
2816     wsRet += L'-';
2817     i++;
2818   }
2819   for (; i < iCount; i++) {
2820     FX_WCHAR wc = wsValue[i];
2821     if (XFA_IsDigit(wc)) {
2822       if (iLead >= 0) {
2823         iLead_++;
2824         if (iLead_ > iLead) {
2825           return L"0";
2826         }
2827       } else if (iTread_ >= 0) {
2828         iTread_++;
2829         if (iTread_ > iTread) {
2830           if (iTread != -1) {
2831             CFX_Decimal wsDeci = CFX_Decimal(wsValue);
2832             wsDeci.SetScale(iTread);
2833             wsRet = wsDeci;
2834           }
2835           return wsRet;
2836         }
2837       }
2838     } else if (wc == L'.') {
2839       iTread_ = 0;
2840       iLead = -1;
2841     }
2842     wsRet += wc;
2843   }
2844   return wsRet;
2845 }
SetValue(const CFX_WideString & wsValue,XFA_VALUEPICTURE eValueType)2846 FX_BOOL CXFA_WidgetData::SetValue(const CFX_WideString& wsValue,
2847                                   XFA_VALUEPICTURE eValueType) {
2848   if (wsValue.IsEmpty()) {
2849     SyncValue(wsValue, TRUE);
2850     return TRUE;
2851   }
2852   this->m_bPreNull = this->m_bIsNull;
2853   this->m_bIsNull = FALSE;
2854   CFX_WideString wsNewText(wsValue);
2855   CFX_WideString wsPicture;
2856   GetPictureContent(wsPicture, eValueType);
2857   FX_BOOL bValidate = TRUE;
2858   FX_BOOL bSyncData = FALSE;
2859   CXFA_Node* pNode = GetUIChild();
2860   if (!pNode) {
2861     return TRUE;
2862   }
2863   XFA_ELEMENT uiType = pNode->GetClassID();
2864   if (!wsPicture.IsEmpty()) {
2865     CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
2866     IFX_Locale* pLocale = GetLocal();
2867     CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
2868     bValidate =
2869         widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture);
2870     if (bValidate) {
2871       widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNewText,
2872                                      wsPicture, pLocale, pLocalMgr);
2873       wsNewText = widgetValue.GetValue();
2874       if (uiType == XFA_ELEMENT_NumericEdit) {
2875         int32_t iLeadDigits = 0;
2876         int32_t iFracDigits = 0;
2877         GetLeadDigits(iLeadDigits);
2878         GetFracDigits(iFracDigits);
2879         wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
2880       }
2881       bSyncData = TRUE;
2882     }
2883   } else {
2884     if (uiType == XFA_ELEMENT_NumericEdit) {
2885       if (wsNewText != FX_WSTRC(L"0")) {
2886         int32_t iLeadDigits = 0;
2887         int32_t iFracDigits = 0;
2888         GetLeadDigits(iLeadDigits);
2889         GetFracDigits(iFracDigits);
2890         wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
2891       }
2892       bSyncData = TRUE;
2893     }
2894   }
2895   if (uiType != XFA_ELEMENT_NumericEdit || bSyncData) {
2896     SyncValue(wsNewText, TRUE);
2897   }
2898   return bValidate;
2899 }
GetPictureContent(CFX_WideString & wsPicture,XFA_VALUEPICTURE ePicture)2900 FX_BOOL CXFA_WidgetData::GetPictureContent(CFX_WideString& wsPicture,
2901                                            XFA_VALUEPICTURE ePicture) {
2902   if (ePicture == XFA_VALUEPICTURE_Raw) {
2903     return FALSE;
2904   }
2905   CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
2906   switch (ePicture) {
2907     case XFA_VALUEPICTURE_Display: {
2908       if (CXFA_Node* pFormat = m_pNode->GetChild(0, XFA_ELEMENT_Format)) {
2909         if (CXFA_Node* pPicture = pFormat->GetChild(0, XFA_ELEMENT_Picture)) {
2910           if (pPicture->TryContent(wsPicture)) {
2911             return TRUE;
2912           }
2913         }
2914       }
2915       CFX_WideString wsDataPicture, wsTimePicture;
2916       IFX_Locale* pLocale = GetLocal();
2917       if (!pLocale) {
2918         return FALSE;
2919       }
2920       FX_DWORD dwType = widgetValue.GetType();
2921       switch (dwType) {
2922         case XFA_VT_DATE:
2923           pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
2924                                   wsPicture);
2925           break;
2926         case XFA_VT_TIME:
2927           pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
2928                                   wsPicture);
2929           break;
2930         case XFA_VT_DATETIME:
2931           pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
2932                                   wsDataPicture);
2933           pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
2934                                   wsTimePicture);
2935           wsPicture = wsDataPicture + FX_WSTRC(L"T") + wsTimePicture;
2936           break;
2937         case XFA_VT_DECIMAL:
2938         case XFA_VT_FLOAT:
2939           break;
2940         default:
2941           break;
2942       }
2943     }
2944       return TRUE;
2945     case XFA_VALUEPICTURE_Edit: {
2946       CXFA_Node* pUI = m_pNode->GetChild(0, XFA_ELEMENT_Ui);
2947       if (pUI) {
2948         if (CXFA_Node* pPicture = pUI->GetChild(0, XFA_ELEMENT_Picture)) {
2949           if (pPicture->TryContent(wsPicture)) {
2950             return TRUE;
2951           }
2952         }
2953       }
2954       {
2955         CFX_WideString wsDataPicture, wsTimePicture;
2956         IFX_Locale* pLocale = GetLocal();
2957         if (!pLocale) {
2958           return FALSE;
2959         }
2960         FX_DWORD dwType = widgetValue.GetType();
2961         switch (dwType) {
2962           case XFA_VT_DATE:
2963             pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
2964                                     wsPicture);
2965             break;
2966           case XFA_VT_TIME:
2967             pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
2968                                     wsPicture);
2969             break;
2970           case XFA_VT_DATETIME:
2971             pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
2972                                     wsDataPicture);
2973             pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
2974                                     wsTimePicture);
2975             wsPicture = wsDataPicture + L"T" + wsTimePicture;
2976             break;
2977           default:
2978             break;
2979         }
2980       }
2981     }
2982       return TRUE;
2983     case XFA_VALUEPICTURE_DataBind: {
2984       if (CXFA_Bind bind = GetBind()) {
2985         bind.GetPicture(wsPicture);
2986         return TRUE;
2987       }
2988     } break;
2989     default:
2990       break;
2991   }
2992   return FALSE;
2993 }
GetLocal()2994 IFX_Locale* CXFA_WidgetData::GetLocal() {
2995   IFX_Locale* pLocale = NULL;
2996   if (!m_pNode) {
2997     return pLocale;
2998   }
2999   FX_BOOL bLocale = FALSE;
3000   CFX_WideString wsLocaleName;
3001   bLocale = m_pNode->GetLocaleName(wsLocaleName);
3002   if (bLocale) {
3003     if (wsLocaleName.Equal(FX_WSTRC(L"ambient"))) {
3004       pLocale = m_pNode->GetDocument()->GetLocalMgr()->GetDefLocale();
3005     } else {
3006       pLocale =
3007           m_pNode->GetDocument()->GetLocalMgr()->GetLocaleByName(wsLocaleName);
3008     }
3009   }
3010   return pLocale;
3011 }
XFA_SplitDateTime(const CFX_WideString & wsDateTime,CFX_WideString & wsDate,CFX_WideString & wsTime)3012 static FX_BOOL XFA_SplitDateTime(const CFX_WideString& wsDateTime,
3013                                  CFX_WideString& wsDate,
3014                                  CFX_WideString& wsTime) {
3015   wsDate = L"";
3016   wsTime = L"";
3017   if (wsDateTime.IsEmpty()) {
3018     return FALSE;
3019   }
3020   int nSplitIndex = -1;
3021   nSplitIndex = wsDateTime.Find('T');
3022   if (nSplitIndex < 0) {
3023     nSplitIndex = wsDateTime.Find(' ');
3024   }
3025   if (nSplitIndex < 0) {
3026     return FALSE;
3027   }
3028   wsDate = wsDateTime.Left(nSplitIndex);
3029   if (!wsDate.IsEmpty()) {
3030     int32_t iCount = wsDate.GetLength();
3031     int32_t i = 0;
3032     for (i = 0; i < iCount; i++) {
3033       if (wsDate[i] >= '0' && wsDate[i] <= '9') {
3034         break;
3035       }
3036     }
3037     if (i == iCount) {
3038       return FALSE;
3039     }
3040   }
3041   wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
3042   if (!wsTime.IsEmpty()) {
3043     int32_t iCount = wsTime.GetLength();
3044     int32_t i = 0;
3045     for (i = 0; i < iCount; i++) {
3046       if (wsTime[i] >= '0' && wsTime[i] <= '9') {
3047         break;
3048       }
3049     }
3050     if (i == iCount) {
3051       return FALSE;
3052     }
3053   }
3054   return TRUE;
3055 }
3056 #ifndef XFA_PARSE_HAS_LINEIDENTIFIER
CXFA_FieldNode_IsRichTextEdit(CXFA_Node * pFieldNode,IFDE_XMLNode * & pXMLNode)3057 FX_BOOL CXFA_FieldNode_IsRichTextEdit(CXFA_Node* pFieldNode,
3058                                       IFDE_XMLNode*& pXMLNode) {
3059   FX_BOOL bRichTextEdit = FALSE;
3060   pXMLNode = NULL;
3061   if (pFieldNode->GetClassID() == XFA_ELEMENT_Field) {
3062     CXFA_Node* pValue = pFieldNode->GetChild(0, XFA_ELEMENT_Value);
3063     if (!pValue) {
3064       return bRichTextEdit;
3065     }
3066     CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
3067     if (!pChildValue) {
3068       return bRichTextEdit;
3069     }
3070     if (pChildValue->GetClassID() == XFA_ELEMENT_ExData) {
3071       CFX_WideString wsContentType;
3072       pChildValue->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType,
3073                                 FALSE);
3074       bRichTextEdit = wsContentType.Equal(FX_WSTRC(L"text/html"));
3075       if (bRichTextEdit) {
3076         FX_BOOL bXMLInData = FALSE;
3077         CXFA_Node* pDataNode = pFieldNode->GetBindData();
3078         if (pDataNode) {
3079           IFDE_XMLNode* pBindXML = pDataNode->GetXMLMappingNode();
3080           FXSYS_assert(pBindXML);
3081           IFDE_XMLNode* pValueXML =
3082               pBindXML->GetNodeItem(IFDE_XMLNode::FirstChild);
3083           if (pValueXML && pValueXML->GetType() == FDE_XMLNODE_Element) {
3084             pXMLNode = pValueXML;
3085             bXMLInData = TRUE;
3086           }
3087         }
3088         if (!bXMLInData) {
3089           pXMLNode = pChildValue->GetXMLMappingNode();
3090         }
3091       }
3092     }
3093   }
3094   return bRichTextEdit;
3095 }
3096 #endif
GetValue(CFX_WideString & wsValue,XFA_VALUEPICTURE eValueType)3097 FX_BOOL CXFA_WidgetData::GetValue(CFX_WideString& wsValue,
3098                                   XFA_VALUEPICTURE eValueType) {
3099 #ifdef XFA_PARSE_HAS_LINEIDENTIFIER
3100   wsValue = m_pNode->GetContent();
3101 #else
3102   IFDE_XMLNode* pXMLNode = NULL;
3103   FX_BOOL bRichTextEdit = CXFA_FieldNode_IsRichTextEdit(m_pNode, pXMLNode);
3104   if (bRichTextEdit) {
3105     XFA_GetPlainTextFromRichText(pXMLNode, wsValue);
3106   } else {
3107     wsValue = m_pNode->GetContent();
3108   }
3109 #endif
3110   if (eValueType == XFA_VALUEPICTURE_Display) {
3111     GetItemLabel(wsValue, wsValue);
3112   }
3113   CFX_WideString wsPicture;
3114   GetPictureContent(wsPicture, eValueType);
3115   CXFA_Node* pNode = GetUIChild();
3116   if (!pNode) {
3117     return TRUE;
3118   }
3119   XFA_ELEMENT uiType = GetUIChild()->GetClassID();
3120   switch (uiType) {
3121     case XFA_ELEMENT_ChoiceList: {
3122       if (eValueType == XFA_VALUEPICTURE_Display) {
3123         int32_t iSelItemIndex = GetSelectedItem(0);
3124         if (iSelItemIndex >= 0) {
3125           GetChoiceListItem(wsValue, iSelItemIndex);
3126           wsPicture.Empty();
3127         }
3128       }
3129     } break;
3130     case XFA_ELEMENT_NumericEdit:
3131       if (eValueType != XFA_VALUEPICTURE_Raw && wsPicture.IsEmpty()) {
3132         IFX_Locale* pLocale = GetLocal();
3133         if (eValueType == XFA_VALUEPICTURE_Display && pLocale) {
3134           CFX_WideString wsOutput;
3135           NormalizeNumStr(wsValue, wsOutput);
3136           FormatNumStr(wsOutput, pLocale, wsOutput);
3137           wsValue = wsOutput;
3138         }
3139       }
3140       break;
3141     default:
3142       break;
3143   }
3144   if (wsPicture.IsEmpty()) {
3145     return TRUE;
3146   }
3147   if (IFX_Locale* pLocale = GetLocal()) {
3148     CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
3149     CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
3150     switch (widgetValue.GetType()) {
3151       case XFA_VT_DATE: {
3152         CFX_WideString wsDate, wsTime;
3153         if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
3154           CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
3155           if (date.FormatPatterns(wsValue, wsPicture, pLocale, eValueType)) {
3156             return TRUE;
3157           }
3158         }
3159         break;
3160       }
3161       case XFA_VT_TIME: {
3162         CFX_WideString wsDate, wsTime;
3163         if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
3164           CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
3165           if (time.FormatPatterns(wsValue, wsPicture, pLocale, eValueType)) {
3166             return TRUE;
3167           }
3168         }
3169         break;
3170       }
3171       default:
3172         break;
3173     }
3174     widgetValue.FormatPatterns(wsValue, wsPicture, pLocale, eValueType);
3175   }
3176   return TRUE;
3177 }
GetNormalizeDataValue(const CFX_WideStringC & wsValue,CFX_WideString & wsNormalizeValue)3178 FX_BOOL CXFA_WidgetData::GetNormalizeDataValue(
3179     const CFX_WideStringC& wsValue,
3180     CFX_WideString& wsNormalizeValue) {
3181   wsNormalizeValue = wsValue;
3182   if (wsValue.IsEmpty()) {
3183     return TRUE;
3184   }
3185   CFX_WideString wsPicture;
3186   GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
3187   if (wsPicture.IsEmpty()) {
3188     return TRUE;
3189   }
3190   FXSYS_assert(GetNode());
3191   CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
3192   IFX_Locale* pLocale = GetLocal();
3193   CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
3194   if (widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture)) {
3195     widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNormalizeValue,
3196                                    wsPicture, pLocale, pLocalMgr);
3197     wsNormalizeValue = widgetValue.GetValue();
3198     return TRUE;
3199   }
3200   return FALSE;
3201 }
GetFormatDataValue(const CFX_WideStringC & wsValue,CFX_WideString & wsFormatedValue)3202 FX_BOOL CXFA_WidgetData::GetFormatDataValue(const CFX_WideStringC& wsValue,
3203                                             CFX_WideString& wsFormatedValue) {
3204   wsFormatedValue = wsValue;
3205   if (wsValue.IsEmpty()) {
3206     return TRUE;
3207   }
3208   CFX_WideString wsPicture;
3209   GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
3210   if (wsPicture.IsEmpty()) {
3211     return TRUE;
3212   }
3213   if (IFX_Locale* pLocale = GetLocal()) {
3214     FXSYS_assert(GetNode());
3215     CXFA_Node* pNodeValue = GetNode()->GetChild(0, XFA_ELEMENT_Value);
3216     if (!pNodeValue) {
3217       return FALSE;
3218     }
3219     CXFA_Node* pValueChild = pNodeValue->GetNodeItem(XFA_NODEITEM_FirstChild);
3220     if (!pValueChild) {
3221       return FALSE;
3222     }
3223     int32_t iVTType = XFA_VT_NULL;
3224     XFA_ELEMENT eType = pValueChild->GetClassID();
3225     switch (eType) {
3226       case XFA_ELEMENT_Decimal:
3227         iVTType = XFA_VT_DECIMAL;
3228         break;
3229       case XFA_ELEMENT_Float:
3230         iVTType = XFA_VT_FLOAT;
3231         break;
3232       case XFA_ELEMENT_Date:
3233         iVTType = XFA_VT_DATE;
3234         break;
3235       case XFA_ELEMENT_Time:
3236         iVTType = XFA_VT_TIME;
3237         break;
3238       case XFA_ELEMENT_DateTime:
3239         iVTType = XFA_VT_DATETIME;
3240         break;
3241       case XFA_ELEMENT_Boolean:
3242         iVTType = XFA_VT_BOOLEAN;
3243         break;
3244       case XFA_ELEMENT_Integer:
3245         iVTType = XFA_VT_INTEGER;
3246         break;
3247       case XFA_ELEMENT_Text:
3248         iVTType = XFA_VT_TEXT;
3249         break;
3250       default:
3251         iVTType = XFA_VT_NULL;
3252         break;
3253     }
3254     CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
3255     CXFA_LocaleValue widgetValue(iVTType, wsValue, pLocalMgr);
3256     switch (widgetValue.GetType()) {
3257       case XFA_VT_DATE: {
3258         CFX_WideString wsDate, wsTime;
3259         if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
3260           CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
3261           if (date.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
3262                                   XFA_VALUEPICTURE_DataBind)) {
3263             return TRUE;
3264           }
3265         }
3266         break;
3267       }
3268       case XFA_VT_TIME: {
3269         CFX_WideString wsDate, wsTime;
3270         if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
3271           CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
3272           if (time.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
3273                                   XFA_VALUEPICTURE_DataBind)) {
3274             return TRUE;
3275           }
3276         }
3277         break;
3278       }
3279       default:
3280         break;
3281     }
3282     widgetValue.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
3283                                XFA_VALUEPICTURE_DataBind);
3284   }
3285   return FALSE;
3286 }
NormalizeNumStr(const CFX_WideString & wsValue,CFX_WideString & wsOutput)3287 void CXFA_WidgetData::NormalizeNumStr(const CFX_WideString& wsValue,
3288                                       CFX_WideString& wsOutput) {
3289   if (wsValue.IsEmpty()) {
3290     return;
3291   }
3292   wsOutput = wsValue;
3293   wsOutput.TrimLeft('0');
3294   int32_t dot_index = wsOutput.Find('.');
3295   int32_t iFracDigits = 0;
3296   if (!wsOutput.IsEmpty() && dot_index >= 0 &&
3297       (!GetFracDigits(iFracDigits) || iFracDigits != -1)) {
3298     wsOutput.TrimRight(L"0");
3299     wsOutput.TrimRight(L".");
3300   }
3301   if (wsOutput.IsEmpty() || wsOutput[0] == '.') {
3302     wsOutput.Insert(0, '0');
3303   }
3304 }
FormatNumStr(const CFX_WideString & wsValue,IFX_Locale * pLocale,CFX_WideString & wsOutput)3305 void CXFA_WidgetData::FormatNumStr(const CFX_WideString& wsValue,
3306                                    IFX_Locale* pLocale,
3307                                    CFX_WideString& wsOutput) {
3308   if (wsValue.IsEmpty()) {
3309     return;
3310   }
3311   CFX_WideString wsSrcNum = wsValue;
3312   CFX_WideString wsGroupSymbol;
3313   pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
3314   FX_BOOL bNeg = FALSE;
3315   if (wsSrcNum[0] == '-') {
3316     bNeg = TRUE;
3317     wsSrcNum.Delete(0, 1);
3318   }
3319   int32_t len = wsSrcNum.GetLength();
3320   int32_t dot_index = wsSrcNum.Find('.');
3321   if (dot_index == -1) {
3322     dot_index = len;
3323   }
3324   int32_t cc = dot_index - 1;
3325   if (cc >= 0) {
3326     int nPos = dot_index % 3;
3327     wsOutput.Empty();
3328     for (int32_t i = 0; i < dot_index; i++) {
3329       if (i % 3 == nPos && i != 0) {
3330         wsOutput += wsGroupSymbol;
3331       }
3332       wsOutput += wsSrcNum[i];
3333     }
3334     if (dot_index < len) {
3335       CFX_WideString wsSymbol;
3336       pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
3337       wsOutput += wsSymbol;
3338       wsOutput += wsSrcNum.Right(len - dot_index - 1);
3339     }
3340     if (bNeg) {
3341       CFX_WideString wsMinusymbol;
3342       pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
3343       wsOutput = wsMinusymbol + wsOutput;
3344     }
3345   }
3346 }
SyncValue(const CFX_WideString & wsValue,FX_BOOL bNotify)3347 void CXFA_WidgetData::SyncValue(const CFX_WideString& wsValue,
3348                                 FX_BOOL bNotify) {
3349   if (!m_pNode) {
3350     return;
3351   }
3352   CFX_WideString wsFormatValue(wsValue);
3353   CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
3354   if (pContainerWidgetData) {
3355     pContainerWidgetData->GetFormatDataValue(wsValue, wsFormatValue);
3356   }
3357   m_pNode->SetContent(wsValue, wsFormatValue, bNotify);
3358 }
InsertListTextItem(CXFA_Node * pItems,const CFX_WideStringC & wsText,int32_t nIndex)3359 void CXFA_WidgetData::InsertListTextItem(CXFA_Node* pItems,
3360                                          const CFX_WideStringC& wsText,
3361                                          int32_t nIndex) {
3362   CXFA_Node* pText = pItems->CreateSamePacketNode(XFA_ELEMENT_Text);
3363   pItems->InsertChild(nIndex, pText);
3364   pText->SetContent(wsText, wsText, FALSE, FALSE, FALSE);
3365 }
GetFilter(FX_BOOL bModified)3366 CXFA_Filter CXFA_WidgetData::GetFilter(FX_BOOL bModified) {
3367   if (!m_pUiChildNode) {
3368     return CXFA_Filter(NULL);
3369   }
3370   return m_pUiChildNode->GetProperty(0, XFA_ELEMENT_Filter, bModified);
3371 }
GetManifest(FX_BOOL bModified)3372 CXFA_Manifest CXFA_WidgetData::GetManifest(FX_BOOL bModified) {
3373   if (!m_pUiChildNode) {
3374     return CXFA_Manifest(NULL);
3375   }
3376   return m_pUiChildNode->GetProperty(0, XFA_ELEMENT_Manifest, bModified);
3377 }
CXFA_Occur(CXFA_Node * pNode)3378 CXFA_Occur::CXFA_Occur(CXFA_Node* pNode) : CXFA_Data(pNode) {}
GetMax()3379 int32_t CXFA_Occur::GetMax() {
3380   int32_t iMax = 1;
3381   if (m_pNode) {
3382     if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, TRUE)) {
3383       iMax = GetMin();
3384     }
3385   }
3386   return iMax;
3387 }
GetMin()3388 int32_t CXFA_Occur::GetMin() {
3389   int32_t iMin = 1;
3390   if (m_pNode) {
3391     if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, TRUE) || iMin < 0) {
3392       iMin = 1;
3393     }
3394   }
3395   return iMin;
3396 }
GetInitial()3397 int32_t CXFA_Occur::GetInitial() {
3398   int32_t iInit = 1;
3399   if (m_pNode) {
3400     int32_t iMin = GetMin();
3401     if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, TRUE) ||
3402         iInit < iMin) {
3403       iInit = iMin;
3404     }
3405   }
3406   return iInit;
3407 }
GetOccurInfo(int32_t & iMin,int32_t & iMax,int32_t & iInit)3408 FX_BOOL CXFA_Occur::GetOccurInfo(int32_t& iMin, int32_t& iMax, int32_t& iInit) {
3409   if (!m_pNode) {
3410     return FALSE;
3411   }
3412   if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE) || iMin < 0) {
3413     iMin = 1;
3414   }
3415   if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) {
3416     if (iMin == 0) {
3417       iMax = 1;
3418     } else {
3419       iMax = iMin;
3420     }
3421   }
3422   if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, FALSE) ||
3423       iInit < iMin) {
3424     iInit = iMin;
3425   }
3426   return TRUE;
3427 }
SetMax(int32_t iMax)3428 void CXFA_Occur::SetMax(int32_t iMax) {
3429   iMax = (iMax != -1 && iMax < 1) ? 1 : iMax;
3430   m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
3431   int32_t iMin = GetMin();
3432   if (iMax != -1 && iMax < iMin) {
3433     iMin = iMax;
3434     m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
3435   }
3436 }
SetMin(int32_t iMin)3437 void CXFA_Occur::SetMin(int32_t iMin) {
3438   iMin = (iMin < 0) ? 1 : iMin;
3439   m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
3440   int32_t iMax = GetMax();
3441   if (iMax > 0 && iMax < iMin) {
3442     iMax = iMin;
3443     m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
3444   }
3445 }
XFA_GetEnumTypeAttribute(CXFA_Node * pNode,XFA_ATTRIBUTE attributeValue=XFA_ATTRIBUTE_Type,XFA_ATTRIBUTEENUM eDefaultValue=XFA_ATTRIBUTEENUM_Optional)3446 XFA_ATTRIBUTEENUM XFA_GetEnumTypeAttribute(
3447     CXFA_Node* pNode,
3448     XFA_ATTRIBUTE attributeValue = XFA_ATTRIBUTE_Type,
3449     XFA_ATTRIBUTEENUM eDefaultValue = XFA_ATTRIBUTEENUM_Optional) {
3450   XFA_ATTRIBUTEENUM eType = eDefaultValue;
3451   if (pNode) {
3452     if (!pNode->TryEnum(attributeValue, eType, TRUE)) {
3453       eType = eDefaultValue;
3454     }
3455   }
3456   return eType;
3457 }
GetFilterString(XFA_ATTRIBUTE eAttribute)3458 CFX_WideString CXFA_Filter::GetFilterString(XFA_ATTRIBUTE eAttribute) {
3459   CFX_WideString wsStringValue;
3460   if (m_pNode) {
3461     m_pNode->GetAttribute(eAttribute, wsStringValue, FALSE);
3462   }
3463   return wsStringValue;
3464 }
GetAppearanceFilterType()3465 XFA_ATTRIBUTEENUM CXFA_Filter::GetAppearanceFilterType() {
3466   if (!m_pNode) {
3467     return XFA_ATTRIBUTEENUM_Optional;
3468   }
3469   CXFA_Node* pAppearanceFilterNode =
3470       m_pNode->GetProperty(0, XFA_ELEMENT_AppearanceFilter);
3471   return XFA_GetEnumTypeAttribute(pAppearanceFilterNode);
3472 }
GetAppearanceFilterContent()3473 CFX_WideString CXFA_Filter::GetAppearanceFilterContent() {
3474   CFX_WideString wsContent;
3475   if (m_pNode) {
3476     CXFA_Node* pAppearanceFilterNode =
3477         m_pNode->GetProperty(0, XFA_ELEMENT_AppearanceFilter);
3478     pAppearanceFilterNode->TryContent(wsContent);
3479   }
3480   return wsContent;
3481 }
GetCertificatesCredentialServerPolicy()3482 XFA_ATTRIBUTEENUM CXFA_Filter::GetCertificatesCredentialServerPolicy() {
3483   if (!m_pNode) {
3484     return XFA_ATTRIBUTEENUM_Optional;
3485   }
3486   CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
3487   return XFA_GetEnumTypeAttribute(pCertsNode,
3488                                   XFA_ATTRIBUTE_CredentialServerPolicy);
3489 }
GetCertificatesURL()3490 CFX_WideString CXFA_Filter::GetCertificatesURL() {
3491   CFX_WideString wsURL;
3492   if (m_pNode) {
3493     CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
3494     pCertsNode->GetAttribute(XFA_ATTRIBUTE_Url, wsURL, FALSE);
3495   }
3496   return wsURL;
3497 }
GetCertificatesURLPolicy()3498 CFX_WideString CXFA_Filter::GetCertificatesURLPolicy() {
3499   CFX_WideString wsURLPolicy;
3500   if (m_pNode) {
3501     CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
3502     pCertsNode->GetAttribute(XFA_ATTRIBUTE_UrlPolicy, wsURLPolicy, FALSE);
3503   }
3504   return wsURLPolicy;
3505 }
GetCertificatesEncryption(FX_BOOL bModified)3506 CXFA_WrapCertificate CXFA_Filter::GetCertificatesEncryption(FX_BOOL bModified) {
3507   if (!m_pNode) {
3508     return CXFA_WrapCertificate(NULL);
3509   }
3510   CXFA_Node* pCertsNode =
3511       m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified);
3512   return CXFA_WrapCertificate(
3513       pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Encryption, bModified)
3514                  : NULL);
3515 }
GetCertificatesIssuers(FX_BOOL bModified)3516 CXFA_WrapCertificate CXFA_Filter::GetCertificatesIssuers(FX_BOOL bModified) {
3517   if (!m_pNode) {
3518     return CXFA_WrapCertificate(NULL);
3519   }
3520   CXFA_Node* pCertsNode =
3521       m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified);
3522   return CXFA_WrapCertificate(
3523       pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Issuers, bModified)
3524                  : NULL);
3525 }
GetCertificatesKeyUsageString(XFA_ATTRIBUTE eAttribute)3526 CFX_WideString CXFA_Filter::GetCertificatesKeyUsageString(
3527     XFA_ATTRIBUTE eAttribute) {
3528   if (!m_pNode) {
3529     return FX_WSTRC(L"");
3530   }
3531   CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
3532   CXFA_Node* pKeyUsageNode = pCertsNode->GetProperty(0, XFA_ELEMENT_KeyUsage);
3533   CFX_WideString wsAttributeValue;
3534   pKeyUsageNode->GetAttribute(eAttribute, wsAttributeValue, FALSE);
3535   return wsAttributeValue;
3536 }
GetCertificatesOids()3537 CXFA_Oids CXFA_Filter::GetCertificatesOids() {
3538   if (!m_pNode) {
3539     return CXFA_Oids(NULL);
3540   }
3541   CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
3542   return CXFA_Oids(pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Oids)
3543                               : NULL);
3544 }
GetCertificatesSigning(FX_BOOL bModified)3545 CXFA_WrapCertificate CXFA_Filter::GetCertificatesSigning(FX_BOOL bModified) {
3546   if (!m_pNode) {
3547     return CXFA_WrapCertificate(NULL);
3548   }
3549   CXFA_Node* pCertsNode =
3550       m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified);
3551   return CXFA_WrapCertificate(
3552       pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Signing, bModified)
3553                  : NULL);
3554 }
GetDigestMethods(FX_BOOL bModified)3555 CXFA_DigestMethods CXFA_Filter::GetDigestMethods(FX_BOOL bModified) {
3556   return CXFA_DigestMethods(
3557       m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_DigestMethods, bModified)
3558               : NULL);
3559 }
GetEncodings(FX_BOOL bModified)3560 CXFA_Encodings CXFA_Filter::GetEncodings(FX_BOOL bModified) {
3561   return CXFA_Encodings(
3562       m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_Encodings, bModified)
3563               : NULL);
3564 }
GetEncryptionMethods(FX_BOOL bModified)3565 CXFA_EncryptionMethods CXFA_Filter::GetEncryptionMethods(FX_BOOL bModified) {
3566   return CXFA_EncryptionMethods(
3567       m_pNode
3568           ? m_pNode->GetProperty(0, XFA_ELEMENT_EncryptionMethods, bModified)
3569           : NULL);
3570 }
GetHandlerType()3571 XFA_ATTRIBUTEENUM CXFA_Filter::GetHandlerType() {
3572   if (!m_pNode) {
3573     return XFA_ATTRIBUTEENUM_Optional;
3574   }
3575   CXFA_Node* pHandlerNode = m_pNode->GetProperty(0, XFA_ELEMENT_Handler);
3576   return XFA_GetEnumTypeAttribute(pHandlerNode);
3577 }
GetHandlerContent()3578 CFX_WideString CXFA_Filter::GetHandlerContent() {
3579   CFX_WideString wsContent;
3580   if (m_pNode) {
3581     CXFA_Node* pHandlerNode = m_pNode->GetProperty(0, XFA_ELEMENT_Handler);
3582     pHandlerNode->TryContent(wsContent);
3583   }
3584   return wsContent;
3585 }
GetlockDocumentType()3586 XFA_ATTRIBUTEENUM CXFA_Filter::GetlockDocumentType() {
3587   if (!m_pNode) {
3588     return XFA_ATTRIBUTEENUM_Optional;
3589   }
3590   CXFA_Node* pLockDocNode = m_pNode->GetProperty(0, XFA_ELEMENT_LockDocument);
3591   return XFA_GetEnumTypeAttribute(pLockDocNode);
3592 }
GetlockDocumentContent()3593 CFX_WideString CXFA_Filter::GetlockDocumentContent() {
3594   CFX_WideString wsContent = FX_WSTRC(L"auto");
3595   if (m_pNode) {
3596     CXFA_Node* pLockDocNode = m_pNode->GetProperty(0, XFA_ELEMENT_LockDocument);
3597     pLockDocNode->TryContent(wsContent);
3598   }
3599   return wsContent;
3600 }
GetMDPPermissions()3601 int32_t CXFA_Filter::GetMDPPermissions() {
3602   int32_t iPermissions = 2;
3603   if (m_pNode) {
3604     CXFA_Node* pMDPNode = m_pNode->GetProperty(0, XFA_ELEMENT_Mdp);
3605     if (!pMDPNode->TryInteger(XFA_ATTRIBUTE_Permissions, iPermissions, TRUE)) {
3606       iPermissions = 2;
3607     }
3608   }
3609   return iPermissions;
3610 }
GetMDPSignatureType()3611 XFA_ATTRIBUTEENUM CXFA_Filter::GetMDPSignatureType() {
3612   if (!m_pNode) {
3613     return XFA_ATTRIBUTEENUM_Filter;
3614   }
3615   CXFA_Node* pMDPNode = m_pNode->GetProperty(0, XFA_ELEMENT_Mdp);
3616   return XFA_GetEnumTypeAttribute(pMDPNode, XFA_ATTRIBUTE_SignatureType,
3617                                   XFA_ATTRIBUTEENUM_Filter);
3618 }
GetReasons(FX_BOOL bModified)3619 CXFA_Reasons CXFA_Filter::GetReasons(FX_BOOL bModified) {
3620   return CXFA_Reasons(m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_Reasons)
3621                               : NULL);
3622 }
GetTimeStampServer()3623 CFX_WideString CXFA_Filter::GetTimeStampServer() {
3624   CFX_WideString wsServerURI;
3625   if (m_pNode) {
3626     CXFA_Node* pTimeStampNode = m_pNode->GetProperty(0, XFA_ELEMENT_TimeStamp);
3627     pTimeStampNode->GetAttribute(XFA_ATTRIBUTE_Server, wsServerURI, FALSE);
3628   }
3629   return wsServerURI;
3630 }
GetTimeStampType()3631 XFA_ATTRIBUTEENUM CXFA_Filter::GetTimeStampType() {
3632   if (!m_pNode) {
3633     return XFA_ATTRIBUTEENUM_Optional;
3634   }
3635   CXFA_Node* pTimeStampNode = m_pNode->GetProperty(0, XFA_ELEMENT_TimeStamp);
3636   return XFA_GetEnumTypeAttribute(pTimeStampNode);
3637 }
GetCertificateName()3638 CFX_WideString CXFA_Certificate::GetCertificateName() {
3639   CFX_WideString wsName;
3640   if (m_pNode) {
3641     m_pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
3642   }
3643   return wsName;
3644 }
GetCertificateContent()3645 CFX_WideString CXFA_Certificate::GetCertificateContent() {
3646   CFX_WideString wsContent;
3647   if (m_pNode) {
3648     m_pNode->TryContent(wsContent);
3649   }
3650   return wsContent;
3651 }
GetType()3652 XFA_ATTRIBUTEENUM CXFA_WrapCertificate::GetType() {
3653   return XFA_GetEnumTypeAttribute(m_pNode);
3654 }
CountCertificates()3655 int32_t CXFA_WrapCertificate::CountCertificates() {
3656   return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Certificate) : 0;
3657 }
GetCertificate(int32_t nIndex)3658 CXFA_Certificate CXFA_WrapCertificate::GetCertificate(int32_t nIndex) {
3659   return CXFA_Certificate(
3660       (nIndex > -1 && m_pNode)
3661           ? m_pNode->GetChild(nIndex, XFA_ELEMENT_Certificate)
3662           : NULL);
3663 }
GetOidsType()3664 XFA_ATTRIBUTEENUM CXFA_Oids::GetOidsType() {
3665   return XFA_GetEnumTypeAttribute(m_pNode);
3666 }
CountOids()3667 int32_t CXFA_Oids::CountOids() {
3668   return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Oid) : 0;
3669 }
GetOidContent(int32_t nIndex)3670 CFX_WideString CXFA_Oids::GetOidContent(int32_t nIndex) {
3671   if (nIndex <= -1 || !m_pNode) {
3672     return FX_WSTRC(L"");
3673   }
3674   CXFA_Node* pOidNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Oid);
3675   if (!pOidNode) {
3676     return FX_WSTRC(L"");
3677   }
3678   CFX_WideString wsContent;
3679   pOidNode->TryContent(wsContent);
3680   return wsContent;
3681 }
GetSubjectDNsType()3682 XFA_ATTRIBUTEENUM CXFA_SubjectDNs::GetSubjectDNsType() {
3683   return XFA_GetEnumTypeAttribute(m_pNode);
3684 }
CountSubjectDNs()3685 int32_t CXFA_SubjectDNs::CountSubjectDNs() {
3686   return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_SubjectDN) : 0;
3687 }
GetSubjectDNString(int32_t nIndex,XFA_ATTRIBUTE eAttribute)3688 CFX_WideString CXFA_SubjectDNs::GetSubjectDNString(int32_t nIndex,
3689                                                    XFA_ATTRIBUTE eAttribute) {
3690   if (nIndex <= -1 || !m_pNode) {
3691     return FX_WSTRC(L"");
3692   }
3693   CXFA_Node* pSubjectDNNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_SubjectDN);
3694   if (!pSubjectDNNode) {
3695     return FX_WSTRC(L"");
3696   }
3697   CFX_WideString wsAttributeValue;
3698   pSubjectDNNode->GetAttribute(eAttribute, wsAttributeValue, FALSE);
3699   return wsAttributeValue;
3700 }
GetSubjectDNContent(int32_t nIndex)3701 CFX_WideString CXFA_SubjectDNs::GetSubjectDNContent(int32_t nIndex) {
3702   if (nIndex <= -1 || !m_pNode) {
3703     return FX_WSTRC(L"");
3704   }
3705   CXFA_Node* pSubjectDNNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_SubjectDN);
3706   if (!pSubjectDNNode) {
3707     return FX_WSTRC(L"");
3708   }
3709   CFX_WideString wsContent;
3710   pSubjectDNNode->TryContent(wsContent);
3711   return wsContent;
3712 }
GetDigestMethodsType()3713 XFA_ATTRIBUTEENUM CXFA_DigestMethods::GetDigestMethodsType() {
3714   return XFA_GetEnumTypeAttribute(m_pNode);
3715 }
CountDigestMethods()3716 int32_t CXFA_DigestMethods::CountDigestMethods() {
3717   return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_DigestMethod) : 0;
3718 }
GetDigestMethodContent(int32_t nIndex)3719 CFX_WideString CXFA_DigestMethods::GetDigestMethodContent(int32_t nIndex) {
3720   if (nIndex <= -1 || !m_pNode) {
3721     return FX_WSTRC(L"");
3722   }
3723   CXFA_Node* pDigestMethodNode =
3724       m_pNode->GetChild(nIndex, XFA_ELEMENT_DigestMethod);
3725   if (!pDigestMethodNode) {
3726     return FX_WSTRC(L"");
3727   }
3728   CFX_WideString wsContent;
3729   pDigestMethodNode->TryContent(wsContent);
3730   return wsContent;
3731 }
GetEncodingsType()3732 XFA_ATTRIBUTEENUM CXFA_Encodings::GetEncodingsType() {
3733   return XFA_GetEnumTypeAttribute(m_pNode);
3734 }
CountEncodings()3735 int32_t CXFA_Encodings::CountEncodings() {
3736   return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Encoding) : 0;
3737 }
GetEncodingContent(int32_t nIndex)3738 CFX_WideString CXFA_Encodings::GetEncodingContent(int32_t nIndex) {
3739   if (nIndex <= -1 || !m_pNode) {
3740     return FX_WSTRC(L"");
3741   }
3742   CXFA_Node* pEncodingNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Encoding);
3743   if (!pEncodingNode) {
3744     return FX_WSTRC(L"");
3745   }
3746   CFX_WideString wsContent;
3747   pEncodingNode->TryContent(wsContent);
3748   return wsContent;
3749 }
GetEncryptionMethodsType()3750 XFA_ATTRIBUTEENUM CXFA_EncryptionMethods::GetEncryptionMethodsType() {
3751   return XFA_GetEnumTypeAttribute(m_pNode);
3752 }
CountEncryptionMethods()3753 int32_t CXFA_EncryptionMethods::CountEncryptionMethods() {
3754   return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_EncryptionMethod) : 0;
3755 }
GetEncryptionMethodContent(int32_t nIndex)3756 CFX_WideString CXFA_EncryptionMethods::GetEncryptionMethodContent(
3757     int32_t nIndex) {
3758   if (nIndex <= -1 || !m_pNode) {
3759     return FX_WSTRC(L"");
3760   }
3761   CXFA_Node* pEncryMethodNode =
3762       m_pNode->GetChild(nIndex, XFA_ELEMENT_EncryptionMethod);
3763   if (!pEncryMethodNode) {
3764     return FX_WSTRC(L"");
3765   }
3766   CFX_WideString wsContent;
3767   pEncryMethodNode->TryContent(wsContent);
3768   return wsContent;
3769 }
GetReasonsType()3770 XFA_ATTRIBUTEENUM CXFA_Reasons::GetReasonsType() {
3771   return XFA_GetEnumTypeAttribute(m_pNode);
3772 }
CountReasons()3773 int32_t CXFA_Reasons::CountReasons() {
3774   return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Reason) : 0;
3775 }
GetReasonContent(int32_t nIndex)3776 CFX_WideString CXFA_Reasons::GetReasonContent(int32_t nIndex) {
3777   if (nIndex <= -1 || !m_pNode) {
3778     return FX_WSTRC(L"");
3779   }
3780   CXFA_Node* pReasonNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Reason);
3781   if (!pReasonNode) {
3782     return FX_WSTRC(L"");
3783   }
3784   CFX_WideString wsContent;
3785   pReasonNode->TryContent(wsContent);
3786   return wsContent;
3787 }
GetAction()3788 XFA_ATTRIBUTEENUM CXFA_Manifest::GetAction() {
3789   return XFA_GetEnumTypeAttribute(m_pNode, XFA_ATTRIBUTE_Action,
3790                                   XFA_ATTRIBUTEENUM_Include);
3791 }
CountReives()3792 int32_t CXFA_Manifest::CountReives() {
3793   return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Ref) : 0;
3794 }
GetRefContent(int32_t nIndex)3795 CFX_WideString CXFA_Manifest::GetRefContent(int32_t nIndex) {
3796   if (nIndex <= -1 || !m_pNode) {
3797     return FX_WSTRC(L"");
3798   }
3799   CXFA_Node* pRefNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Ref);
3800   if (!pRefNode) {
3801     return FX_WSTRC(L"");
3802   }
3803   CFX_WideString wsContent;
3804   pRefNode->TryContent(wsContent);
3805   return wsContent;
3806 }
3807