diff --git a/BUILD.gn b/BUILD.gn
index 711ab98..f5c445c 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1466,6 +1466,59 @@
       "xfa/fxfa/fm2js/xfa_program.h",
       "xfa/fxfa/fm2js/xfa_simpleexpression.cpp",
       "xfa/fxfa/fm2js/xfa_simpleexpression.h",
+      "xfa/fxfa/parser/cxfa_arc.h",
+      "xfa/fxfa/parser/cxfa_assist.cpp",
+      "xfa/fxfa/parser/cxfa_assist.h",
+      "xfa/fxfa/parser/cxfa_bind.cpp",
+      "xfa/fxfa/parser/cxfa_bind.h",
+      "xfa/fxfa/parser/cxfa_binditems.cpp",
+      "xfa/fxfa/parser/cxfa_binditems.h",
+      "xfa/fxfa/parser/cxfa_border.h",
+      "xfa/fxfa/parser/cxfa_box.cpp",
+      "xfa/fxfa/parser/cxfa_box.h",
+      "xfa/fxfa/parser/cxfa_calculate.cpp",
+      "xfa/fxfa/parser/cxfa_calculate.h",
+      "xfa/fxfa/parser/cxfa_caption.cpp",
+      "xfa/fxfa/parser/cxfa_caption.h",
+      "xfa/fxfa/parser/cxfa_corner.h",
+      "xfa/fxfa/parser/cxfa_data.cpp",
+      "xfa/fxfa/parser/cxfa_data.h",
+      "xfa/fxfa/parser/cxfa_edge.h",
+      "xfa/fxfa/parser/cxfa_event.cpp",
+      "xfa/fxfa/parser/cxfa_event.h",
+      "xfa/fxfa/parser/cxfa_exdata.cpp",
+      "xfa/fxfa/parser/cxfa_exdata.h",
+      "xfa/fxfa/parser/cxfa_fill.cpp",
+      "xfa/fxfa/parser/cxfa_fill.h",
+      "xfa/fxfa/parser/cxfa_font.cpp",
+      "xfa/fxfa/parser/cxfa_font.h",
+      "xfa/fxfa/parser/cxfa_image.cpp",
+      "xfa/fxfa/parser/cxfa_image.h",
+      "xfa/fxfa/parser/cxfa_line.cpp",
+      "xfa/fxfa/parser/cxfa_line.h",
+      "xfa/fxfa/parser/cxfa_margin.cpp",
+      "xfa/fxfa/parser/cxfa_margin.h",
+      "xfa/fxfa/parser/cxfa_occur.cpp",
+      "xfa/fxfa/parser/cxfa_occur.h",
+      "xfa/fxfa/parser/cxfa_para.cpp",
+      "xfa/fxfa/parser/cxfa_para.h",
+      "xfa/fxfa/parser/cxfa_rectangle.h",
+      "xfa/fxfa/parser/cxfa_script.cpp",
+      "xfa/fxfa/parser/cxfa_script.h",
+      "xfa/fxfa/parser/cxfa_stroke.cpp",
+      "xfa/fxfa/parser/cxfa_stroke.h",
+      "xfa/fxfa/parser/cxfa_submit.cpp",
+      "xfa/fxfa/parser/cxfa_submit.h",
+      "xfa/fxfa/parser/cxfa_text.cpp",
+      "xfa/fxfa/parser/cxfa_text.h",
+      "xfa/fxfa/parser/cxfa_tooltip.cpp",
+      "xfa/fxfa/parser/cxfa_tooltip.h",
+      "xfa/fxfa/parser/cxfa_validate.cpp",
+      "xfa/fxfa/parser/cxfa_validate.h",
+      "xfa/fxfa/parser/cxfa_value.cpp",
+      "xfa/fxfa/parser/cxfa_value.h",
+      "xfa/fxfa/parser/cxfa_widgetdata.cpp",
+      "xfa/fxfa/parser/cxfa_widgetdata.h",
       "xfa/fxfa/parser/xfa_basic_data.cpp",
       "xfa/fxfa/parser/xfa_basic_data.h",
       "xfa/fxfa/parser/xfa_basic_imp.cpp",
@@ -1496,7 +1549,6 @@
       "xfa/fxfa/parser/xfa_localevalue.h",
       "xfa/fxfa/parser/xfa_object.h",
       "xfa/fxfa/parser/xfa_object_imp.cpp",
-      "xfa/fxfa/parser/xfa_objectacc_imp.cpp",
       "xfa/fxfa/parser/xfa_parser.h",
       "xfa/fxfa/parser/xfa_parser_imp.cpp",
       "xfa/fxfa/parser/xfa_parser_imp.h",
@@ -1538,7 +1590,6 @@
       "xfa/fxjse/include/fxjse.h",
       "xfa/include/fxfa/fxfa.h",
       "xfa/include/fxfa/fxfa_basic.h",
-      "xfa/include/fxfa/fxfa_objectacc.h",
       "xfa/include/fxfa/fxfa_widget.h",
       "xfa/include/fxfa/xfa_checksum.h",
       "xfa/include/fxfa/xfa_ffapp.h",
diff --git a/xfa.gyp b/xfa.gyp
index 1d0c828..9d3e578 100644
--- a/xfa.gyp
+++ b/xfa.gyp
@@ -37,7 +37,6 @@
       "sources":[
         "xfa/include/fxfa/fxfa.h",
         "xfa/include/fxfa/fxfa_basic.h",
-        "xfa/include/fxfa/fxfa_objectacc.h",
         "xfa/include/fxfa/fxfa_widget.h",
         "xfa/include/fxfa/xfa_checksum.h",
         "xfa/include/fxfa/xfa_ffapp.h",
@@ -621,6 +620,59 @@
         "xfa/fxfa/fm2js/xfa_program.h",
         "xfa/fxfa/fm2js/xfa_simpleexpression.cpp",
         "xfa/fxfa/fm2js/xfa_simpleexpression.h",
+        "xfa/fxfa/parser/cxfa_arc.h",
+        "xfa/fxfa/parser/cxfa_assist.cpp",
+        "xfa/fxfa/parser/cxfa_assist.h",
+        "xfa/fxfa/parser/cxfa_bind.cpp",
+        "xfa/fxfa/parser/cxfa_bind.h",
+        "xfa/fxfa/parser/cxfa_binditems.cpp",
+        "xfa/fxfa/parser/cxfa_binditems.h",
+        "xfa/fxfa/parser/cxfa_border.h",
+        "xfa/fxfa/parser/cxfa_box.cpp",
+        "xfa/fxfa/parser/cxfa_box.h",
+        "xfa/fxfa/parser/cxfa_calculate.cpp",
+        "xfa/fxfa/parser/cxfa_calculate.h",
+        "xfa/fxfa/parser/cxfa_caption.cpp",
+        "xfa/fxfa/parser/cxfa_caption.h",
+        "xfa/fxfa/parser/cxfa_corner.h",
+        "xfa/fxfa/parser/cxfa_data.cpp",
+        "xfa/fxfa/parser/cxfa_data.h",
+        "xfa/fxfa/parser/cxfa_edge.h",
+        "xfa/fxfa/parser/cxfa_event.cpp",
+        "xfa/fxfa/parser/cxfa_event.h",
+        "xfa/fxfa/parser/cxfa_exdata.cpp",
+        "xfa/fxfa/parser/cxfa_exdata.h",
+        "xfa/fxfa/parser/cxfa_fill.cpp",
+        "xfa/fxfa/parser/cxfa_fill.h",
+        "xfa/fxfa/parser/cxfa_font.cpp",
+        "xfa/fxfa/parser/cxfa_font.h",
+        "xfa/fxfa/parser/cxfa_image.cpp",
+        "xfa/fxfa/parser/cxfa_image.h",
+        "xfa/fxfa/parser/cxfa_line.cpp",
+        "xfa/fxfa/parser/cxfa_line.h",
+        "xfa/fxfa/parser/cxfa_margin.cpp",
+        "xfa/fxfa/parser/cxfa_margin.h",
+        "xfa/fxfa/parser/cxfa_occur.cpp",
+        "xfa/fxfa/parser/cxfa_occur.h",
+        "xfa/fxfa/parser/cxfa_para.cpp",
+        "xfa/fxfa/parser/cxfa_para.h",
+        "xfa/fxfa/parser/cxfa_rectangle.h",
+        "xfa/fxfa/parser/cxfa_script.cpp",
+        "xfa/fxfa/parser/cxfa_script.h",
+        "xfa/fxfa/parser/cxfa_stroke.cpp",
+        "xfa/fxfa/parser/cxfa_stroke.h",
+        "xfa/fxfa/parser/cxfa_submit.cpp",
+        "xfa/fxfa/parser/cxfa_submit.h",
+        "xfa/fxfa/parser/cxfa_text.cpp",
+        "xfa/fxfa/parser/cxfa_text.h",
+        "xfa/fxfa/parser/cxfa_tooltip.cpp",
+        "xfa/fxfa/parser/cxfa_tooltip.h",
+        "xfa/fxfa/parser/cxfa_validate.cpp",
+        "xfa/fxfa/parser/cxfa_validate.h",
+        "xfa/fxfa/parser/cxfa_value.cpp",
+        "xfa/fxfa/parser/cxfa_value.h",
+        "xfa/fxfa/parser/cxfa_widgetdata.cpp",
+        "xfa/fxfa/parser/cxfa_widgetdata.h",
         "xfa/fxfa/parser/xfa_basic_data.cpp",
         "xfa/fxfa/parser/xfa_basic_data.h",
         "xfa/fxfa/parser/xfa_basic_imp.cpp",
@@ -650,7 +702,6 @@
         "xfa/fxfa/parser/xfa_localevalue.cpp",
         "xfa/fxfa/parser/xfa_localevalue.h",
         "xfa/fxfa/parser/xfa_object.h",
-        "xfa/fxfa/parser/xfa_objectacc_imp.cpp",
         "xfa/fxfa/parser/xfa_object_imp.cpp",
         "xfa/fxfa/parser/xfa_parser.h",
         "xfa/fxfa/parser/xfa_parser_imp.cpp",
diff --git a/xfa/fxfa/app/xfa_ffdocview.cpp b/xfa/fxfa/app/xfa_ffdocview.cpp
index c82fd53..dbedbad 100644
--- a/xfa/fxfa/app/xfa_ffdocview.cpp
+++ b/xfa/fxfa/app/xfa_ffdocview.cpp
@@ -24,6 +24,7 @@
 #include "xfa/fxfa/app/xfa_ffwidgetacc.h"
 #include "xfa/fxfa/app/xfa_fwladapter.h"
 #include "xfa/fxfa/app/xfa_textlayout.h"
+#include "xfa/fxfa/parser/cxfa_binditems.h"
 #include "xfa/fxfa/parser/xfa_document_layout_imp.h"
 #include "xfa/fxfa/parser/xfa_script.h"
 #include "xfa/fxfa/parser/xfa_script_imp.h"
diff --git a/xfa/fxfa/app/xfa_ffwidget.cpp b/xfa/fxfa/app/xfa_ffwidget.cpp
index 3a238ad..2b859ab 100644
--- a/xfa/fxfa/app/xfa_ffwidget.cpp
+++ b/xfa/fxfa/app/xfa_ffwidget.cpp
@@ -11,6 +11,7 @@
 #include "core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h"
 #include "core/include/fxcodec/fx_codec.h"
 #include "xfa/fxfa/app/xfa_textlayout.h"
+#include "xfa/fxfa/parser/cxfa_corner.h"
 #include "xfa/fxgraphics/cfx_color.h"
 #include "xfa/fxgraphics/cfx_path.h"
 #include "xfa/fxgraphics/cfx_pattern.h"
diff --git a/xfa/fxfa/parser/cxfa_arc.h b/xfa/fxfa/parser/cxfa_arc.h
new file mode 100644
index 0000000..e712d80
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_arc.h
@@ -0,0 +1,19 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_ARC_H_
+#define XFA_FXFA_PARSER_CXFA_ARC_H_
+
+#include "xfa/fxfa/parser/cxfa_box.h"
+
+class CXFA_Node;
+
+class CXFA_Arc : public CXFA_Box {
+ public:
+  explicit CXFA_Arc(CXFA_Node* pNode) : CXFA_Box(pNode) {}
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_ARC_H_
diff --git a/xfa/fxfa/parser/cxfa_assist.cpp b/xfa/fxfa/parser/cxfa_assist.cpp
new file mode 100644
index 0000000..e19be34
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_assist.cpp
@@ -0,0 +1,15 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_assist.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Assist::CXFA_Assist(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+CXFA_ToolTip CXFA_Assist::GetToolTip() {
+  return CXFA_ToolTip(m_pNode->GetChild(0, XFA_ELEMENT_ToolTip));
+}
diff --git a/xfa/fxfa/parser/cxfa_assist.h b/xfa/fxfa/parser/cxfa_assist.h
new file mode 100644
index 0000000..c583ff5
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_assist.h
@@ -0,0 +1,22 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_ASSIST_H_
+#define XFA_FXFA_PARSER_CXFA_ASSIST_H_
+
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/fxfa/parser/cxfa_tooltip.h"
+
+class CXFA_Node;
+
+class CXFA_Assist : public CXFA_Data {
+ public:
+  explicit CXFA_Assist(CXFA_Node* pNode);
+
+  CXFA_ToolTip GetToolTip();
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_ASSIST_H_
diff --git a/xfa/fxfa/parser/cxfa_bind.cpp b/xfa/fxfa/parser/cxfa_bind.cpp
new file mode 100644
index 0000000..e27a8b1
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_bind.cpp
@@ -0,0 +1,16 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_bind.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Bind::CXFA_Bind(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+void CXFA_Bind::GetPicture(CFX_WideString& wsPicture) {
+  if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture))
+    pPicture->TryContent(wsPicture);
+}
diff --git a/xfa/fxfa/parser/cxfa_bind.h b/xfa/fxfa/parser/cxfa_bind.h
new file mode 100644
index 0000000..2e2954e
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_bind.h
@@ -0,0 +1,22 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_BIND_H_
+#define XFA_FXFA_PARSER_CXFA_BIND_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_Bind : public CXFA_Data {
+ public:
+  explicit CXFA_Bind(CXFA_Node* pNode);
+
+  void GetPicture(CFX_WideString& wsPicture);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_BIND_H_
diff --git a/xfa/fxfa/parser/cxfa_binditems.cpp b/xfa/fxfa/parser/cxfa_binditems.cpp
new file mode 100644
index 0000000..fa691fe
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_binditems.cpp
@@ -0,0 +1,27 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_binditems.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_BindItems::CXFA_BindItems(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+void CXFA_BindItems::GetLabelRef(CFX_WideStringC& wsLabelRef) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef);
+}
+
+void CXFA_BindItems::GetValueRef(CFX_WideStringC& wsValueRef) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_ValueRef, wsValueRef);
+}
+
+void CXFA_BindItems::GetRef(CFX_WideStringC& wsRef) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
+}
+
+FX_BOOL CXFA_BindItems::SetConnection(const CFX_WideString& wsConnection) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection);
+}
diff --git a/xfa/fxfa/parser/cxfa_binditems.h b/xfa/fxfa/parser/cxfa_binditems.h
new file mode 100644
index 0000000..3dc0b28
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_binditems.h
@@ -0,0 +1,25 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_BINDITEMS_H_
+#define XFA_FXFA_PARSER_CXFA_BINDITEMS_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_BindItems : public CXFA_Data {
+ public:
+  explicit CXFA_BindItems(CXFA_Node* pNode);
+
+  void GetLabelRef(CFX_WideStringC& wsLabelRef);
+  void GetValueRef(CFX_WideStringC& wsValueRef);
+  void GetRef(CFX_WideStringC& wsRef);
+  FX_BOOL SetConnection(const CFX_WideString& wsConnection);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_BINDITEMS_H_
diff --git a/xfa/fxfa/parser/cxfa_border.h b/xfa/fxfa/parser/cxfa_border.h
new file mode 100644
index 0000000..27b469c
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_border.h
@@ -0,0 +1,19 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_BORDER_H_
+#define XFA_FXFA_PARSER_CXFA_BORDER_H_
+
+#include "xfa/fxfa/parser/cxfa_box.h"
+
+class CXFA_Node;
+
+class CXFA_Border : public CXFA_Box {
+ public:
+  explicit CXFA_Border(CXFA_Node* pNode) : CXFA_Box(pNode) {}
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_BORDER_H_
diff --git a/xfa/fxfa/parser/cxfa_box.cpp b/xfa/fxfa/parser/cxfa_box.cpp
new file mode 100644
index 0000000..fc57201
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_box.cpp
@@ -0,0 +1,168 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_box.h"
+
+#include "xfa/fxfa/parser/cxfa_corner.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+
+namespace {
+
+void GetStrokesInternal(CXFA_Node* pNode,
+                        CXFA_StrokeArray& strokes,
+                        FX_BOOL bNULL) {
+  strokes.RemoveAll();
+  if (!pNode)
+    return;
+
+  strokes.SetSize(8);
+  int32_t i, j;
+  for (i = 0, j = 0; i < 4; i++) {
+    CXFA_Corner corner =
+        CXFA_Corner(pNode->GetProperty(i, XFA_ELEMENT_Corner, i == 0));
+    if (corner || i == 0)
+      strokes.SetAt(j, corner);
+    else if (bNULL)
+      strokes.SetAt(j, CXFA_Stroke(nullptr));
+    else if (i == 1)
+      strokes.SetAt(j, strokes[0]);
+    else if (i == 2)
+      strokes.SetAt(j, strokes[0]);
+    else
+      strokes.SetAt(j, strokes[2]);
+
+    j++;
+    CXFA_Edge edge = CXFA_Edge(pNode->GetProperty(i, XFA_ELEMENT_Edge, i == 0));
+    if (edge || i == 0)
+      strokes.SetAt(j, edge);
+    else if (bNULL)
+      strokes.SetAt(j, CXFA_Stroke(nullptr));
+    else if (i == 1)
+      strokes.SetAt(j, strokes[1]);
+    else if (i == 2)
+      strokes.SetAt(j, strokes[1]);
+    else
+      strokes.SetAt(j, strokes[3]);
+
+    j++;
+  }
+}
+
+static int32_t Style3D(const CXFA_StrokeArray& strokes, CXFA_Stroke& stroke) {
+  int32_t iCount = strokes.GetSize();
+  if (iCount < 1)
+    return 0;
+
+  stroke = strokes[0];
+  for (int32_t i = 1; i < iCount; i++) {
+    CXFA_Stroke find = strokes[i];
+    if (!find)
+      continue;
+
+    if (!stroke)
+      stroke = find;
+    else if (stroke.GetStrokeType() != find.GetStrokeType())
+      stroke = find;
+    break;
+  }
+  int32_t iType = stroke.GetStrokeType();
+  if (iType == XFA_ATTRIBUTEENUM_Lowered || iType == XFA_ATTRIBUTEENUM_Raised ||
+      iType == XFA_ATTRIBUTEENUM_Etched ||
+      iType == XFA_ATTRIBUTEENUM_Embossed) {
+    return iType;
+  }
+  return 0;
+}
+
+}  // namespace
+
+int32_t CXFA_Box::GetHand() const {
+  if (!m_pNode)
+    return XFA_ATTRIBUTEENUM_Even;
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
+}
+
+int32_t CXFA_Box::GetPresence() const {
+  if (!m_pNode)
+    return XFA_ATTRIBUTEENUM_Hidden;
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
+}
+
+int32_t CXFA_Box::CountEdges() const {
+  if (!m_pNode)
+    return 0;
+  return m_pNode->CountChildren(XFA_ELEMENT_Edge);
+}
+
+CXFA_Edge CXFA_Box::GetEdge(int32_t nIndex) const {
+  return CXFA_Edge(
+      m_pNode ? m_pNode->GetProperty(nIndex, XFA_ELEMENT_Edge, nIndex == 0)
+              : nullptr);
+}
+
+void CXFA_Box::GetStrokes(CXFA_StrokeArray& strokes) const {
+  GetStrokesInternal(m_pNode, strokes, FALSE);
+}
+
+FX_BOOL CXFA_Box::IsCircular() const {
+  if (!m_pNode)
+    return FALSE;
+  return m_pNode->GetBoolean(XFA_ATTRIBUTE_Circular);
+}
+
+FX_BOOL CXFA_Box::GetStartAngle(FX_FLOAT& fStartAngle) const {
+  fStartAngle = 0;
+  if (!m_pNode)
+    return FALSE;
+
+  CXFA_Measurement ms;
+  FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_StartAngle, ms, FALSE);
+  if (bRet)
+    fStartAngle = ms.GetValue();
+
+  return bRet;
+}
+
+FX_BOOL CXFA_Box::GetSweepAngle(FX_FLOAT& fSweepAngle) const {
+  fSweepAngle = 360;
+  if (!m_pNode)
+    return FALSE;
+
+  CXFA_Measurement ms;
+  FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_SweepAngle, ms, FALSE);
+  if (bRet)
+    fSweepAngle = ms.GetValue();
+
+  return bRet;
+}
+
+CXFA_Fill CXFA_Box::GetFill(FX_BOOL bModified) const {
+  if (!m_pNode)
+    return CXFA_Fill(nullptr);
+
+  CXFA_Node* pFillNode = m_pNode->GetProperty(0, XFA_ELEMENT_Fill, bModified);
+  return CXFA_Fill(pFillNode);
+}
+
+CXFA_Margin CXFA_Box::GetMargin() const {
+  return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin)
+                             : nullptr);
+}
+
+int32_t CXFA_Box::Get3DStyle(FX_BOOL& bVisible, FX_FLOAT& fThickness) const {
+  if (IsArc())
+    return 0;
+
+  CXFA_StrokeArray strokes;
+  GetStrokesInternal(m_pNode, strokes, TRUE);
+  CXFA_Stroke stroke(NULL);
+  int32_t iType = Style3D(strokes, stroke);
+  if (iType) {
+    bVisible = stroke.IsVisible();
+    fThickness = stroke.GetThickness();
+  }
+  return iType;
+}
diff --git a/xfa/fxfa/parser/cxfa_box.h b/xfa/fxfa/parser/cxfa_box.h
new file mode 100644
index 0000000..6123f94
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_box.h
@@ -0,0 +1,50 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_BOX_H_
+#define XFA_FXFA_PARSER_CXFA_BOX_H_
+
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/fxfa/parser/cxfa_edge.h"
+#include "xfa/fxfa/parser/cxfa_fill.h"
+#include "xfa/fxfa/parser/cxfa_margin.h"
+
+class CXFA_Node;
+
+class CXFA_Box : public CXFA_Data {
+ public:
+  explicit CXFA_Box(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+  bool IsArc() const { return GetClassID() == XFA_ELEMENT_Arc; }
+  bool IsBorder() const { return GetClassID() == XFA_ELEMENT_Border; }
+  bool IsRectangle() const { return GetClassID() == XFA_ELEMENT_Rectangle; }
+  int32_t GetHand() const;
+  int32_t GetPresence() const;
+  int32_t CountEdges() const;
+  CXFA_Edge GetEdge(int32_t nIndex = 0) const;
+  void GetStrokes(CXFA_StrokeArray& strokes) const;
+  FX_BOOL IsCircular() const;
+  FX_BOOL GetStartAngle(FX_FLOAT& fStartAngle) const;
+  FX_FLOAT GetStartAngle() const {
+    FX_FLOAT fStartAngle;
+    GetStartAngle(fStartAngle);
+    return fStartAngle;
+  }
+
+  FX_BOOL GetSweepAngle(FX_FLOAT& fSweepAngle) const;
+  FX_FLOAT GetSweepAngle() const {
+    FX_FLOAT fSweepAngle;
+    GetSweepAngle(fSweepAngle);
+    return fSweepAngle;
+  }
+
+  CXFA_Fill GetFill(FX_BOOL bModified = FALSE) const;
+  CXFA_Margin GetMargin() const;
+  int32_t Get3DStyle(FX_BOOL& bVisible, FX_FLOAT& fThickness) const;
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_BOX_H_
diff --git a/xfa/fxfa/parser/cxfa_calculate.cpp b/xfa/fxfa/parser/cxfa_calculate.cpp
new file mode 100644
index 0000000..8984c5e
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_calculate.cpp
@@ -0,0 +1,32 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_calculate.h"
+
+#include "xfa/fxfa/parser/cxfa_text.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Calculate::CXFA_Calculate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+int32_t CXFA_Calculate::GetOverride() {
+  XFA_ATTRIBUTEENUM eAtt = XFA_ATTRIBUTEENUM_Error;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Override, eAtt, FALSE);
+  return eAtt;
+}
+
+CXFA_Script CXFA_Calculate::GetScript() {
+  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
+}
+
+void CXFA_Calculate::GetMessageText(CFX_WideString& wsMessage) {
+  CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message);
+  if (!pNode)
+    return;
+
+  CXFA_Text text(pNode->GetChild(0, XFA_ELEMENT_Text));
+  if (text)
+    text.GetContent(wsMessage);
+}
diff --git a/xfa/fxfa/parser/cxfa_calculate.h b/xfa/fxfa/parser/cxfa_calculate.h
new file mode 100644
index 0000000..c90656a
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_calculate.h
@@ -0,0 +1,25 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_CALCULATE_H_
+#define XFA_FXFA_PARSER_CXFA_CALCULATE_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/fxfa/parser/cxfa_script.h"
+
+class CXFA_Node;
+
+class CXFA_Calculate : public CXFA_Data {
+ public:
+  explicit CXFA_Calculate(CXFA_Node* pNode);
+
+  int32_t GetOverride();
+  CXFA_Script GetScript();
+  void GetMessageText(CFX_WideString& wsMessage);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_CALCULATE_H_
diff --git a/xfa/fxfa/parser/cxfa_caption.cpp b/xfa/fxfa/parser/cxfa_caption.cpp
new file mode 100644
index 0000000..1d343e7
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_caption.cpp
@@ -0,0 +1,41 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_caption.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Caption::CXFA_Caption(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+int32_t CXFA_Caption::GetPresence() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Visible;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Presence, eAttr);
+  return eAttr;
+}
+
+int32_t CXFA_Caption::GetPlacementType() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Placement, eAttr);
+  return eAttr;
+}
+
+FX_FLOAT CXFA_Caption::GetReserve() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_Reserve, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+
+CXFA_Margin CXFA_Caption::GetMargin() {
+  return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin) : NULL);
+}
+
+CXFA_Font CXFA_Caption::GetFont() {
+  return CXFA_Font(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Font) : NULL);
+}
+
+CXFA_Value CXFA_Caption::GetValue() {
+  return CXFA_Value(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Value) : NULL);
+}
diff --git a/xfa/fxfa/parser/cxfa_caption.h b/xfa/fxfa/parser/cxfa_caption.h
new file mode 100644
index 0000000..70dd435
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_caption.h
@@ -0,0 +1,29 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_CAPTION_H_
+#define XFA_FXFA_PARSER_CXFA_CAPTION_H_
+
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/fxfa/parser/cxfa_font.h"
+#include "xfa/fxfa/parser/cxfa_margin.h"
+#include "xfa/fxfa/parser/cxfa_value.h"
+
+class CXFA_Node;
+
+class CXFA_Caption : public CXFA_Data {
+ public:
+  explicit CXFA_Caption(CXFA_Node* pNode);
+
+  int32_t GetPresence();
+  int32_t GetPlacementType();
+  FX_FLOAT GetReserve();
+  CXFA_Margin GetMargin();
+  CXFA_Font GetFont();
+  CXFA_Value GetValue();
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_CAPTION_H_
diff --git a/xfa/fxfa/parser/cxfa_corner.h b/xfa/fxfa/parser/cxfa_corner.h
new file mode 100644
index 0000000..7665c53
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_corner.h
@@ -0,0 +1,19 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_CORNER_H_
+#define XFA_FXFA_PARSER_CXFA_CORNER_H_
+
+#include "xfa/fxfa/parser/cxfa_stroke.h"
+
+class CXFA_Node;
+
+class CXFA_Corner : public CXFA_Stroke {
+ public:
+  explicit CXFA_Corner(CXFA_Node* pNode) : CXFA_Stroke(pNode) {}
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_CORNER_H_
diff --git a/xfa/fxfa/parser/cxfa_data.cpp b/xfa/fxfa/parser/cxfa_data.cpp
new file mode 100644
index 0000000..cbcb079
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_data.cpp
@@ -0,0 +1,80 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+// Static.
+FX_ARGB CXFA_Data::ToColor(const CFX_WideStringC& wsValue) {
+  uint8_t r = 0, g = 0, b = 0;
+  if (wsValue.GetLength() == 0)
+    return 0xff000000;
+
+  int cc = 0;
+  const FX_WCHAR* str = wsValue.c_str();
+  int len = wsValue.GetLength();
+  while (XFA_IsSpace(str[cc]) && cc < len)
+    cc++;
+
+  if (cc >= len)
+    return 0xff000000;
+
+  while (cc < len) {
+    if (str[cc] == ',' || !XFA_IsDigit(str[cc]))
+      break;
+
+    r = r * 10 + str[cc] - '0';
+    cc++;
+  }
+  if (cc < len && str[cc] == ',') {
+    cc++;
+    while (XFA_IsSpace(str[cc]) && cc < len)
+      cc++;
+
+    while (cc < len) {
+      if (str[cc] == ',' || !XFA_IsDigit(str[cc]))
+        break;
+
+      g = g * 10 + str[cc] - '0';
+      cc++;
+    }
+    if (cc < len && str[cc] == ',') {
+      cc++;
+      while (XFA_IsSpace(str[cc]) && cc < len)
+        cc++;
+
+      while (cc < len) {
+        if (str[cc] == ',' || !XFA_IsDigit(str[cc]))
+          break;
+
+        b = b * 10 + str[cc] - '0';
+        cc++;
+      }
+    }
+  }
+  return (0xff << 24) | (r << 16) | (g << 8) | b;
+}
+
+XFA_ELEMENT CXFA_Data::GetClassID() const {
+  return m_pNode ? m_pNode->GetClassID() : XFA_ELEMENT_UNKNOWN;
+}
+
+FX_BOOL CXFA_Data::TryMeasure(XFA_ATTRIBUTE eAttr,
+                              FX_FLOAT& fValue,
+                              FX_BOOL bUseDefault) const {
+  CXFA_Measurement ms;
+  if (m_pNode->TryMeasure(eAttr, ms, bUseDefault)) {
+    fValue = ms.ToUnit(XFA_UNIT_Pt);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_Data::SetMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT fValue) {
+  CXFA_Measurement ms(fValue, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(eAttr, ms);
+}
diff --git a/xfa/fxfa/parser/cxfa_data.h b/xfa/fxfa/parser/cxfa_data.h
new file mode 100644
index 0000000..e6750d5
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_data.h
@@ -0,0 +1,35 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_DATA_H_
+#define XFA_FXFA_PARSER_CXFA_DATA_H_
+
+#include "core/fxcrt/include/fx_system.h"
+#include "core/fxge/include/fx_dib.h"
+#include "xfa/include/fxfa/fxfa_basic.h"
+
+class CXFA_Node;
+
+class CXFA_Data {
+ public:
+  static FX_ARGB ToColor(const CFX_WideStringC& wsValue);
+
+  explicit CXFA_Data(CXFA_Node* pNode) : m_pNode(pNode) {}
+
+  operator bool() const { return !!m_pNode; }
+  CXFA_Node* GetNode() const { return m_pNode; }
+  XFA_ELEMENT GetClassID() const;
+
+ protected:
+  FX_BOOL TryMeasure(XFA_ATTRIBUTE eAttr,
+                     FX_FLOAT& fValue,
+                     FX_BOOL bUseDefault = FALSE) const;
+  FX_BOOL SetMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT fValue);
+
+  CXFA_Node* m_pNode;
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_DATA_H_
diff --git a/xfa/fxfa/parser/cxfa_edge.h b/xfa/fxfa/parser/cxfa_edge.h
new file mode 100644
index 0000000..96e725f
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_edge.h
@@ -0,0 +1,19 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_EDGE_H_
+#define XFA_FXFA_PARSER_CXFA_EDGE_H_
+
+#include "xfa/fxfa/parser/cxfa_stroke.h"
+
+class CXFA_Node;
+
+class CXFA_Edge : public CXFA_Stroke {
+ public:
+  explicit CXFA_Edge(CXFA_Node* pNode) : CXFA_Stroke(pNode) {}
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_EDGE_H_
diff --git a/xfa/fxfa/parser/cxfa_event.cpp b/xfa/fxfa/parser/cxfa_event.cpp
new file mode 100644
index 0000000..efff3e5
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_event.cpp
@@ -0,0 +1,49 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_event.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Event::CXFA_Event(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+int32_t CXFA_Event::GetActivity() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Activity);
+}
+
+int32_t CXFA_Event::GetEventType() {
+  CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  while (pChild) {
+    int32_t eType = pChild->GetClassID();
+    if (eType != XFA_ELEMENT_Extras)
+      return eType;
+
+    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return XFA_ELEMENT_UNKNOWN;
+}
+
+void CXFA_Event::GetRef(CFX_WideStringC& wsRef) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
+}
+
+CXFA_Script CXFA_Event::GetScript() {
+  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
+}
+
+CXFA_Submit CXFA_Event::GetSubmit() {
+  return CXFA_Submit(m_pNode->GetChild(0, XFA_ELEMENT_Submit));
+}
+
+void CXFA_Event::GetSignDataTarget(CFX_WideString& wsTarget) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData);
+  if (!pNode)
+    return;
+
+  CFX_WideStringC wsCData;
+  pNode->TryCData(XFA_ATTRIBUTE_Target, wsCData);
+  wsTarget = wsCData;
+}
diff --git a/xfa/fxfa/parser/cxfa_event.h b/xfa/fxfa/parser/cxfa_event.h
new file mode 100644
index 0000000..91d0812
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_event.h
@@ -0,0 +1,33 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_EVENT_H_
+#define XFA_FXFA_PARSER_CXFA_EVENT_H_
+
+#include <stdint.h>
+
+#include "core/fxcrt/include/fx_string.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/fxfa/parser/cxfa_script.h"
+#include "xfa/fxfa/parser/cxfa_submit.h"
+
+class CXFA_Node;
+
+class CXFA_Event : public CXFA_Data {
+ public:
+  explicit CXFA_Event(CXFA_Node* pNode);
+
+  int32_t GetActivity();
+  int32_t GetEventType();
+  void GetRef(CFX_WideStringC& wsRef);
+
+  CXFA_Script GetScript();
+  CXFA_Submit GetSubmit();
+
+  void GetSignDataTarget(CFX_WideString& wsTarget);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_EVENT_H_
diff --git a/xfa/fxfa/parser/cxfa_exdata.cpp b/xfa/fxfa/parser/cxfa_exdata.cpp
new file mode 100644
index 0000000..358cc3d
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_exdata.cpp
@@ -0,0 +1,15 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_exdata.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_ExData::CXFA_ExData(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+FX_BOOL CXFA_ExData::SetContentType(const CFX_WideString& wsContentType) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+}
diff --git a/xfa/fxfa/parser/cxfa_exdata.h b/xfa/fxfa/parser/cxfa_exdata.h
new file mode 100644
index 0000000..eb04398
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_exdata.h
@@ -0,0 +1,22 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_EXDATA_H_
+#define XFA_FXFA_PARSER_CXFA_EXDATA_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_ExData : public CXFA_Data {
+ public:
+  explicit CXFA_ExData(CXFA_Node* pNode);
+
+  FX_BOOL SetContentType(const CFX_WideString& wsContentType);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_EXDATA_H_
diff --git a/xfa/fxfa/parser/cxfa_fill.cpp b/xfa/fxfa/parser/cxfa_fill.cpp
new file mode 100644
index 0000000..c67e303
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_fill.cpp
@@ -0,0 +1,103 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_fill.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Fill::CXFA_Fill(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+CXFA_Fill::~CXFA_Fill() {}
+
+int32_t CXFA_Fill::GetPresence() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
+}
+
+void CXFA_Fill::SetColor(FX_ARGB color) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
+  CFX_WideString wsColor;
+  int a, r, g, b;
+  ArgbDecode(color, a, r, g, b);
+  wsColor.Format(L"%d,%d,%d", r, g, b);
+  pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
+}
+
+FX_ARGB CXFA_Fill::GetColor(FX_BOOL bText) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    if (pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE))
+      return CXFA_Data::ToColor(wsColor);
+  }
+  if (bText)
+    return 0xFF000000;
+  return 0xFFFFFFFF;
+}
+
+int32_t CXFA_Fill::GetFillType() {
+  CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  while (pChild) {
+    int32_t eType = pChild->GetClassID();
+    if (eType != XFA_ELEMENT_Color && eType != XFA_ELEMENT_Extras)
+      return eType;
+
+    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return XFA_ELEMENT_Solid;
+}
+
+int32_t CXFA_Fill::GetPattern(FX_ARGB& foreColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern);
+  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
+    foreColor = CXFA_Data::ToColor(wsColor);
+  } else {
+    foreColor = 0xFF000000;
+  }
+  return pNode->GetEnum(XFA_ATTRIBUTE_Type);
+}
+
+int32_t CXFA_Fill::GetStipple(FX_ARGB& stippleColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple);
+  int32_t eAttr = 50;
+  pNode->TryInteger(XFA_ATTRIBUTE_Rate, eAttr);
+  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
+    stippleColor = CXFA_Data::ToColor(wsColor);
+  } else {
+    stippleColor = 0xFF000000;
+  }
+  return eAttr;
+}
+
+int32_t CXFA_Fill::GetLinear(FX_ARGB& endColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear);
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToRight;
+  pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
+  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
+    endColor = CXFA_Data::ToColor(wsColor);
+  } else {
+    endColor = 0xFF000000;
+  }
+  return eAttr;
+}
+
+int32_t CXFA_Fill::GetRadial(FX_ARGB& endColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial);
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToEdge;
+  pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
+  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
+    endColor = CXFA_Data::ToColor(wsColor);
+  } else {
+    endColor = 0xFF000000;
+  }
+  return eAttr;
+}
diff --git a/xfa/fxfa/parser/cxfa_fill.h b/xfa/fxfa/parser/cxfa_fill.h
new file mode 100644
index 0000000..57f0410
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_fill.h
@@ -0,0 +1,31 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_FILL_H_
+#define XFA_FXFA_PARSER_CXFA_FILL_H_
+
+#include "core/fxcrt/include/fx_system.h"
+#include "core/fxge/include/fx_dib.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_Fill : public CXFA_Data {
+ public:
+  explicit CXFA_Fill(CXFA_Node* pNode);
+  ~CXFA_Fill();
+
+  int32_t GetPresence();
+  FX_ARGB GetColor(FX_BOOL bText = FALSE);
+  int32_t GetFillType();
+  int32_t GetPattern(FX_ARGB& foreColor);
+  int32_t GetStipple(FX_ARGB& stippleColor);
+  int32_t GetLinear(FX_ARGB& endColor);
+  int32_t GetRadial(FX_ARGB& endColor);
+  void SetColor(FX_ARGB color);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_FILL_H_
diff --git a/xfa/fxfa/parser/cxfa_font.cpp b/xfa/fxfa/parser/cxfa_font.cpp
new file mode 100644
index 0000000..8579fcb
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_font.cpp
@@ -0,0 +1,92 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_font.h"
+
+#include "core/fxge/include/fx_dib.h"
+#include "xfa/fxfa/parser/cxfa_fill.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Font::CXFA_Font(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+FX_FLOAT CXFA_Font::GetBaselineShift() {
+  return m_pNode->GetMeasure(XFA_ATTRIBUTE_BaselineShift).ToUnit(XFA_UNIT_Pt);
+}
+
+FX_FLOAT CXFA_Font::GetHorizontalScale() {
+  CFX_WideString wsValue;
+  m_pNode->TryCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue);
+  int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
+  return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
+}
+
+FX_FLOAT CXFA_Font::GetVerticalScale() {
+  CFX_WideString wsValue;
+  m_pNode->TryCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue);
+  int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
+  return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
+}
+
+FX_FLOAT CXFA_Font::GetLetterSpacing() {
+  CFX_WideStringC wsValue;
+  if (!m_pNode->TryCData(XFA_ATTRIBUTE_LetterSpacing, wsValue))
+    return 0;
+
+  CXFA_Measurement ms(wsValue);
+  if (ms.GetUnit() == XFA_UNIT_Em)
+    return ms.GetValue() * GetFontSize();
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+
+int32_t CXFA_Font::GetLineThrough() {
+  int32_t iValue = 0;
+  m_pNode->TryInteger(XFA_ATTRIBUTE_LineThrough, iValue);
+  return iValue;
+}
+
+int32_t CXFA_Font::GetUnderline() {
+  int32_t iValue = 0;
+  m_pNode->TryInteger(XFA_ATTRIBUTE_Underline, iValue);
+  return iValue;
+}
+
+int32_t CXFA_Font::GetUnderlinePeriod() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_UnderlinePeriod, eAttr);
+  return eAttr;
+}
+
+FX_FLOAT CXFA_Font::GetFontSize() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_Size, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+
+void CXFA_Font::GetTypeface(CFX_WideStringC& wsTypeFace) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Typeface, wsTypeFace);
+}
+
+FX_BOOL CXFA_Font::IsBold() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Weight, eAttr);
+  return eAttr == XFA_ATTRIBUTEENUM_Bold;
+}
+
+FX_BOOL CXFA_Font::IsItalic() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Posture, eAttr);
+  return eAttr == XFA_ATTRIBUTEENUM_Italic;
+}
+
+void CXFA_Font::SetColor(FX_ARGB color) {
+  CXFA_Fill fill(m_pNode->GetProperty(0, XFA_ELEMENT_Fill));
+  fill.SetColor(color);
+}
+
+FX_ARGB CXFA_Font::GetColor() {
+  CXFA_Fill fill(m_pNode->GetChild(0, XFA_ELEMENT_Fill));
+  return fill ? fill.GetColor(TRUE) : 0xFF000000;
+}
diff --git a/xfa/fxfa/parser/cxfa_font.h b/xfa/fxfa/parser/cxfa_font.h
new file mode 100644
index 0000000..e2e1809
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_font.h
@@ -0,0 +1,36 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_FONT_H_
+#define XFA_FXFA_PARSER_CXFA_FONT_H_
+
+#include "core/fxge/include/fx_dib.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_Font : public CXFA_Data {
+ public:
+  explicit CXFA_Font(CXFA_Node* pNode);
+
+  FX_FLOAT GetBaselineShift();
+  FX_FLOAT GetHorizontalScale();
+  FX_FLOAT GetVerticalScale();
+  FX_FLOAT GetLetterSpacing();
+  int32_t GetLineThrough();
+  int32_t GetUnderline();
+  int32_t GetUnderlinePeriod();
+  FX_FLOAT GetFontSize();
+  void GetTypeface(CFX_WideStringC& wsTypeFace);
+
+  FX_BOOL IsBold();
+  FX_BOOL IsItalic();
+
+  FX_ARGB GetColor();
+  void SetColor(FX_ARGB color);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_FONT_H_
diff --git a/xfa/fxfa/parser/cxfa_image.cpp b/xfa/fxfa/parser/cxfa_image.cpp
new file mode 100644
index 0000000..c54a580
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_image.cpp
@@ -0,0 +1,54 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_image.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Image::CXFA_Image(CXFA_Node* pNode, FX_BOOL bDefValue)
+    : CXFA_Data(pNode), m_bDefValue(bDefValue) {}
+
+int32_t CXFA_Image::GetAspect() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Aspect);
+}
+
+FX_BOOL CXFA_Image::GetContentType(CFX_WideString& wsContentType) {
+  return m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+}
+
+FX_BOOL CXFA_Image::GetHref(CFX_WideString& wsHref) {
+  if (m_bDefValue)
+    return m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref);
+  return m_pNode->GetAttribute(FX_WSTRC(L"href"), wsHref);
+}
+
+int32_t CXFA_Image::GetTransferEncoding() {
+  if (m_bDefValue)
+    return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding);
+  return XFA_ATTRIBUTEENUM_Base64;
+}
+
+FX_BOOL CXFA_Image::GetContent(CFX_WideString& wsText) {
+  return m_pNode->TryContent(wsText);
+}
+
+FX_BOOL CXFA_Image::SetContentType(const CFX_WideString& wsContentType) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+}
+
+FX_BOOL CXFA_Image::SetHref(const CFX_WideString& wsHref) {
+  if (m_bDefValue)
+    return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref);
+  return m_pNode->SetAttribute(XFA_ATTRIBUTE_Href, wsHref.AsWideStringC());
+}
+
+FX_BOOL CXFA_Image::SetTransferEncoding(int32_t iTransferEncoding) {
+  if (m_bDefValue) {
+    return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding,
+                            (XFA_ATTRIBUTEENUM)iTransferEncoding);
+  }
+  return TRUE;
+}
diff --git a/xfa/fxfa/parser/cxfa_image.h b/xfa/fxfa/parser/cxfa_image.h
new file mode 100644
index 0000000..9f8b3bb
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_image.h
@@ -0,0 +1,33 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_IMAGE_H_
+#define XFA_FXFA_PARSER_CXFA_IMAGE_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_Image : public CXFA_Data {
+ public:
+  CXFA_Image(CXFA_Node* pNode, FX_BOOL bDefValue);
+
+  int32_t GetAspect();
+  FX_BOOL GetContentType(CFX_WideString& wsContentType);
+  FX_BOOL GetHref(CFX_WideString& wsHref);
+  int32_t GetTransferEncoding();
+  FX_BOOL GetContent(CFX_WideString& wsText);
+  FX_BOOL SetContentType(const CFX_WideString& wsContentType);
+  FX_BOOL SetHref(const CFX_WideString& wsHref);
+  FX_BOOL SetTransferEncoding(int32_t iTransferEncoding);
+
+ protected:
+  FX_BOOL m_bDefValue;
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_IMAGE_H_
diff --git a/xfa/fxfa/parser/cxfa_line.cpp b/xfa/fxfa/parser/cxfa_line.cpp
new file mode 100644
index 0000000..07ca6d7
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_line.cpp
@@ -0,0 +1,22 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_line.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+int32_t CXFA_Line::GetHand() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
+}
+
+FX_BOOL CXFA_Line::GetSlop() {
+  XFA_ATTRIBUTEENUM eSlop = m_pNode->GetEnum(XFA_ATTRIBUTE_Slope);
+  return eSlop == XFA_ATTRIBUTEENUM_Slash;
+}
+
+CXFA_Edge CXFA_Line::GetEdge() {
+  return CXFA_Edge(m_pNode->GetChild(0, XFA_ELEMENT_Edge));
+}
diff --git a/xfa/fxfa/parser/cxfa_line.h b/xfa/fxfa/parser/cxfa_line.h
new file mode 100644
index 0000000..3807604
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_line.h
@@ -0,0 +1,25 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_LINE_H_
+#define XFA_FXFA_PARSER_CXFA_LINE_H_
+
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/fxfa/parser/cxfa_edge.h"
+
+class CXFA_Node;
+
+class CXFA_Line : public CXFA_Data {
+ public:
+  explicit CXFA_Line(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+  int32_t GetHand();
+  FX_BOOL GetSlop();
+  CXFA_Edge GetEdge();
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_LINE_H_
diff --git a/xfa/fxfa/parser/cxfa_margin.cpp b/xfa/fxfa/parser/cxfa_margin.cpp
new file mode 100644
index 0000000..c3ced3d
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_margin.cpp
@@ -0,0 +1,32 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_margin.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Margin::CXFA_Margin(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+FX_BOOL CXFA_Margin::GetLeftInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
+  fInset = fDefInset;
+  return TryMeasure(XFA_ATTRIBUTE_LeftInset, fInset);
+}
+
+FX_BOOL CXFA_Margin::GetTopInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
+  fInset = fDefInset;
+  return TryMeasure(XFA_ATTRIBUTE_TopInset, fInset);
+}
+
+FX_BOOL CXFA_Margin::GetRightInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
+  fInset = fDefInset;
+  return TryMeasure(XFA_ATTRIBUTE_RightInset, fInset);
+}
+
+FX_BOOL CXFA_Margin::GetBottomInset(FX_FLOAT& fInset,
+                                    FX_FLOAT fDefInset) const {
+  fInset = fDefInset;
+  return TryMeasure(XFA_ATTRIBUTE_BottomInset, fInset);
+}
diff --git a/xfa/fxfa/parser/cxfa_margin.h b/xfa/fxfa/parser/cxfa_margin.h
new file mode 100644
index 0000000..ecfc628
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_margin.h
@@ -0,0 +1,25 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_MARGIN_H_
+#define XFA_FXFA_PARSER_CXFA_MARGIN_H_
+
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_Margin : public CXFA_Data {
+ public:
+  explicit CXFA_Margin(CXFA_Node* pNode);
+
+  FX_BOOL GetLeftInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
+  FX_BOOL GetTopInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
+  FX_BOOL GetRightInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
+  FX_BOOL GetBottomInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_MARGIN_H_
diff --git a/xfa/fxfa/parser/cxfa_occur.cpp b/xfa/fxfa/parser/cxfa_occur.cpp
new file mode 100644
index 0000000..6d105ab
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_occur.cpp
@@ -0,0 +1,67 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_occur.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Occur::CXFA_Occur(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+int32_t CXFA_Occur::GetMax() {
+  int32_t iMax = 1;
+  if (m_pNode) {
+    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, TRUE))
+      iMax = GetMin();
+  }
+  return iMax;
+}
+
+int32_t CXFA_Occur::GetMin() {
+  int32_t iMin = 1;
+  if (m_pNode) {
+    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, TRUE) || iMin < 0)
+      iMin = 1;
+  }
+  return iMin;
+}
+
+FX_BOOL CXFA_Occur::GetOccurInfo(int32_t& iMin, int32_t& iMax, int32_t& iInit) {
+  if (!m_pNode)
+    return FALSE;
+  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE) || iMin < 0)
+    iMin = 1;
+  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) {
+    if (iMin == 0)
+      iMax = 1;
+    else
+      iMax = iMin;
+  }
+  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, FALSE) ||
+      iInit < iMin) {
+    iInit = iMin;
+  }
+  return TRUE;
+}
+
+void CXFA_Occur::SetMax(int32_t iMax) {
+  iMax = (iMax != -1 && iMax < 1) ? 1 : iMax;
+  m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
+  int32_t iMin = GetMin();
+  if (iMax != -1 && iMax < iMin) {
+    iMin = iMax;
+    m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
+  }
+}
+
+void CXFA_Occur::SetMin(int32_t iMin) {
+  iMin = (iMin < 0) ? 1 : iMin;
+  m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
+  int32_t iMax = GetMax();
+  if (iMax > 0 && iMax < iMin) {
+    iMax = iMin;
+    m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
+  }
+}
diff --git a/xfa/fxfa/parser/cxfa_occur.h b/xfa/fxfa/parser/cxfa_occur.h
new file mode 100644
index 0000000..0f10540
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_occur.h
@@ -0,0 +1,26 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_OCCUR_H_
+#define XFA_FXFA_PARSER_CXFA_OCCUR_H_
+
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_Occur : public CXFA_Data {
+ public:
+  explicit CXFA_Occur(CXFA_Node* pNode);
+
+  int32_t GetMax();
+  int32_t GetMin();
+  FX_BOOL GetOccurInfo(int32_t& iMin, int32_t& iMax, int32_t& iInit);
+  void SetMax(int32_t iMax);
+  void SetMin(int32_t iMin);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_OCCUR_H_
diff --git a/xfa/fxfa/parser/cxfa_para.cpp b/xfa/fxfa/parser/cxfa_para.cpp
new file mode 100644
index 0000000..4f4a169
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_para.cpp
@@ -0,0 +1,59 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_para.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Para::CXFA_Para(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+int32_t CXFA_Para::GetHorizontalAlign() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_HAlign, eAttr);
+  return eAttr;
+}
+
+int32_t CXFA_Para::GetVerticalAlign() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Top;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_VAlign, eAttr);
+  return eAttr;
+}
+
+FX_FLOAT CXFA_Para::GetLineHeight() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_LineHeight, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+
+FX_FLOAT CXFA_Para::GetMarginLeft() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginLeft, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+
+FX_FLOAT CXFA_Para::GetMarginRight() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginRight, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+
+FX_FLOAT CXFA_Para::GetSpaceAbove() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceAbove, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+
+FX_FLOAT CXFA_Para::GetSpaceBelow() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceBelow, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+
+FX_FLOAT CXFA_Para::GetTextIndent() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_TextIndent, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
diff --git a/xfa/fxfa/parser/cxfa_para.h b/xfa/fxfa/parser/cxfa_para.h
new file mode 100644
index 0000000..109d05d
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_para.h
@@ -0,0 +1,29 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_PARA_H_
+#define XFA_FXFA_PARSER_CXFA_PARA_H_
+
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_Para : public CXFA_Data {
+ public:
+  explicit CXFA_Para(CXFA_Node* pNode);
+
+  int32_t GetHorizontalAlign();
+  int32_t GetVerticalAlign();
+  FX_FLOAT GetLineHeight();
+  FX_FLOAT GetMarginLeft();
+  FX_FLOAT GetMarginRight();
+  FX_FLOAT GetSpaceAbove();
+  FX_FLOAT GetSpaceBelow();
+  FX_FLOAT GetTextIndent();
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_PARA_H_
diff --git a/xfa/fxfa/parser/cxfa_rectangle.h b/xfa/fxfa/parser/cxfa_rectangle.h
new file mode 100644
index 0000000..8d18ace
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_rectangle.h
@@ -0,0 +1,19 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_RECTANGLE_H_
+#define XFA_FXFA_PARSER_CXFA_RECTANGLE_H_
+
+#include "xfa/fxfa/parser/cxfa_box.h"
+
+class CXFA_Node;
+
+class CXFA_Rectangle : public CXFA_Box {
+ public:
+  explicit CXFA_Rectangle(CXFA_Node* pNode) : CXFA_Box(pNode) {}
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_RECTANGLE_H_
diff --git a/xfa/fxfa/parser/cxfa_script.cpp b/xfa/fxfa/parser/cxfa_script.cpp
new file mode 100644
index 0000000..b99d8a3
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_script.cpp
@@ -0,0 +1,31 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_script.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Script::CXFA_Script(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+XFA_SCRIPTTYPE CXFA_Script::GetContentType() {
+  CFX_WideStringC cData;
+  if (m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, cData, FALSE)) {
+    if (cData == FX_WSTRC(L"application/x-javascript"))
+      return XFA_SCRIPTTYPE_Javascript;
+    if (cData == FX_WSTRC(L"application/x-formcalc"))
+      return XFA_SCRIPTTYPE_Formcalc;
+    return XFA_SCRIPTTYPE_Unkown;
+  }
+  return XFA_SCRIPTTYPE_Formcalc;
+}
+
+int32_t CXFA_Script::GetRunAt() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_RunAt);
+}
+
+void CXFA_Script::GetExpression(CFX_WideString& wsExpression) {
+  m_pNode->TryContent(wsExpression);
+}
diff --git a/xfa/fxfa/parser/cxfa_script.h b/xfa/fxfa/parser/cxfa_script.h
new file mode 100644
index 0000000..f265961
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_script.h
@@ -0,0 +1,32 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_SCRIPT_H_
+#define XFA_FXFA_PARSER_CXFA_SCRIPT_H_
+
+#include <stdint.h>
+
+#include "core/fxcrt/include/fx_string.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+enum XFA_SCRIPTTYPE {
+  XFA_SCRIPTTYPE_Formcalc = 0,
+  XFA_SCRIPTTYPE_Javascript,
+  XFA_SCRIPTTYPE_Unkown,
+};
+
+class CXFA_Node;
+
+class CXFA_Script : public CXFA_Data {
+ public:
+  explicit CXFA_Script(CXFA_Node* pNode);
+
+  XFA_SCRIPTTYPE GetContentType();
+  int32_t GetRunAt();
+  void GetExpression(CFX_WideString& wsExpression);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_SCRIPT_H_
diff --git a/xfa/fxfa/parser/cxfa_stroke.cpp b/xfa/fxfa/parser/cxfa_stroke.cpp
new file mode 100644
index 0000000..ac175be
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_stroke.cpp
@@ -0,0 +1,105 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_stroke.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+int32_t CXFA_Stroke::GetPresence() const {
+  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Presence)
+                 : XFA_ATTRIBUTEENUM_Invisible;
+}
+
+int32_t CXFA_Stroke::GetCapType() const {
+  if (!m_pNode)
+    return XFA_ATTRIBUTEENUM_Square;
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Cap);
+}
+
+int32_t CXFA_Stroke::GetStrokeType() const {
+  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Stroke)
+                 : XFA_ATTRIBUTEENUM_Solid;
+}
+
+FX_FLOAT CXFA_Stroke::GetThickness() const {
+  return GetMSThickness().ToUnit(XFA_UNIT_Pt);
+}
+
+CXFA_Measurement CXFA_Stroke::GetMSThickness() const {
+  return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Thickness)
+                 : XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT_Edge,
+                                                        XFA_ATTRIBUTE_Thickness,
+                                                        XFA_XDPPACKET_Form);
+}
+
+void CXFA_Stroke::SetMSThickness(CXFA_Measurement msThinkness) {
+  if (!m_pNode)
+    return;
+
+  m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, msThinkness);
+}
+
+FX_ARGB CXFA_Stroke::GetColor() const {
+  if (!m_pNode)
+    return 0xFF000000;
+
+  CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color);
+  if (!pNode)
+    return 0xFF000000;
+
+  CFX_WideStringC wsColor;
+  pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor);
+  return CXFA_Data::ToColor(wsColor);
+}
+
+void CXFA_Stroke::SetColor(FX_ARGB argb) {
+  if (!m_pNode)
+    return;
+
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
+  CFX_WideString wsColor;
+  int a;
+  int r;
+  int g;
+  int b;
+  ArgbDecode(argb, a, r, g, b);
+  wsColor.Format(L"%d,%d,%d", r, g, b);
+  pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
+}
+
+int32_t CXFA_Stroke::GetJoinType() const {
+  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Join)
+                 : XFA_ATTRIBUTEENUM_Square;
+}
+
+FX_BOOL CXFA_Stroke::IsInverted() const {
+  return m_pNode ? m_pNode->GetBoolean(XFA_ATTRIBUTE_Inverted) : FALSE;
+}
+
+FX_FLOAT CXFA_Stroke::GetRadius() const {
+  return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Radius).ToUnit(XFA_UNIT_Pt)
+                 : 0;
+}
+
+FX_BOOL CXFA_Stroke::SameStyles(CXFA_Stroke stroke, uint32_t dwFlags) const {
+  if (m_pNode == stroke.GetNode())
+    return TRUE;
+  if (FXSYS_fabs(GetThickness() - stroke.GetThickness()) >= 0.01f)
+    return FALSE;
+  if ((dwFlags & XFA_STROKE_SAMESTYLE_NoPresence) == 0 &&
+      IsVisible() != stroke.IsVisible()) {
+    return FALSE;
+  }
+  if (GetStrokeType() != stroke.GetStrokeType())
+    return FALSE;
+  if (GetColor() != stroke.GetColor())
+    return FALSE;
+  if ((dwFlags & XFA_STROKE_SAMESTYLE_Corner) != 0 &&
+      FXSYS_fabs(GetRadius() - stroke.GetRadius()) >= 0.01f) {
+    return FALSE;
+  }
+  return TRUE;
+}
diff --git a/xfa/fxfa/parser/cxfa_stroke.h b/xfa/fxfa/parser/cxfa_stroke.h
new file mode 100644
index 0000000..34ec8dd
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_stroke.h
@@ -0,0 +1,45 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_STROKE_H_
+#define XFA_FXFA_PARSER_CXFA_STROKE_H_
+
+#include "core/fxcrt/include/fx_system.h"
+#include "core/fxge/include/fx_dib.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/include/fxfa/fxfa_basic.h"
+
+enum StrokeSameStyle {
+  XFA_STROKE_SAMESTYLE_NoPresence = 1,
+  XFA_STROKE_SAMESTYLE_Corner = 2
+};
+
+class CXFA_Node;
+
+class CXFA_Stroke : public CXFA_Data {
+ public:
+  explicit CXFA_Stroke(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+  bool IsCorner() const { return GetClassID() == XFA_ELEMENT_Corner; }
+  bool IsEdge() const { return GetClassID() == XFA_ELEMENT_Edge; }
+  bool IsVisible() const { return GetPresence() == XFA_ATTRIBUTEENUM_Visible; }
+  int32_t GetPresence() const;
+  int32_t GetCapType() const;
+  int32_t GetStrokeType() const;
+  FX_FLOAT GetThickness() const;
+  CXFA_Measurement GetMSThickness() const;
+  void SetMSThickness(CXFA_Measurement msThinkness);
+  FX_ARGB GetColor() const;
+  void SetColor(FX_ARGB argb);
+  int32_t GetJoinType() const;
+  FX_BOOL IsInverted() const;
+  FX_FLOAT GetRadius() const;
+  FX_BOOL SameStyles(CXFA_Stroke stroke, uint32_t dwFlags = 0) const;
+};
+
+typedef CFX_ArrayTemplate<CXFA_Stroke> CXFA_StrokeArray;
+
+#endif  // XFA_FXFA_PARSER_CXFA_STROKE_H_
diff --git a/xfa/fxfa/parser/cxfa_submit.cpp b/xfa/fxfa/parser/cxfa_submit.cpp
new file mode 100644
index 0000000..2aa011b
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_submit.cpp
@@ -0,0 +1,27 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_submit.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Submit::CXFA_Submit(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+FX_BOOL CXFA_Submit::IsSubmitEmbedPDF() {
+  return m_pNode->GetBoolean(XFA_ATTRIBUTE_EmbedPDF);
+}
+
+int32_t CXFA_Submit::GetSubmitFormat() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Format);
+}
+
+void CXFA_Submit::GetSubmitTarget(CFX_WideStringC& wsTarget) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Target, wsTarget);
+}
+
+void CXFA_Submit::GetSubmitXDPContent(CFX_WideStringC& wsContent) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_XdpContent, wsContent);
+}
diff --git a/xfa/fxfa/parser/cxfa_submit.h b/xfa/fxfa/parser/cxfa_submit.h
new file mode 100644
index 0000000..5984311
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_submit.h
@@ -0,0 +1,26 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_SUBMIT_H_
+#define XFA_FXFA_PARSER_CXFA_SUBMIT_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_Submit : public CXFA_Data {
+ public:
+  explicit CXFA_Submit(CXFA_Node* pNode);
+
+  FX_BOOL IsSubmitEmbedPDF();
+  int32_t GetSubmitFormat();
+  void GetSubmitTarget(CFX_WideStringC& wsTarget);
+  void GetSubmitXDPContent(CFX_WideStringC& wsContent);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_SUBMIT_H_
diff --git a/xfa/fxfa/parser/cxfa_text.cpp b/xfa/fxfa/parser/cxfa_text.cpp
new file mode 100644
index 0000000..fc7d7aa
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_text.cpp
@@ -0,0 +1,15 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_text.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Text::CXFA_Text(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+void CXFA_Text::GetContent(CFX_WideString& wsText) {
+  m_pNode->TryContent(wsText);
+}
diff --git a/xfa/fxfa/parser/cxfa_text.h b/xfa/fxfa/parser/cxfa_text.h
new file mode 100644
index 0000000..7467647
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_text.h
@@ -0,0 +1,22 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_TEXT_H_
+#define XFA_FXFA_PARSER_CXFA_TEXT_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_Text : public CXFA_Data {
+ public:
+  explicit CXFA_Text(CXFA_Node* pNode);
+
+  void GetContent(CFX_WideString& wsText);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_TEXT_H_
diff --git a/xfa/fxfa/parser/cxfa_tooltip.cpp b/xfa/fxfa/parser/cxfa_tooltip.cpp
new file mode 100644
index 0000000..079b365
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_tooltip.cpp
@@ -0,0 +1,15 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_tooltip.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_ToolTip::CXFA_ToolTip(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+FX_BOOL CXFA_ToolTip::GetTip(CFX_WideString& wsTip) {
+  return m_pNode->TryContent(wsTip);
+}
diff --git a/xfa/fxfa/parser/cxfa_tooltip.h b/xfa/fxfa/parser/cxfa_tooltip.h
new file mode 100644
index 0000000..af1791e
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_tooltip.h
@@ -0,0 +1,22 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_TOOLTIP_H_
+#define XFA_FXFA_PARSER_CXFA_TOOLTIP_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+
+class CXFA_Node;
+
+class CXFA_ToolTip : public CXFA_Data {
+ public:
+  explicit CXFA_ToolTip(CXFA_Node* pNode);
+
+  FX_BOOL GetTip(CFX_WideString& wsTip);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_TOOLTIP_H_
diff --git a/xfa/fxfa/parser/cxfa_validate.cpp b/xfa/fxfa/parser/cxfa_validate.cpp
new file mode 100644
index 0000000..d226cbf
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_validate.cpp
@@ -0,0 +1,119 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_validate.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Validate::CXFA_Validate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+int32_t CXFA_Validate::GetFormatTest() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_FormatTest);
+}
+
+FX_BOOL CXFA_Validate::SetTestValue(int32_t iType,
+                                    CFX_WideString& wsValue,
+                                    XFA_ATTRIBUTEENUM eName) {
+  const XFA_ATTRIBUTEENUMINFO* pInfo =
+      XFA_GetAttributeEnumByName(wsValue.AsWideStringC());
+  if (pInfo)
+    eName = pInfo->eName;
+
+  m_pNode->SetEnum((XFA_ATTRIBUTE)iType, eName, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CXFA_Validate::SetNullTest(CFX_WideString wsValue) {
+  return SetTestValue(XFA_ATTRIBUTE_NullTest, wsValue,
+                      XFA_ATTRIBUTEENUM_Disabled);
+}
+
+int32_t CXFA_Validate::GetNullTest() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_NullTest);
+}
+
+int32_t CXFA_Validate::GetScriptTest() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_ScriptTest);
+}
+
+void CXFA_Validate::GetMessageText(CFX_WideString& wsMessage,
+                                   const CFX_WideStringC& wsMessageType) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, FALSE);
+  if (!pNode)
+    return;
+
+  CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItemNode;
+       pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItemNode->GetClassID() != XFA_ELEMENT_Text)
+      continue;
+
+    CFX_WideStringC wsName;
+    pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
+    if (wsName.IsEmpty() || wsName == wsMessageType) {
+      pItemNode->TryContent(wsMessage);
+      return;
+    }
+  }
+}
+
+void CXFA_Validate::SetFormatMessageText(CFX_WideString wsMessage) {
+  SetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
+}
+
+void CXFA_Validate::GetFormatMessageText(CFX_WideString& wsMessage) {
+  GetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
+}
+
+void CXFA_Validate::SetNullMessageText(CFX_WideString wsMessage) {
+  SetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
+}
+
+void CXFA_Validate::GetNullMessageText(CFX_WideString& wsMessage) {
+  GetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
+}
+
+void CXFA_Validate::SetMessageText(CFX_WideString& wsMessage,
+                                   const CFX_WideStringC& wsMessageType) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, TRUE);
+  if (!pNode)
+    return;
+
+  CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItemNode;
+       pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItemNode->GetClassID() != XFA_ELEMENT_Text)
+      continue;
+
+    CFX_WideStringC wsName;
+    pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
+    if (wsName.IsEmpty() || wsName == wsMessageType) {
+      pItemNode->SetContent(wsMessage, wsMessage, FALSE);
+      return;
+    }
+  }
+  CXFA_Node* pTextNode = pNode->CreateSamePacketNode(XFA_ELEMENT_Text);
+  pNode->InsertChild(pTextNode);
+  pTextNode->SetCData(XFA_ATTRIBUTE_Name, wsMessageType, FALSE);
+  pTextNode->SetContent(wsMessage, wsMessage, FALSE);
+}
+
+void CXFA_Validate::GetScriptMessageText(CFX_WideString& wsMessage) {
+  GetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
+}
+
+void CXFA_Validate::SetScriptMessageText(CFX_WideString wsMessage) {
+  SetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
+}
+
+void CXFA_Validate::GetPicture(CFX_WideString& wsPicture) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Picture))
+    pNode->TryContent(wsPicture);
+}
+
+CXFA_Script CXFA_Validate::GetScript() {
+  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
+}
diff --git a/xfa/fxfa/parser/cxfa_validate.h b/xfa/fxfa/parser/cxfa_validate.h
new file mode 100644
index 0000000..aab5de3
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_validate.h
@@ -0,0 +1,44 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_VALIDATE_H_
+#define XFA_FXFA_PARSER_CXFA_VALIDATE_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/fxfa/parser/cxfa_script.h"
+
+class CXFA_Node;
+
+class CXFA_Validate : public CXFA_Data {
+ public:
+  explicit CXFA_Validate(CXFA_Node* pNode);
+
+  int32_t GetFormatTest();
+  int32_t GetNullTest();
+  FX_BOOL SetNullTest(CFX_WideString wsValue);
+  int32_t GetScriptTest();
+  void GetFormatMessageText(CFX_WideString& wsMessage);
+  void SetFormatMessageText(CFX_WideString wsMessage);
+  void GetNullMessageText(CFX_WideString& wsMessage);
+  void SetNullMessageText(CFX_WideString wsMessage);
+  void GetScriptMessageText(CFX_WideString& wsMessage);
+  void SetScriptMessageText(CFX_WideString wsMessage);
+  void GetPicture(CFX_WideString& wsPicture);
+  CXFA_Script GetScript();
+
+ protected:
+  void GetMessageText(CFX_WideString& wsMessage,
+                      const CFX_WideStringC& wsMessageType);
+  void SetMessageText(CFX_WideString& wsMessage,
+                      const CFX_WideStringC& wsMessageType);
+  FX_BOOL SetTestValue(int32_t iType,
+                       CFX_WideString& wsValue,
+                       XFA_ATTRIBUTEENUM eName);
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_VALIDATE_H_
diff --git a/xfa/fxfa/parser/cxfa_value.cpp b/xfa/fxfa/parser/cxfa_value.cpp
new file mode 100644
index 0000000..1e41ab2
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_value.cpp
@@ -0,0 +1,56 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_value.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+XFA_ELEMENT CXFA_Value::GetChildValueClassID() {
+  if (!m_pNode)
+    return XFA_ELEMENT_UNKNOWN;
+  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
+    return pNode->GetClassID();
+  return XFA_ELEMENT_UNKNOWN;
+}
+
+FX_BOOL CXFA_Value::GetChildValueContent(CFX_WideString& wsContent) {
+  if (!m_pNode)
+    return FALSE;
+  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
+    return pNode->TryContent(wsContent);
+  return FALSE;
+}
+
+CXFA_Arc CXFA_Value::GetArc() {
+  return CXFA_Arc(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                          : nullptr);
+}
+
+CXFA_Line CXFA_Value::GetLine() {
+  return CXFA_Line(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                           : nullptr);
+}
+
+CXFA_Rectangle CXFA_Value::GetRectangle() {
+  return CXFA_Rectangle(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                                : nullptr);
+}
+
+CXFA_Text CXFA_Value::GetText() {
+  return CXFA_Text(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                           : nullptr);
+}
+
+CXFA_ExData CXFA_Value::GetExData() {
+  return CXFA_ExData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                             : nullptr);
+}
+
+CXFA_Image CXFA_Value::GetImage() {
+  return CXFA_Image(
+      m_pNode ? (m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : nullptr,
+      TRUE);
+}
diff --git a/xfa/fxfa/parser/cxfa_value.h b/xfa/fxfa/parser/cxfa_value.h
new file mode 100644
index 0000000..5c9a684
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_value.h
@@ -0,0 +1,35 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_VALUE_H_
+#define XFA_FXFA_PARSER_CXFA_VALUE_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "xfa/fxfa/parser/cxfa_arc.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/fxfa/parser/cxfa_exdata.h"
+#include "xfa/fxfa/parser/cxfa_image.h"
+#include "xfa/fxfa/parser/cxfa_line.h"
+#include "xfa/fxfa/parser/cxfa_rectangle.h"
+#include "xfa/fxfa/parser/cxfa_text.h"
+
+class CXFA_Node;
+
+class CXFA_Value : public CXFA_Data {
+ public:
+  explicit CXFA_Value(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+
+  XFA_ELEMENT GetChildValueClassID();
+  FX_BOOL GetChildValueContent(CFX_WideString& wsContent);
+  CXFA_Arc GetArc();
+  CXFA_Line GetLine();
+  CXFA_Rectangle GetRectangle();
+  CXFA_Text GetText();
+  CXFA_ExData GetExData();
+  CXFA_Image GetImage();
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_VALUE_H_
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp
new file mode 100644
index 0000000..af714fd
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp
@@ -0,0 +1,1797 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/cxfa_widgetdata.h"
+
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/cxfa_event.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "core/fxcrt/include/fx_ext.h"
+#include "xfa/fxfa/app/xfa_ffnotify.h"
+#include "xfa/fxbarcode/include/BC_Library.h"
+#include "xfa/fxfa/parser/xfa_localevalue.h"
+
+namespace {
+
+FX_FLOAT GetEdgeThickness(const CXFA_StrokeArray& strokes,
+                          FX_BOOL b3DStyle,
+                          int32_t nIndex) {
+  FX_FLOAT fThickness = 0;
+
+  if (strokes[nIndex * 2 + 1].GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
+    if (nIndex == 0)
+      fThickness += 2.5f;
+
+    fThickness += strokes[nIndex * 2 + 1].GetThickness() * (b3DStyle ? 4 : 2);
+  }
+  return fThickness;
+}
+
+FX_BOOL SplitDateTime(const CFX_WideString& wsDateTime,
+                      CFX_WideString& wsDate,
+                      CFX_WideString& wsTime) {
+  wsDate = L"";
+  wsTime = L"";
+  if (wsDateTime.IsEmpty())
+    return FALSE;
+
+  int nSplitIndex = -1;
+  nSplitIndex = wsDateTime.Find('T');
+  if (nSplitIndex < 0)
+    nSplitIndex = wsDateTime.Find(' ');
+  if (nSplitIndex < 0)
+    return FALSE;
+
+  wsDate = wsDateTime.Left(nSplitIndex);
+  if (!wsDate.IsEmpty()) {
+    int32_t iCount = wsDate.GetLength();
+    int32_t i = 0;
+    for (i = 0; i < iCount; i++) {
+      if (wsDate[i] >= '0' && wsDate[i] <= '9')
+        break;
+    }
+    if (i == iCount)
+      return FALSE;
+  }
+  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
+  if (!wsTime.IsEmpty()) {
+    int32_t iCount = wsTime.GetLength();
+    int32_t i = 0;
+    for (i = 0; i < iCount; i++) {
+      if (wsTime[i] >= '0' && wsTime[i] <= '9')
+        break;
+    }
+    if (i == iCount)
+      return FALSE;
+  }
+  return TRUE;
+}
+
+}  // namespace
+
+CXFA_WidgetData::CXFA_WidgetData(CXFA_Node* pNode)
+    : CXFA_Data(pNode),
+      m_bIsNull(TRUE),
+      m_bPreNull(TRUE),
+      m_pUiChildNode(NULL),
+      m_eUIType(XFA_ELEMENT_UNKNOWN) {}
+
+CXFA_Node* CXFA_WidgetData::GetUIChild() {
+  if (m_eUIType == XFA_ELEMENT_UNKNOWN)
+    m_pUiChildNode = XFA_CreateUIChild(m_pNode, m_eUIType);
+
+  return m_pUiChildNode;
+}
+
+XFA_ELEMENT CXFA_WidgetData::GetUIType() {
+  GetUIChild();
+  return m_eUIType;
+}
+
+CFX_WideString CXFA_WidgetData::GetRawValue() {
+  return m_pNode->GetContent();
+}
+
+int32_t CXFA_WidgetData::GetAccess(FX_BOOL bTemplate) {
+  if (bTemplate) {
+    CXFA_Node* pNode = m_pNode->GetTemplateNode();
+    if (pNode)
+      return pNode->GetEnum(XFA_ATTRIBUTE_Access);
+    return XFA_ATTRIBUTEENUM_Open;
+  }
+  CXFA_Node* pNode = m_pNode;
+  while (pNode) {
+    int32_t iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Access);
+    if (iAcc != XFA_ATTRIBUTEENUM_Open)
+      return iAcc;
+
+    pNode =
+        pNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
+  }
+  return XFA_ATTRIBUTEENUM_Open;
+}
+
+int32_t CXFA_WidgetData::GetRotate() {
+  CXFA_Measurement ms;
+  if (!m_pNode->TryMeasure(XFA_ATTRIBUTE_Rotate, ms, FALSE))
+    return 0;
+
+  int32_t iRotate = FXSYS_round(ms.GetValue());
+  iRotate = XFA_MapRotation(iRotate);
+  return iRotate / 90 * 90;
+}
+
+CXFA_Border CXFA_WidgetData::GetBorder(FX_BOOL bModified) {
+  return CXFA_Border(m_pNode->GetProperty(0, XFA_ELEMENT_Border, bModified));
+}
+
+CXFA_Caption CXFA_WidgetData::GetCaption(FX_BOOL bModified) {
+  return CXFA_Caption(m_pNode->GetProperty(0, XFA_ELEMENT_Caption, bModified));
+}
+
+CXFA_Font CXFA_WidgetData::GetFont(FX_BOOL bModified) {
+  return CXFA_Font(m_pNode->GetProperty(0, XFA_ELEMENT_Font, bModified));
+}
+
+CXFA_Margin CXFA_WidgetData::GetMargin(FX_BOOL bModified) {
+  return CXFA_Margin(m_pNode->GetProperty(0, XFA_ELEMENT_Margin, bModified));
+}
+
+CXFA_Para CXFA_WidgetData::GetPara(FX_BOOL bModified) {
+  return CXFA_Para(m_pNode->GetProperty(0, XFA_ELEMENT_Para, bModified));
+}
+
+void CXFA_WidgetData::GetEventList(CXFA_NodeArray& events) {
+  m_pNode->GetNodeList(events, 0, XFA_ELEMENT_Event);
+}
+
+int32_t CXFA_WidgetData::GetEventByActivity(int32_t iActivity,
+                                            CXFA_NodeArray& events,
+                                            FX_BOOL bIsFormReady) {
+  CXFA_NodeArray allEvents;
+  GetEventList(allEvents);
+  int32_t iCount = allEvents.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CXFA_Event event(allEvents[i]);
+    if (event.GetActivity() == iActivity) {
+      if (iActivity == XFA_ATTRIBUTEENUM_Ready) {
+        CFX_WideStringC wsRef;
+        event.GetRef(wsRef);
+        if (bIsFormReady) {
+          if (wsRef == CFX_WideStringC(L"$form"))
+            events.Add(allEvents[i]);
+        } else {
+          if (wsRef == CFX_WideStringC(L"$layout"))
+            events.Add(allEvents[i]);
+        }
+      } else {
+        events.Add(allEvents[i]);
+      }
+    }
+  }
+  return events.GetSize();
+}
+
+CXFA_Value CXFA_WidgetData::GetDefaultValue(FX_BOOL bModified) {
+  CXFA_Node* pTemNode = m_pNode->GetTemplateNode();
+  return CXFA_Value(pTemNode
+                        ? pTemNode->GetProperty(0, XFA_ELEMENT_Value, bModified)
+                        : nullptr);
+}
+
+CXFA_Value CXFA_WidgetData::GetFormValue(FX_BOOL bModified) {
+  return CXFA_Value(m_pNode->GetProperty(0, XFA_ELEMENT_Value, bModified));
+}
+
+CXFA_Calculate CXFA_WidgetData::GetCalculate(FX_BOOL bModified) {
+  return CXFA_Calculate(
+      m_pNode->GetProperty(0, XFA_ELEMENT_Calculate, bModified));
+}
+
+CXFA_Validate CXFA_WidgetData::GetValidate(FX_BOOL bModified) {
+  return CXFA_Validate(
+      m_pNode->GetProperty(0, XFA_ELEMENT_Validate, bModified));
+}
+
+CXFA_Bind CXFA_WidgetData::GetBind(FX_BOOL bModified) {
+  return CXFA_Bind(m_pNode->GetProperty(0, XFA_ELEMENT_Bind, bModified));
+}
+
+CXFA_Assist CXFA_WidgetData::GetAssist(FX_BOOL bModified) {
+  return CXFA_Assist(m_pNode->GetProperty(0, XFA_ELEMENT_Assist, bModified));
+}
+
+FX_BOOL CXFA_WidgetData::GetWidth(FX_FLOAT& fWidth) {
+  return TryMeasure(XFA_ATTRIBUTE_W, fWidth);
+}
+
+FX_BOOL CXFA_WidgetData::GetHeight(FX_FLOAT& fHeight) {
+  return TryMeasure(XFA_ATTRIBUTE_H, fHeight);
+}
+
+FX_BOOL CXFA_WidgetData::GetMinWidth(FX_FLOAT& fMinWidth) {
+  return TryMeasure(XFA_ATTRIBUTE_MinW, fMinWidth);
+}
+
+FX_BOOL CXFA_WidgetData::GetMinHeight(FX_FLOAT& fMinHeight) {
+  return TryMeasure(XFA_ATTRIBUTE_MinH, fMinHeight);
+}
+
+FX_BOOL CXFA_WidgetData::GetMaxWidth(FX_FLOAT& fMaxWidth) {
+  return TryMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth);
+}
+
+FX_BOOL CXFA_WidgetData::GetMaxHeight(FX_FLOAT& fMaxHeight) {
+  return TryMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight);
+}
+
+CXFA_Border CXFA_WidgetData::GetUIBorder(FX_BOOL bModified) {
+  CXFA_Node* pUIChild = GetUIChild();
+  return CXFA_Border(
+      pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Border, bModified)
+               : nullptr);
+}
+
+CXFA_Margin CXFA_WidgetData::GetUIMargin(FX_BOOL bModified) {
+  CXFA_Node* pUIChild = GetUIChild();
+  return CXFA_Margin(
+      pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Margin, bModified)
+               : nullptr);
+}
+
+void CXFA_WidgetData::GetUIMargin(CFX_RectF& rtUIMargin) {
+  rtUIMargin.Reset();
+  CXFA_Margin mgUI = GetUIMargin();
+  if (!mgUI)
+    return;
+
+  CXFA_Border border = GetUIBorder();
+  if (border && border.GetPresence() != XFA_ATTRIBUTEENUM_Visible)
+    return;
+
+  FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
+  FX_BOOL bLeft = mgUI.GetLeftInset(fLeftInset);
+  FX_BOOL bTop = mgUI.GetTopInset(fTopInset);
+  FX_BOOL bRight = mgUI.GetRightInset(fRightInset);
+  FX_BOOL bBottom = mgUI.GetBottomInset(fBottomInset);
+  if (border) {
+    FX_BOOL bVisible = FALSE;
+    FX_FLOAT fThickness = 0;
+    border.Get3DStyle(bVisible, fThickness);
+    if (!bLeft || !bTop || !bRight || !bBottom) {
+      CXFA_StrokeArray strokes;
+      border.GetStrokes(strokes);
+      if (!bTop)
+        fTopInset = GetEdgeThickness(strokes, bVisible, 0);
+      if (!bRight)
+        fRightInset = GetEdgeThickness(strokes, bVisible, 1);
+      if (!bBottom)
+        fBottomInset = GetEdgeThickness(strokes, bVisible, 2);
+      if (!bLeft)
+        fLeftInset = GetEdgeThickness(strokes, bVisible, 3);
+    }
+  }
+  rtUIMargin.Set(fLeftInset, fTopInset, fRightInset, fBottomInset);
+}
+
+int32_t CXFA_WidgetData::GetButtonHighlight() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_Highlight);
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_Button, XFA_ATTRIBUTE_Highlight, XFA_XDPPACKET_Form);
+}
+
+FX_BOOL CXFA_WidgetData::GetButtonRollover(CFX_WideString& wsRollover,
+                                           FX_BOOL& bRichText) {
+  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
+    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    while (pText) {
+      CFX_WideStringC wsName;
+      pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
+      if (wsName == FX_WSTRC(L"rollover")) {
+        pText->TryContent(wsRollover);
+        bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
+        return !wsRollover.IsEmpty();
+      }
+      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetButtonDown(CFX_WideString& wsDown,
+                                       FX_BOOL& bRichText) {
+  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
+    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    while (pText) {
+      CFX_WideStringC wsName;
+      pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
+      if (wsName == FX_WSTRC(L"down")) {
+        pText->TryContent(wsDown);
+        bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
+        return !wsDown.IsEmpty();
+      }
+      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+  }
+  return FALSE;
+}
+
+int32_t CXFA_WidgetData::GetCheckButtonShape() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_Shape);
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Shape, XFA_XDPPACKET_Form);
+}
+
+int32_t CXFA_WidgetData::GetCheckButtonMark() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_Mark);
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Mark, XFA_XDPPACKET_Form);
+}
+
+FX_BOOL CXFA_WidgetData::IsRadioButton() {
+  if (CXFA_Node* pParent = m_pNode->GetNodeItem(XFA_NODEITEM_Parent))
+    return pParent->GetClassID() == XFA_ELEMENT_ExclGroup;
+  return FALSE;
+}
+
+FX_FLOAT CXFA_WidgetData::GetCheckButtonSize() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetMeasure(XFA_ATTRIBUTE_Size).ToUnit(XFA_UNIT_Pt);
+  return XFA_GetAttributeDefaultValue_Measure(
+             XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Size, XFA_XDPPACKET_Form)
+      .ToUnit(XFA_UNIT_Pt);
+}
+
+FX_BOOL CXFA_WidgetData::IsAllowNeutral() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetBoolean(XFA_ATTRIBUTE_AllowNeutral);
+  return XFA_GetAttributeDefaultValue_Boolean(
+      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_AllowNeutral, XFA_XDPPACKET_Form);
+}
+
+XFA_CHECKSTATE CXFA_WidgetData::GetCheckState() {
+  CFX_WideString wsValue = GetRawValue();
+  if (wsValue.IsEmpty())
+    return XFA_CHECKSTATE_Off;
+
+  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
+    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    int32_t i = 0;
+    while (pText) {
+      CFX_WideString wsContent;
+      if (pText->TryContent(wsContent) && (wsContent == wsValue))
+        return (XFA_CHECKSTATE)i;
+
+      i++;
+      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+  }
+  return XFA_CHECKSTATE_Off;
+}
+
+void CXFA_WidgetData::SetCheckState(XFA_CHECKSTATE eCheckState,
+                                    FX_BOOL bNotify) {
+  CXFA_WidgetData exclGroup(GetExclGroupNode());
+  if (exclGroup) {
+    CFX_WideString wsValue;
+    if (eCheckState != XFA_CHECKSTATE_Off) {
+      if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
+        CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+        if (pText)
+          pText->TryContent(wsValue);
+      }
+    }
+    CXFA_Node* pChild =
+        exclGroup.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild);
+    for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      if (pChild->GetClassID() != XFA_ELEMENT_Field)
+        continue;
+
+      CXFA_Node* pItem = pChild->GetChild(0, XFA_ELEMENT_Items);
+      if (!pItem)
+        continue;
+
+      CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
+      if (!pItemchild)
+        continue;
+
+      CFX_WideString text = pItemchild->GetContent();
+      CFX_WideString wsChildValue = text;
+      if (wsValue != text) {
+        pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
+        if (pItemchild)
+          wsChildValue = pItemchild->GetContent();
+        else
+          wsChildValue.Empty();
+      }
+      CXFA_WidgetData ch(pChild);
+      ch.SyncValue(wsChildValue, bNotify);
+    }
+    exclGroup.SyncValue(wsValue, bNotify);
+  } else {
+    CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items);
+    if (!pItems)
+      return;
+
+    int32_t i = -1;
+    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    CFX_WideString wsContent;
+    while (pText) {
+      i++;
+      if (i == eCheckState) {
+        pText->TryContent(wsContent);
+        break;
+      }
+      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+    SyncValue(wsContent, bNotify);
+  }
+}
+
+CXFA_Node* CXFA_WidgetData::GetExclGroupNode() {
+  CXFA_Node* pExcl = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_Parent));
+  if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup)
+    return NULL;
+  return pExcl;
+}
+
+CXFA_Node* CXFA_WidgetData::GetSelectedMember() {
+  CXFA_Node* pSelectedMember = NULL;
+  CFX_WideString wsState = GetRawValue();
+  if (wsState.IsEmpty())
+    return pSelectedMember;
+
+  for (CXFA_Node* pNode = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild));
+       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    CXFA_WidgetData widgetData(pNode);
+    if (widgetData.GetCheckState() == XFA_CHECKSTATE_On) {
+      pSelectedMember = pNode;
+      break;
+    }
+  }
+  return pSelectedMember;
+}
+
+CXFA_Node* CXFA_WidgetData::SetSelectedMember(const CFX_WideStringC& wsName,
+                                              FX_BOOL bNotify) {
+  CXFA_Node* pSelectedMember = NULL;
+  uint32_t nameHash =
+      FX_HashCode_String_GetW(wsName.c_str(), wsName.GetLength());
+  for (CXFA_Node* pNode = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild));
+       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetNameHash() == nameHash) {
+      CXFA_WidgetData widgetData(pNode);
+      widgetData.SetCheckState(XFA_CHECKSTATE_On, bNotify);
+      pSelectedMember = pNode;
+      break;
+    }
+  }
+  return pSelectedMember;
+}
+
+void CXFA_WidgetData::SetSelectedMemberByValue(const CFX_WideStringC& wsValue,
+                                               FX_BOOL bNotify,
+                                               FX_BOOL bScriptModify,
+                                               FX_BOOL bSyncData) {
+  CFX_WideString wsExclGroup;
+  for (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
+       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() != XFA_ELEMENT_Field)
+      continue;
+
+    CXFA_Node* pItem = pNode->GetChild(0, XFA_ELEMENT_Items);
+    if (!pItem)
+      continue;
+
+    CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
+    if (!pItemchild)
+      continue;
+
+    CFX_WideString wsChildValue = pItemchild->GetContent();
+    if (wsValue != wsChildValue) {
+      pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
+      if (pItemchild)
+        wsChildValue = pItemchild->GetContent();
+      else
+        wsChildValue.Empty();
+    } else {
+      wsExclGroup = wsValue;
+    }
+    pNode->SetContent(wsChildValue, wsChildValue, bNotify, bScriptModify,
+                      FALSE);
+  }
+  if (m_pNode) {
+    m_pNode->SetContent(wsExclGroup, wsExclGroup, bNotify, bScriptModify,
+                        bSyncData);
+  }
+}
+
+CXFA_Node* CXFA_WidgetData::GetExclGroupFirstMember() {
+  CXFA_Node* pExcl = GetNode();
+  if (!pExcl)
+    return NULL;
+
+  CXFA_Node* pNode = pExcl->GetNodeItem(XFA_NODEITEM_FirstChild);
+  while (pNode) {
+    if (pNode->GetClassID() == XFA_ELEMENT_Field)
+      return pNode;
+
+    pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_WidgetData::GetExclGroupNextMember(CXFA_Node* pNode) {
+  if (!pNode)
+    return NULL;
+
+  CXFA_Node* pNodeField = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+  while (pNodeField) {
+    if (pNodeField->GetClassID() == XFA_ELEMENT_Field)
+      return pNodeField;
+
+    pNodeField = pNodeField->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return NULL;
+}
+
+int32_t CXFA_WidgetData::GetChoiceListCommitOn() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_CommitOn);
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_CommitOn, XFA_XDPPACKET_Form);
+}
+
+FX_BOOL CXFA_WidgetData::IsChoiceListAllowTextEntry() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetBoolean(XFA_ATTRIBUTE_TextEntry);
+  return XFA_GetAttributeDefaultValue_Boolean(
+      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_TextEntry, XFA_XDPPACKET_Form);
+}
+
+int32_t CXFA_WidgetData::GetChoiceListOpen() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_Open);
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_Open, XFA_XDPPACKET_Form);
+}
+
+FX_BOOL CXFA_WidgetData::IsListBox() {
+  int32_t iOpenMode = GetChoiceListOpen();
+  return (iOpenMode == XFA_ATTRIBUTEENUM_Always ||
+          iOpenMode == XFA_ATTRIBUTEENUM_MultiSelect);
+}
+
+int32_t CXFA_WidgetData::CountChoiceListItems(FX_BOOL bSaveValue) {
+  CXFA_NodeArray pItems;
+  CXFA_Node* pItem = NULL;
+  int32_t iCount = 0;
+  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() != XFA_ELEMENT_Items)
+      continue;
+
+    iCount++;
+    pItems.Add(pNode);
+    if (iCount == 2)
+      break;
+  }
+  if (iCount == 0)
+    return 0;
+
+  pItem = pItems[0];
+  if (iCount > 1) {
+    FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
+    FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
+    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave)
+      pItem = pItems[1];
+  }
+  pItems.RemoveAll();
+  return pItem->CountChildren(XFA_ELEMENT_UNKNOWN);
+}
+
+FX_BOOL CXFA_WidgetData::GetChoiceListItem(CFX_WideString& wsText,
+                                           int32_t nIndex,
+                                           FX_BOOL bSaveValue) {
+  wsText.Empty();
+  CXFA_NodeArray pItemsArray;
+  CXFA_Node* pItems = NULL;
+  int32_t iCount = 0;
+  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() != XFA_ELEMENT_Items)
+      continue;
+
+    iCount++;
+    pItemsArray.Add(pNode);
+    if (iCount == 2)
+      break;
+  }
+  if (iCount == 0)
+    return FALSE;
+
+  pItems = pItemsArray[0];
+  if (iCount > 1) {
+    FX_BOOL bItemOneHasSave = pItemsArray[0]->GetBoolean(XFA_ATTRIBUTE_Save);
+    FX_BOOL bItemTwoHasSave = pItemsArray[1]->GetBoolean(XFA_ATTRIBUTE_Save);
+    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave)
+      pItems = pItemsArray[1];
+  }
+  if (pItems) {
+    CXFA_Node* pItem = pItems->GetChild(nIndex, XFA_ELEMENT_UNKNOWN);
+    if (pItem) {
+      pItem->TryContent(wsText);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+void CXFA_WidgetData::GetChoiceListItems(CFX_WideStringArray& wsTextArray,
+                                         FX_BOOL bSaveValue) {
+  CXFA_NodeArray pItems;
+  CXFA_Node* pItem = NULL;
+  int32_t iCount = 0;
+  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() != XFA_ELEMENT_Items)
+      continue;
+
+    iCount++;
+    pItems.Add(pNode);
+    if (iCount == 2)
+      break;
+  }
+  if (iCount == 0)
+    return;
+
+  pItem = pItems[0];
+  if (iCount > 1) {
+    FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
+    FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
+    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave)
+      pItem = pItems[1];
+  }
+  pItems.RemoveAll();
+  pNode = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling))
+    pNode->TryContent(wsTextArray.Add());
+}
+
+int32_t CXFA_WidgetData::CountSelectedItems() {
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  if (IsListBox() || !IsChoiceListAllowTextEntry())
+    return wsValueArray.GetSize();
+
+  int32_t iSelected = 0;
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  int32_t iValues = wsValueArray.GetSize();
+  for (int32_t i = 0; i < iValues; i++) {
+    int32_t iSaves = wsSaveTextArray.GetSize();
+    for (int32_t j = 0; j < iSaves; j++) {
+      if (wsValueArray[i] == wsSaveTextArray[j]) {
+        iSelected++;
+        break;
+      }
+    }
+  }
+  return iSelected;
+}
+
+int32_t CXFA_WidgetData::GetSelectedItem(int32_t nIndex) {
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  int32_t iSaves = wsSaveTextArray.GetSize();
+  for (int32_t j = 0; j < iSaves; j++) {
+    if (wsValueArray[nIndex] == wsSaveTextArray[j])
+      return j;
+  }
+  return -1;
+}
+
+void CXFA_WidgetData::GetSelectedItems(CFX_Int32Array& iSelArray) {
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  int32_t iValues = wsValueArray.GetSize();
+  if (iValues < 1)
+    return;
+
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  int32_t iSaves = wsSaveTextArray.GetSize();
+  for (int32_t i = 0; i < iValues; i++) {
+    for (int32_t j = 0; j < iSaves; j++) {
+      if (wsValueArray[i] == wsSaveTextArray[j]) {
+        iSelArray.Add(j);
+        break;
+      }
+    }
+  }
+}
+
+void CXFA_WidgetData::GetSelectedItemsValue(
+    CFX_WideStringArray& wsSelTextArray) {
+  CFX_WideString wsValue = GetRawValue();
+  if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
+    if (!wsValue.IsEmpty()) {
+      int32_t iStart = 0;
+      int32_t iLength = wsValue.GetLength();
+      int32_t iEnd = wsValue.Find(L'\n', iStart);
+      iEnd = (iEnd == -1) ? iLength : iEnd;
+      while (iEnd >= iStart) {
+        wsSelTextArray.Add(wsValue.Mid(iStart, iEnd - iStart));
+        iStart = iEnd + 1;
+        if (iStart >= iLength)
+          break;
+
+        iEnd = wsValue.Find(L'\n', iStart);
+        if (iEnd < 0)
+          wsSelTextArray.Add(wsValue.Mid(iStart, iLength - iStart));
+      }
+    }
+  } else {
+    wsSelTextArray.Add(wsValue);
+  }
+}
+
+FX_BOOL CXFA_WidgetData::GetItemState(int32_t nIndex) {
+  if (nIndex < 0)
+    return FALSE;
+
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  if (wsSaveTextArray.GetSize() <= nIndex)
+    return FALSE;
+
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  int32_t iValues = wsValueArray.GetSize();
+  for (int32_t j = 0; j < iValues; j++) {
+    if (wsValueArray[j] == wsSaveTextArray[nIndex])
+      return TRUE;
+  }
+  return FALSE;
+}
+
+void CXFA_WidgetData::SetItemState(int32_t nIndex,
+                                   FX_BOOL bSelected,
+                                   FX_BOOL bNotify,
+                                   FX_BOOL bScriptModify,
+                                   FX_BOOL bSyncData) {
+  if (nIndex < 0)
+    return;
+
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  if (wsSaveTextArray.GetSize() <= nIndex)
+    return;
+
+  int32_t iSel = -1;
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  int32_t iValues = wsValueArray.GetSize();
+  for (int32_t j = 0; j < iValues; j++) {
+    if (wsValueArray[j] == wsSaveTextArray[nIndex]) {
+      iSel = j;
+      break;
+    }
+  }
+  if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
+    if (bSelected) {
+      if (iSel < 0) {
+        CFX_WideString wsValue = GetRawValue();
+        if (!wsValue.IsEmpty()) {
+          wsValue += L"\n";
+        }
+        wsValue += wsSaveTextArray[nIndex];
+        m_pNode->SetContent(wsValue, wsValue, bNotify, bScriptModify,
+                            bSyncData);
+      }
+    } else if (iSel >= 0) {
+      CFX_Int32Array iSelArray;
+      GetSelectedItems(iSelArray);
+      for (int32_t i = 0; i < iSelArray.GetSize(); i++) {
+        if (iSelArray[i] == nIndex) {
+          iSelArray.RemoveAt(i);
+          break;
+        }
+      }
+      SetSelectdItems(iSelArray, bNotify, bScriptModify, bSyncData);
+    }
+  } else {
+    if (bSelected) {
+      if (iSel < 0) {
+        CFX_WideString wsSaveText = wsSaveTextArray[nIndex];
+        CFX_WideString wsFormatText(wsSaveText);
+        GetFormatDataValue(wsSaveText.AsWideStringC(), wsFormatText);
+        m_pNode->SetContent(wsSaveText, wsFormatText, bNotify, bScriptModify,
+                            bSyncData);
+      }
+    } else if (iSel >= 0) {
+      m_pNode->SetContent(CFX_WideString(), CFX_WideString(), bNotify,
+                          bScriptModify, bSyncData);
+    }
+  }
+}
+
+void CXFA_WidgetData::SetSelectdItems(CFX_Int32Array& iSelArray,
+                                      FX_BOOL bNotify,
+                                      FX_BOOL bScriptModify,
+                                      FX_BOOL bSyncData) {
+  CFX_WideString wsValue;
+  int32_t iSize = iSelArray.GetSize();
+  if (iSize >= 1) {
+    CFX_WideStringArray wsSaveTextArray;
+    GetChoiceListItems(wsSaveTextArray, TRUE);
+    CFX_WideString wsItemValue;
+    for (int32_t i = 0; i < iSize; i++) {
+      wsItemValue = (iSize == 1)
+                        ? wsSaveTextArray[iSelArray[i]]
+                        : wsSaveTextArray[iSelArray[i]] + FX_WSTRC(L"\n");
+      wsValue += wsItemValue;
+    }
+  }
+  CFX_WideString wsFormat(wsValue);
+  if (GetChoiceListOpen() != XFA_ATTRIBUTEENUM_MultiSelect)
+    GetFormatDataValue(wsValue.AsWideStringC(), wsFormat);
+
+  m_pNode->SetContent(wsValue, wsFormat, bNotify, bScriptModify, bSyncData);
+}
+
+void CXFA_WidgetData::ClearAllSelections() {
+  CXFA_Node* pBind = m_pNode->GetBindData();
+  if (pBind && GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
+    while (CXFA_Node* pChildNode =
+               pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+      pBind->RemoveChild(pChildNode);
+    }
+  } else {
+    SyncValue(CFX_WideString(), FALSE);
+  }
+}
+
+void CXFA_WidgetData::InsertItem(const CFX_WideString& wsLabel,
+                                 const CFX_WideString& wsValue,
+                                 int32_t nIndex,
+                                 FX_BOOL bNotify) {
+  CFX_WideString wsNewValue(wsValue);
+  if (wsNewValue.IsEmpty())
+    wsNewValue = wsLabel;
+
+  CXFA_NodeArray listitems;
+  int32_t iCount = 0;
+  CXFA_Node* pItemNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItemNode;
+       pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItemNode->GetClassID() != XFA_ELEMENT_Items)
+      continue;
+
+    listitems.Add(pItemNode);
+    iCount++;
+  }
+  if (iCount < 1) {
+    CXFA_Node* pItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
+    m_pNode->InsertChild(-1, pItems);
+    InsertListTextItem(pItems, wsLabel.AsWideStringC(), nIndex);
+    CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
+    m_pNode->InsertChild(-1, pSaveItems);
+    pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
+    InsertListTextItem(pSaveItems, wsNewValue.AsWideStringC(), nIndex);
+  } else if (iCount > 1) {
+    for (int32_t i = 0; i < 2; i++) {
+      CXFA_Node* pNode = listitems[i];
+      FX_BOOL bHasSave = pNode->GetBoolean(XFA_ATTRIBUTE_Save);
+      if (bHasSave)
+        InsertListTextItem(pNode, wsNewValue.AsWideStringC(), nIndex);
+      else
+        InsertListTextItem(pNode, wsLabel.AsWideStringC(), nIndex);
+    }
+  } else {
+    CXFA_Node* pNode = listitems[0];
+    pNode->SetBoolean(XFA_ATTRIBUTE_Save, FALSE);
+    pNode->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Visible);
+    CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
+    m_pNode->InsertChild(-1, pSaveItems);
+    pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
+    pSaveItems->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Hidden);
+    listitems.RemoveAll();
+    CXFA_Node* pListNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+    int32_t i = 0;
+    while (pListNode) {
+      CFX_WideString wsOldValue;
+      pListNode->TryContent(wsOldValue);
+      InsertListTextItem(pSaveItems, wsOldValue.AsWideStringC(), i);
+      i++;
+      pListNode = pListNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+    InsertListTextItem(pNode, wsLabel.AsWideStringC(), nIndex);
+    InsertListTextItem(pSaveItems, wsNewValue.AsWideStringC(), nIndex);
+  }
+  if (!bNotify)
+    return;
+
+  m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
+      this, XFA_WIDGETEVENT_ListItemAdded, (void*)(const FX_WCHAR*)wsLabel,
+      (void*)(const FX_WCHAR*)wsValue, (void*)(uintptr_t)nIndex);
+}
+
+void CXFA_WidgetData::GetItemLabel(const CFX_WideStringC& wsValue,
+                                   CFX_WideString& wsLabel) {
+  int32_t iCount = 0;
+  CXFA_NodeArray listitems;
+  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItems->GetClassID() != XFA_ELEMENT_Items)
+      continue;
+
+    iCount++;
+    listitems.Add(pItems);
+  }
+  if (iCount <= 1) {
+    wsLabel = wsValue;
+  } else {
+    CXFA_Node* pLabelItems = listitems[0];
+    FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
+    CXFA_Node* pSaveItems = NULL;
+    if (bSave) {
+      pSaveItems = pLabelItems;
+      pLabelItems = listitems[1];
+    } else {
+      pSaveItems = listitems[1];
+    }
+    iCount = 0;
+    int32_t iSearch = -1;
+    CFX_WideString wsContent;
+    CXFA_Node* pChildItem = pSaveItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    for (; pChildItem;
+         pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      pChildItem->TryContent(wsContent);
+      if (wsContent == wsValue) {
+        iSearch = iCount;
+        break;
+      }
+      iCount++;
+    }
+    if (iSearch < 0)
+      return;
+    if (CXFA_Node* pText =
+            pLabelItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) {
+      pText->TryContent(wsLabel);
+    }
+  }
+}
+
+void CXFA_WidgetData::GetItemValue(const CFX_WideStringC& wsLabel,
+                                   CFX_WideString& wsValue) {
+  int32_t iCount = 0;
+  CXFA_NodeArray listitems;
+  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItems->GetClassID() != XFA_ELEMENT_Items)
+      continue;
+
+    iCount++;
+    listitems.Add(pItems);
+  }
+  if (iCount <= 1) {
+    wsValue = wsLabel;
+  } else {
+    CXFA_Node* pLabelItems = listitems[0];
+    FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
+    CXFA_Node* pSaveItems = NULL;
+    if (bSave) {
+      pSaveItems = pLabelItems;
+      pLabelItems = listitems[1];
+    } else {
+      pSaveItems = listitems[1];
+    }
+    iCount = 0;
+    int32_t iSearch = -1;
+    CFX_WideString wsContent;
+    CXFA_Node* pChildItem = pLabelItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    for (; pChildItem;
+         pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      pChildItem->TryContent(wsContent);
+      if (wsContent == wsLabel) {
+        iSearch = iCount;
+        break;
+      }
+      iCount++;
+    }
+    if (iSearch < 0)
+      return;
+    if (CXFA_Node* pText = pSaveItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN))
+      pText->TryContent(wsValue);
+  }
+}
+
+FX_BOOL CXFA_WidgetData::DeleteItem(int32_t nIndex,
+                                    FX_BOOL bNotify,
+                                    FX_BOOL bScriptModify,
+                                    FX_BOOL bSyncData) {
+  FX_BOOL bSetValue = FALSE;
+  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItems->GetClassID() != XFA_ELEMENT_Items)
+      continue;
+
+    if (nIndex < 0) {
+      while (CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+        pItems->RemoveChild(pNode);
+      }
+    } else {
+      if (!bSetValue && pItems->GetBoolean(XFA_ATTRIBUTE_Save)) {
+        SetItemState(nIndex, FALSE, TRUE, bScriptModify, bSyncData);
+        bSetValue = TRUE;
+      }
+      int32_t i = 0;
+      CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+      while (pNode) {
+        if (i == nIndex) {
+          pItems->RemoveChild(pNode);
+          break;
+        }
+        i++;
+        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+      }
+    }
+  }
+  if (!bNotify)
+    return TRUE;
+
+  m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
+      this, XFA_WIDGETEVENT_ListItemRemoved, (void*)(uintptr_t)nIndex);
+  return TRUE;
+}
+
+int32_t CXFA_WidgetData::GetHorizontalScrollPolicy() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_HScrollPolicy);
+  return XFA_ATTRIBUTEENUM_Auto;
+}
+
+int32_t CXFA_WidgetData::GetNumberOfCells() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (!pUIChild)
+    return -1;
+  if (CXFA_Node* pNode = pUIChild->GetChild(0, XFA_ELEMENT_Comb))
+    return pNode->GetInteger(XFA_ATTRIBUTE_NumberOfCells);
+  return -1;
+}
+
+CFX_WideString CXFA_WidgetData::GetBarcodeType() {
+  CXFA_Node* pUIChild = GetUIChild();
+  return pUIChild ? pUIChild->GetCData(XFA_ATTRIBUTE_Type) : NULL;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_CharEncoding(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideString wsCharEncoding;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_CharEncoding, wsCharEncoding)) {
+    if (wsCharEncoding.CompareNoCase(L"UTF-16")) {
+      val = CHAR_ENCODING_UNICODE;
+      return TRUE;
+    } else if (wsCharEncoding.CompareNoCase(L"UTF-8")) {
+      val = CHAR_ENCODING_UTF8;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Checksum(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  XFA_ATTRIBUTEENUM eChecksum;
+  if (pUIChild->TryEnum(XFA_ATTRIBUTE_Checksum, eChecksum)) {
+    switch (eChecksum) {
+      case XFA_ATTRIBUTEENUM_None:
+        val = 0;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_Auto:
+        val = 1;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_1mod10:
+        break;
+      case XFA_ATTRIBUTEENUM_1mod10_1mod11:
+        break;
+      case XFA_ATTRIBUTEENUM_2mod10:
+        break;
+      default:
+        break;
+    }
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_DataLength(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideString wsDataLength;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_DataLength, wsDataLength)) {
+    val = FXSYS_wtoi(wsDataLength);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_StartChar(FX_CHAR& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideStringC wsStartEndChar;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_StartChar, wsStartEndChar)) {
+    if (wsStartEndChar.GetLength()) {
+      val = (FX_CHAR)wsStartEndChar.GetAt(0);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_EndChar(FX_CHAR& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideStringC wsStartEndChar;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_EndChar, wsStartEndChar)) {
+    if (wsStartEndChar.GetLength()) {
+      val = (FX_CHAR)wsStartEndChar.GetAt(0);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ECLevel(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideString wsECLevel;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_ErrorCorrectionLevel, wsECLevel)) {
+    val = FXSYS_wtoi(wsECLevel);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleWidth(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CXFA_Measurement mModuleWidthHeight;
+  if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleWidth, mModuleWidthHeight)) {
+    val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleHeight(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CXFA_Measurement mModuleWidthHeight;
+  if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleHeight, mModuleWidthHeight)) {
+    val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_PrintChecksum(FX_BOOL& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  FX_BOOL bPrintCheckDigit;
+  if (pUIChild->TryBoolean(XFA_ATTRIBUTE_PrintCheckDigit, bPrintCheckDigit)) {
+    val = bPrintCheckDigit;
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_TextLocation(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  XFA_ATTRIBUTEENUM eTextLocation;
+  if (pUIChild->TryEnum(XFA_ATTRIBUTE_TextLocation, eTextLocation)) {
+    switch (eTextLocation) {
+      case XFA_ATTRIBUTEENUM_None:
+        val = BC_TEXT_LOC_NONE;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_Above:
+        val = BC_TEXT_LOC_ABOVE;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_Below:
+        val = BC_TEXT_LOC_BELOW;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_AboveEmbedded:
+        val = BC_TEXT_LOC_ABOVEEMBED;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_BelowEmbedded:
+        val = BC_TEXT_LOC_BELOWEMBED;
+        return TRUE;
+      default:
+        break;
+    }
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Truncate(FX_BOOL& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  FX_BOOL bTruncate;
+  if (pUIChild->TryBoolean(XFA_ATTRIBUTE_Truncate, bTruncate)) {
+    val = bTruncate;
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideString wsWideNarrowRatio;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_WideNarrowRatio, wsWideNarrowRatio)) {
+    FX_STRSIZE ptPos = wsWideNarrowRatio.Find(':');
+    FX_FLOAT fRatio = 0;
+    if (ptPos >= 0) {
+      fRatio = (FX_FLOAT)FXSYS_wtoi(wsWideNarrowRatio);
+    } else {
+      int32_t fA, fB;
+      fA = FXSYS_wtoi(wsWideNarrowRatio.Left(ptPos));
+      fB = FXSYS_wtoi(wsWideNarrowRatio.Mid(ptPos + 1));
+      if (fB)
+        fRatio = (FX_FLOAT)fA / fB;
+    }
+    val = fRatio;
+    return TRUE;
+  }
+  return FALSE;
+}
+
+void CXFA_WidgetData::GetPasswordChar(CFX_WideString& wsPassWord) {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    pUIChild->TryCData(XFA_ATTRIBUTE_PasswordChar, wsPassWord);
+  } else {
+    wsPassWord = XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT_PasswordEdit,
+                                                    XFA_ATTRIBUTE_PasswordChar,
+                                                    XFA_XDPPACKET_Form);
+  }
+}
+
+FX_BOOL CXFA_WidgetData::IsMultiLine() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetBoolean(XFA_ATTRIBUTE_MultiLine);
+  return XFA_GetAttributeDefaultValue_Boolean(
+      XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_MultiLine, XFA_XDPPACKET_Form);
+}
+
+int32_t CXFA_WidgetData::GetVerticalScrollPolicy() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild)
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_VScrollPolicy);
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_VScrollPolicy, XFA_XDPPACKET_Form);
+}
+
+int32_t CXFA_WidgetData::GetMaxChars(XFA_ELEMENT& eType) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
+    if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+      switch (pChild->GetClassID()) {
+        case XFA_ELEMENT_Text:
+          eType = XFA_ELEMENT_Text;
+          return pChild->GetInteger(XFA_ATTRIBUTE_MaxChars);
+        case XFA_ELEMENT_ExData: {
+          eType = XFA_ELEMENT_ExData;
+          int32_t iMax = pChild->GetInteger(XFA_ATTRIBUTE_MaxLength);
+          return iMax < 0 ? 0 : iMax;
+        }
+        default:
+          break;
+      }
+    }
+  }
+  return 0;
+}
+
+FX_BOOL CXFA_WidgetData::GetFracDigits(int32_t& iFracDigits) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
+    if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal))
+      return pChild->TryInteger(XFA_ATTRIBUTE_FracDigits, iFracDigits);
+  }
+  iFracDigits = -1;
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetLeadDigits(int32_t& iLeadDigits) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
+    if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal))
+      return pChild->TryInteger(XFA_ATTRIBUTE_LeadDigits, iLeadDigits);
+  }
+  iLeadDigits = -1;
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::SetValue(const CFX_WideString& wsValue,
+                                  XFA_VALUEPICTURE eValueType) {
+  if (wsValue.IsEmpty()) {
+    SyncValue(wsValue, TRUE);
+    return TRUE;
+  }
+  m_bPreNull = m_bIsNull;
+  m_bIsNull = FALSE;
+  CFX_WideString wsNewText(wsValue);
+  CFX_WideString wsPicture;
+  GetPictureContent(wsPicture, eValueType);
+  FX_BOOL bValidate = TRUE;
+  FX_BOOL bSyncData = FALSE;
+  CXFA_Node* pNode = GetUIChild();
+  if (!pNode)
+    return TRUE;
+
+  XFA_ELEMENT uiType = pNode->GetClassID();
+  if (!wsPicture.IsEmpty()) {
+    CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
+    IFX_Locale* pLocale = GetLocal();
+    CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
+    bValidate =
+        widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture);
+    if (bValidate) {
+      widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNewText,
+                                     wsPicture, pLocale, pLocalMgr);
+      wsNewText = widgetValue.GetValue();
+      if (uiType == XFA_ELEMENT_NumericEdit) {
+        int32_t iLeadDigits = 0;
+        int32_t iFracDigits = 0;
+        GetLeadDigits(iLeadDigits);
+        GetFracDigits(iFracDigits);
+        wsNewText = NumericLimit(wsNewText, iLeadDigits, iFracDigits);
+      }
+      bSyncData = TRUE;
+    }
+  } else {
+    if (uiType == XFA_ELEMENT_NumericEdit) {
+      if (wsNewText != FX_WSTRC(L"0")) {
+        int32_t iLeadDigits = 0;
+        int32_t iFracDigits = 0;
+        GetLeadDigits(iLeadDigits);
+        GetFracDigits(iFracDigits);
+        wsNewText = NumericLimit(wsNewText, iLeadDigits, iFracDigits);
+      }
+      bSyncData = TRUE;
+    }
+  }
+  if (uiType != XFA_ELEMENT_NumericEdit || bSyncData)
+    SyncValue(wsNewText, TRUE);
+
+  return bValidate;
+}
+
+FX_BOOL CXFA_WidgetData::GetPictureContent(CFX_WideString& wsPicture,
+                                           XFA_VALUEPICTURE ePicture) {
+  if (ePicture == XFA_VALUEPICTURE_Raw)
+    return FALSE;
+
+  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
+  switch (ePicture) {
+    case XFA_VALUEPICTURE_Display: {
+      if (CXFA_Node* pFormat = m_pNode->GetChild(0, XFA_ELEMENT_Format)) {
+        if (CXFA_Node* pPicture = pFormat->GetChild(0, XFA_ELEMENT_Picture)) {
+          if (pPicture->TryContent(wsPicture))
+            return TRUE;
+        }
+      }
+      CFX_WideString wsDataPicture, wsTimePicture;
+      IFX_Locale* pLocale = GetLocal();
+      if (!pLocale)
+        return FALSE;
+
+      uint32_t dwType = widgetValue.GetType();
+      switch (dwType) {
+        case XFA_VT_DATE:
+          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
+                                  wsPicture);
+          break;
+        case XFA_VT_TIME:
+          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
+                                  wsPicture);
+          break;
+        case XFA_VT_DATETIME:
+          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
+                                  wsDataPicture);
+          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
+                                  wsTimePicture);
+          wsPicture = wsDataPicture + FX_WSTRC(L"T") + wsTimePicture;
+          break;
+        case XFA_VT_DECIMAL:
+        case XFA_VT_FLOAT:
+          break;
+        default:
+          break;
+      }
+      return TRUE;
+    }
+
+    case XFA_VALUEPICTURE_Edit: {
+      CXFA_Node* pUI = m_pNode->GetChild(0, XFA_ELEMENT_Ui);
+      if (pUI) {
+        if (CXFA_Node* pPicture = pUI->GetChild(0, XFA_ELEMENT_Picture)) {
+          if (pPicture->TryContent(wsPicture))
+            return TRUE;
+        }
+      }
+      {
+        CFX_WideString wsDataPicture, wsTimePicture;
+        IFX_Locale* pLocale = GetLocal();
+        if (!pLocale) {
+          return FALSE;
+        }
+        uint32_t dwType = widgetValue.GetType();
+        switch (dwType) {
+          case XFA_VT_DATE:
+            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
+                                    wsPicture);
+            break;
+          case XFA_VT_TIME:
+            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
+                                    wsPicture);
+            break;
+          case XFA_VT_DATETIME:
+            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
+                                    wsDataPicture);
+            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
+                                    wsTimePicture);
+            wsPicture = wsDataPicture + L"T" + wsTimePicture;
+            break;
+          default:
+            break;
+        }
+      }
+      return TRUE;
+    }
+    case XFA_VALUEPICTURE_DataBind: {
+      if (CXFA_Bind bind = GetBind()) {
+        bind.GetPicture(wsPicture);
+        return TRUE;
+      }
+      break;
+    }
+    default:
+      break;
+  }
+  return FALSE;
+}
+
+IFX_Locale* CXFA_WidgetData::GetLocal() {
+  IFX_Locale* pLocale = NULL;
+  if (!m_pNode)
+    return pLocale;
+
+  FX_BOOL bLocale = FALSE;
+  CFX_WideString wsLocaleName;
+  bLocale = m_pNode->GetLocaleName(wsLocaleName);
+  if (bLocale) {
+    if (wsLocaleName == FX_WSTRC(L"ambient")) {
+      pLocale = m_pNode->GetDocument()->GetLocalMgr()->GetDefLocale();
+    } else {
+      pLocale = m_pNode->GetDocument()->GetLocalMgr()->GetLocaleByName(
+          wsLocaleName.AsWideStringC());
+    }
+  }
+  return pLocale;
+}
+
+FX_BOOL CXFA_WidgetData::GetValue(CFX_WideString& wsValue,
+                                  XFA_VALUEPICTURE eValueType) {
+  wsValue = m_pNode->GetContent();
+
+  if (eValueType == XFA_VALUEPICTURE_Display)
+    GetItemLabel(wsValue.AsWideStringC(), wsValue);
+
+  CFX_WideString wsPicture;
+  GetPictureContent(wsPicture, eValueType);
+  CXFA_Node* pNode = GetUIChild();
+  if (!pNode)
+    return TRUE;
+
+  XFA_ELEMENT uiType = GetUIChild()->GetClassID();
+  switch (uiType) {
+    case XFA_ELEMENT_ChoiceList: {
+      if (eValueType == XFA_VALUEPICTURE_Display) {
+        int32_t iSelItemIndex = GetSelectedItem(0);
+        if (iSelItemIndex >= 0) {
+          GetChoiceListItem(wsValue, iSelItemIndex);
+          wsPicture.Empty();
+        }
+      }
+    } break;
+    case XFA_ELEMENT_NumericEdit:
+      if (eValueType != XFA_VALUEPICTURE_Raw && wsPicture.IsEmpty()) {
+        IFX_Locale* pLocale = GetLocal();
+        if (eValueType == XFA_VALUEPICTURE_Display && pLocale) {
+          CFX_WideString wsOutput;
+          NormalizeNumStr(wsValue, wsOutput);
+          FormatNumStr(wsOutput, pLocale, wsOutput);
+          wsValue = wsOutput;
+        }
+      }
+      break;
+    default:
+      break;
+  }
+  if (wsPicture.IsEmpty())
+    return TRUE;
+
+  if (IFX_Locale* pLocale = GetLocal()) {
+    CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
+    CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
+    switch (widgetValue.GetType()) {
+      case XFA_VT_DATE: {
+        CFX_WideString wsDate, wsTime;
+        if (SplitDateTime(wsValue, wsDate, wsTime)) {
+          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
+          if (date.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
+            return TRUE;
+        }
+        break;
+      }
+      case XFA_VT_TIME: {
+        CFX_WideString wsDate, wsTime;
+        if (SplitDateTime(wsValue, wsDate, wsTime)) {
+          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
+          if (time.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
+            return TRUE;
+        }
+        break;
+      }
+      default:
+        break;
+    }
+    widgetValue.FormatPatterns(wsValue, wsPicture, pLocale, eValueType);
+  }
+  return TRUE;
+}
+
+FX_BOOL CXFA_WidgetData::GetNormalizeDataValue(
+    const CFX_WideStringC& wsValue,
+    CFX_WideString& wsNormalizeValue) {
+  wsNormalizeValue = wsValue;
+  if (wsValue.IsEmpty())
+    return TRUE;
+
+  CFX_WideString wsPicture;
+  GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
+  if (wsPicture.IsEmpty())
+    return TRUE;
+
+  FXSYS_assert(GetNode());
+  CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
+  IFX_Locale* pLocale = GetLocal();
+  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
+  if (widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture)) {
+    widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNormalizeValue,
+                                   wsPicture, pLocale, pLocalMgr);
+    wsNormalizeValue = widgetValue.GetValue();
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL CXFA_WidgetData::GetFormatDataValue(const CFX_WideStringC& wsValue,
+                                            CFX_WideString& wsFormatedValue) {
+  wsFormatedValue = wsValue;
+  if (wsValue.IsEmpty())
+    return TRUE;
+
+  CFX_WideString wsPicture;
+  GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
+  if (wsPicture.IsEmpty())
+    return TRUE;
+
+  if (IFX_Locale* pLocale = GetLocal()) {
+    FXSYS_assert(GetNode());
+    CXFA_Node* pNodeValue = GetNode()->GetChild(0, XFA_ELEMENT_Value);
+    if (!pNodeValue)
+      return FALSE;
+
+    CXFA_Node* pValueChild = pNodeValue->GetNodeItem(XFA_NODEITEM_FirstChild);
+    if (!pValueChild)
+      return FALSE;
+
+    int32_t iVTType = XFA_VT_NULL;
+    XFA_ELEMENT eType = pValueChild->GetClassID();
+    switch (eType) {
+      case XFA_ELEMENT_Decimal:
+        iVTType = XFA_VT_DECIMAL;
+        break;
+      case XFA_ELEMENT_Float:
+        iVTType = XFA_VT_FLOAT;
+        break;
+      case XFA_ELEMENT_Date:
+        iVTType = XFA_VT_DATE;
+        break;
+      case XFA_ELEMENT_Time:
+        iVTType = XFA_VT_TIME;
+        break;
+      case XFA_ELEMENT_DateTime:
+        iVTType = XFA_VT_DATETIME;
+        break;
+      case XFA_ELEMENT_Boolean:
+        iVTType = XFA_VT_BOOLEAN;
+        break;
+      case XFA_ELEMENT_Integer:
+        iVTType = XFA_VT_INTEGER;
+        break;
+      case XFA_ELEMENT_Text:
+        iVTType = XFA_VT_TEXT;
+        break;
+      default:
+        iVTType = XFA_VT_NULL;
+        break;
+    }
+    CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
+    CXFA_LocaleValue widgetValue(iVTType, wsValue, pLocalMgr);
+    switch (widgetValue.GetType()) {
+      case XFA_VT_DATE: {
+        CFX_WideString wsDate, wsTime;
+        if (SplitDateTime(wsValue, wsDate, wsTime)) {
+          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
+          if (date.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
+                                  XFA_VALUEPICTURE_DataBind)) {
+            return TRUE;
+          }
+        }
+        break;
+      }
+      case XFA_VT_TIME: {
+        CFX_WideString wsDate, wsTime;
+        if (SplitDateTime(wsValue, wsDate, wsTime)) {
+          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
+          if (time.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
+                                  XFA_VALUEPICTURE_DataBind)) {
+            return TRUE;
+          }
+        }
+        break;
+      }
+      default:
+        break;
+    }
+    widgetValue.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
+                               XFA_VALUEPICTURE_DataBind);
+  }
+  return FALSE;
+}
+
+void CXFA_WidgetData::NormalizeNumStr(const CFX_WideString& wsValue,
+                                      CFX_WideString& wsOutput) {
+  if (wsValue.IsEmpty())
+    return;
+
+  wsOutput = wsValue;
+  wsOutput.TrimLeft('0');
+  int32_t dot_index = wsOutput.Find('.');
+  int32_t iFracDigits = 0;
+  if (!wsOutput.IsEmpty() && dot_index >= 0 &&
+      (!GetFracDigits(iFracDigits) || iFracDigits != -1)) {
+    wsOutput.TrimRight(L"0");
+    wsOutput.TrimRight(L".");
+  }
+  if (wsOutput.IsEmpty() || wsOutput[0] == '.')
+    wsOutput.Insert(0, '0');
+}
+
+void CXFA_WidgetData::FormatNumStr(const CFX_WideString& wsValue,
+                                   IFX_Locale* pLocale,
+                                   CFX_WideString& wsOutput) {
+  if (wsValue.IsEmpty())
+    return;
+
+  CFX_WideString wsSrcNum = wsValue;
+  CFX_WideString wsGroupSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
+  FX_BOOL bNeg = FALSE;
+  if (wsSrcNum[0] == '-') {
+    bNeg = TRUE;
+    wsSrcNum.Delete(0, 1);
+  }
+  int32_t len = wsSrcNum.GetLength();
+  int32_t dot_index = wsSrcNum.Find('.');
+  if (dot_index == -1)
+    dot_index = len;
+
+  int32_t cc = dot_index - 1;
+  if (cc >= 0) {
+    int nPos = dot_index % 3;
+    wsOutput.Empty();
+    for (int32_t i = 0; i < dot_index; i++) {
+      if (i % 3 == nPos && i != 0)
+        wsOutput += wsGroupSymbol;
+
+      wsOutput += wsSrcNum[i];
+    }
+    if (dot_index < len) {
+      CFX_WideString wsSymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
+      wsOutput += wsSymbol;
+      wsOutput += wsSrcNum.Right(len - dot_index - 1);
+    }
+    if (bNeg) {
+      CFX_WideString wsMinusymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
+      wsOutput = wsMinusymbol + wsOutput;
+    }
+  }
+}
+
+void CXFA_WidgetData::SyncValue(const CFX_WideString& wsValue,
+                                FX_BOOL bNotify) {
+  if (!m_pNode)
+    return;
+
+  CFX_WideString wsFormatValue(wsValue);
+  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
+  if (pContainerWidgetData)
+    pContainerWidgetData->GetFormatDataValue(wsValue.AsWideStringC(),
+                                             wsFormatValue);
+
+  m_pNode->SetContent(wsValue, wsFormatValue, bNotify);
+}
+
+void CXFA_WidgetData::InsertListTextItem(CXFA_Node* pItems,
+                                         const CFX_WideStringC& wsText,
+                                         int32_t nIndex) {
+  CXFA_Node* pText = pItems->CreateSamePacketNode(XFA_ELEMENT_Text);
+  pItems->InsertChild(nIndex, pText);
+  pText->SetContent(wsText, wsText, FALSE, FALSE, FALSE);
+}
+
+CFX_WideString CXFA_WidgetData::NumericLimit(const CFX_WideString& wsValue,
+                                             int32_t iLead,
+                                             int32_t iTread) const {
+  if ((iLead == -1) && (iTread == -1))
+    return wsValue;
+
+  CFX_WideString wsRet;
+  int32_t iLead_ = 0, iTread_ = -1;
+  int32_t iCount = wsValue.GetLength();
+  if (iCount == 0)
+    return wsValue;
+
+  int32_t i = 0;
+  if (wsValue[i] == L'-') {
+    wsRet += L'-';
+    i++;
+  }
+  for (; i < iCount; i++) {
+    FX_WCHAR wc = wsValue[i];
+    if (XFA_IsDigit(wc)) {
+      if (iLead >= 0) {
+        iLead_++;
+        if (iLead_ > iLead)
+          return L"0";
+      } else if (iTread_ >= 0) {
+        iTread_++;
+        if (iTread_ > iTread) {
+          if (iTread != -1) {
+            CFX_Decimal wsDeci = CFX_Decimal(wsValue.AsWideStringC());
+            wsDeci.SetScale(iTread);
+            wsRet = wsDeci;
+          }
+          return wsRet;
+        }
+      }
+    } else if (wc == L'.') {
+      iTread_ = 0;
+      iLead = -1;
+    }
+    wsRet += wc;
+  }
+  return wsRet;
+}
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.h b/xfa/fxfa/parser/cxfa_widgetdata.h
new file mode 100644
index 0000000..7b7afd1
--- /dev/null
+++ b/xfa/fxfa/parser/cxfa_widgetdata.h
@@ -0,0 +1,181 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_CXFA_WIDGETDATA_H_
+#define XFA_FXFA_PARSER_CXFA_WIDGETDATA_H_
+
+#include "core/fxcrt/include/fx_string.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_assist.h"
+#include "xfa/fxfa/parser/cxfa_bind.h"
+#include "xfa/fxfa/parser/cxfa_border.h"
+#include "xfa/fxfa/parser/cxfa_calculate.h"
+#include "xfa/fxfa/parser/cxfa_caption.h"
+#include "xfa/fxfa/parser/cxfa_data.h"
+#include "xfa/fxfa/parser/cxfa_font.h"
+#include "xfa/fxfa/parser/cxfa_margin.h"
+#include "xfa/fxfa/parser/cxfa_para.h"
+#include "xfa/fxfa/parser/cxfa_validate.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+
+enum XFA_CHECKSTATE {
+  XFA_CHECKSTATE_On = 0,
+  XFA_CHECKSTATE_Off = 1,
+  XFA_CHECKSTATE_Neutral = 2,
+};
+
+enum XFA_VALUEPICTURE {
+  XFA_VALUEPICTURE_Raw = 0,
+  XFA_VALUEPICTURE_Display,
+  XFA_VALUEPICTURE_Edit,
+  XFA_VALUEPICTURE_DataBind,
+};
+
+class CXFA_Node;
+class IFX_Locale;
+
+class CXFA_WidgetData : public CXFA_Data {
+ public:
+  explicit CXFA_WidgetData(CXFA_Node* pNode);
+
+  CXFA_Node* GetUIChild();
+  XFA_ELEMENT GetUIType();
+  CFX_WideString GetRawValue();
+  int32_t GetAccess(FX_BOOL bTemplate = FALSE);
+  int32_t GetRotate();
+  CXFA_Border GetBorder(FX_BOOL bModified = FALSE);
+  CXFA_Caption GetCaption(FX_BOOL bModified = FALSE);
+  CXFA_Font GetFont(FX_BOOL bModified = FALSE);
+  CXFA_Margin GetMargin(FX_BOOL bModified = FALSE);
+  CXFA_Para GetPara(FX_BOOL bModified = FALSE);
+  void GetEventList(CXFA_NodeArray& events);
+  int32_t GetEventByActivity(int32_t iActivity,
+                             CXFA_NodeArray& events,
+                             FX_BOOL bIsFormReady = FALSE);
+  CXFA_Value GetDefaultValue(FX_BOOL bModified = FALSE);
+  CXFA_Value GetFormValue(FX_BOOL bModified = FALSE);
+  CXFA_Calculate GetCalculate(FX_BOOL bModified = FALSE);
+  CXFA_Validate GetValidate(FX_BOOL bModified = FALSE);
+  CXFA_Bind GetBind(FX_BOOL bModified = FALSE);
+  CXFA_Assist GetAssist(FX_BOOL bModified = FALSE);
+  uint32_t GetRelevantStatus();
+  FX_BOOL GetWidth(FX_FLOAT& fWidth);
+  FX_BOOL GetHeight(FX_FLOAT& fHeight);
+  FX_BOOL GetMinWidth(FX_FLOAT& fMinWidth);
+  FX_BOOL GetMinHeight(FX_FLOAT& fMinHeight);
+  FX_BOOL GetMaxWidth(FX_FLOAT& fMaxWidth);
+  FX_BOOL GetMaxHeight(FX_FLOAT& fMaxHeight);
+  CXFA_Border GetUIBorder(FX_BOOL bModified = FALSE);
+  CXFA_Margin GetUIMargin(FX_BOOL bModified = FALSE);
+  void GetUIMargin(CFX_RectF& rtUIMargin);
+  int32_t GetButtonHighlight();
+  FX_BOOL GetButtonRollover(CFX_WideString& wsRollover, FX_BOOL& bRichText);
+  FX_BOOL GetButtonDown(CFX_WideString& wsDown, FX_BOOL& bRichText);
+  int32_t GetCheckButtonShape();
+  int32_t GetCheckButtonMark();
+  FX_FLOAT GetCheckButtonSize();
+  FX_BOOL IsAllowNeutral();
+  FX_BOOL IsRadioButton();
+  XFA_CHECKSTATE GetCheckState();
+  void SetCheckState(XFA_CHECKSTATE eCheckState, FX_BOOL bNotify = TRUE);
+  CXFA_Node* GetExclGroupNode();
+  CXFA_Node* GetSelectedMember();
+  CXFA_Node* SetSelectedMember(const CFX_WideStringC& wsName,
+                               FX_BOOL bNotify = TRUE);
+  void SetSelectedMemberByValue(const CFX_WideStringC& wsValue,
+                                FX_BOOL bNotify = TRUE,
+                                FX_BOOL bScriptModify = FALSE,
+                                FX_BOOL bSyncData = TRUE);
+  CXFA_Node* GetExclGroupFirstMember();
+  CXFA_Node* GetExclGroupNextMember(CXFA_Node* pNode);
+  int32_t GetChoiceListCommitOn();
+  FX_BOOL IsChoiceListAllowTextEntry();
+  int32_t GetChoiceListOpen();
+  FX_BOOL IsListBox();
+  int32_t CountChoiceListItems(FX_BOOL bSaveValue = FALSE);
+  FX_BOOL GetChoiceListItem(CFX_WideString& wsText,
+                            int32_t nIndex,
+                            FX_BOOL bSaveValue = FALSE);
+  void GetChoiceListItems(CFX_WideStringArray& wsTextArray,
+                          FX_BOOL bSaveValue = FALSE);
+  int32_t CountSelectedItems();
+  int32_t GetSelectedItem(int32_t nIndex = 0);
+  void GetSelectedItems(CFX_Int32Array& iSelArray);
+  void GetSelectedItemsValue(CFX_WideStringArray& wsSelTextArray);
+  FX_BOOL GetItemState(int32_t nIndex);
+  void SetItemState(int32_t nIndex,
+                    FX_BOOL bSelected,
+                    FX_BOOL bNotify = FALSE,
+                    FX_BOOL bScriptModify = FALSE,
+                    FX_BOOL bSyncData = TRUE);
+  void SetSelectdItems(CFX_Int32Array& iSelArray,
+                       FX_BOOL bNotify = FALSE,
+                       FX_BOOL bScriptModify = FALSE,
+                       FX_BOOL bSyncData = TRUE);
+  void ClearAllSelections();
+  void InsertItem(const CFX_WideString& wsLabel,
+                  const CFX_WideString& wsValue,
+                  int32_t nIndex = -1,
+                  FX_BOOL bNotify = FALSE);
+  void GetItemLabel(const CFX_WideStringC& wsValue, CFX_WideString& wsLabel);
+  void GetItemValue(const CFX_WideStringC& wsLabel, CFX_WideString& wsValue);
+  FX_BOOL DeleteItem(int32_t nIndex,
+                     FX_BOOL bNotify = FALSE,
+                     FX_BOOL bScriptModify = FALSE,
+                     FX_BOOL bSyncData = TRUE);
+  int32_t GetHorizontalScrollPolicy();
+  int32_t GetNumberOfCells();
+  FX_BOOL SetValue(const CFX_WideString& wsValue, XFA_VALUEPICTURE eValueType);
+  FX_BOOL GetPictureContent(CFX_WideString& wsPicture,
+                            XFA_VALUEPICTURE ePicture);
+  IFX_Locale* GetLocal();
+  FX_BOOL GetValue(CFX_WideString& wsValue, XFA_VALUEPICTURE eValueType);
+  FX_BOOL GetNormalizeDataValue(const CFX_WideStringC& wsValue,
+                                CFX_WideString& wsNormalizeValue);
+  FX_BOOL GetFormatDataValue(const CFX_WideStringC& wsValue,
+                             CFX_WideString& wsFormatedValue);
+  void NormalizeNumStr(const CFX_WideString& wsValue, CFX_WideString& wsOutput);
+  CFX_WideString GetBarcodeType();
+  FX_BOOL GetBarcodeAttribute_CharEncoding(int32_t& val);
+  FX_BOOL GetBarcodeAttribute_Checksum(int32_t& val);
+  FX_BOOL GetBarcodeAttribute_DataLength(int32_t& val);
+  FX_BOOL GetBarcodeAttribute_StartChar(FX_CHAR& val);
+  FX_BOOL GetBarcodeAttribute_EndChar(FX_CHAR& val);
+  FX_BOOL GetBarcodeAttribute_ECLevel(int32_t& val);
+  FX_BOOL GetBarcodeAttribute_ModuleWidth(int32_t& val);
+  FX_BOOL GetBarcodeAttribute_ModuleHeight(int32_t& val);
+  FX_BOOL GetBarcodeAttribute_PrintChecksum(FX_BOOL& val);
+  FX_BOOL GetBarcodeAttribute_TextLocation(int32_t& val);
+  FX_BOOL GetBarcodeAttribute_Truncate(FX_BOOL& val);
+  FX_BOOL GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT& val);
+  void GetPasswordChar(CFX_WideString& wsPassWord);
+  FX_BOOL IsMultiLine();
+  int32_t GetVerticalScrollPolicy();
+  int32_t GetMaxChars(XFA_ELEMENT& eType);
+  FX_BOOL GetFracDigits(int32_t& iFracDigits);
+  FX_BOOL GetLeadDigits(int32_t& iLeadDigits);
+
+  CFX_WideString NumericLimit(const CFX_WideString& wsValue,
+                              int32_t iLead,
+                              int32_t iTread) const;
+
+  FX_BOOL m_bIsNull;
+  FX_BOOL m_bPreNull;
+
+ protected:
+  void SyncValue(const CFX_WideString& wsValue, FX_BOOL bNotify);
+  void InsertListTextItem(CXFA_Node* pItems,
+                          const CFX_WideStringC& wsText,
+                          int32_t nIndex = -1);
+  void FormatNumStr(const CFX_WideString& wsValue,
+                    IFX_Locale* pLocale,
+                    CFX_WideString& wsOutput);
+
+  CXFA_Node* m_pUiChildNode;
+  XFA_ELEMENT m_eUIType;
+};
+
+#endif  // XFA_FXFA_PARSER_CXFA_WIDGETDATA_H_
diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
index 2217b94..f812d03 100644
--- a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
+++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
@@ -9,6 +9,7 @@
 #include "core/fxcrt/include/fx_ext.h"
 #include "xfa/fde/xml/fde_xml_imp.h"
 #include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/cxfa_occur.h"
 #include "xfa/fxfa/parser/xfa_basic_imp.h"
 #include "xfa/fxfa/parser/xfa_docdata.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
diff --git a/xfa/fxfa/parser/xfa_layout_itemlayout.cpp b/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
index 8278ce9..d680128 100644
--- a/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
+++ b/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
@@ -12,6 +12,7 @@
 #include "xfa/fgas/crt/fgas_algorithm.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/cxfa_occur.h"
 #include "xfa/fxfa/parser/xfa_docdata.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
 #include "xfa/fxfa/parser/xfa_document.h"
diff --git a/xfa/fxfa/parser/xfa_localemgr.h b/xfa/fxfa/parser/xfa_localemgr.h
index 62b8c67..2bdd1dd 100644
--- a/xfa/fxfa/parser/xfa_localemgr.h
+++ b/xfa/fxfa/parser/xfa_localemgr.h
@@ -10,7 +10,6 @@
 #include "xfa/fgas/localization/fgas_datetime.h"
 #include "xfa/fgas/localization/fgas_locale.h"
 #include "xfa/fxfa/parser/xfa_localemgr.h"
-#include "xfa/include/fxfa/fxfa_objectacc.h"
 
 class CXFA_Node;
 class IFX_Locale;
diff --git a/xfa/fxfa/parser/xfa_localevalue.h b/xfa/fxfa/parser/xfa_localevalue.h
index bd88b0c..912af93 100644
--- a/xfa/fxfa/parser/xfa_localevalue.h
+++ b/xfa/fxfa/parser/xfa_localevalue.h
@@ -7,7 +7,9 @@
 #ifndef XFA_FXFA_PARSER_XFA_LOCALEVALUE_H_
 #define XFA_FXFA_PARSER_XFA_LOCALEVALUE_H_
 
-#include "xfa/include/fxfa/fxfa_objectacc.h"
+#include "core/fxcrt/include/fx_string.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fxfa/parser/cxfa_widgetdata.h"
 
 class IFX_Locale;
 class CFX_Unitime;
diff --git a/xfa/fxfa/parser/xfa_object.h b/xfa/fxfa/parser/xfa_object.h
index 3279941..4361eb7 100644
--- a/xfa/fxfa/parser/xfa_object.h
+++ b/xfa/fxfa/parser/xfa_object.h
@@ -87,6 +87,7 @@
   CXFA_Document* const m_pDocument;
   uint32_t m_uFlags;
 };
+using CXFA_ObjArray = CFX_ArrayTemplate<CXFA_Object*>;
 
 #define XFA_NODEFILTER_Children 0x01
 #define XFA_NODEFILTER_Properties 0x02
diff --git a/xfa/fxfa/parser/xfa_object_imp.cpp b/xfa/fxfa/parser/xfa_object_imp.cpp
index 8be5746..d078423 100644
--- a/xfa/fxfa/parser/xfa_object_imp.cpp
+++ b/xfa/fxfa/parser/xfa_object_imp.cpp
@@ -12,6 +12,7 @@
 #include "xfa/fgas/crt/fgas_system.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/cxfa_occur.h"
 #include "xfa/fxfa/parser/xfa_basic_imp.h"
 #include "xfa/fxfa/parser/xfa_docdata.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
@@ -2009,7 +2010,8 @@
       int32_t iFracDigits = 0;
       pWidgetData->GetLeadDigits(iLeadDigits);
       pWidgetData->GetFracDigits(iFracDigits);
-      wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
+      wsNewText =
+          pWidgetData->NumericLimit(wsNewText, iLeadDigits, iFracDigits);
     }
     CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData();
     CFX_WideString wsFormatText(wsNewText);
diff --git a/xfa/fxfa/parser/xfa_objectacc_imp.cpp b/xfa/fxfa/parser/xfa_objectacc_imp.cpp
deleted file mode 100644
index c0f281d..0000000
--- a/xfa/fxfa/parser/xfa_objectacc_imp.cpp
+++ /dev/null
@@ -1,2659 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/fxcrt/include/fx_ext.h"
-#include "xfa/fxbarcode/include/BC_Library.h"
-#include "xfa/fxfa/app/xfa_ffnotify.h"
-#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/fxfa/parser/xfa_docdata.h"
-#include "xfa/fxfa/parser/xfa_doclayout.h"
-#include "xfa/fxfa/parser/xfa_document.h"
-#include "xfa/fxfa/parser/xfa_localemgr.h"
-#include "xfa/fxfa/parser/xfa_localevalue.h"
-#include "xfa/fxfa/parser/xfa_object.h"
-#include "xfa/fxfa/parser/xfa_parser.h"
-#include "xfa/fxfa/parser/xfa_script.h"
-#include "xfa/fxfa/parser/xfa_utils.h"
-
-static FX_ARGB XFA_WStringToColor(const CFX_WideStringC& wsValue) {
-  uint8_t r = 0, g = 0, b = 0;
-  if (wsValue.GetLength() == 0) {
-    return 0xff000000;
-  }
-  int cc = 0;
-  const FX_WCHAR* str = wsValue.c_str();
-  int len = wsValue.GetLength();
-  while (XFA_IsSpace(str[cc]) && cc < len) {
-    cc++;
-  }
-  if (cc >= len) {
-    return 0xff000000;
-  }
-  while (cc < len) {
-    if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
-      break;
-    }
-    r = r * 10 + str[cc] - '0';
-    cc++;
-  }
-  if (cc < len && str[cc] == ',') {
-    cc++;
-    while (XFA_IsSpace(str[cc]) && cc < len) {
-      cc++;
-    }
-    while (cc < len) {
-      if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
-        break;
-      }
-      g = g * 10 + str[cc] - '0';
-      cc++;
-    }
-    if (cc < len && str[cc] == ',') {
-      cc++;
-      while (XFA_IsSpace(str[cc]) && cc < len) {
-        cc++;
-      }
-      while (cc < len) {
-        if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
-          break;
-        }
-        b = b * 10 + str[cc] - '0';
-        cc++;
-      }
-    }
-  }
-  return (0xff << 24) | (r << 16) | (g << 8) | b;
-}
-XFA_ELEMENT CXFA_Data::GetClassID() const {
-  return m_pNode ? m_pNode->GetClassID() : XFA_ELEMENT_UNKNOWN;
-}
-FX_BOOL CXFA_Data::TryMeasure(XFA_ATTRIBUTE eAttr,
-                              FX_FLOAT& fValue,
-                              FX_BOOL bUseDefault) const {
-  CXFA_Measurement ms;
-  if (m_pNode->TryMeasure(eAttr, ms, bUseDefault)) {
-    fValue = ms.ToUnit(XFA_UNIT_Pt);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_Data::SetMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT fValue) {
-  CXFA_Measurement ms(fValue, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(eAttr, ms);
-}
-CXFA_Fill::CXFA_Fill(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-CXFA_Fill::~CXFA_Fill() {}
-int32_t CXFA_Fill::GetPresence() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
-}
-void CXFA_Fill::SetColor(FX_ARGB color) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
-  CFX_WideString wsColor;
-  int a, r, g, b;
-  ArgbDecode(color, a, r, g, b);
-  wsColor.Format(L"%d,%d,%d", r, g, b);
-  pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
-}
-FX_ARGB CXFA_Fill::GetColor(FX_BOOL bText) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    if (pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE)) {
-      return XFA_WStringToColor(wsColor);
-    }
-  }
-  if (bText) {
-    return 0xFF000000;
-  }
-  return 0xFFFFFFFF;
-}
-int32_t CXFA_Fill::GetFillType() {
-  CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  while (pChild) {
-    int32_t eType = pChild->GetClassID();
-    if (eType != XFA_ELEMENT_Color && eType != XFA_ELEMENT_Extras) {
-      return eType;
-    }
-    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return XFA_ELEMENT_Solid;
-}
-int32_t CXFA_Fill::GetPattern(FX_ARGB& foreColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern);
-  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
-    foreColor = XFA_WStringToColor(wsColor);
-  } else {
-    foreColor = 0xFF000000;
-  }
-  return pNode->GetEnum(XFA_ATTRIBUTE_Type);
-}
-int32_t CXFA_Fill::GetStipple(FX_ARGB& stippleColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple);
-  int32_t eAttr = 50;
-  pNode->TryInteger(XFA_ATTRIBUTE_Rate, eAttr);
-  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
-    stippleColor = XFA_WStringToColor(wsColor);
-  } else {
-    stippleColor = 0xFF000000;
-  }
-  return eAttr;
-}
-int32_t CXFA_Fill::GetLinear(FX_ARGB& endColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear);
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToRight;
-  pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
-  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
-    endColor = XFA_WStringToColor(wsColor);
-  } else {
-    endColor = 0xFF000000;
-  }
-  return eAttr;
-}
-int32_t CXFA_Fill::GetRadial(FX_ARGB& endColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial);
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToEdge;
-  pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
-  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
-    endColor = XFA_WStringToColor(wsColor);
-  } else {
-    endColor = 0xFF000000;
-  }
-  return eAttr;
-}
-CXFA_Margin::CXFA_Margin(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-FX_BOOL CXFA_Margin::GetLeftInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
-  fInset = fDefInset;
-  return TryMeasure(XFA_ATTRIBUTE_LeftInset, fInset);
-}
-FX_BOOL CXFA_Margin::GetTopInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
-  fInset = fDefInset;
-  return TryMeasure(XFA_ATTRIBUTE_TopInset, fInset);
-}
-FX_BOOL CXFA_Margin::GetRightInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
-  fInset = fDefInset;
-  return TryMeasure(XFA_ATTRIBUTE_RightInset, fInset);
-}
-FX_BOOL CXFA_Margin::GetBottomInset(FX_FLOAT& fInset,
-                                    FX_FLOAT fDefInset) const {
-  fInset = fDefInset;
-  return TryMeasure(XFA_ATTRIBUTE_BottomInset, fInset);
-}
-CXFA_Font::CXFA_Font(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-FX_FLOAT CXFA_Font::GetBaselineShift() {
-  return m_pNode->GetMeasure(XFA_ATTRIBUTE_BaselineShift).ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Font::GetHorizontalScale() {
-  CFX_WideString wsValue;
-  m_pNode->TryCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue);
-  int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
-  return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
-}
-FX_FLOAT CXFA_Font::GetVerticalScale() {
-  CFX_WideString wsValue;
-  m_pNode->TryCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue);
-  int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
-  return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
-}
-FX_FLOAT CXFA_Font::GetLetterSpacing() {
-  CFX_WideStringC wsValue;
-  if (!m_pNode->TryCData(XFA_ATTRIBUTE_LetterSpacing, wsValue)) {
-    return 0;
-  }
-  CXFA_Measurement ms(wsValue);
-  if (ms.GetUnit() == XFA_UNIT_Em) {
-    return ms.GetValue() * GetFontSize();
-  }
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-int32_t CXFA_Font::GetLineThrough() {
-  int32_t iValue = 0;
-  m_pNode->TryInteger(XFA_ATTRIBUTE_LineThrough, iValue);
-  return iValue;
-}
-int32_t CXFA_Font::GetUnderline() {
-  int32_t iValue = 0;
-  m_pNode->TryInteger(XFA_ATTRIBUTE_Underline, iValue);
-  return iValue;
-}
-int32_t CXFA_Font::GetUnderlinePeriod() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_UnderlinePeriod, eAttr);
-  return eAttr;
-}
-FX_FLOAT CXFA_Font::GetFontSize() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_Size, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-void CXFA_Font::GetTypeface(CFX_WideStringC& wsTypeFace) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Typeface, wsTypeFace);
-}
-FX_BOOL CXFA_Font::IsBold() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Weight, eAttr);
-  return eAttr == XFA_ATTRIBUTEENUM_Bold;
-}
-FX_BOOL CXFA_Font::IsItalic() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Posture, eAttr);
-  return eAttr == XFA_ATTRIBUTEENUM_Italic;
-}
-void CXFA_Font::SetColor(FX_ARGB color) {
-  CXFA_Fill fill(m_pNode->GetProperty(0, XFA_ELEMENT_Fill));
-  fill.SetColor(color);
-}
-FX_ARGB CXFA_Font::GetColor() {
-  CXFA_Fill fill(m_pNode->GetChild(0, XFA_ELEMENT_Fill));
-  return fill ? fill.GetColor(TRUE) : 0xFF000000;
-}
-CXFA_Caption::CXFA_Caption(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Caption::GetPresence() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Visible;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Presence, eAttr);
-  return eAttr;
-}
-int32_t CXFA_Caption::GetPlacementType() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Placement, eAttr);
-  return eAttr;
-}
-FX_FLOAT CXFA_Caption::GetReserve() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_Reserve, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-CXFA_Margin CXFA_Caption::GetMargin() {
-  return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin) : NULL);
-}
-CXFA_Font CXFA_Caption::GetFont() {
-  return CXFA_Font(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Font) : NULL);
-}
-CXFA_Value CXFA_Caption::GetValue() {
-  return CXFA_Value(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Value) : NULL);
-}
-CXFA_Para::CXFA_Para(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Para::GetHorizontalAlign() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_HAlign, eAttr);
-  return eAttr;
-}
-int32_t CXFA_Para::GetVerticalAlign() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Top;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_VAlign, eAttr);
-  return eAttr;
-}
-FX_FLOAT CXFA_Para::GetLineHeight() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_LineHeight, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetMarginLeft() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginLeft, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetMarginRight() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginRight, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetSpaceAbove() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceAbove, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetSpaceBelow() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceBelow, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetTextIndent() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_TextIndent, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-CXFA_Event::CXFA_Event(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Event::GetActivity() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Activity);
-}
-int32_t CXFA_Event::GetEventType() {
-  CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  while (pChild) {
-    int32_t eType = pChild->GetClassID();
-    if (eType != XFA_ELEMENT_Extras) {
-      return eType;
-    }
-    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return XFA_ELEMENT_UNKNOWN;
-}
-void CXFA_Event::GetRef(CFX_WideStringC& wsRef) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
-}
-CXFA_Script CXFA_Event::GetScript() {
-  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
-}
-CXFA_Submit CXFA_Event::GetSubmit() {
-  return CXFA_Submit(m_pNode->GetChild(0, XFA_ELEMENT_Submit));
-}
-void CXFA_Event::GetSignDataTarget(CFX_WideString& wsTarget) {
-  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData)) {
-    CFX_WideStringC wsCData;
-    pNode->TryCData(XFA_ATTRIBUTE_Target, wsCData);
-    wsTarget = wsCData;
-  }
-}
-CXFA_Script::CXFA_Script(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-XFA_SCRIPTTYPE CXFA_Script::GetContentType() {
-  CFX_WideStringC cData;
-  if (m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, cData, FALSE)) {
-    if (cData == FX_WSTRC(L"application/x-javascript")) {
-      return XFA_SCRIPTTYPE_Javascript;
-    } else if (cData == FX_WSTRC(L"application/x-formcalc")) {
-      return XFA_SCRIPTTYPE_Formcalc;
-    } else {
-      return XFA_SCRIPTTYPE_Unkown;
-    }
-  }
-  return XFA_SCRIPTTYPE_Formcalc;
-}
-int32_t CXFA_Script::GetRunAt() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_RunAt);
-}
-void CXFA_Script::GetExpression(CFX_WideString& wsExpression) {
-  m_pNode->TryContent(wsExpression);
-}
-CXFA_Submit::CXFA_Submit(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-FX_BOOL CXFA_Submit::IsSubmitEmbedPDF() {
-  return m_pNode->GetBoolean(XFA_ATTRIBUTE_EmbedPDF);
-}
-int32_t CXFA_Submit::GetSubmitFormat() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Format);
-}
-void CXFA_Submit::GetSubmitTarget(CFX_WideStringC& wsTarget) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Target, wsTarget);
-}
-void CXFA_Submit::GetSubmitXDPContent(CFX_WideStringC& wsContent) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_XdpContent, wsContent);
-}
-XFA_ELEMENT CXFA_Value::GetChildValueClassID() {
-  if (!m_pNode) {
-    return XFA_ELEMENT_UNKNOWN;
-  }
-  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-    return pNode->GetClassID();
-  }
-  return XFA_ELEMENT_UNKNOWN;
-}
-FX_BOOL CXFA_Value::GetChildValueContent(CFX_WideString& wsContent) {
-  if (!m_pNode) {
-    return FALSE;
-  }
-  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-    return pNode->TryContent(wsContent);
-  }
-  return FALSE;
-}
-CXFA_Arc CXFA_Value::GetArc() {
-  return CXFA_Arc(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                          : nullptr);
-}
-CXFA_Line CXFA_Value::GetLine() {
-  return CXFA_Line(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                           : nullptr);
-}
-CXFA_Rectangle CXFA_Value::GetRectangle() {
-  return CXFA_Rectangle(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                                : nullptr);
-}
-CXFA_Text CXFA_Value::GetText() {
-  return CXFA_Text(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                           : nullptr);
-}
-CXFA_ExData CXFA_Value::GetExData() {
-  return CXFA_ExData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                             : nullptr);
-}
-CXFA_Image CXFA_Value::GetImage() {
-  return CXFA_Image(
-      m_pNode ? (m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : nullptr,
-      TRUE);
-}
-int32_t CXFA_Line::GetHand() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
-}
-FX_BOOL CXFA_Line::GetSlop() {
-  XFA_ATTRIBUTEENUM eSlop = m_pNode->GetEnum(XFA_ATTRIBUTE_Slope);
-  return eSlop == XFA_ATTRIBUTEENUM_Slash;
-}
-CXFA_Edge CXFA_Line::GetEdge() {
-  return CXFA_Edge(m_pNode->GetChild(0, XFA_ELEMENT_Edge));
-}
-CXFA_Text::CXFA_Text(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-void CXFA_Text::GetContent(CFX_WideString& wsText) {
-  m_pNode->TryContent(wsText);
-}
-CXFA_ExData::CXFA_ExData(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-FX_BOOL CXFA_ExData::SetContentType(const CFX_WideString& wsContentType) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-}
-CXFA_Image::CXFA_Image(CXFA_Node* pNode, FX_BOOL bDefValue)
-    : CXFA_Data(pNode), m_bDefValue(bDefValue) {}
-int32_t CXFA_Image::GetAspect() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Aspect);
-}
-FX_BOOL CXFA_Image::GetContentType(CFX_WideString& wsContentType) {
-  return m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-}
-FX_BOOL CXFA_Image::GetHref(CFX_WideString& wsHref) {
-  if (m_bDefValue) {
-    return m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref);
-  }
-  return m_pNode->GetAttribute(FX_WSTRC(L"href"), wsHref);
-}
-int32_t CXFA_Image::GetTransferEncoding() {
-  if (m_bDefValue) {
-    return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding);
-  }
-  return XFA_ATTRIBUTEENUM_Base64;
-}
-FX_BOOL CXFA_Image::GetContent(CFX_WideString& wsText) {
-  return m_pNode->TryContent(wsText);
-}
-FX_BOOL CXFA_Image::SetContentType(const CFX_WideString& wsContentType) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-}
-FX_BOOL CXFA_Image::SetHref(const CFX_WideString& wsHref) {
-  if (m_bDefValue) {
-    return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref);
-  }
-  return m_pNode->SetAttribute(XFA_ATTRIBUTE_Href, wsHref.AsWideStringC());
-}
-FX_BOOL CXFA_Image::SetTransferEncoding(int32_t iTransferEncoding) {
-  if (m_bDefValue) {
-    return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding,
-                            (XFA_ATTRIBUTEENUM)iTransferEncoding);
-  }
-  return TRUE;
-}
-CXFA_Calculate::CXFA_Calculate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Calculate::GetOverride() {
-  XFA_ATTRIBUTEENUM eAtt = XFA_ATTRIBUTEENUM_Error;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Override, eAtt, FALSE);
-  return eAtt;
-}
-CXFA_Script CXFA_Calculate::GetScript() {
-  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
-}
-void CXFA_Calculate::GetMessageText(CFX_WideString& wsMessage) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message)) {
-    CXFA_Text text(pNode->GetChild(0, XFA_ELEMENT_Text));
-    if (text) {
-      text.GetContent(wsMessage);
-    }
-  }
-}
-CXFA_Validate::CXFA_Validate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Validate::GetFormatTest() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_FormatTest);
-}
-FX_BOOL CXFA_Validate::SetTestValue(int32_t iType,
-                                    CFX_WideString& wsValue,
-                                    XFA_ATTRIBUTEENUM eName) {
-  const XFA_ATTRIBUTEENUMINFO* pInfo =
-      XFA_GetAttributeEnumByName(wsValue.AsWideStringC());
-  if (pInfo) {
-    eName = pInfo->eName;
-  }
-  m_pNode->SetEnum((XFA_ATTRIBUTE)iType, eName, FALSE);
-  return TRUE;
-}
-FX_BOOL CXFA_Validate::SetNullTest(CFX_WideString wsValue) {
-  return SetTestValue(XFA_ATTRIBUTE_NullTest, wsValue,
-                      XFA_ATTRIBUTEENUM_Disabled);
-}
-int32_t CXFA_Validate::GetNullTest() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_NullTest);
-}
-int32_t CXFA_Validate::GetScriptTest() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_ScriptTest);
-}
-void CXFA_Validate::GetMessageText(CFX_WideString& wsMessage,
-                                   const CFX_WideStringC& wsMessageType) {
-  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, FALSE)) {
-    CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pItemNode;
-         pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      if (pItemNode->GetClassID() != XFA_ELEMENT_Text) {
-        continue;
-      }
-      CFX_WideStringC wsName;
-      pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
-      if (wsName.IsEmpty() || wsName == wsMessageType) {
-        pItemNode->TryContent(wsMessage);
-        return;
-      }
-    }
-  }
-}
-void CXFA_Validate::SetFormatMessageText(CFX_WideString wsMessage) {
-  SetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
-}
-void CXFA_Validate::GetFormatMessageText(CFX_WideString& wsMessage) {
-  GetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
-}
-void CXFA_Validate::SetNullMessageText(CFX_WideString wsMessage) {
-  SetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
-}
-void CXFA_Validate::GetNullMessageText(CFX_WideString& wsMessage) {
-  GetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
-}
-void CXFA_Validate::SetMessageText(CFX_WideString& wsMessage,
-                                   const CFX_WideStringC& wsMessageType) {
-  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, TRUE)) {
-    CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pItemNode;
-         pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      if (pItemNode->GetClassID() != XFA_ELEMENT_Text) {
-        continue;
-      }
-      CFX_WideStringC wsName;
-      pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
-      if (wsName.IsEmpty() || wsName == wsMessageType) {
-        pItemNode->SetContent(wsMessage, wsMessage, FALSE);
-        return;
-      }
-    }
-    CXFA_Node* pTextNode = pNode->CreateSamePacketNode(XFA_ELEMENT_Text);
-    pNode->InsertChild(pTextNode);
-    pTextNode->SetCData(XFA_ATTRIBUTE_Name, wsMessageType, FALSE);
-    pTextNode->SetContent(wsMessage, wsMessage, FALSE);
-  }
-}
-void CXFA_Validate::GetScriptMessageText(CFX_WideString& wsMessage) {
-  GetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
-}
-void CXFA_Validate::SetScriptMessageText(CFX_WideString wsMessage) {
-  SetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
-}
-void CXFA_Validate::GetPicture(CFX_WideString& wsPicture) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
-    pNode->TryContent(wsPicture);
-  }
-}
-CXFA_Script CXFA_Validate::GetScript() {
-  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
-}
-CXFA_Bind::CXFA_Bind(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-void CXFA_Bind::GetPicture(CFX_WideString& wsPicture) {
-  if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
-    pPicture->TryContent(wsPicture);
-  }
-}
-CXFA_Assist::CXFA_Assist(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-CXFA_ToolTip CXFA_Assist::GetToolTip() {
-  return CXFA_ToolTip(m_pNode->GetChild(0, XFA_ELEMENT_ToolTip));
-}
-CXFA_ToolTip::CXFA_ToolTip(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-FX_BOOL CXFA_ToolTip::GetTip(CFX_WideString& wsTip) {
-  return m_pNode->TryContent(wsTip);
-}
-CXFA_BindItems::CXFA_BindItems(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-void CXFA_BindItems::GetLabelRef(CFX_WideStringC& wsLabelRef) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef);
-}
-void CXFA_BindItems::GetValueRef(CFX_WideStringC& wsValueRef) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_ValueRef, wsValueRef);
-}
-void CXFA_BindItems::GetRef(CFX_WideStringC& wsRef) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
-}
-FX_BOOL CXFA_BindItems::SetConnection(const CFX_WideString& wsConnection) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection);
-}
-int32_t CXFA_Box::GetHand() const {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Even;
-  }
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
-}
-int32_t CXFA_Box::GetPresence() const {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Hidden;
-  }
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
-}
-int32_t CXFA_Box::CountEdges() const {
-  if (!m_pNode) {
-    return 0;
-  }
-  return m_pNode->CountChildren(XFA_ELEMENT_Edge);
-}
-CXFA_Edge CXFA_Box::GetEdge(int32_t nIndex) const {
-  return CXFA_Edge(
-      m_pNode ? m_pNode->GetProperty(nIndex, XFA_ELEMENT_Edge, nIndex == 0)
-              : nullptr);
-}
-static void XFA_BOX_GetStrokes(CXFA_Node* pNode,
-                               CXFA_StrokeArray& strokes,
-                               FX_BOOL bNULL) {
-  strokes.RemoveAll();
-  if (!pNode) {
-    return;
-  }
-  strokes.SetSize(8);
-  int32_t i, j;
-  for (i = 0, j = 0; i < 4; i++) {
-    CXFA_Corner corner =
-        CXFA_Corner(pNode->GetProperty(i, XFA_ELEMENT_Corner, i == 0));
-    if (corner || i == 0) {
-      strokes.SetAt(j, corner);
-    } else if (bNULL) {
-      strokes.SetAt(j, CXFA_Stroke(nullptr));
-    } else if (i == 1) {
-      strokes.SetAt(j, strokes[0]);
-    } else if (i == 2) {
-      strokes.SetAt(j, strokes[0]);
-    } else {
-      strokes.SetAt(j, strokes[2]);
-    }
-    j++;
-    CXFA_Edge edge = CXFA_Edge(pNode->GetProperty(i, XFA_ELEMENT_Edge, i == 0));
-    if (edge || i == 0) {
-      strokes.SetAt(j, edge);
-    } else if (bNULL) {
-      strokes.SetAt(j, CXFA_Stroke(nullptr));
-    } else if (i == 1) {
-      strokes.SetAt(j, strokes[1]);
-    } else if (i == 2) {
-      strokes.SetAt(j, strokes[1]);
-    } else {
-      strokes.SetAt(j, strokes[3]);
-    }
-    j++;
-  }
-}
-void CXFA_Box::GetStrokes(CXFA_StrokeArray& strokes) const {
-  XFA_BOX_GetStrokes(m_pNode, strokes, FALSE);
-}
-FX_BOOL CXFA_Box::IsCircular() const {
-  if (!m_pNode) {
-    return FALSE;
-  }
-  return m_pNode->GetBoolean(XFA_ATTRIBUTE_Circular);
-}
-FX_BOOL CXFA_Box::GetStartAngle(FX_FLOAT& fStartAngle) const {
-  fStartAngle = 0;
-  if (!m_pNode) {
-    return FALSE;
-  }
-  CXFA_Measurement ms;
-  FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_StartAngle, ms, FALSE);
-  if (bRet) {
-    fStartAngle = ms.GetValue();
-  }
-  return bRet;
-}
-FX_BOOL CXFA_Box::GetSweepAngle(FX_FLOAT& fSweepAngle) const {
-  fSweepAngle = 360;
-  if (!m_pNode) {
-    return FALSE;
-  }
-  CXFA_Measurement ms;
-  FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_SweepAngle, ms, FALSE);
-  if (bRet) {
-    fSweepAngle = ms.GetValue();
-  }
-  return bRet;
-}
-CXFA_Fill CXFA_Box::GetFill(FX_BOOL bModified) const {
-  if (!m_pNode) {
-    return CXFA_Fill(nullptr);
-  }
-  CXFA_Node* pFillNode = m_pNode->GetProperty(0, XFA_ELEMENT_Fill, bModified);
-  return CXFA_Fill(pFillNode);
-}
-CXFA_Margin CXFA_Box::GetMargin() const {
-  return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin)
-                             : nullptr);
-}
-static int32_t XFA_BOX_3DStyle(const CXFA_StrokeArray& strokes,
-                               CXFA_Stroke& stroke) {
-  int32_t iCount = strokes.GetSize();
-  if (iCount < 1) {
-    return 0;
-  }
-  stroke = strokes[0];
-  for (int32_t i = 1; i < iCount; i++) {
-    CXFA_Stroke find = strokes[i];
-    if (!find) {
-      continue;
-    }
-    if (!stroke) {
-      stroke = find;
-    } else if (stroke.GetStrokeType() != find.GetStrokeType()) {
-      stroke = find;
-      break;
-    }
-  }
-  int32_t iType = stroke.GetStrokeType();
-  if (iType == XFA_ATTRIBUTEENUM_Lowered || iType == XFA_ATTRIBUTEENUM_Raised ||
-      iType == XFA_ATTRIBUTEENUM_Etched ||
-      iType == XFA_ATTRIBUTEENUM_Embossed) {
-    return iType;
-  }
-  return 0;
-}
-int32_t CXFA_Box::Get3DStyle(FX_BOOL& bVisible, FX_FLOAT& fThickness) const {
-  if (IsArc()) {
-    return 0;
-  }
-  CXFA_StrokeArray strokes;
-  XFA_BOX_GetStrokes(m_pNode, strokes, TRUE);
-  CXFA_Stroke stroke(NULL);
-  int32_t iType = XFA_BOX_3DStyle(strokes, stroke);
-  if (iType) {
-    bVisible = stroke.IsVisible();
-    fThickness = stroke.GetThickness();
-  }
-  return iType;
-}
-int32_t CXFA_Stroke::GetPresence() const {
-  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Presence)
-                 : XFA_ATTRIBUTEENUM_Invisible;
-}
-int32_t CXFA_Stroke::GetCapType() const {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Square;
-  }
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Cap);
-}
-int32_t CXFA_Stroke::GetStrokeType() const {
-  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Stroke)
-                 : XFA_ATTRIBUTEENUM_Solid;
-}
-FX_FLOAT CXFA_Stroke::GetThickness() const {
-  return GetMSThickness().ToUnit(XFA_UNIT_Pt);
-}
-CXFA_Measurement CXFA_Stroke::GetMSThickness() const {
-  return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Thickness)
-                 : XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT_Edge,
-                                                        XFA_ATTRIBUTE_Thickness,
-                                                        XFA_XDPPACKET_Form);
-}
-void CXFA_Stroke::SetMSThickness(CXFA_Measurement msThinkness) {
-  if (!m_pNode) {
-    return;
-  }
-  m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, msThinkness);
-}
-FX_ARGB CXFA_Stroke::GetColor() const {
-  if (!m_pNode) {
-    return 0xFF000000;
-  }
-  CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color);
-  if (!pNode) {
-    return 0xFF000000;
-  }
-  CFX_WideStringC wsColor;
-  pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor);
-  return XFA_WStringToColor(wsColor);
-}
-void CXFA_Stroke::SetColor(FX_ARGB argb) {
-  if (!m_pNode) {
-    return;
-  }
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
-  CFX_WideString wsColor;
-  int a, r, g, b;
-  ArgbDecode(argb, a, r, g, b);
-  wsColor.Format(L"%d,%d,%d", r, g, b);
-  pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
-}
-int32_t CXFA_Stroke::GetJoinType() const {
-  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Join)
-                 : XFA_ATTRIBUTEENUM_Square;
-}
-FX_BOOL CXFA_Stroke::IsInverted() const {
-  return m_pNode ? m_pNode->GetBoolean(XFA_ATTRIBUTE_Inverted) : FALSE;
-}
-FX_FLOAT CXFA_Stroke::GetRadius() const {
-  return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Radius).ToUnit(XFA_UNIT_Pt)
-                 : 0;
-}
-FX_BOOL CXFA_Stroke::SameStyles(CXFA_Stroke stroke, uint32_t dwFlags) const {
-  if (m_pNode == stroke.GetNode()) {
-    return TRUE;
-  }
-  if (FXSYS_fabs(GetThickness() - stroke.GetThickness()) >= 0.01f) {
-    return FALSE;
-  }
-  if ((dwFlags & XFA_STROKE_SAMESTYLE_NoPresence) == 0 &&
-      IsVisible() != stroke.IsVisible()) {
-    return FALSE;
-  }
-  if (GetStrokeType() != stroke.GetStrokeType()) {
-    return FALSE;
-  }
-  if (GetColor() != stroke.GetColor()) {
-    return FALSE;
-  }
-  if ((dwFlags & XFA_STROKE_SAMESTYLE_Corner) != 0 &&
-      FXSYS_fabs(GetRadius() - stroke.GetRadius()) >= 0.01f) {
-    return FALSE;
-  }
-  return TRUE;
-}
-FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray& strokes,
-                              FX_BOOL b3DStyle,
-                              int32_t nIndex) {
-  FX_FLOAT fThickness = 0;
-  {
-    if (strokes[nIndex * 2 + 1].GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
-      if (nIndex == 0) {
-        fThickness += 2.5f;
-      }
-      fThickness += strokes[nIndex * 2 + 1].GetThickness() * (b3DStyle ? 4 : 2);
-    }
-  }
-  return fThickness;
-}
-CXFA_WidgetData::CXFA_WidgetData(CXFA_Node* pNode)
-    : CXFA_Data(pNode),
-      m_bIsNull(TRUE),
-      m_bPreNull(TRUE),
-      m_pUiChildNode(NULL),
-      m_eUIType(XFA_ELEMENT_UNKNOWN) {}
-CXFA_Node* CXFA_WidgetData::GetUIChild() {
-  if (m_eUIType == XFA_ELEMENT_UNKNOWN) {
-    m_pUiChildNode = XFA_CreateUIChild(m_pNode, m_eUIType);
-  }
-  return m_pUiChildNode;
-}
-XFA_ELEMENT CXFA_WidgetData::GetUIType() {
-  GetUIChild();
-  return m_eUIType;
-}
-CFX_WideString CXFA_WidgetData::GetRawValue() {
-  return m_pNode->GetContent();
-}
-int32_t CXFA_WidgetData::GetAccess(FX_BOOL bTemplate) {
-  if (bTemplate) {
-    CXFA_Node* pNode = m_pNode->GetTemplateNode();
-    if (pNode) {
-      return pNode->GetEnum(XFA_ATTRIBUTE_Access);
-    }
-    return XFA_ATTRIBUTEENUM_Open;
-  }
-  CXFA_Node* pNode = m_pNode;
-  while (pNode) {
-    int32_t iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Access);
-    if (iAcc != XFA_ATTRIBUTEENUM_Open) {
-      return iAcc;
-    }
-    pNode =
-        pNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
-  }
-  return XFA_ATTRIBUTEENUM_Open;
-}
-int32_t CXFA_WidgetData::GetRotate() {
-  CXFA_Measurement ms;
-  if (!m_pNode->TryMeasure(XFA_ATTRIBUTE_Rotate, ms, FALSE)) {
-    return 0;
-  }
-  int32_t iRotate = FXSYS_round(ms.GetValue());
-  iRotate = XFA_MapRotation(iRotate);
-  return iRotate / 90 * 90;
-}
-CXFA_Border CXFA_WidgetData::GetBorder(FX_BOOL bModified) {
-  return CXFA_Border(m_pNode->GetProperty(0, XFA_ELEMENT_Border, bModified));
-}
-CXFA_Caption CXFA_WidgetData::GetCaption(FX_BOOL bModified) {
-  return CXFA_Caption(m_pNode->GetProperty(0, XFA_ELEMENT_Caption, bModified));
-}
-CXFA_Font CXFA_WidgetData::GetFont(FX_BOOL bModified) {
-  return CXFA_Font(m_pNode->GetProperty(0, XFA_ELEMENT_Font, bModified));
-}
-CXFA_Margin CXFA_WidgetData::GetMargin(FX_BOOL bModified) {
-  return CXFA_Margin(m_pNode->GetProperty(0, XFA_ELEMENT_Margin, bModified));
-}
-CXFA_Para CXFA_WidgetData::GetPara(FX_BOOL bModified) {
-  return CXFA_Para(m_pNode->GetProperty(0, XFA_ELEMENT_Para, bModified));
-}
-void CXFA_WidgetData::GetEventList(CXFA_NodeArray& events) {
-  m_pNode->GetNodeList(events, 0, XFA_ELEMENT_Event);
-}
-int32_t CXFA_WidgetData::GetEventByActivity(int32_t iActivity,
-                                            CXFA_NodeArray& events,
-                                            FX_BOOL bIsFormReady) {
-  CXFA_NodeArray allEvents;
-  GetEventList(allEvents);
-  int32_t iCount = allEvents.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    CXFA_Event event(allEvents[i]);
-    if (event.GetActivity() == iActivity) {
-      if (iActivity == XFA_ATTRIBUTEENUM_Ready) {
-        CFX_WideStringC wsRef;
-        event.GetRef(wsRef);
-        if (bIsFormReady) {
-          if (wsRef == CFX_WideStringC(L"$form")) {
-            events.Add(allEvents[i]);
-          }
-        } else {
-          if (wsRef == CFX_WideStringC(L"$layout")) {
-            events.Add(allEvents[i]);
-          }
-        }
-      } else {
-        events.Add(allEvents[i]);
-      }
-    }
-  }
-  return events.GetSize();
-}
-CXFA_Value CXFA_WidgetData::GetDefaultValue(FX_BOOL bModified) {
-  CXFA_Node* pTemNode = m_pNode->GetTemplateNode();
-  return CXFA_Value(pTemNode
-                        ? pTemNode->GetProperty(0, XFA_ELEMENT_Value, bModified)
-                        : nullptr);
-}
-CXFA_Value CXFA_WidgetData::GetFormValue(FX_BOOL bModified) {
-  return CXFA_Value(m_pNode->GetProperty(0, XFA_ELEMENT_Value, bModified));
-}
-CXFA_Calculate CXFA_WidgetData::GetCalculate(FX_BOOL bModified) {
-  return CXFA_Calculate(
-      m_pNode->GetProperty(0, XFA_ELEMENT_Calculate, bModified));
-}
-CXFA_Validate CXFA_WidgetData::GetValidate(FX_BOOL bModified) {
-  return CXFA_Validate(
-      m_pNode->GetProperty(0, XFA_ELEMENT_Validate, bModified));
-}
-CXFA_Bind CXFA_WidgetData::GetBind(FX_BOOL bModified) {
-  return CXFA_Bind(m_pNode->GetProperty(0, XFA_ELEMENT_Bind, bModified));
-}
-CXFA_Assist CXFA_WidgetData::GetAssist(FX_BOOL bModified) {
-  return CXFA_Assist(m_pNode->GetProperty(0, XFA_ELEMENT_Assist, bModified));
-}
-FX_BOOL CXFA_WidgetData::GetWidth(FX_FLOAT& fWidth) {
-  return TryMeasure(XFA_ATTRIBUTE_W, fWidth);
-}
-FX_BOOL CXFA_WidgetData::GetHeight(FX_FLOAT& fHeight) {
-  return TryMeasure(XFA_ATTRIBUTE_H, fHeight);
-}
-FX_BOOL CXFA_WidgetData::GetMinWidth(FX_FLOAT& fMinWidth) {
-  return TryMeasure(XFA_ATTRIBUTE_MinW, fMinWidth);
-}
-FX_BOOL CXFA_WidgetData::GetMinHeight(FX_FLOAT& fMinHeight) {
-  return TryMeasure(XFA_ATTRIBUTE_MinH, fMinHeight);
-}
-FX_BOOL CXFA_WidgetData::GetMaxWidth(FX_FLOAT& fMaxWidth) {
-  return TryMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth);
-}
-FX_BOOL CXFA_WidgetData::GetMaxHeight(FX_FLOAT& fMaxHeight) {
-  return TryMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight);
-}
-CXFA_Border CXFA_WidgetData::GetUIBorder(FX_BOOL bModified) {
-  CXFA_Node* pUIChild = GetUIChild();
-  return CXFA_Border(
-      pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Border, bModified)
-               : nullptr);
-}
-CXFA_Margin CXFA_WidgetData::GetUIMargin(FX_BOOL bModified) {
-  CXFA_Node* pUIChild = GetUIChild();
-  return CXFA_Margin(
-      pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Margin, bModified)
-               : nullptr);
-}
-void CXFA_WidgetData::GetUIMargin(CFX_RectF& rtUIMargin) {
-  rtUIMargin.Reset();
-  CXFA_Margin mgUI = GetUIMargin();
-  if (!mgUI) {
-    return;
-  }
-  CXFA_Border border = GetUIBorder();
-  if (border && border.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
-    return;
-  }
-  FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
-  FX_BOOL bLeft = mgUI.GetLeftInset(fLeftInset);
-  FX_BOOL bTop = mgUI.GetTopInset(fTopInset);
-  FX_BOOL bRight = mgUI.GetRightInset(fRightInset);
-  FX_BOOL bBottom = mgUI.GetBottomInset(fBottomInset);
-  if (border) {
-    FX_BOOL bVisible = FALSE;
-    FX_FLOAT fThickness = 0;
-    border.Get3DStyle(bVisible, fThickness);
-    if (!bLeft || !bTop || !bRight || !bBottom) {
-      CXFA_StrokeArray strokes;
-      border.GetStrokes(strokes);
-      if (!bTop) {
-        fTopInset = XFA_GetEdgeThickness(strokes, bVisible, 0);
-      }
-      if (!bRight) {
-        fRightInset = XFA_GetEdgeThickness(strokes, bVisible, 1);
-      }
-      if (!bBottom) {
-        fBottomInset = XFA_GetEdgeThickness(strokes, bVisible, 2);
-      }
-      if (!bLeft) {
-        fLeftInset = XFA_GetEdgeThickness(strokes, bVisible, 3);
-      }
-    }
-  }
-  rtUIMargin.Set(fLeftInset, fTopInset, fRightInset, fBottomInset);
-}
-int32_t CXFA_WidgetData::GetButtonHighlight() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_Highlight);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_Button, XFA_ATTRIBUTE_Highlight, XFA_XDPPACKET_Form);
-}
-FX_BOOL CXFA_WidgetData::GetButtonRollover(CFX_WideString& wsRollover,
-                                           FX_BOOL& bRichText) {
-  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
-    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    while (pText) {
-      CFX_WideStringC wsName;
-      pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
-      if (wsName == FX_WSTRC(L"rollover")) {
-        pText->TryContent(wsRollover);
-        bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
-        return !wsRollover.IsEmpty();
-      }
-      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetButtonDown(CFX_WideString& wsDown,
-                                       FX_BOOL& bRichText) {
-  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
-    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    while (pText) {
-      CFX_WideStringC wsName;
-      pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
-      if (wsName == FX_WSTRC(L"down")) {
-        pText->TryContent(wsDown);
-        bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
-        return !wsDown.IsEmpty();
-      }
-      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-  }
-  return FALSE;
-}
-int32_t CXFA_WidgetData::GetCheckButtonShape() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_Shape);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Shape, XFA_XDPPACKET_Form);
-}
-int32_t CXFA_WidgetData::GetCheckButtonMark() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_Mark);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Mark, XFA_XDPPACKET_Form);
-}
-FX_BOOL CXFA_WidgetData::IsRadioButton() {
-  if (CXFA_Node* pParent = m_pNode->GetNodeItem(XFA_NODEITEM_Parent)) {
-    return pParent->GetClassID() == XFA_ELEMENT_ExclGroup;
-  }
-  return FALSE;
-}
-FX_FLOAT CXFA_WidgetData::GetCheckButtonSize() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetMeasure(XFA_ATTRIBUTE_Size).ToUnit(XFA_UNIT_Pt);
-  }
-  return XFA_GetAttributeDefaultValue_Measure(
-             XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Size, XFA_XDPPACKET_Form)
-      .ToUnit(XFA_UNIT_Pt);
-}
-FX_BOOL CXFA_WidgetData::IsAllowNeutral() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetBoolean(XFA_ATTRIBUTE_AllowNeutral);
-  }
-  return XFA_GetAttributeDefaultValue_Boolean(
-      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_AllowNeutral, XFA_XDPPACKET_Form);
-}
-XFA_CHECKSTATE CXFA_WidgetData::GetCheckState() {
-  CFX_WideString wsValue = GetRawValue();
-  if (wsValue.IsEmpty()) {
-    return XFA_CHECKSTATE_Off;
-  }
-  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
-    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    int32_t i = 0;
-    while (pText) {
-      CFX_WideString wsContent;
-      if (pText->TryContent(wsContent) && (wsContent == wsValue)) {
-        return (XFA_CHECKSTATE)i;
-      }
-      i++;
-      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-  }
-  return XFA_CHECKSTATE_Off;
-}
-void CXFA_WidgetData::SetCheckState(XFA_CHECKSTATE eCheckState,
-                                    FX_BOOL bNotify) {
-  CXFA_WidgetData exclGroup(GetExclGroupNode());
-  if (exclGroup) {
-    CFX_WideString wsValue;
-    if (eCheckState != XFA_CHECKSTATE_Off) {
-      if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
-        CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-        if (pText) {
-          pText->TryContent(wsValue);
-        }
-      }
-    }
-    CXFA_Node* pChild =
-        exclGroup.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      if (pChild->GetClassID() != XFA_ELEMENT_Field) {
-        continue;
-      }
-      CXFA_Node* pItem = pChild->GetChild(0, XFA_ELEMENT_Items);
-      if (!pItem) {
-        continue;
-      }
-      CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
-      if (!pItemchild) {
-        continue;
-      }
-      CFX_WideString text = pItemchild->GetContent();
-      CFX_WideString wsChildValue = text;
-      if (wsValue != text) {
-        pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
-        if (pItemchild) {
-          wsChildValue = pItemchild->GetContent();
-        } else {
-          wsChildValue.Empty();
-        }
-      }
-      CXFA_WidgetData ch(pChild);
-      ch.SyncValue(wsChildValue, bNotify);
-    }
-    exclGroup.SyncValue(wsValue, bNotify);
-  } else {
-    CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items);
-    if (!pItems) {
-      return;
-    }
-    int32_t i = -1;
-    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    CFX_WideString wsContent;
-    while (pText) {
-      i++;
-      if (i == eCheckState) {
-        pText->TryContent(wsContent);
-        break;
-      }
-      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-    SyncValue(wsContent, bNotify);
-  }
-}
-CXFA_Node* CXFA_WidgetData::GetExclGroupNode() {
-  CXFA_Node* pExcl = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_Parent));
-  if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup) {
-    return NULL;
-  }
-  return pExcl;
-}
-CXFA_Node* CXFA_WidgetData::GetSelectedMember() {
-  CXFA_Node* pSelectedMember = NULL;
-  CFX_WideString wsState = GetRawValue();
-  if (wsState.IsEmpty()) {
-    return pSelectedMember;
-  }
-  for (CXFA_Node* pNode = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild));
-       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    CXFA_WidgetData widgetData(pNode);
-    if (widgetData.GetCheckState() == XFA_CHECKSTATE_On) {
-      pSelectedMember = pNode;
-      break;
-    }
-  }
-  return pSelectedMember;
-}
-CXFA_Node* CXFA_WidgetData::SetSelectedMember(const CFX_WideStringC& wsName,
-                                              FX_BOOL bNotify) {
-  CXFA_Node* pSelectedMember = NULL;
-  uint32_t nameHash =
-      FX_HashCode_String_GetW(wsName.c_str(), wsName.GetLength());
-  for (CXFA_Node* pNode = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild));
-       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetNameHash() == nameHash) {
-      CXFA_WidgetData widgetData(pNode);
-      widgetData.SetCheckState(XFA_CHECKSTATE_On, bNotify);
-      pSelectedMember = pNode;
-      break;
-    }
-  }
-  return pSelectedMember;
-}
-void CXFA_WidgetData::SetSelectedMemberByValue(const CFX_WideStringC& wsValue,
-                                               FX_BOOL bNotify,
-                                               FX_BOOL bScriptModify,
-                                               FX_BOOL bSyncData) {
-  CFX_WideString wsExclGroup;
-  for (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
-       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() != XFA_ELEMENT_Field) {
-      continue;
-    }
-    CXFA_Node* pItem = pNode->GetChild(0, XFA_ELEMENT_Items);
-    if (!pItem) {
-      continue;
-    }
-    CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
-    if (!pItemchild) {
-      continue;
-    }
-    CFX_WideString wsChildValue = pItemchild->GetContent();
-    if (wsValue != wsChildValue) {
-      pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
-      if (pItemchild) {
-        wsChildValue = pItemchild->GetContent();
-      } else {
-        wsChildValue.Empty();
-      }
-    } else {
-      wsExclGroup = wsValue;
-    }
-    pNode->SetContent(wsChildValue, wsChildValue, bNotify, bScriptModify,
-                      FALSE);
-  }
-  if (m_pNode) {
-    m_pNode->SetContent(wsExclGroup, wsExclGroup, bNotify, bScriptModify,
-                        bSyncData);
-  }
-}
-CXFA_Node* CXFA_WidgetData::GetExclGroupFirstMember() {
-  CXFA_Node* pExcl = GetNode();
-  if (!pExcl) {
-    return NULL;
-  }
-  CXFA_Node* pNode = pExcl->GetNodeItem(XFA_NODEITEM_FirstChild);
-  while (pNode) {
-    if (pNode->GetClassID() == XFA_ELEMENT_Field) {
-      return pNode;
-    }
-    pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_WidgetData::GetExclGroupNextMember(CXFA_Node* pNode) {
-  if (!pNode) {
-    return NULL;
-  }
-  CXFA_Node* pNodeField = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-  while (pNodeField) {
-    if (pNodeField->GetClassID() == XFA_ELEMENT_Field) {
-      return pNodeField;
-    }
-    pNodeField = pNodeField->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return NULL;
-}
-int32_t CXFA_WidgetData::GetChoiceListCommitOn() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_CommitOn);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_CommitOn, XFA_XDPPACKET_Form);
-}
-FX_BOOL CXFA_WidgetData::IsChoiceListAllowTextEntry() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetBoolean(XFA_ATTRIBUTE_TextEntry);
-  }
-  return XFA_GetAttributeDefaultValue_Boolean(
-      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_TextEntry, XFA_XDPPACKET_Form);
-}
-int32_t CXFA_WidgetData::GetChoiceListOpen() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_Open);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_Open, XFA_XDPPACKET_Form);
-}
-FX_BOOL CXFA_WidgetData::IsListBox() {
-  int32_t iOpenMode = GetChoiceListOpen();
-  return (iOpenMode == XFA_ATTRIBUTEENUM_Always ||
-          iOpenMode == XFA_ATTRIBUTEENUM_MultiSelect);
-}
-int32_t CXFA_WidgetData::CountChoiceListItems(FX_BOOL bSaveValue) {
-  CXFA_NodeArray pItems;
-  CXFA_Node* pItem = NULL;
-  int32_t iCount = 0;
-  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    pItems.Add(pNode);
-    if (iCount == 2) {
-      break;
-    }
-  }
-  if (iCount == 0) {
-    return 0;
-  }
-  pItem = pItems[0];
-  if (iCount > 1) {
-    FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
-    FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
-    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
-      pItem = pItems[1];
-    }
-  }
-  pItems.RemoveAll();
-  return pItem->CountChildren(XFA_ELEMENT_UNKNOWN);
-}
-FX_BOOL CXFA_WidgetData::GetChoiceListItem(CFX_WideString& wsText,
-                                           int32_t nIndex,
-                                           FX_BOOL bSaveValue) {
-  wsText.Empty();
-  CXFA_NodeArray pItemsArray;
-  CXFA_Node* pItems = NULL;
-  int32_t iCount = 0;
-  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    pItemsArray.Add(pNode);
-    if (iCount == 2) {
-      break;
-    }
-  }
-  if (iCount == 0) {
-    return FALSE;
-  }
-  pItems = pItemsArray[0];
-  if (iCount > 1) {
-    FX_BOOL bItemOneHasSave = pItemsArray[0]->GetBoolean(XFA_ATTRIBUTE_Save);
-    FX_BOOL bItemTwoHasSave = pItemsArray[1]->GetBoolean(XFA_ATTRIBUTE_Save);
-    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
-      pItems = pItemsArray[1];
-    }
-  }
-  if (pItems) {
-    CXFA_Node* pItem = pItems->GetChild(nIndex, XFA_ELEMENT_UNKNOWN);
-    if (pItem) {
-      pItem->TryContent(wsText);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-void CXFA_WidgetData::GetChoiceListItems(CFX_WideStringArray& wsTextArray,
-                                         FX_BOOL bSaveValue) {
-  CXFA_NodeArray pItems;
-  CXFA_Node* pItem = NULL;
-  int32_t iCount = 0;
-  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    pItems.Add(pNode);
-    if (iCount == 2) {
-      break;
-    }
-  }
-  if (iCount == 0) {
-    return;
-  }
-  pItem = pItems[0];
-  if (iCount > 1) {
-    FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
-    FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
-    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
-      pItem = pItems[1];
-    }
-  }
-  pItems.RemoveAll();
-  pNode = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    pNode->TryContent(wsTextArray.Add());
-  }
-}
-int32_t CXFA_WidgetData::CountSelectedItems() {
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  if (IsListBox() || !IsChoiceListAllowTextEntry()) {
-    return wsValueArray.GetSize();
-  }
-  int32_t iSelected = 0;
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  int32_t iValues = wsValueArray.GetSize();
-  for (int32_t i = 0; i < iValues; i++) {
-    int32_t iSaves = wsSaveTextArray.GetSize();
-    for (int32_t j = 0; j < iSaves; j++) {
-      if (wsValueArray[i] == wsSaveTextArray[j]) {
-        iSelected++;
-        break;
-      }
-    }
-  }
-  return iSelected;
-}
-int32_t CXFA_WidgetData::GetSelectedItem(int32_t nIndex) {
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  int32_t iSaves = wsSaveTextArray.GetSize();
-  for (int32_t j = 0; j < iSaves; j++) {
-    if (wsValueArray[nIndex] == wsSaveTextArray[j]) {
-      return j;
-    }
-  }
-  return -1;
-}
-void CXFA_WidgetData::GetSelectedItems(CFX_Int32Array& iSelArray) {
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  int32_t iValues = wsValueArray.GetSize();
-  if (iValues < 1) {
-    return;
-  }
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  int32_t iSaves = wsSaveTextArray.GetSize();
-  for (int32_t i = 0; i < iValues; i++) {
-    for (int32_t j = 0; j < iSaves; j++) {
-      if (wsValueArray[i] == wsSaveTextArray[j]) {
-        iSelArray.Add(j);
-        break;
-      }
-    }
-  }
-}
-void CXFA_WidgetData::GetSelectedItemsValue(
-    CFX_WideStringArray& wsSelTextArray) {
-  CFX_WideString wsValue = GetRawValue();
-  if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
-    if (!wsValue.IsEmpty()) {
-      int32_t iStart = 0;
-      int32_t iLength = wsValue.GetLength();
-      int32_t iEnd = wsValue.Find(L'\n', iStart);
-      iEnd = (iEnd == -1) ? iLength : iEnd;
-      while (iEnd >= iStart) {
-        wsSelTextArray.Add(wsValue.Mid(iStart, iEnd - iStart));
-        iStart = iEnd + 1;
-        if (iStart >= iLength) {
-          break;
-        }
-        iEnd = wsValue.Find(L'\n', iStart);
-        if (iEnd < 0) {
-          wsSelTextArray.Add(wsValue.Mid(iStart, iLength - iStart));
-        }
-      }
-    }
-  } else {
-    wsSelTextArray.Add(wsValue);
-  }
-}
-FX_BOOL CXFA_WidgetData::GetItemState(int32_t nIndex) {
-  if (nIndex < 0) {
-    return FALSE;
-  }
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  if (wsSaveTextArray.GetSize() <= nIndex) {
-    return FALSE;
-  }
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  int32_t iValues = wsValueArray.GetSize();
-  for (int32_t j = 0; j < iValues; j++) {
-    if (wsValueArray[j] == wsSaveTextArray[nIndex]) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-void CXFA_WidgetData::SetItemState(int32_t nIndex,
-                                   FX_BOOL bSelected,
-                                   FX_BOOL bNotify,
-                                   FX_BOOL bScriptModify,
-                                   FX_BOOL bSyncData) {
-  if (nIndex < 0) {
-    return;
-  }
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  if (wsSaveTextArray.GetSize() <= nIndex) {
-    return;
-  }
-  int32_t iSel = -1;
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  int32_t iValues = wsValueArray.GetSize();
-  for (int32_t j = 0; j < iValues; j++) {
-    if (wsValueArray[j] == wsSaveTextArray[nIndex]) {
-      iSel = j;
-      break;
-    }
-  }
-  if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
-    if (bSelected) {
-      if (iSel < 0) {
-        CFX_WideString wsValue = GetRawValue();
-        if (!wsValue.IsEmpty()) {
-          wsValue += L"\n";
-        }
-        wsValue += wsSaveTextArray[nIndex];
-        m_pNode->SetContent(wsValue, wsValue, bNotify, bScriptModify,
-                            bSyncData);
-      }
-    } else if (iSel >= 0) {
-      CFX_Int32Array iSelArray;
-      GetSelectedItems(iSelArray);
-      for (int32_t i = 0; i < iSelArray.GetSize(); i++) {
-        if (iSelArray[i] == nIndex) {
-          iSelArray.RemoveAt(i);
-          break;
-        }
-      }
-      SetSelectdItems(iSelArray, bNotify, bScriptModify, bSyncData);
-    }
-  } else {
-    if (bSelected) {
-      if (iSel < 0) {
-        CFX_WideString wsSaveText = wsSaveTextArray[nIndex];
-        CFX_WideString wsFormatText(wsSaveText);
-        GetFormatDataValue(wsSaveText.AsWideStringC(), wsFormatText);
-        m_pNode->SetContent(wsSaveText, wsFormatText, bNotify, bScriptModify,
-                            bSyncData);
-      }
-    } else if (iSel >= 0) {
-      m_pNode->SetContent(CFX_WideString(), CFX_WideString(), bNotify,
-                          bScriptModify, bSyncData);
-    }
-  }
-}
-void CXFA_WidgetData::SetSelectdItems(CFX_Int32Array& iSelArray,
-                                      FX_BOOL bNotify,
-                                      FX_BOOL bScriptModify,
-                                      FX_BOOL bSyncData) {
-  CFX_WideString wsValue;
-  int32_t iSize = iSelArray.GetSize();
-  if (iSize >= 1) {
-    CFX_WideStringArray wsSaveTextArray;
-    GetChoiceListItems(wsSaveTextArray, TRUE);
-    CFX_WideString wsItemValue;
-    for (int32_t i = 0; i < iSize; i++) {
-      wsItemValue = (iSize == 1)
-                        ? wsSaveTextArray[iSelArray[i]]
-                        : wsSaveTextArray[iSelArray[i]] + FX_WSTRC(L"\n");
-      wsValue += wsItemValue;
-    }
-  }
-  CFX_WideString wsFormat(wsValue);
-  if (GetChoiceListOpen() != XFA_ATTRIBUTEENUM_MultiSelect) {
-    GetFormatDataValue(wsValue.AsWideStringC(), wsFormat);
-  }
-  m_pNode->SetContent(wsValue, wsFormat, bNotify, bScriptModify, bSyncData);
-}
-void CXFA_WidgetData::ClearAllSelections() {
-  CXFA_Node* pBind = m_pNode->GetBindData();
-  if (pBind && GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
-    while (CXFA_Node* pChildNode =
-               pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-      pBind->RemoveChild(pChildNode);
-    }
-  } else {
-    SyncValue(CFX_WideString(), FALSE);
-  }
-}
-void CXFA_WidgetData::InsertItem(const CFX_WideString& wsLabel,
-                                 const CFX_WideString& wsValue,
-                                 int32_t nIndex,
-                                 FX_BOOL bNotify) {
-  CFX_WideString wsNewValue(wsValue);
-  if (wsNewValue.IsEmpty()) {
-    wsNewValue = wsLabel;
-  }
-  CXFA_NodeArray listitems;
-  int32_t iCount = 0;
-  CXFA_Node* pItemNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pItemNode;
-       pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pItemNode->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    listitems.Add(pItemNode);
-    iCount++;
-  }
-  if (iCount < 1) {
-    CXFA_Node* pItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
-    m_pNode->InsertChild(-1, pItems);
-    InsertListTextItem(pItems, wsLabel.AsWideStringC(), nIndex);
-    CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
-    m_pNode->InsertChild(-1, pSaveItems);
-    pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
-    InsertListTextItem(pSaveItems, wsNewValue.AsWideStringC(), nIndex);
-  } else if (iCount > 1) {
-    for (int32_t i = 0; i < 2; i++) {
-      CXFA_Node* pNode = listitems[i];
-      FX_BOOL bHasSave = pNode->GetBoolean(XFA_ATTRIBUTE_Save);
-      if (bHasSave) {
-        InsertListTextItem(pNode, wsNewValue.AsWideStringC(), nIndex);
-      } else {
-        InsertListTextItem(pNode, wsLabel.AsWideStringC(), nIndex);
-      }
-    }
-  } else {
-    CXFA_Node* pNode = listitems[0];
-    pNode->SetBoolean(XFA_ATTRIBUTE_Save, FALSE);
-    pNode->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Visible);
-    CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
-    m_pNode->InsertChild(-1, pSaveItems);
-    pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
-    pSaveItems->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Hidden);
-    listitems.RemoveAll();
-    CXFA_Node* pListNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    int32_t i = 0;
-    while (pListNode) {
-      CFX_WideString wsOldValue;
-      pListNode->TryContent(wsOldValue);
-      InsertListTextItem(pSaveItems, wsOldValue.AsWideStringC(), i);
-      i++;
-      pListNode = pListNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-    InsertListTextItem(pNode, wsLabel.AsWideStringC(), nIndex);
-    InsertListTextItem(pSaveItems, wsNewValue.AsWideStringC(), nIndex);
-  }
-  if (!bNotify) {
-    return;
-  }
-  m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
-      this, XFA_WIDGETEVENT_ListItemAdded, (void*)(const FX_WCHAR*)wsLabel,
-      (void*)(const FX_WCHAR*)wsValue, (void*)(uintptr_t)nIndex);
-}
-void CXFA_WidgetData::GetItemLabel(const CFX_WideStringC& wsValue,
-                                   CFX_WideString& wsLabel) {
-  int32_t iCount = 0;
-  CXFA_NodeArray listitems;
-  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pItems->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    listitems.Add(pItems);
-  }
-  if (iCount <= 1) {
-    wsLabel = wsValue;
-  } else {
-    CXFA_Node* pLabelItems = listitems[0];
-    FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
-    CXFA_Node* pSaveItems = NULL;
-    if (bSave) {
-      pSaveItems = pLabelItems;
-      pLabelItems = listitems[1];
-    } else {
-      pSaveItems = listitems[1];
-    }
-    iCount = 0;
-    int32_t iSearch = -1;
-    CFX_WideString wsContent;
-    CXFA_Node* pChildItem = pSaveItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pChildItem;
-         pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      pChildItem->TryContent(wsContent);
-      if (wsContent == wsValue) {
-        iSearch = iCount;
-        break;
-      }
-      iCount++;
-    }
-    if (iSearch < 0) {
-      return;
-    }
-    if (CXFA_Node* pText =
-            pLabelItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) {
-      pText->TryContent(wsLabel);
-    }
-  }
-}
-void CXFA_WidgetData::GetItemValue(const CFX_WideStringC& wsLabel,
-                                   CFX_WideString& wsValue) {
-  int32_t iCount = 0;
-  CXFA_NodeArray listitems;
-  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pItems->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    listitems.Add(pItems);
-  }
-  if (iCount <= 1) {
-    wsValue = wsLabel;
-  } else {
-    CXFA_Node* pLabelItems = listitems[0];
-    FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
-    CXFA_Node* pSaveItems = NULL;
-    if (bSave) {
-      pSaveItems = pLabelItems;
-      pLabelItems = listitems[1];
-    } else {
-      pSaveItems = listitems[1];
-    }
-    iCount = 0;
-    int32_t iSearch = -1;
-    CFX_WideString wsContent;
-    CXFA_Node* pChildItem = pLabelItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pChildItem;
-         pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      pChildItem->TryContent(wsContent);
-      if (wsContent == wsLabel) {
-        iSearch = iCount;
-        break;
-      }
-      iCount++;
-    }
-    if (iSearch < 0) {
-      return;
-    }
-    if (CXFA_Node* pText = pSaveItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) {
-      pText->TryContent(wsValue);
-    }
-  }
-}
-FX_BOOL CXFA_WidgetData::DeleteItem(int32_t nIndex,
-                                    FX_BOOL bNotify,
-                                    FX_BOOL bScriptModify,
-                                    FX_BOOL bSyncData) {
-  FX_BOOL bSetValue = FALSE;
-  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pItems->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    if (nIndex < 0) {
-      while (CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-        pItems->RemoveChild(pNode);
-      }
-    } else {
-      if (!bSetValue && pItems->GetBoolean(XFA_ATTRIBUTE_Save)) {
-        SetItemState(nIndex, FALSE, TRUE, bScriptModify, bSyncData);
-        bSetValue = TRUE;
-      }
-      int32_t i = 0;
-      CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-      while (pNode) {
-        if (i == nIndex) {
-          pItems->RemoveChild(pNode);
-          break;
-        }
-        i++;
-        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-      }
-    }
-  }
-  if (!bNotify) {
-    return TRUE;
-  }
-  m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
-      this, XFA_WIDGETEVENT_ListItemRemoved, (void*)(uintptr_t)nIndex);
-  return TRUE;
-}
-int32_t CXFA_WidgetData::GetHorizontalScrollPolicy() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_HScrollPolicy);
-  }
-  return XFA_ATTRIBUTEENUM_Auto;
-}
-int32_t CXFA_WidgetData::GetNumberOfCells() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (!pUIChild) {
-    return -1;
-  }
-  if (CXFA_Node* pNode = pUIChild->GetChild(0, XFA_ELEMENT_Comb)) {
-    return pNode->GetInteger(XFA_ATTRIBUTE_NumberOfCells);
-  }
-  return -1;
-}
-CFX_WideString CXFA_WidgetData::GetBarcodeType() {
-  CXFA_Node* pUIChild = GetUIChild();
-  return pUIChild ? pUIChild->GetCData(XFA_ATTRIBUTE_Type) : NULL;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_CharEncoding(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideString wsCharEncoding;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_CharEncoding, wsCharEncoding)) {
-    if (wsCharEncoding.CompareNoCase(L"UTF-16")) {
-      val = CHAR_ENCODING_UNICODE;
-      return TRUE;
-    } else if (wsCharEncoding.CompareNoCase(L"UTF-8")) {
-      val = CHAR_ENCODING_UTF8;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Checksum(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  XFA_ATTRIBUTEENUM eChecksum;
-  if (pUIChild->TryEnum(XFA_ATTRIBUTE_Checksum, eChecksum)) {
-    switch (eChecksum) {
-      case XFA_ATTRIBUTEENUM_None:
-        val = 0;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_Auto:
-        val = 1;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_1mod10:
-        break;
-      case XFA_ATTRIBUTEENUM_1mod10_1mod11:
-        break;
-      case XFA_ATTRIBUTEENUM_2mod10:
-        break;
-      default:
-        break;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_DataLength(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideString wsDataLength;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_DataLength, wsDataLength)) {
-    val = FXSYS_wtoi(wsDataLength);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_StartChar(FX_CHAR& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideStringC wsStartEndChar;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_StartChar, wsStartEndChar)) {
-    if (wsStartEndChar.GetLength()) {
-      val = (FX_CHAR)wsStartEndChar.GetAt(0);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_EndChar(FX_CHAR& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideStringC wsStartEndChar;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_EndChar, wsStartEndChar)) {
-    if (wsStartEndChar.GetLength()) {
-      val = (FX_CHAR)wsStartEndChar.GetAt(0);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ECLevel(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideString wsECLevel;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_ErrorCorrectionLevel, wsECLevel)) {
-    val = FXSYS_wtoi(wsECLevel);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleWidth(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CXFA_Measurement mModuleWidthHeight;
-  if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleWidth, mModuleWidthHeight)) {
-    val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleHeight(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CXFA_Measurement mModuleWidthHeight;
-  if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleHeight, mModuleWidthHeight)) {
-    val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_PrintChecksum(FX_BOOL& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  FX_BOOL bPrintCheckDigit;
-  if (pUIChild->TryBoolean(XFA_ATTRIBUTE_PrintCheckDigit, bPrintCheckDigit)) {
-    val = bPrintCheckDigit;
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_TextLocation(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  XFA_ATTRIBUTEENUM eTextLocation;
-  if (pUIChild->TryEnum(XFA_ATTRIBUTE_TextLocation, eTextLocation)) {
-    switch (eTextLocation) {
-      case XFA_ATTRIBUTEENUM_None:
-        val = BC_TEXT_LOC_NONE;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_Above:
-        val = BC_TEXT_LOC_ABOVE;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_Below:
-        val = BC_TEXT_LOC_BELOW;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_AboveEmbedded:
-        val = BC_TEXT_LOC_ABOVEEMBED;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_BelowEmbedded:
-        val = BC_TEXT_LOC_BELOWEMBED;
-        return TRUE;
-      default:
-        break;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Truncate(FX_BOOL& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  FX_BOOL bTruncate;
-  if (pUIChild->TryBoolean(XFA_ATTRIBUTE_Truncate, bTruncate)) {
-    val = bTruncate;
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideString wsWideNarrowRatio;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_WideNarrowRatio, wsWideNarrowRatio)) {
-    FX_STRSIZE ptPos = wsWideNarrowRatio.Find(':');
-    FX_FLOAT fRatio = 0;
-    if (ptPos >= 0) {
-      fRatio = (FX_FLOAT)FXSYS_wtoi(wsWideNarrowRatio);
-    } else {
-      int32_t fA, fB;
-      fA = FXSYS_wtoi(wsWideNarrowRatio.Left(ptPos));
-      fB = FXSYS_wtoi(wsWideNarrowRatio.Mid(ptPos + 1));
-      if (fB) {
-        fRatio = (FX_FLOAT)fA / fB;
-      }
-    }
-    val = fRatio;
-    return TRUE;
-  }
-  return FALSE;
-}
-void CXFA_WidgetData::GetPasswordChar(CFX_WideString& wsPassWord) {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    pUIChild->TryCData(XFA_ATTRIBUTE_PasswordChar, wsPassWord);
-  } else {
-    wsPassWord = XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT_PasswordEdit,
-                                                    XFA_ATTRIBUTE_PasswordChar,
-                                                    XFA_XDPPACKET_Form);
-  }
-}
-FX_BOOL CXFA_WidgetData::IsMultiLine() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetBoolean(XFA_ATTRIBUTE_MultiLine);
-  }
-  return XFA_GetAttributeDefaultValue_Boolean(
-      XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_MultiLine, XFA_XDPPACKET_Form);
-}
-int32_t CXFA_WidgetData::GetVerticalScrollPolicy() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_VScrollPolicy);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_VScrollPolicy, XFA_XDPPACKET_Form);
-}
-int32_t CXFA_WidgetData::GetMaxChars(XFA_ELEMENT& eType) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
-    if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-      switch (pChild->GetClassID()) {
-        case XFA_ELEMENT_Text:
-          eType = XFA_ELEMENT_Text;
-          return pChild->GetInteger(XFA_ATTRIBUTE_MaxChars);
-        case XFA_ELEMENT_ExData: {
-          eType = XFA_ELEMENT_ExData;
-          int32_t iMax = pChild->GetInteger(XFA_ATTRIBUTE_MaxLength);
-          return iMax < 0 ? 0 : iMax;
-        }
-        default:
-          break;
-      }
-    }
-  }
-  return 0;
-}
-FX_BOOL CXFA_WidgetData::GetFracDigits(int32_t& iFracDigits) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
-    if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) {
-      return pChild->TryInteger(XFA_ATTRIBUTE_FracDigits, iFracDigits);
-    }
-  }
-  iFracDigits = -1;
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetLeadDigits(int32_t& iLeadDigits) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
-    if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) {
-      return pChild->TryInteger(XFA_ATTRIBUTE_LeadDigits, iLeadDigits);
-    }
-  }
-  iLeadDigits = -1;
-  return FALSE;
-}
-CFX_WideString XFA_NumericLimit(const CFX_WideString& wsValue,
-                                int32_t iLead,
-                                int32_t iTread) {
-  if ((iLead == -1) && (iTread == -1)) {
-    return wsValue;
-  }
-  CFX_WideString wsRet;
-  int32_t iLead_ = 0, iTread_ = -1;
-  int32_t iCount = wsValue.GetLength();
-  if (iCount == 0) {
-    return wsValue;
-  }
-  int32_t i = 0;
-  if (wsValue[i] == L'-') {
-    wsRet += L'-';
-    i++;
-  }
-  for (; i < iCount; i++) {
-    FX_WCHAR wc = wsValue[i];
-    if (XFA_IsDigit(wc)) {
-      if (iLead >= 0) {
-        iLead_++;
-        if (iLead_ > iLead) {
-          return L"0";
-        }
-      } else if (iTread_ >= 0) {
-        iTread_++;
-        if (iTread_ > iTread) {
-          if (iTread != -1) {
-            CFX_Decimal wsDeci = CFX_Decimal(wsValue.AsWideStringC());
-            wsDeci.SetScale(iTread);
-            wsRet = wsDeci;
-          }
-          return wsRet;
-        }
-      }
-    } else if (wc == L'.') {
-      iTread_ = 0;
-      iLead = -1;
-    }
-    wsRet += wc;
-  }
-  return wsRet;
-}
-FX_BOOL CXFA_WidgetData::SetValue(const CFX_WideString& wsValue,
-                                  XFA_VALUEPICTURE eValueType) {
-  if (wsValue.IsEmpty()) {
-    SyncValue(wsValue, TRUE);
-    return TRUE;
-  }
-  m_bPreNull = m_bIsNull;
-  m_bIsNull = FALSE;
-  CFX_WideString wsNewText(wsValue);
-  CFX_WideString wsPicture;
-  GetPictureContent(wsPicture, eValueType);
-  FX_BOOL bValidate = TRUE;
-  FX_BOOL bSyncData = FALSE;
-  CXFA_Node* pNode = GetUIChild();
-  if (!pNode) {
-    return TRUE;
-  }
-  XFA_ELEMENT uiType = pNode->GetClassID();
-  if (!wsPicture.IsEmpty()) {
-    CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
-    IFX_Locale* pLocale = GetLocal();
-    CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
-    bValidate =
-        widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture);
-    if (bValidate) {
-      widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNewText,
-                                     wsPicture, pLocale, pLocalMgr);
-      wsNewText = widgetValue.GetValue();
-      if (uiType == XFA_ELEMENT_NumericEdit) {
-        int32_t iLeadDigits = 0;
-        int32_t iFracDigits = 0;
-        GetLeadDigits(iLeadDigits);
-        GetFracDigits(iFracDigits);
-        wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
-      }
-      bSyncData = TRUE;
-    }
-  } else {
-    if (uiType == XFA_ELEMENT_NumericEdit) {
-      if (wsNewText != FX_WSTRC(L"0")) {
-        int32_t iLeadDigits = 0;
-        int32_t iFracDigits = 0;
-        GetLeadDigits(iLeadDigits);
-        GetFracDigits(iFracDigits);
-        wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
-      }
-      bSyncData = TRUE;
-    }
-  }
-  if (uiType != XFA_ELEMENT_NumericEdit || bSyncData) {
-    SyncValue(wsNewText, TRUE);
-  }
-  return bValidate;
-}
-FX_BOOL CXFA_WidgetData::GetPictureContent(CFX_WideString& wsPicture,
-                                           XFA_VALUEPICTURE ePicture) {
-  if (ePicture == XFA_VALUEPICTURE_Raw) {
-    return FALSE;
-  }
-  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
-  switch (ePicture) {
-    case XFA_VALUEPICTURE_Display: {
-      if (CXFA_Node* pFormat = m_pNode->GetChild(0, XFA_ELEMENT_Format)) {
-        if (CXFA_Node* pPicture = pFormat->GetChild(0, XFA_ELEMENT_Picture)) {
-          if (pPicture->TryContent(wsPicture)) {
-            return TRUE;
-          }
-        }
-      }
-      CFX_WideString wsDataPicture, wsTimePicture;
-      IFX_Locale* pLocale = GetLocal();
-      if (!pLocale) {
-        return FALSE;
-      }
-      uint32_t dwType = widgetValue.GetType();
-      switch (dwType) {
-        case XFA_VT_DATE:
-          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsPicture);
-          break;
-        case XFA_VT_TIME:
-          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsPicture);
-          break;
-        case XFA_VT_DATETIME:
-          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsDataPicture);
-          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsTimePicture);
-          wsPicture = wsDataPicture + FX_WSTRC(L"T") + wsTimePicture;
-          break;
-        case XFA_VT_DECIMAL:
-        case XFA_VT_FLOAT:
-          break;
-        default:
-          break;
-      }
-    }
-      return TRUE;
-    case XFA_VALUEPICTURE_Edit: {
-      CXFA_Node* pUI = m_pNode->GetChild(0, XFA_ELEMENT_Ui);
-      if (pUI) {
-        if (CXFA_Node* pPicture = pUI->GetChild(0, XFA_ELEMENT_Picture)) {
-          if (pPicture->TryContent(wsPicture)) {
-            return TRUE;
-          }
-        }
-      }
-      {
-        CFX_WideString wsDataPicture, wsTimePicture;
-        IFX_Locale* pLocale = GetLocal();
-        if (!pLocale) {
-          return FALSE;
-        }
-        uint32_t dwType = widgetValue.GetType();
-        switch (dwType) {
-          case XFA_VT_DATE:
-            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsPicture);
-            break;
-          case XFA_VT_TIME:
-            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsPicture);
-            break;
-          case XFA_VT_DATETIME:
-            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsDataPicture);
-            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsTimePicture);
-            wsPicture = wsDataPicture + L"T" + wsTimePicture;
-            break;
-          default:
-            break;
-        }
-      }
-    }
-      return TRUE;
-    case XFA_VALUEPICTURE_DataBind: {
-      if (CXFA_Bind bind = GetBind()) {
-        bind.GetPicture(wsPicture);
-        return TRUE;
-      }
-    } break;
-    default:
-      break;
-  }
-  return FALSE;
-}
-IFX_Locale* CXFA_WidgetData::GetLocal() {
-  IFX_Locale* pLocale = NULL;
-  if (!m_pNode) {
-    return pLocale;
-  }
-  FX_BOOL bLocale = FALSE;
-  CFX_WideString wsLocaleName;
-  bLocale = m_pNode->GetLocaleName(wsLocaleName);
-  if (bLocale) {
-    if (wsLocaleName == FX_WSTRC(L"ambient")) {
-      pLocale = m_pNode->GetDocument()->GetLocalMgr()->GetDefLocale();
-    } else {
-      pLocale = m_pNode->GetDocument()->GetLocalMgr()->GetLocaleByName(
-          wsLocaleName.AsWideStringC());
-    }
-  }
-  return pLocale;
-}
-static FX_BOOL XFA_SplitDateTime(const CFX_WideString& wsDateTime,
-                                 CFX_WideString& wsDate,
-                                 CFX_WideString& wsTime) {
-  wsDate = L"";
-  wsTime = L"";
-  if (wsDateTime.IsEmpty()) {
-    return FALSE;
-  }
-  int nSplitIndex = -1;
-  nSplitIndex = wsDateTime.Find('T');
-  if (nSplitIndex < 0) {
-    nSplitIndex = wsDateTime.Find(' ');
-  }
-  if (nSplitIndex < 0) {
-    return FALSE;
-  }
-  wsDate = wsDateTime.Left(nSplitIndex);
-  if (!wsDate.IsEmpty()) {
-    int32_t iCount = wsDate.GetLength();
-    int32_t i = 0;
-    for (i = 0; i < iCount; i++) {
-      if (wsDate[i] >= '0' && wsDate[i] <= '9') {
-        break;
-      }
-    }
-    if (i == iCount) {
-      return FALSE;
-    }
-  }
-  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
-  if (!wsTime.IsEmpty()) {
-    int32_t iCount = wsTime.GetLength();
-    int32_t i = 0;
-    for (i = 0; i < iCount; i++) {
-      if (wsTime[i] >= '0' && wsTime[i] <= '9') {
-        break;
-      }
-    }
-    if (i == iCount) {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-
-FX_BOOL CXFA_WidgetData::GetValue(CFX_WideString& wsValue,
-                                  XFA_VALUEPICTURE eValueType) {
-  wsValue = m_pNode->GetContent();
-
-  if (eValueType == XFA_VALUEPICTURE_Display)
-    GetItemLabel(wsValue.AsWideStringC(), wsValue);
-
-  CFX_WideString wsPicture;
-  GetPictureContent(wsPicture, eValueType);
-  CXFA_Node* pNode = GetUIChild();
-  if (!pNode)
-    return TRUE;
-
-  XFA_ELEMENT uiType = GetUIChild()->GetClassID();
-  switch (uiType) {
-    case XFA_ELEMENT_ChoiceList: {
-      if (eValueType == XFA_VALUEPICTURE_Display) {
-        int32_t iSelItemIndex = GetSelectedItem(0);
-        if (iSelItemIndex >= 0) {
-          GetChoiceListItem(wsValue, iSelItemIndex);
-          wsPicture.Empty();
-        }
-      }
-    } break;
-    case XFA_ELEMENT_NumericEdit:
-      if (eValueType != XFA_VALUEPICTURE_Raw && wsPicture.IsEmpty()) {
-        IFX_Locale* pLocale = GetLocal();
-        if (eValueType == XFA_VALUEPICTURE_Display && pLocale) {
-          CFX_WideString wsOutput;
-          NormalizeNumStr(wsValue, wsOutput);
-          FormatNumStr(wsOutput, pLocale, wsOutput);
-          wsValue = wsOutput;
-        }
-      }
-      break;
-    default:
-      break;
-  }
-  if (wsPicture.IsEmpty())
-    return TRUE;
-
-  if (IFX_Locale* pLocale = GetLocal()) {
-    CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
-    CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
-    switch (widgetValue.GetType()) {
-      case XFA_VT_DATE: {
-        CFX_WideString wsDate, wsTime;
-        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
-          if (date.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
-            return TRUE;
-        }
-        break;
-      }
-      case XFA_VT_TIME: {
-        CFX_WideString wsDate, wsTime;
-        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
-          if (time.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
-            return TRUE;
-        }
-        break;
-      }
-      default:
-        break;
-    }
-    widgetValue.FormatPatterns(wsValue, wsPicture, pLocale, eValueType);
-  }
-  return TRUE;
-}
-
-FX_BOOL CXFA_WidgetData::GetNormalizeDataValue(
-    const CFX_WideStringC& wsValue,
-    CFX_WideString& wsNormalizeValue) {
-  wsNormalizeValue = wsValue;
-  if (wsValue.IsEmpty()) {
-    return TRUE;
-  }
-  CFX_WideString wsPicture;
-  GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
-  if (wsPicture.IsEmpty()) {
-    return TRUE;
-  }
-  FXSYS_assert(GetNode());
-  CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
-  IFX_Locale* pLocale = GetLocal();
-  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
-  if (widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture)) {
-    widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNormalizeValue,
-                                   wsPicture, pLocale, pLocalMgr);
-    wsNormalizeValue = widgetValue.GetValue();
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetFormatDataValue(const CFX_WideStringC& wsValue,
-                                            CFX_WideString& wsFormatedValue) {
-  wsFormatedValue = wsValue;
-  if (wsValue.IsEmpty()) {
-    return TRUE;
-  }
-  CFX_WideString wsPicture;
-  GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
-  if (wsPicture.IsEmpty()) {
-    return TRUE;
-  }
-  if (IFX_Locale* pLocale = GetLocal()) {
-    FXSYS_assert(GetNode());
-    CXFA_Node* pNodeValue = GetNode()->GetChild(0, XFA_ELEMENT_Value);
-    if (!pNodeValue) {
-      return FALSE;
-    }
-    CXFA_Node* pValueChild = pNodeValue->GetNodeItem(XFA_NODEITEM_FirstChild);
-    if (!pValueChild) {
-      return FALSE;
-    }
-    int32_t iVTType = XFA_VT_NULL;
-    XFA_ELEMENT eType = pValueChild->GetClassID();
-    switch (eType) {
-      case XFA_ELEMENT_Decimal:
-        iVTType = XFA_VT_DECIMAL;
-        break;
-      case XFA_ELEMENT_Float:
-        iVTType = XFA_VT_FLOAT;
-        break;
-      case XFA_ELEMENT_Date:
-        iVTType = XFA_VT_DATE;
-        break;
-      case XFA_ELEMENT_Time:
-        iVTType = XFA_VT_TIME;
-        break;
-      case XFA_ELEMENT_DateTime:
-        iVTType = XFA_VT_DATETIME;
-        break;
-      case XFA_ELEMENT_Boolean:
-        iVTType = XFA_VT_BOOLEAN;
-        break;
-      case XFA_ELEMENT_Integer:
-        iVTType = XFA_VT_INTEGER;
-        break;
-      case XFA_ELEMENT_Text:
-        iVTType = XFA_VT_TEXT;
-        break;
-      default:
-        iVTType = XFA_VT_NULL;
-        break;
-    }
-    CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
-    CXFA_LocaleValue widgetValue(iVTType, wsValue, pLocalMgr);
-    switch (widgetValue.GetType()) {
-      case XFA_VT_DATE: {
-        CFX_WideString wsDate, wsTime;
-        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
-          if (date.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
-                                  XFA_VALUEPICTURE_DataBind)) {
-            return TRUE;
-          }
-        }
-        break;
-      }
-      case XFA_VT_TIME: {
-        CFX_WideString wsDate, wsTime;
-        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
-          if (time.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
-                                  XFA_VALUEPICTURE_DataBind)) {
-            return TRUE;
-          }
-        }
-        break;
-      }
-      default:
-        break;
-    }
-    widgetValue.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
-                               XFA_VALUEPICTURE_DataBind);
-  }
-  return FALSE;
-}
-void CXFA_WidgetData::NormalizeNumStr(const CFX_WideString& wsValue,
-                                      CFX_WideString& wsOutput) {
-  if (wsValue.IsEmpty()) {
-    return;
-  }
-  wsOutput = wsValue;
-  wsOutput.TrimLeft('0');
-  int32_t dot_index = wsOutput.Find('.');
-  int32_t iFracDigits = 0;
-  if (!wsOutput.IsEmpty() && dot_index >= 0 &&
-      (!GetFracDigits(iFracDigits) || iFracDigits != -1)) {
-    wsOutput.TrimRight(L"0");
-    wsOutput.TrimRight(L".");
-  }
-  if (wsOutput.IsEmpty() || wsOutput[0] == '.') {
-    wsOutput.Insert(0, '0');
-  }
-}
-void CXFA_WidgetData::FormatNumStr(const CFX_WideString& wsValue,
-                                   IFX_Locale* pLocale,
-                                   CFX_WideString& wsOutput) {
-  if (wsValue.IsEmpty()) {
-    return;
-  }
-  CFX_WideString wsSrcNum = wsValue;
-  CFX_WideString wsGroupSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
-  FX_BOOL bNeg = FALSE;
-  if (wsSrcNum[0] == '-') {
-    bNeg = TRUE;
-    wsSrcNum.Delete(0, 1);
-  }
-  int32_t len = wsSrcNum.GetLength();
-  int32_t dot_index = wsSrcNum.Find('.');
-  if (dot_index == -1) {
-    dot_index = len;
-  }
-  int32_t cc = dot_index - 1;
-  if (cc >= 0) {
-    int nPos = dot_index % 3;
-    wsOutput.Empty();
-    for (int32_t i = 0; i < dot_index; i++) {
-      if (i % 3 == nPos && i != 0) {
-        wsOutput += wsGroupSymbol;
-      }
-      wsOutput += wsSrcNum[i];
-    }
-    if (dot_index < len) {
-      CFX_WideString wsSymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
-      wsOutput += wsSymbol;
-      wsOutput += wsSrcNum.Right(len - dot_index - 1);
-    }
-    if (bNeg) {
-      CFX_WideString wsMinusymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-      wsOutput = wsMinusymbol + wsOutput;
-    }
-  }
-}
-void CXFA_WidgetData::SyncValue(const CFX_WideString& wsValue,
-                                FX_BOOL bNotify) {
-  if (!m_pNode) {
-    return;
-  }
-  CFX_WideString wsFormatValue(wsValue);
-  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
-  if (pContainerWidgetData) {
-    pContainerWidgetData->GetFormatDataValue(wsValue.AsWideStringC(),
-                                             wsFormatValue);
-  }
-  m_pNode->SetContent(wsValue, wsFormatValue, bNotify);
-}
-void CXFA_WidgetData::InsertListTextItem(CXFA_Node* pItems,
-                                         const CFX_WideStringC& wsText,
-                                         int32_t nIndex) {
-  CXFA_Node* pText = pItems->CreateSamePacketNode(XFA_ELEMENT_Text);
-  pItems->InsertChild(nIndex, pText);
-  pText->SetContent(wsText, wsText, FALSE, FALSE, FALSE);
-}
-CXFA_Occur::CXFA_Occur(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Occur::GetMax() {
-  int32_t iMax = 1;
-  if (m_pNode) {
-    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, TRUE)) {
-      iMax = GetMin();
-    }
-  }
-  return iMax;
-}
-int32_t CXFA_Occur::GetMin() {
-  int32_t iMin = 1;
-  if (m_pNode) {
-    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, TRUE) || iMin < 0) {
-      iMin = 1;
-    }
-  }
-  return iMin;
-}
-FX_BOOL CXFA_Occur::GetOccurInfo(int32_t& iMin, int32_t& iMax, int32_t& iInit) {
-  if (!m_pNode) {
-    return FALSE;
-  }
-  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE) || iMin < 0) {
-    iMin = 1;
-  }
-  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) {
-    if (iMin == 0) {
-      iMax = 1;
-    } else {
-      iMax = iMin;
-    }
-  }
-  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, FALSE) ||
-      iInit < iMin) {
-    iInit = iMin;
-  }
-  return TRUE;
-}
-void CXFA_Occur::SetMax(int32_t iMax) {
-  iMax = (iMax != -1 && iMax < 1) ? 1 : iMax;
-  m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
-  int32_t iMin = GetMin();
-  if (iMax != -1 && iMax < iMin) {
-    iMin = iMax;
-    m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
-  }
-}
-void CXFA_Occur::SetMin(int32_t iMin) {
-  iMin = (iMin < 0) ? 1 : iMin;
-  m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
-  int32_t iMax = GetMax();
-  if (iMax > 0 && iMax < iMin) {
-    iMax = iMin;
-    m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
-  }
-}
-XFA_ATTRIBUTEENUM XFA_GetEnumTypeAttribute(
-    CXFA_Node* pNode,
-    XFA_ATTRIBUTE attributeValue = XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTEENUM eDefaultValue = XFA_ATTRIBUTEENUM_Optional) {
-  XFA_ATTRIBUTEENUM eType = eDefaultValue;
-  if (pNode) {
-    if (!pNode->TryEnum(attributeValue, eType, TRUE)) {
-      eType = eDefaultValue;
-    }
-  }
-  return eType;
-}
diff --git a/xfa/fxfa/parser/xfa_script.h b/xfa/fxfa/parser/xfa_script.h
index 80601c5..d92ede3 100644
--- a/xfa/fxfa/parser/xfa_script.h
+++ b/xfa/fxfa/parser/xfa_script.h
@@ -8,7 +8,6 @@
 #define XFA_FXFA_PARSER_XFA_SCRIPT_H_
 
 #include "xfa/include/fxfa/fxfa.h"
-#include "xfa/include/fxfa/fxfa_objectacc.h"
 
 #define XFA_RESOLVENODE_Children 0x0001
 #define XFA_RESOLVENODE_Attributes 0x0004
diff --git a/xfa/fxfa/parser/xfa_script_resolveprocessor.h b/xfa/fxfa/parser/xfa_script_resolveprocessor.h
index ee0cd82..b63cced 100644
--- a/xfa/fxfa/parser/xfa_script_resolveprocessor.h
+++ b/xfa/fxfa/parser/xfa_script_resolveprocessor.h
@@ -9,7 +9,6 @@
 
 #include "xfa/fxfa/parser/xfa_object.h"
 #include "xfa/fxfa/parser/xfa_script.h"
-#include "xfa/include/fxfa/fxfa_objectacc.h"
 
 class CXFA_NodeHelper;
 class CXFA_ScriptContext;
diff --git a/xfa/fxfa/parser/xfa_utils.h b/xfa/fxfa/parser/xfa_utils.h
index 9070b97e..83d0e23 100644
--- a/xfa/fxfa/parser/xfa_utils.h
+++ b/xfa/fxfa/parser/xfa_utils.h
@@ -14,6 +14,13 @@
 class CFDE_XMLNode;
 class CXFA_LocaleValue;
 
+inline FX_BOOL XFA_IsSpace(FX_WCHAR c) {
+  return (c == 0x20) || (c == 0x0d) || (c == 0x0a) || (c == 0x09);
+}
+inline FX_BOOL XFA_IsDigit(FX_WCHAR c) {
+  return c >= '0' && c <= '9';
+}
+
 FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier(
     CFDE_XMLElement* pNode,
     const CFX_WideStringC& wsQualifier,
@@ -195,9 +202,6 @@
 
 CXFA_Node* XFA_CreateUIChild(CXFA_Node* pNode, XFA_ELEMENT& eWidgetType);
 CXFA_LocaleValue XFA_GetLocaleValue(CXFA_WidgetData* pWidgetData);
-CFX_WideString XFA_NumericLimit(const CFX_WideString& wsValue,
-                                int32_t iLead,
-                                int32_t iTread);
 FX_DOUBLE XFA_WideStringToDouble(const CFX_WideString& wsStringVal);
 FX_DOUBLE XFA_ByteStringToDouble(const CFX_ByteStringC& szStringVal);
 int32_t XFA_MapRotation(int32_t nRotation);
diff --git a/xfa/include/fxfa/fxfa_objectacc.h b/xfa/include/fxfa/fxfa_objectacc.h
deleted file mode 100644
index f6f48e9..0000000
--- a/xfa/include/fxfa/fxfa_objectacc.h
+++ /dev/null
@@ -1,561 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_INCLUDE_FXFA_FXFA_OBJECTACC_H_
-#define XFA_INCLUDE_FXFA_FXFA_OBJECTACC_H_
-
-#include "core/fxge/include/fx_dib.h"
-#include "xfa/fxfa/parser/xfa_object.h"
-
-class CXFA_Node;
-class IFX_Locale;
-class CXFA_Margin;
-class CXFA_Caption;
-class CXFA_Para;
-class CXFA_Event;
-class CXFA_Script;
-class CXFA_Value;
-class CXFA_Calculate;
-class CXFA_Line;
-class CXFA_Text;
-class CXFA_ExData;
-class CXFA_Image;
-class CXFA_Validate;
-class CXFA_Bind;
-class CXFA_Assist;
-class CXFA_ToolTip;
-class CXFA_Submit;
-class CXFA_BindItems;
-class CXFA_Stroke;
-class CXFA_Corner;
-class CXFA_Edge;
-class CXFA_Box;
-class CXFA_Arc;
-class CXFA_Border;
-class CXFA_Rectangle;
-class CXFA_WidgetData;
-class CXFA_Occur;
-
-inline FX_BOOL XFA_IsSpace(FX_WCHAR c) {
-  return (c == 0x20) || (c == 0x0d) || (c == 0x0a) || (c == 0x09);
-}
-inline FX_BOOL XFA_IsDigit(FX_WCHAR c) {
-  return c >= '0' && c <= '9';
-}
-typedef CFX_ArrayTemplate<CXFA_Object*> CXFA_ObjArray;
-
-class CXFA_Data {
- public:
-  explicit CXFA_Data(CXFA_Node* pNode) : m_pNode(pNode) {}
-
-  operator bool() const { return !!m_pNode; }
-  CXFA_Node* GetNode() const { return m_pNode; }
-  XFA_ELEMENT GetClassID() const;
-
- protected:
-  FX_BOOL TryMeasure(XFA_ATTRIBUTE eAttr,
-                     FX_FLOAT& fValue,
-                     FX_BOOL bUseDefault = FALSE) const;
-  FX_BOOL SetMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT fValue);
-
-  CXFA_Node* m_pNode;
-};
-
-class CXFA_Fill : public CXFA_Data {
- public:
-  explicit CXFA_Fill(CXFA_Node* pNode);
-  ~CXFA_Fill();
-
-  int32_t GetPresence();
-  FX_ARGB GetColor(FX_BOOL bText = FALSE);
-  int32_t GetFillType();
-  int32_t GetPattern(FX_ARGB& foreColor);
-  int32_t GetStipple(FX_ARGB& stippleColor);
-  int32_t GetLinear(FX_ARGB& endColor);
-  int32_t GetRadial(FX_ARGB& endColor);
-  void SetColor(FX_ARGB color);
-};
-
-class CXFA_Margin : public CXFA_Data {
- public:
-  explicit CXFA_Margin(CXFA_Node* pNode);
-  FX_BOOL GetLeftInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
-  FX_BOOL GetTopInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
-  FX_BOOL GetRightInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
-  FX_BOOL GetBottomInset(FX_FLOAT& fInset, FX_FLOAT fDefInset = 0) const;
-};
-
-class CXFA_Font : public CXFA_Data {
- public:
-  explicit CXFA_Font(CXFA_Node* pNode);
-
-  FX_FLOAT GetBaselineShift();
-  FX_FLOAT GetHorizontalScale();
-  FX_FLOAT GetVerticalScale();
-  FX_FLOAT GetLetterSpacing();
-  int32_t GetLineThrough();
-  int32_t GetUnderline();
-  int32_t GetUnderlinePeriod();
-  FX_FLOAT GetFontSize();
-  void GetTypeface(CFX_WideStringC& wsTypeFace);
-
-  FX_BOOL IsBold();
-  FX_BOOL IsItalic();
-
-  FX_ARGB GetColor();
-  void SetColor(FX_ARGB color);
-
-};
-
-class CXFA_Caption : public CXFA_Data {
- public:
-  explicit CXFA_Caption(CXFA_Node* pNode);
-
-  int32_t GetPresence();
-  int32_t GetPlacementType();
-  FX_FLOAT GetReserve();
-  CXFA_Margin GetMargin();
-  CXFA_Font GetFont();
-  CXFA_Value GetValue();
-};
-
-class CXFA_Para : public CXFA_Data {
- public:
-  explicit CXFA_Para(CXFA_Node* pNode);
-
-  int32_t GetHorizontalAlign();
-  int32_t GetVerticalAlign();
-  FX_FLOAT GetLineHeight();
-  FX_FLOAT GetMarginLeft();
-  FX_FLOAT GetMarginRight();
-  FX_FLOAT GetSpaceAbove();
-  FX_FLOAT GetSpaceBelow();
-  FX_FLOAT GetTextIndent();
-};
-
-enum XFA_TEXTENCODING {
-  XFA_TEXTENCODING_None,
-  XFA_TEXTENCODING_Big5,
-  XFA_TEXTENCODING_FontSpecific,
-  XFA_TEXTENCODING_GBK,
-  XFA_TEXTENCODING_GB18030,
-  XFA_TEXTENCODING_GB2312,
-  XFA_TEXTENCODING_ISO8859NN,
-  XFA_TEXTENCODING_KSC5601,
-  XFA_TEXTENCODING_ShiftJIS,
-  XFA_TEXTENCODING_UCS2,
-  XFA_TEXTENCODING_UTF16,
-  XFA_TEXTENCODING_UTF8
-};
-
-class CXFA_Event : public CXFA_Data {
- public:
-  explicit CXFA_Event(CXFA_Node* pNode);
-
-  int32_t GetActivity();
-  int32_t GetEventType();
-  void GetRef(CFX_WideStringC& wsRef);
-
-
-  CXFA_Script GetScript();
-  CXFA_Submit GetSubmit();
-
-  void GetSignDataTarget(CFX_WideString& wsTarget);
-};
-
-enum XFA_SCRIPTTYPE {
-  XFA_SCRIPTTYPE_Formcalc = 0,
-  XFA_SCRIPTTYPE_Javascript,
-  XFA_SCRIPTTYPE_Unkown,
-};
-
-class CXFA_Script : public CXFA_Data {
- public:
-  explicit CXFA_Script(CXFA_Node* pNode);
-
-  XFA_SCRIPTTYPE GetContentType();
-  int32_t GetRunAt();
-  void GetExpression(CFX_WideString& wsExpression);
-};
-
-class CXFA_Submit : public CXFA_Data {
- public:
-  explicit CXFA_Submit(CXFA_Node* pNode);
-
-  FX_BOOL IsSubmitEmbedPDF();
-  int32_t GetSubmitFormat();
-  void GetSubmitTarget(CFX_WideStringC& wsTarget);
-  void GetSubmitXDPContent(CFX_WideStringC& wsContent);
-};
-
-class CXFA_Value : public CXFA_Data {
- public:
-  explicit CXFA_Value(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-
-  XFA_ELEMENT GetChildValueClassID();
-  FX_BOOL GetChildValueContent(CFX_WideString& wsContent);
-  CXFA_Arc GetArc();
-  CXFA_Line GetLine();
-  CXFA_Rectangle GetRectangle();
-  CXFA_Text GetText();
-  CXFA_ExData GetExData();
-  CXFA_Image GetImage();
-};
-
-class CXFA_Line : public CXFA_Data {
- public:
-  explicit CXFA_Line(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-
-  int32_t GetHand();
-  FX_BOOL GetSlop();
-  CXFA_Edge GetEdge();
-};
-
-class CXFA_Text : public CXFA_Data {
- public:
-  explicit CXFA_Text(CXFA_Node* pNode);
-
-  void GetContent(CFX_WideString& wsText);
-};
-
-class CXFA_ExData : public CXFA_Data {
- public:
-  explicit CXFA_ExData(CXFA_Node* pNode);
-
-  FX_BOOL SetContentType(const CFX_WideString& wsContentType);
-};
-
-class CXFA_Image : public CXFA_Data {
- public:
-  CXFA_Image(CXFA_Node* pNode, FX_BOOL bDefValue);
-
-  int32_t GetAspect();
-  FX_BOOL GetContentType(CFX_WideString& wsContentType);
-  FX_BOOL GetHref(CFX_WideString& wsHref);
-  int32_t GetTransferEncoding();
-  FX_BOOL GetContent(CFX_WideString& wsText);
-  FX_BOOL SetContentType(const CFX_WideString& wsContentType);
-  FX_BOOL SetHref(const CFX_WideString& wsHref);
-  FX_BOOL SetTransferEncoding(int32_t iTransferEncoding);
-
- protected:
-  FX_BOOL m_bDefValue;
-};
-
-class CXFA_Calculate : public CXFA_Data {
- public:
-  explicit CXFA_Calculate(CXFA_Node* pNode);
-
-  int32_t GetOverride();
-  CXFA_Script GetScript();
-  void GetMessageText(CFX_WideString& wsMessage);
-};
-
-class CXFA_Validate : public CXFA_Data {
- public:
-  explicit CXFA_Validate(CXFA_Node* pNode);
-
-  int32_t GetFormatTest();
-  int32_t GetNullTest();
-  FX_BOOL SetNullTest(CFX_WideString wsValue);
-  int32_t GetScriptTest();
-  void GetFormatMessageText(CFX_WideString& wsMessage);
-  void SetFormatMessageText(CFX_WideString wsMessage);
-  void GetNullMessageText(CFX_WideString& wsMessage);
-  void SetNullMessageText(CFX_WideString wsMessage);
-  void GetScriptMessageText(CFX_WideString& wsMessage);
-  void SetScriptMessageText(CFX_WideString wsMessage);
-  void GetPicture(CFX_WideString& wsPicture);
-  CXFA_Script GetScript();
-
- protected:
-  void GetMessageText(CFX_WideString& wsMessage,
-                      const CFX_WideStringC& wsMessageType);
-  void SetMessageText(CFX_WideString& wsMessage,
-                      const CFX_WideStringC& wsMessageType);
-  FX_BOOL SetTestValue(int32_t iType,
-                       CFX_WideString& wsValue,
-                       XFA_ATTRIBUTEENUM eName);
-};
-
-class CXFA_Bind : public CXFA_Data {
- public:
-  explicit CXFA_Bind(CXFA_Node* pNode);
-
-  void GetPicture(CFX_WideString& wsPicture);
-};
-
-class CXFA_Assist : public CXFA_Data {
- public:
-  explicit CXFA_Assist(CXFA_Node* pNode);
-
-  CXFA_ToolTip GetToolTip();
-};
-
-class CXFA_ToolTip : public CXFA_Data {
- public:
-  explicit CXFA_ToolTip(CXFA_Node* pNode);
-
-  FX_BOOL GetTip(CFX_WideString& wsTip);
-};
-
-class CXFA_BindItems : public CXFA_Data {
- public:
-  explicit CXFA_BindItems(CXFA_Node* pNode);
-
-  void GetLabelRef(CFX_WideStringC& wsLabelRef);
-  void GetValueRef(CFX_WideStringC& wsValueRef);
-  void GetRef(CFX_WideStringC& wsRef);
-  FX_BOOL SetConnection(const CFX_WideString& wsConnection);
-};
-
-#define XFA_STROKE_SAMESTYLE_NoPresence 1
-#define XFA_STROKE_SAMESTYLE_Corner 2
-
-class CXFA_Stroke : public CXFA_Data {
- public:
-  explicit CXFA_Stroke(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-
-  bool IsCorner() const { return GetClassID() == XFA_ELEMENT_Corner; }
-  bool IsEdge() const { return GetClassID() == XFA_ELEMENT_Edge; }
-  bool IsVisible() const { return GetPresence() == XFA_ATTRIBUTEENUM_Visible; }
-  int32_t GetPresence() const;
-  int32_t GetCapType() const;
-  int32_t GetStrokeType() const;
-  FX_FLOAT GetThickness() const;
-  CXFA_Measurement GetMSThickness() const;
-  void SetMSThickness(CXFA_Measurement msThinkness);
-  FX_ARGB GetColor() const;
-  void SetColor(FX_ARGB argb);
-  int32_t GetJoinType() const;
-  FX_BOOL IsInverted() const;
-  FX_FLOAT GetRadius() const;
-  FX_BOOL SameStyles(CXFA_Stroke stroke, uint32_t dwFlags = 0) const;
-};
-
-class CXFA_Corner : public CXFA_Stroke {
- public:
-  explicit CXFA_Corner(CXFA_Node* pNode) : CXFA_Stroke(pNode) {}
-};
-
-class CXFA_Edge : public CXFA_Stroke {
- public:
-  explicit CXFA_Edge(CXFA_Node* pNode) : CXFA_Stroke(pNode) {}
-};
-
-typedef CFX_ArrayTemplate<CXFA_Stroke> CXFA_StrokeArray;
-typedef CFX_ArrayTemplate<CXFA_Edge> CXFA_EdgeArray;
-typedef CFX_ArrayTemplate<CXFA_Corner> CXFA_CornerArray;
-
-class CXFA_Box : public CXFA_Data {
- public:
-  explicit CXFA_Box(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-
-  bool IsArc() const { return GetClassID() == XFA_ELEMENT_Arc; }
-  bool IsBorder() const { return GetClassID() == XFA_ELEMENT_Border; }
-  bool IsRectangle() const { return GetClassID() == XFA_ELEMENT_Rectangle; }
-  int32_t GetHand() const;
-  int32_t GetPresence() const;
-  int32_t CountEdges() const;
-  CXFA_Edge GetEdge(int32_t nIndex = 0) const;
-  void GetStrokes(CXFA_StrokeArray& strokes) const;
-  FX_BOOL IsCircular() const;
-  FX_BOOL GetStartAngle(FX_FLOAT& fStartAngle) const;
-  FX_FLOAT GetStartAngle() const {
-    FX_FLOAT fStartAngle;
-    GetStartAngle(fStartAngle);
-    return fStartAngle;
-  }
-
-  FX_BOOL GetSweepAngle(FX_FLOAT& fSweepAngle) const;
-  FX_FLOAT GetSweepAngle() const {
-    FX_FLOAT fSweepAngle;
-    GetSweepAngle(fSweepAngle);
-    return fSweepAngle;
-  }
-
-  CXFA_Fill GetFill(FX_BOOL bModified = FALSE) const;
-  CXFA_Margin GetMargin() const;
-  int32_t Get3DStyle(FX_BOOL& bVisible, FX_FLOAT& fThickness) const;
-};
-
-class CXFA_Arc : public CXFA_Box {
- public:
-  explicit CXFA_Arc(CXFA_Node* pNode) : CXFA_Box(pNode) {}
-};
-
-class CXFA_Border : public CXFA_Box {
- public:
-  explicit CXFA_Border(CXFA_Node* pNode) : CXFA_Box(pNode) {}
-};
-
-class CXFA_Rectangle : public CXFA_Box {
- public:
-  explicit CXFA_Rectangle(CXFA_Node* pNode) : CXFA_Box(pNode) {}
-};
-
-enum XFA_CHECKSTATE {
-  XFA_CHECKSTATE_On = 0,
-  XFA_CHECKSTATE_Off = 1,
-  XFA_CHECKSTATE_Neutral = 2,
-};
-
-enum XFA_VALUEPICTURE {
-  XFA_VALUEPICTURE_Raw = 0,
-  XFA_VALUEPICTURE_Display,
-  XFA_VALUEPICTURE_Edit,
-  XFA_VALUEPICTURE_DataBind,
-};
-
-class CXFA_WidgetData : public CXFA_Data {
- public:
-  explicit CXFA_WidgetData(CXFA_Node* pNode);
-
-  CXFA_Node* GetUIChild();
-  XFA_ELEMENT GetUIType();
-  CFX_WideString GetRawValue();
-  int32_t GetAccess(FX_BOOL bTemplate = FALSE);
-  int32_t GetRotate();
-  CXFA_Border GetBorder(FX_BOOL bModified = FALSE);
-  CXFA_Caption GetCaption(FX_BOOL bModified = FALSE);
-  CXFA_Font GetFont(FX_BOOL bModified = FALSE);
-  CXFA_Margin GetMargin(FX_BOOL bModified = FALSE);
-  CXFA_Para GetPara(FX_BOOL bModified = FALSE);
-  void GetEventList(CXFA_NodeArray& events);
-  int32_t GetEventByActivity(int32_t iActivity,
-                             CXFA_NodeArray& events,
-                             FX_BOOL bIsFormReady = FALSE);
-  CXFA_Value GetDefaultValue(FX_BOOL bModified = FALSE);
-  CXFA_Value GetFormValue(FX_BOOL bModified = FALSE);
-  CXFA_Calculate GetCalculate(FX_BOOL bModified = FALSE);
-  CXFA_Validate GetValidate(FX_BOOL bModified = FALSE);
-  CXFA_Bind GetBind(FX_BOOL bModified = FALSE);
-  CXFA_Assist GetAssist(FX_BOOL bModified = FALSE);
-  uint32_t GetRelevantStatus();
-  FX_BOOL GetWidth(FX_FLOAT& fWidth);
-  FX_BOOL GetHeight(FX_FLOAT& fHeight);
-  FX_BOOL GetMinWidth(FX_FLOAT& fMinWidth);
-  FX_BOOL GetMinHeight(FX_FLOAT& fMinHeight);
-  FX_BOOL GetMaxWidth(FX_FLOAT& fMaxWidth);
-  FX_BOOL GetMaxHeight(FX_FLOAT& fMaxHeight);
-  CXFA_Border GetUIBorder(FX_BOOL bModified = FALSE);
-  CXFA_Margin GetUIMargin(FX_BOOL bModified = FALSE);
-  void GetUIMargin(CFX_RectF& rtUIMargin);
-  int32_t GetButtonHighlight();
-  FX_BOOL GetButtonRollover(CFX_WideString& wsRollover, FX_BOOL& bRichText);
-  FX_BOOL GetButtonDown(CFX_WideString& wsDown, FX_BOOL& bRichText);
-  int32_t GetCheckButtonShape();
-  int32_t GetCheckButtonMark();
-  FX_FLOAT GetCheckButtonSize();
-  FX_BOOL IsAllowNeutral();
-  FX_BOOL IsRadioButton();
-  XFA_CHECKSTATE GetCheckState();
-  void SetCheckState(XFA_CHECKSTATE eCheckState, FX_BOOL bNotify = TRUE);
-  CXFA_Node* GetExclGroupNode();
-  CXFA_Node* GetSelectedMember();
-  CXFA_Node* SetSelectedMember(const CFX_WideStringC& wsName,
-                               FX_BOOL bNotify = TRUE);
-  void SetSelectedMemberByValue(const CFX_WideStringC& wsValue,
-                                FX_BOOL bNotify = TRUE,
-                                FX_BOOL bScriptModify = FALSE,
-                                FX_BOOL bSyncData = TRUE);
-  CXFA_Node* GetExclGroupFirstMember();
-  CXFA_Node* GetExclGroupNextMember(CXFA_Node* pNode);
-  int32_t GetChoiceListCommitOn();
-  FX_BOOL IsChoiceListAllowTextEntry();
-  int32_t GetChoiceListOpen();
-  FX_BOOL IsListBox();
-  int32_t CountChoiceListItems(FX_BOOL bSaveValue = FALSE);
-  FX_BOOL GetChoiceListItem(CFX_WideString& wsText,
-                            int32_t nIndex,
-                            FX_BOOL bSaveValue = FALSE);
-  void GetChoiceListItems(CFX_WideStringArray& wsTextArray,
-                          FX_BOOL bSaveValue = FALSE);
-  int32_t CountSelectedItems();
-  int32_t GetSelectedItem(int32_t nIndex = 0);
-  void GetSelectedItems(CFX_Int32Array& iSelArray);
-  void GetSelectedItemsValue(CFX_WideStringArray& wsSelTextArray);
-  FX_BOOL GetItemState(int32_t nIndex);
-  void SetItemState(int32_t nIndex,
-                    FX_BOOL bSelected,
-                    FX_BOOL bNotify = FALSE,
-                    FX_BOOL bScriptModify = FALSE,
-                    FX_BOOL bSyncData = TRUE);
-  void SetSelectdItems(CFX_Int32Array& iSelArray,
-                       FX_BOOL bNotify = FALSE,
-                       FX_BOOL bScriptModify = FALSE,
-                       FX_BOOL bSyncData = TRUE);
-  void ClearAllSelections();
-  void InsertItem(const CFX_WideString& wsLabel,
-                  const CFX_WideString& wsValue,
-                  int32_t nIndex = -1,
-                  FX_BOOL bNotify = FALSE);
-  void GetItemLabel(const CFX_WideStringC& wsValue, CFX_WideString& wsLabel);
-  void GetItemValue(const CFX_WideStringC& wsLabel, CFX_WideString& wsValue);
-  FX_BOOL DeleteItem(int32_t nIndex,
-                     FX_BOOL bNotify = FALSE,
-                     FX_BOOL bScriptModify = FALSE,
-                     FX_BOOL bSyncData = TRUE);
-  int32_t GetHorizontalScrollPolicy();
-  int32_t GetNumberOfCells();
-  FX_BOOL SetValue(const CFX_WideString& wsValue, XFA_VALUEPICTURE eValueType);
-  FX_BOOL GetPictureContent(CFX_WideString& wsPicture,
-                            XFA_VALUEPICTURE ePicture);
-  IFX_Locale* GetLocal();
-  FX_BOOL GetValue(CFX_WideString& wsValue, XFA_VALUEPICTURE eValueType);
-  FX_BOOL GetNormalizeDataValue(const CFX_WideStringC& wsValue,
-                                CFX_WideString& wsNormalizeValue);
-  FX_BOOL GetFormatDataValue(const CFX_WideStringC& wsValue,
-                             CFX_WideString& wsFormatedValue);
-  void NormalizeNumStr(const CFX_WideString& wsValue, CFX_WideString& wsOutput);
-  CFX_WideString GetBarcodeType();
-  FX_BOOL GetBarcodeAttribute_CharEncoding(int32_t& val);
-  FX_BOOL GetBarcodeAttribute_Checksum(int32_t& val);
-  FX_BOOL GetBarcodeAttribute_DataLength(int32_t& val);
-  FX_BOOL GetBarcodeAttribute_StartChar(FX_CHAR& val);
-  FX_BOOL GetBarcodeAttribute_EndChar(FX_CHAR& val);
-  FX_BOOL GetBarcodeAttribute_ECLevel(int32_t& val);
-  FX_BOOL GetBarcodeAttribute_ModuleWidth(int32_t& val);
-  FX_BOOL GetBarcodeAttribute_ModuleHeight(int32_t& val);
-  FX_BOOL GetBarcodeAttribute_PrintChecksum(FX_BOOL& val);
-  FX_BOOL GetBarcodeAttribute_TextLocation(int32_t& val);
-  FX_BOOL GetBarcodeAttribute_Truncate(FX_BOOL& val);
-  FX_BOOL GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT& val);
-  void GetPasswordChar(CFX_WideString& wsPassWord);
-  FX_BOOL IsMultiLine();
-  int32_t GetVerticalScrollPolicy();
-  int32_t GetMaxChars(XFA_ELEMENT& eType);
-  FX_BOOL GetFracDigits(int32_t& iFracDigits);
-  FX_BOOL GetLeadDigits(int32_t& iLeadDigits);
-
-  FX_BOOL m_bIsNull;
-  FX_BOOL m_bPreNull;
-
- protected:
-  void SyncValue(const CFX_WideString& wsValue, FX_BOOL bNotify);
-  void InsertListTextItem(CXFA_Node* pItems,
-                          const CFX_WideStringC& wsText,
-                          int32_t nIndex = -1);
-  void FormatNumStr(const CFX_WideString& wsValue,
-                    IFX_Locale* pLocale,
-                    CFX_WideString& wsOutput);
-
-  CXFA_Node* m_pUiChildNode;
-  XFA_ELEMENT m_eUIType;
-};
-
-class CXFA_Occur : public CXFA_Data {
- public:
-  explicit CXFA_Occur(CXFA_Node* pNode);
-
-  int32_t GetMax();
-  int32_t GetMin();
-  FX_BOOL GetOccurInfo(int32_t& iMin, int32_t& iMax, int32_t& iInit);
-  void SetMax(int32_t iMax);
-  void SetMin(int32_t iMin);
-};
-
-#endif  // XFA_INCLUDE_FXFA_FXFA_OBJECTACC_H_
diff --git a/xfa/include/fxfa/fxfa_widget.h b/xfa/include/fxfa/fxfa_widget.h
index f1fcffe..6ab7a6f 100644
--- a/xfa/include/fxfa/fxfa_widget.h
+++ b/xfa/include/fxfa/fxfa_widget.h
@@ -7,7 +7,15 @@
 #ifndef XFA_INCLUDE_FXFA_FXFA_WIDGET_H_
 #define XFA_INCLUDE_FXFA_FXFA_WIDGET_H_
 
-#include "xfa/include/fxfa/fxfa_objectacc.h"
+#include "core/fxcrt/include/fx_coordinates.h"
+#include "core/fxge/include/fx_dib.h"
+#include "xfa/fxfa/parser/cxfa_box.h"
+#include "xfa/fxfa/parser/cxfa_event.h"
+#include "xfa/fxfa/parser/cxfa_image.h"
+#include "xfa/fxfa/parser/cxfa_margin.h"
+#include "xfa/fxfa/parser/cxfa_script.h"
+#include "xfa/fxfa/parser/cxfa_value.h"
+#include "xfa/fxfa/parser/cxfa_widgetdata.h"
 
 class CXFA_Node;
 class CXFA_FFDocView;
diff --git a/xfa/include/fxfa/xfa_ffwidget.h b/xfa/include/fxfa/xfa_ffwidget.h
index 0690b7f..30ad6d2 100644
--- a/xfa/include/fxfa/xfa_ffwidget.h
+++ b/xfa/include/fxfa/xfa_ffwidget.h
@@ -169,9 +169,6 @@
 void XFA_RectWidthoutMargin(CFX_RectF& rt,
                             const CXFA_Margin& mg,
                             FX_BOOL bUI = FALSE);
-FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray& strokes,
-                              FX_BOOL b3DStyle,
-                              int32_t nIndex);
 CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem);
 FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType);
 #define XFA_DRAWBOX_ForceRound 1
