Index: xfa/fxfa/parser/cxfa_widgetdata.cpp |
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp |
index 1dd78e198fe8beebc1b016c4bc47b4cedcc91019..f372c51f2cf99c420c774e1182be3eefd068c3ee 100644 |
--- a/xfa/fxfa/parser/cxfa_widgetdata.cpp |
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp |
@@ -70,6 +70,142 @@ FX_BOOL SplitDateTime(const CFX_WideString& wsDateTime, |
return TRUE; |
} |
+CXFA_Node* CreateUIChild(CXFA_Node* pNode, XFA_Element& eWidgetType) { |
+ XFA_Element eType = pNode->GetElementType(); |
+ eWidgetType = eType; |
+ if (eType != XFA_Element::Field && eType != XFA_Element::Draw) |
+ return nullptr; |
+ |
+ eWidgetType = XFA_Element::Unknown; |
+ XFA_Element eUIType = XFA_Element::Unknown; |
+ CXFA_Value defValue(pNode->GetProperty(0, XFA_Element::Value, TRUE)); |
+ XFA_Element eValueType = defValue.GetChildValueClassID(); |
+ switch (eValueType) { |
+ case XFA_Element::Boolean: |
+ eUIType = XFA_Element::CheckButton; |
+ break; |
+ case XFA_Element::Integer: |
+ case XFA_Element::Decimal: |
+ case XFA_Element::Float: |
+ eUIType = XFA_Element::NumericEdit; |
+ break; |
+ case XFA_Element::ExData: |
+ case XFA_Element::Text: |
+ eUIType = XFA_Element::TextEdit; |
+ eWidgetType = XFA_Element::Text; |
+ break; |
+ case XFA_Element::Date: |
+ case XFA_Element::Time: |
+ case XFA_Element::DateTime: |
+ eUIType = XFA_Element::DateTimeEdit; |
+ break; |
+ case XFA_Element::Image: |
+ eUIType = XFA_Element::ImageEdit; |
+ eWidgetType = XFA_Element::Image; |
+ break; |
+ case XFA_Element::Arc: |
+ case XFA_Element::Line: |
+ case XFA_Element::Rectangle: |
+ eUIType = XFA_Element::DefaultUi; |
+ eWidgetType = eValueType; |
+ break; |
+ default: |
+ break; |
+ } |
+ |
+ CXFA_Node* pUIChild = nullptr; |
+ CXFA_Node* pUI = pNode->GetProperty(0, XFA_Element::Ui, TRUE); |
+ CXFA_Node* pChild = pUI->GetNodeItem(XFA_NODEITEM_FirstChild); |
+ for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
+ XFA_Element eChildType = pChild->GetElementType(); |
+ if (eChildType == XFA_Element::Extras || |
+ eChildType == XFA_Element::Picture) { |
+ continue; |
+ } |
+ const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement( |
+ XFA_Element::Ui, eChildType, XFA_XDPPACKET_Form); |
+ if (pProperty && (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) { |
+ pUIChild = pChild; |
+ break; |
+ } |
+ } |
+ |
+ if (eType == XFA_Element::Draw) { |
+ XFA_Element eDraw = |
+ pUIChild ? pUIChild->GetElementType() : XFA_Element::Unknown; |
+ switch (eDraw) { |
+ case XFA_Element::TextEdit: |
+ eWidgetType = XFA_Element::Text; |
+ break; |
+ case XFA_Element::ImageEdit: |
+ eWidgetType = XFA_Element::Image; |
+ break; |
+ default: |
+ eWidgetType = eWidgetType == XFA_Element::Unknown ? XFA_Element::Text |
+ : eWidgetType; |
+ break; |
+ } |
+ } else { |
+ if (pUIChild && pUIChild->GetElementType() == XFA_Element::DefaultUi) { |
+ eWidgetType = XFA_Element::TextEdit; |
+ } else { |
+ eWidgetType = |
+ pUIChild ? pUIChild->GetElementType() |
+ : (eUIType == XFA_Element::Unknown ? XFA_Element::TextEdit |
+ : eUIType); |
+ } |
+ } |
+ |
+ if (!pUIChild) { |
+ if (eUIType == XFA_Element::Unknown) { |
+ eUIType = XFA_Element::TextEdit; |
+ defValue.GetNode()->GetProperty(0, XFA_Element::Text, TRUE); |
+ } |
+ return pUI->GetProperty(0, eUIType, TRUE); |
+ } |
+ |
+ if (eUIType != XFA_Element::Unknown) |
+ return pUIChild; |
+ |
+ switch (pUIChild->GetElementType()) { |
+ case XFA_Element::CheckButton: { |
+ eValueType = XFA_Element::Text; |
+ if (CXFA_Node* pItems = pNode->GetChild(0, XFA_Element::Items)) { |
+ if (CXFA_Node* pItem = pItems->GetChild(0, XFA_Element::Unknown)) |
+ eValueType = pItem->GetElementType(); |
+ } |
+ break; |
+ } |
+ case XFA_Element::DateTimeEdit: |
+ eValueType = XFA_Element::DateTime; |
+ break; |
+ case XFA_Element::ImageEdit: |
+ eValueType = XFA_Element::Image; |
+ break; |
+ case XFA_Element::NumericEdit: |
+ eValueType = XFA_Element::Float; |
+ break; |
+ case XFA_Element::ChoiceList: { |
+ eValueType = (pUIChild->GetEnum(XFA_ATTRIBUTE_Open) == |
+ XFA_ATTRIBUTEENUM_MultiSelect) |
+ ? XFA_Element::ExData |
+ : XFA_Element::Text; |
+ break; |
+ } |
+ case XFA_Element::Barcode: |
+ case XFA_Element::Button: |
+ case XFA_Element::PasswordEdit: |
+ case XFA_Element::Signature: |
+ case XFA_Element::TextEdit: |
+ default: |
+ eValueType = XFA_Element::Text; |
+ break; |
+ } |
+ defValue.GetNode()->GetProperty(0, eValueType, TRUE); |
+ |
+ return pUIChild; |
+} |
+ |
} // namespace |
CXFA_WidgetData::CXFA_WidgetData(CXFA_Node* pNode) |
@@ -81,7 +217,7 @@ CXFA_WidgetData::CXFA_WidgetData(CXFA_Node* pNode) |
CXFA_Node* CXFA_WidgetData::GetUIChild() { |
if (m_eUIType == XFA_Element::Unknown) |
- m_pUiChildNode = XFA_CreateUIChild(m_pNode, m_eUIType); |
+ m_pUiChildNode = CreateUIChild(m_pNode, m_eUIType); |
return m_pUiChildNode; |
} |