diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2018-01-22 18:43:17 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-01-22 18:43:17 +0000 |
commit | ed4038bc335385b7e341d8de5c2bec8db5dcdcb6 (patch) | |
tree | 86af694f9185c0be181c778cf45ede8f57791534 /xfa/fxfa | |
parent | d7d584df24fda9c9a28330959cc28f94dc0294e2 (diff) | |
download | pdfium-ed4038bc335385b7e341d8de5c2bec8db5dcdcb6.tar.xz |
Move the UI elements from CXFA_WidgetAcc to CXFA_Node
This CL moves the methods and members related to the UI nodes from the
CXFA_WidgetAcc class to the CXFA_Node class.
Change-Id: I1fdc5173787141065f1e607bbfefa3b22af738b4
Reviewed-on: https://pdfium-review.googlesource.com/23290
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'xfa/fxfa')
-rw-r--r-- | xfa/fxfa/cxfa_ffbarcode.cpp | 2 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_ffcheckbutton.cpp | 8 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_fffield.cpp | 20 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_ffimageedit.cpp | 4 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_ffnotify.cpp | 23 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_ffnotify.h | 4 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_ffpageview.cpp | 6 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_ffsignature.cpp | 2 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_fftextedit.cpp | 14 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_fwltheme.cpp | 11 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_textprovider.cpp | 2 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_widgetacc.cpp | 285 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_widgetacc.h | 8 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_node.cpp | 265 | ||||
-rw-r--r-- | xfa/fxfa/parser/cxfa_node.h | 7 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_document_datamerger_imp.cpp | 8 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_utils.cpp | 6 |
17 files changed, 327 insertions, 348 deletions
diff --git a/xfa/fxfa/cxfa_ffbarcode.cpp b/xfa/fxfa/cxfa_ffbarcode.cpp index 3ed57b9c28..86b06185e4 100644 --- a/xfa/fxfa/cxfa_ffbarcode.cpp +++ b/xfa/fxfa/cxfa_ffbarcode.cpp @@ -146,7 +146,7 @@ void CXFA_FFBarcode::RenderWidget(CXFA_Graphics* pGS, mtRotate.Concat(matrix); CXFA_FFWidget::RenderWidget(pGS, mtRotate, dwStatus); - DrawBorder(pGS, m_pNode->GetWidgetAcc()->GetUIBorder(), m_rtUI, mtRotate); + DrawBorder(pGS, m_pNode->GetUIBorder(), m_rtUI, mtRotate); RenderCaption(pGS, &mtRotate); CFX_RectF rtWidget = m_pNormalWidget->GetWidgetRect(); diff --git a/xfa/fxfa/cxfa_ffcheckbutton.cpp b/xfa/fxfa/cxfa_ffcheckbutton.cpp index 89af82cdac..858cbf4a5e 100644 --- a/xfa/fxfa/cxfa_ffcheckbutton.cpp +++ b/xfa/fxfa/cxfa_ffcheckbutton.cpp @@ -173,7 +173,7 @@ bool CXFA_FFCheckButton::PerformLayout() { m_rtUI.height = fCheckSize; AddUIMargin(iCapPlacement); m_rtCheckBox = m_rtUI; - CXFA_Border* borderUI = m_pNode->GetWidgetAcc()->GetUIBorder(); + CXFA_Border* borderUI = m_pNode->GetUIBorder(); if (borderUI) { CXFA_Margin* borderMargin = borderUI->GetMarginIfExists(); if (borderMargin) @@ -201,7 +201,7 @@ void CXFA_FFCheckButton::CapLeftRightPlacement( } void CXFA_FFCheckButton::AddUIMargin(XFA_AttributeEnum iCapPlacement) { - CFX_RectF rtUIMargin = m_pNode->GetWidgetAcc()->GetUIMargin(); + CFX_RectF rtUIMargin = m_pNode->GetUIMargin(); m_rtUI.top -= rtUIMargin.top / 2 - rtUIMargin.height / 2; float fLeftAddRight = rtUIMargin.left + rtUIMargin.width; @@ -234,8 +234,8 @@ void CXFA_FFCheckButton::RenderWidget(CXFA_Graphics* pGS, mtRotate.Concat(matrix); CXFA_FFWidget::RenderWidget(pGS, mtRotate, dwStatus); - DrawBorderWithFlag(pGS, m_pNode->GetWidgetAcc()->GetUIBorder(), m_rtUI, - mtRotate, m_pNode->GetWidgetAcc()->IsCheckButtonRound()); + DrawBorderWithFlag(pGS, m_pNode->GetUIBorder(), m_rtUI, mtRotate, + m_pNode->GetWidgetAcc()->IsCheckButtonRound()); RenderCaption(pGS, &mtRotate); DrawHighlight(pGS, &mtRotate, dwStatus, m_pNode->GetWidgetAcc()->IsCheckButtonRound()); diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp index cd4359d7eb..c7d54762f5 100644 --- a/xfa/fxfa/cxfa_fffield.cpp +++ b/xfa/fxfa/cxfa_fffield.cpp @@ -49,7 +49,7 @@ CFX_RectF CXFA_FFField::GetBBox(uint32_t dwStatus, bool bDrawFocus) { if (!bDrawFocus) return CXFA_FFWidget::GetBBox(dwStatus); - XFA_Element type = m_pNode->GetWidgetAcc()->GetUIType(); + XFA_Element type = m_pNode->GetUIType(); if (type != XFA_Element::Button && type != XFA_Element::CheckButton && type != XFA_Element::ImageEdit && type != XFA_Element::Signature && type != XFA_Element::ChoiceList) { @@ -69,7 +69,7 @@ void CXFA_FFField::RenderWidget(CXFA_Graphics* pGS, mtRotate.Concat(matrix); CXFA_FFWidget::RenderWidget(pGS, mtRotate, dwStatus); - DrawBorder(pGS, m_pNode->GetWidgetAcc()->GetUIBorder(), m_rtUI, mtRotate); + DrawBorder(pGS, m_pNode->GetUIBorder(), m_rtUI, mtRotate); RenderCaption(pGS, &mtRotate); DrawHighlight(pGS, &mtRotate, dwStatus, false); @@ -136,7 +136,7 @@ void CXFA_FFField::UnloadWidget() { } void CXFA_FFField::SetEditScrollOffset() { - XFA_Element eType = m_pNode->GetWidgetAcc()->GetUIType(); + XFA_Element eType = m_pNode->GetUIType(); if (eType != XFA_Element::TextEdit && eType != XFA_Element::NumericEdit && eType != XFA_Element::PasswordEdit) { return; @@ -144,10 +144,8 @@ void CXFA_FFField::SetEditScrollOffset() { float fScrollOffset = 0; CXFA_FFField* pPrev = ToField(GetPrev()); - if (pPrev) { - CFX_RectF rtMargin = m_pNode->GetWidgetAcc()->GetUIMargin(); - fScrollOffset = -rtMargin.top; - } + if (pPrev) + fScrollOffset = -(m_pNode->GetUIMargin().top); while (pPrev) { fScrollOffset += pPrev->m_rtUI.height; @@ -267,7 +265,7 @@ void CXFA_FFField::CapPlacement() { break; } - CXFA_Border* borderUI = m_pNode->GetWidgetAcc()->GetUIBorder(); + CXFA_Border* borderUI = m_pNode->GetUIBorder(); if (borderUI) { CXFA_Margin* borderMargin = borderUI->GetMarginIfExists(); if (borderMargin) @@ -279,7 +277,7 @@ void CXFA_FFField::CapPlacement() { void CXFA_FFField::CapTopBottomPlacement(const CXFA_Margin* margin, const CFX_RectF& rtWidget, XFA_AttributeEnum iCapPlacement) { - CFX_RectF rtUIMargin = m_pNode->GetWidgetAcc()->GetUIMargin(); + CFX_RectF rtUIMargin = m_pNode->GetUIMargin(); m_rtCaption.left += rtUIMargin.left; if (margin) { XFA_RectWithoutMargin(m_rtCaption, margin); @@ -305,7 +303,7 @@ void CXFA_FFField::CapTopBottomPlacement(const CXFA_Margin* margin, void CXFA_FFField::CapLeftRightPlacement(const CXFA_Margin* margin, const CFX_RectF& rtWidget, XFA_AttributeEnum iCapPlacement) { - CFX_RectF rtUIMargin = m_pNode->GetWidgetAcc()->GetUIMargin(); + CFX_RectF rtUIMargin = m_pNode->GetUIMargin(); m_rtCaption.top += rtUIMargin.top; m_rtCaption.height -= rtUIMargin.top; if (margin) { @@ -336,7 +334,7 @@ void CXFA_FFField::UpdateFWL() { } uint32_t CXFA_FFField::UpdateUIProperty() { - CXFA_Node* pUiNode = m_pNode->GetWidgetAcc()->GetUIChild(); + CXFA_Node* pUiNode = m_pNode->GetUIChild(); if (pUiNode && pUiNode->GetElementType() == XFA_Element::DefaultUi) return FWL_STYLEEXT_EDT_ReadOnly; return 0; diff --git a/xfa/fxfa/cxfa_ffimageedit.cpp b/xfa/fxfa/cxfa_ffimageedit.cpp index 0e97559e6a..229fe9219e 100644 --- a/xfa/fxfa/cxfa_ffimageedit.cpp +++ b/xfa/fxfa/cxfa_ffimageedit.cpp @@ -65,7 +65,7 @@ void CXFA_FFImageEdit::RenderWidget(CXFA_Graphics* pGS, mtRotate.Concat(matrix); CXFA_FFWidget::RenderWidget(pGS, mtRotate, dwStatus); - DrawBorder(pGS, m_pNode->GetWidgetAcc()->GetUIBorder(), m_rtUI, mtRotate); + DrawBorder(pGS, m_pNode->GetUIBorder(), m_rtUI, mtRotate); RenderCaption(pGS, &mtRotate); RetainPtr<CFX_DIBitmap> pDIBitmap = m_pNode->GetWidgetAcc()->GetImageEditImage(); @@ -117,7 +117,7 @@ void CXFA_FFImageEdit::SetFWLRect() { if (!m_pNormalWidget) return; - CFX_RectF rtUIMargin = m_pNode->GetWidgetAcc()->GetUIMargin(); + CFX_RectF rtUIMargin = m_pNode->GetUIMargin(); CFX_RectF rtImage(m_rtUI); rtImage.Deflate(rtUIMargin.left, rtUIMargin.top, rtUIMargin.width, rtUIMargin.height); diff --git a/xfa/fxfa/cxfa_ffnotify.cpp b/xfa/fxfa/cxfa_ffnotify.cpp index 301a8ecf04..7d9f1c6fa5 100644 --- a/xfa/fxfa/cxfa_ffnotify.cpp +++ b/xfa/fxfa/cxfa_ffnotify.cpp @@ -63,18 +63,17 @@ void CXFA_FFNotify::OnPageEvent(CXFA_ContainerLayoutItem* pSender, pDocView->OnPageEvent(pSender, dwEvent); } -void CXFA_FFNotify::OnWidgetListItemAdded(CXFA_WidgetAcc* pSender, +void CXFA_FFNotify::OnWidgetListItemAdded(CXFA_Node* pSender, const wchar_t* pLabel, const wchar_t* pValue, int32_t iIndex) { if (pSender->GetUIType() != XFA_Element::ChoiceList) return; - CXFA_FFWidget* pWidget = - m_pDoc->GetDocView()->GetWidgetForNode(pSender->GetNode()); - for (; pWidget; pWidget = pSender->GetNextWidget(pWidget)) { + CXFA_FFWidget* pWidget = m_pDoc->GetDocView()->GetWidgetForNode(pSender); + for (; pWidget; pWidget = pSender->GetWidgetAcc()->GetNextWidget(pWidget)) { if (pWidget->IsLoaded()) { - if (pSender->IsListBox()) + if (pSender->GetWidgetAcc()->IsListBox()) ToListBox(pWidget)->InsertItem(pLabel, iIndex); else ToComboBox(pWidget)->InsertItem(pLabel, iIndex); @@ -82,16 +81,15 @@ void CXFA_FFNotify::OnWidgetListItemAdded(CXFA_WidgetAcc* pSender, } } -void CXFA_FFNotify::OnWidgetListItemRemoved(CXFA_WidgetAcc* pSender, +void CXFA_FFNotify::OnWidgetListItemRemoved(CXFA_Node* pSender, int32_t iIndex) { if (pSender->GetUIType() != XFA_Element::ChoiceList) return; - CXFA_FFWidget* pWidget = - m_pDoc->GetDocView()->GetWidgetForNode(pSender->GetNode()); - for (; pWidget; pWidget = pSender->GetNextWidget(pWidget)) { + CXFA_FFWidget* pWidget = m_pDoc->GetDocView()->GetWidgetForNode(pSender); + for (; pWidget; pWidget = pSender->GetWidgetAcc()->GetNextWidget(pWidget)) { if (pWidget->IsLoaded()) { - if (pSender->IsListBox()) + if (pSender->GetWidgetAcc()->IsListBox()) ToListBox(pWidget)->DeleteItem(iIndex); else ToComboBox(pWidget)->DeleteItem(iIndex); @@ -121,7 +119,7 @@ CXFA_ContentLayoutItem* CXFA_FFNotify::OnCreateContentLayoutItem( return new CXFA_ContentLayoutItem(pNode); CXFA_FFWidget* pWidget; - switch (pNode->GetWidgetAcc()->GetUIType()) { + switch (pNode->GetUIType()) { case XFA_Element::Barcode: pWidget = new CXFA_FFBarcode(pNode); break; @@ -272,8 +270,7 @@ CXFA_FFWidget* CXFA_FFNotify::GetHWidget(CXFA_LayoutItem* pLayoutItem) { } void CXFA_FFNotify::OpenDropDownList(CXFA_FFWidget* hWidget) { - if (hWidget->GetNode()->GetWidgetAcc()->GetUIType() != - XFA_Element::ChoiceList) + if (hWidget->GetNode()->GetUIType() != XFA_Element::ChoiceList) return; CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); diff --git a/xfa/fxfa/cxfa_ffnotify.h b/xfa/fxfa/cxfa_ffnotify.h index 924a060210..4086b0adb3 100644 --- a/xfa/fxfa/cxfa_ffnotify.h +++ b/xfa/fxfa/cxfa_ffnotify.h @@ -21,11 +21,11 @@ class CXFA_FFNotify { void OnPageEvent(CXFA_ContainerLayoutItem* pSender, uint32_t dwEvent); - void OnWidgetListItemAdded(CXFA_WidgetAcc* pSender, + void OnWidgetListItemAdded(CXFA_Node* pSender, const wchar_t* pLabel, const wchar_t* pValue, int32_t iIndex); - void OnWidgetListItemRemoved(CXFA_WidgetAcc* pSender, int32_t iIndex); + void OnWidgetListItemRemoved(CXFA_Node* pSender, int32_t iIndex); // Node events void OnNodeReady(CXFA_Node* pNode); diff --git a/xfa/fxfa/cxfa_ffpageview.cpp b/xfa/fxfa/cxfa_ffpageview.cpp index fe1fbb517f..72fe3f4b88 100644 --- a/xfa/fxfa/cxfa_ffpageview.cpp +++ b/xfa/fxfa/cxfa_ffpageview.cpp @@ -344,8 +344,8 @@ void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() { nWidgetCount) { if (!pdfium::ContainsValue(m_TabOrderWidgetArray, hWidget)) { m_TabOrderWidgetArray.push_back(hWidget); - CXFA_WidgetAcc* pWidgetAcc = hWidget->GetNode()->GetWidgetAcc(); - if (pWidgetAcc->GetUIType() == XFA_Element::ExclGroup) { + CXFA_Node* pNode = hWidget->GetNode(); + if (pNode->GetUIType() == XFA_Element::ExclGroup) { auto it = std::find(SpaceOrderWidgetArray.begin(), SpaceOrderWidgetArray.end(), hWidget); int32_t iWidgetIndex = it != SpaceOrderWidgetArray.end() @@ -354,7 +354,7 @@ void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() { while (true) { CXFA_FFWidget* radio = SpaceOrderWidgetArray[iWidgetIndex % nWidgetCount]; - if (radio->GetNode()->GetExclGroupIfExists() != pWidgetAcc->GetNode()) + if (radio->GetNode()->GetExclGroupIfExists() != pNode) break; if (!pdfium::ContainsValue(m_TabOrderWidgetArray, hWidget)) m_TabOrderWidgetArray.push_back(radio); diff --git a/xfa/fxfa/cxfa_ffsignature.cpp b/xfa/fxfa/cxfa_ffsignature.cpp index 6e56b38ad1..6911facce1 100644 --- a/xfa/fxfa/cxfa_ffsignature.cpp +++ b/xfa/fxfa/cxfa_ffsignature.cpp @@ -31,7 +31,7 @@ void CXFA_FFSignature::RenderWidget(CXFA_Graphics* pGS, CXFA_FFWidget::RenderWidget(pGS, mtRotate, dwStatus); - DrawBorder(pGS, m_pNode->GetWidgetAcc()->GetUIBorder(), m_rtUI, mtRotate); + DrawBorder(pGS, m_pNode->GetUIBorder(), m_rtUI, mtRotate); RenderCaption(pGS, &mtRotate); DrawHighlight(pGS, &mtRotate, dwStatus, false); } diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp index fad9a9b37a..19405d2d2a 100644 --- a/xfa/fxfa/cxfa_fftextedit.cpp +++ b/xfa/fxfa/cxfa_fftextedit.cpp @@ -193,15 +193,14 @@ bool CXFA_FFTextEdit::CommitData() { } void CXFA_FFTextEdit::ValidateNumberField(const WideString& wsText) { - CXFA_WidgetAcc* pAcc = GetNode()->GetWidgetAcc(); - if (!pAcc || pAcc->GetUIType() != XFA_Element::NumericEdit) + if (GetNode()->GetUIType() != XFA_Element::NumericEdit) return; IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider(); if (!pAppProvider) return; - WideString wsSomField = pAcc->GetNode()->GetSOMExpression(); + WideString wsSomField = GetNode()->GetSOMExpression(); pAppProvider->MsgBox(WideString::Format(L"%ls can not contain %ls", wsText.c_str(), wsSomField.c_str()), pAppProvider->GetAppTitle(), XFA_MBICON_Error, @@ -260,7 +259,7 @@ bool CXFA_FFTextEdit::UpdateFWLData() { eType = XFA_VALUEPICTURE_Edit; bool bUpdate = false; - if (m_pNode->GetWidgetAcc()->GetUIType() == XFA_Element::TextEdit && + if (m_pNode->GetUIType() == XFA_Element::TextEdit && !m_pNode->GetWidgetAcc()->GetNumberOfCells()) { XFA_Element elementType; int32_t iMaxChars; @@ -271,7 +270,7 @@ bool CXFA_FFTextEdit::UpdateFWLData() { pEdit->SetLimit(iMaxChars); bUpdate = true; } - } else if (m_pNode->GetWidgetAcc()->GetUIType() == XFA_Element::Barcode) { + } else if (m_pNode->GetUIType() == XFA_Element::Barcode) { int32_t nDataLen = 0; if (eType == XFA_VALUEPICTURE_Edit) nDataLen = m_pNode->GetBarcodeAttribute_DataLength().value_or(0); @@ -302,7 +301,7 @@ void CXFA_FFTextEdit::OnTextChanged(CFWL_Widget* pWidget, eParam.m_pTarget = m_pNode->GetWidgetAcc(); eParam.m_wsPrevText = wsPrevText; CFWL_Edit* pEdit = static_cast<CFWL_Edit*>(m_pNormalWidget.get()); - if (m_pNode->GetWidgetAcc()->GetUIType() == XFA_Element::DateTimeEdit) { + if (m_pNode->GetUIType() == XFA_Element::DateTimeEdit) { CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)pEdit; eParam.m_wsNewText = pDateTime->GetEditText(); if (pDateTime->HasSelection()) { @@ -326,8 +325,7 @@ void CXFA_FFTextEdit::OnTextFull(CFWL_Widget* pWidget) { } bool CXFA_FFTextEdit::CheckWord(const ByteStringView& sWord) { - return sWord.IsEmpty() || - m_pNode->GetWidgetAcc()->GetUIType() != XFA_Element::TextEdit; + return sWord.IsEmpty() || m_pNode->GetUIType() != XFA_Element::TextEdit; } void CXFA_FFTextEdit::OnProcessMessage(CFWL_Message* pMessage) { diff --git a/xfa/fxfa/cxfa_fwltheme.cpp b/xfa/fxfa/cxfa_fwltheme.cpp index 920968269f..c7c521ea66 100644 --- a/xfa/fxfa/cxfa_fwltheme.cpp +++ b/xfa/fxfa/cxfa_fwltheme.cpp @@ -147,18 +147,17 @@ void CXFA_FWLTheme::DrawText(CFWL_ThemeText* pParams) { } CFX_RectF CXFA_FWLTheme::GetUIMargin(CFWL_ThemePart* pThemePart) const { - CFX_RectF rect; CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget); if (!pWidget) - return rect; + return CFX_RectF(); CXFA_LayoutItem* pItem = pWidget; - CXFA_WidgetAcc* pWidgetAcc = pWidget->GetNode()->GetWidgetAcc(); - rect = pWidgetAcc->GetUIMargin(); - CXFA_Para* para = pWidgetAcc->GetNode()->GetParaIfExists(); + CXFA_Node* pNode = pWidget->GetNode(); + CFX_RectF rect = pNode->GetUIMargin(); + CXFA_Para* para = pNode->GetParaIfExists(); if (para) { rect.left += para->GetMarginLeft(); - if (pWidgetAcc->IsMultiLine()) + if (pNode->GetWidgetAcc()->IsMultiLine()) rect.width += para->GetMarginRight(); } if (!pItem->GetPrev()) { diff --git a/xfa/fxfa/cxfa_textprovider.cpp b/xfa/fxfa/cxfa_textprovider.cpp index a2da41ca40..6e5db65b57 100644 --- a/xfa/fxfa/cxfa_textprovider.cpp +++ b/xfa/fxfa/cxfa_textprovider.cpp @@ -136,7 +136,7 @@ CXFA_Font* CXFA_TextProvider::GetFontIfExists() { } bool CXFA_TextProvider::IsCheckButtonAndAutoWidth() { - XFA_Element eType = m_pWidgetAcc->GetUIType(); + XFA_Element eType = m_pWidgetAcc->GetNode()->GetUIType(); if (eType != XFA_Element::CheckButton) return false; return !m_pWidgetAcc->GetNode()->TryWidth(); diff --git a/xfa/fxfa/cxfa_widgetacc.cpp b/xfa/fxfa/cxfa_widgetacc.cpp index b7b51ba03b..49ccade894 100644 --- a/xfa/fxfa/cxfa_widgetacc.cpp +++ b/xfa/fxfa/cxfa_widgetacc.cpp @@ -319,21 +319,6 @@ class CXFA_ImageEditData : public CXFA_FieldLayoutData { int32_t m_iImageYDpi; }; -float GetEdgeThickness(const std::vector<CXFA_Stroke*>& strokes, - bool b3DStyle, - int32_t nIndex) { - float fThickness = 0; - - CXFA_Stroke* stroke = strokes[nIndex * 2 + 1]; - if (stroke->IsVisible()) { - if (nIndex == 0) - fThickness += 2.5f; - - fThickness += stroke->GetThickness() * (b3DStyle ? 4 : 2); - } - return fThickness; -} - bool SplitDateTime(const WideString& wsDateTime, WideString& wsDate, WideString& wsTime) { @@ -361,170 +346,18 @@ bool SplitDateTime(const WideString& wsDateTime, return true; } -std::pair<XFA_Element, CXFA_Node*> CreateUIChild(CXFA_Node* pNode) { - XFA_Element eType = pNode->GetElementType(); - XFA_Element eWidgetType = eType; - if (eType != XFA_Element::Field && eType != XFA_Element::Draw) - return {eWidgetType, nullptr}; - - eWidgetType = XFA_Element::Unknown; - XFA_Element eUIType = XFA_Element::Unknown; - auto* defValue = - pNode->JSObject()->GetOrCreateProperty<CXFA_Value>(0, XFA_Element::Value); - XFA_Element eValueType = - defValue ? defValue->GetChildValueClassID() : XFA_Element::Unknown; - 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_Ui* pUI = - pNode->JSObject()->GetOrCreateProperty<CXFA_Ui>(0, XFA_Element::Ui); - CXFA_Node* pChild = pUI ? pUI->GetFirstChild() : nullptr; - for (; pChild; pChild = pChild->GetNextSibling()) { - XFA_Element eChildType = pChild->GetElementType(); - if (eChildType == XFA_Element::Extras || - eChildType == XFA_Element::Picture) { - continue; - } - - auto node = CXFA_Node::Create(pChild->GetDocument(), XFA_Element::Ui, - XFA_PacketType::Form); - if (node && node->HasPropertyFlags(eChildType, 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; - if (defValue) { - defValue->JSObject()->GetOrCreateProperty<CXFA_Text>(0, - XFA_Element::Text); - } - } - return {eWidgetType, - pUI ? pUI->JSObject()->GetOrCreateProperty<CXFA_Node>(0, eUIType) - : nullptr}; - } - - if (eUIType != XFA_Element::Unknown) - return {eWidgetType, pUIChild}; - - switch (pUIChild->GetElementType()) { - case XFA_Element::CheckButton: { - eValueType = XFA_Element::Text; - if (CXFA_Items* pItems = - pNode->GetChild<CXFA_Items>(0, XFA_Element::Items, false)) { - if (CXFA_Node* pItem = - pItems->GetChild<CXFA_Node>(0, XFA_Element::Unknown, false)) { - 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->JSObject()->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; - } - if (defValue) - defValue->JSObject()->GetOrCreateProperty<CXFA_Node>(0, eValueType); - - return {eWidgetType, pUIChild}; -} - } // namespace CXFA_WidgetAcc::CXFA_WidgetAcc(CXFA_Node* pNode) : m_bIsNull(true), m_bPreNull(true), - m_pUiChildNode(nullptr), - m_eUIType(XFA_Element::Unknown), m_pNode(pNode) {} CXFA_WidgetAcc::~CXFA_WidgetAcc() = default; void CXFA_WidgetAcc::ResetData() { WideString wsValue; - XFA_Element eUIType = GetUIType(); - switch (eUIType) { + switch (m_pNode->GetUIType()) { case XFA_Element::ImageEdit: { CXFA_Value* imageValue = m_pNode->GetDefaultValueIfExists(); CXFA_Image* image = imageValue ? imageValue->GetImageIfExists() : nullptr; @@ -627,7 +460,8 @@ void CXFA_WidgetAcc::UpdateUIDisplay(CXFA_FFDocView* docView, CXFA_FFWidget* pWidget = docView->GetWidgetForNode(m_pNode); for (; pWidget; pWidget = GetNextWidget(pWidget)) { if (pWidget == pExcept || !pWidget->IsLoaded() || - (GetUIType() != XFA_Element::CheckButton && pWidget->IsFocused())) { + (m_pNode->GetUIType() != XFA_Element::CheckButton && + pWidget->IsFocused())) { continue; } pWidget->UpdateFWLData(); @@ -642,7 +476,7 @@ void CXFA_WidgetAcc::CalcCaptionSize(CXFA_FFDoc* doc, CFX_SizeF& szCap) { LoadCaption(doc); - XFA_Element eUIType = GetUIType(); + XFA_Element eUIType = m_pNode->GetUIType(); XFA_AttributeEnum iCapPlacement = caption->GetPlacementType(); float fCapReserve = caption->GetReserve(); const bool bVert = iCapPlacement == XFA_AttributeEnum::Top || @@ -699,7 +533,7 @@ bool CXFA_WidgetAcc::CalculateFieldAutoSize(CXFA_FFDoc* doc, CFX_SizeF& size) { CFX_SizeF szCap; CalcCaptionSize(doc, szCap); - CFX_RectF rtUIMargin = GetUIMargin(); + CFX_RectF rtUIMargin = m_pNode->GetUIMargin(); size.width += rtUIMargin.left + rtUIMargin.width; size.height += rtUIMargin.top + rtUIMargin.height; if (szCap.width > 0 && szCap.height > 0) { @@ -790,7 +624,7 @@ void CXFA_WidgetAcc::CalculateTextContentSize(CXFA_FFDoc* doc, FDE_TextStyle dwStyles; dwStyles.last_line_height_ = true; - if (GetUIType() == XFA_Element::TextEdit && IsMultiLine()) + if (m_pNode->GetUIType() == XFA_Element::TextEdit && IsMultiLine()) dwStyles.line_wrap_ = true; pTextOut->SetStyles(dwStyles); @@ -820,7 +654,7 @@ bool CXFA_WidgetAcc::CalculateTextEditAutoSize(CXFA_FFDoc* doc, break; } } - CFX_RectF rtUIMargin = GetUIMargin(); + CFX_RectF rtUIMargin = m_pNode->GetUIMargin(); size.width -= rtUIMargin.left + rtUIMargin.width; CXFA_Margin* margin = m_pNode->GetMarginIfExists(); if (margin) @@ -1009,7 +843,7 @@ void CXFA_WidgetAcc::StartWidgetLayout(CXFA_FFDoc* doc, float& fCalcHeight) { InitLayoutData(); - XFA_Element eUIType = GetUIType(); + XFA_Element eUIType = m_pNode->GetUIType(); if (eUIType == XFA_Element::Text) { m_pLayoutData->m_fWidgetHeight = m_pNode->TryHeight().value_or(-1); StartTextLayout(doc, fCalcWidth, fCalcHeight); @@ -1095,7 +929,7 @@ void CXFA_WidgetAcc::CalculateAccWidthAndHeight(CXFA_FFDoc* doc, bool CXFA_WidgetAcc::FindSplitPos(CXFA_FFDocView* docView, int32_t iBlockIndex, float& fCalcHeight) { - XFA_Element eUIType = GetUIType(); + XFA_Element eUIType = m_pNode->GetUIType(); if (eUIType == XFA_Element::Subform) return false; @@ -1115,7 +949,7 @@ bool CXFA_WidgetAcc::FindSplitPos(CXFA_FFDocView* docView, fBottomInset = margin->GetBottomInset(); } - CFX_RectF rtUIMargin = GetUIMargin(); + CFX_RectF rtUIMargin = m_pNode->GetUIMargin(); fTopInset += rtUIMargin.top; fBottomInset += rtUIMargin.width; } @@ -1326,7 +1160,7 @@ void CXFA_WidgetAcc::InitLayoutData() { if (m_pLayoutData) return; - switch (GetUIType()) { + switch (m_pNode->GetUIType()) { case XFA_Element::Text: m_pLayoutData = pdfium::MakeUnique<CXFA_TextLayoutData>(); return; @@ -1458,17 +1292,6 @@ RetainPtr<CFGAS_GEFont> CXFA_WidgetAcc::GetFDEFont(CXFA_FFDoc* doc) { dwFontStyle); } -CXFA_Node* CXFA_WidgetAcc::GetUIChild() { - if (m_eUIType == XFA_Element::Unknown) - std::tie(m_eUIType, m_pUiChildNode) = CreateUIChild(m_pNode); - return m_pUiChildNode; -} - -XFA_Element CXFA_WidgetAcc::GetUIType() { - GetUIChild(); - return m_eUIType; -} - bool CXFA_WidgetAcc::IsOpenAccess() const { return m_pNode && m_pNode->IsOpenAccess(); } @@ -1497,55 +1320,8 @@ std::vector<CXFA_Event*> CXFA_WidgetAcc::GetEventByActivity( return events; } -CXFA_Border* CXFA_WidgetAcc::GetUIBorder() { - CXFA_Node* pUIChild = GetUIChild(); - return pUIChild ? pUIChild->JSObject()->GetProperty<CXFA_Border>( - 0, XFA_Element::Border) - : nullptr; -} - -CFX_RectF CXFA_WidgetAcc::GetUIMargin() { - CXFA_Node* pUIChild = GetUIChild(); - CXFA_Margin* mgUI = nullptr; - if (pUIChild) { - mgUI = - pUIChild->JSObject()->GetProperty<CXFA_Margin>(0, XFA_Element::Margin); - } - - if (!mgUI) - return CFX_RectF(); - - CXFA_Border* border = GetUIBorder(); - if (border && border->GetPresence() != XFA_AttributeEnum::Visible) - return CFX_RectF(); - - Optional<float> left = mgUI->TryLeftInset(); - Optional<float> top = mgUI->TryTopInset(); - Optional<float> right = mgUI->TryRightInset(); - Optional<float> bottom = mgUI->TryBottomInset(); - if (border) { - bool bVisible = false; - float fThickness = 0; - XFA_AttributeEnum iType = XFA_AttributeEnum::Unknown; - std::tie(iType, bVisible, fThickness) = border->Get3DStyle(); - if (!left || !top || !right || !bottom) { - std::vector<CXFA_Stroke*> strokes = border->GetStrokes(); - if (!top) - top = GetEdgeThickness(strokes, bVisible, 0); - if (!right) - right = GetEdgeThickness(strokes, bVisible, 1); - if (!bottom) - bottom = GetEdgeThickness(strokes, bVisible, 2); - if (!left) - left = GetEdgeThickness(strokes, bVisible, 3); - } - } - return CFX_RectF(left.value_or(0.0), top.value_or(0.0), right.value_or(0.0), - bottom.value_or(0.0)); -} - XFA_AttributeEnum CXFA_WidgetAcc::GetButtonHighlight() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (pUIChild) return pUIChild->JSObject()->GetEnum(XFA_Attribute::Highlight); return XFA_AttributeEnum::Inverted; @@ -1580,7 +1356,7 @@ bool CXFA_WidgetAcc::HasButtonDown() const { } bool CXFA_WidgetAcc::IsCheckButtonRound() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (pUIChild) return pUIChild->JSObject()->GetEnum(XFA_Attribute::Shape) == XFA_AttributeEnum::Round; @@ -1588,7 +1364,7 @@ bool CXFA_WidgetAcc::IsCheckButtonRound() { } XFA_AttributeEnum CXFA_WidgetAcc::GetCheckButtonMark() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (pUIChild) return pUIChild->JSObject()->GetEnum(XFA_Attribute::Mark); return XFA_AttributeEnum::Default; @@ -1600,7 +1376,7 @@ bool CXFA_WidgetAcc::IsRadioButton() { } float CXFA_WidgetAcc::GetCheckButtonSize() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (pUIChild) { return pUIChild->JSObject() ->GetMeasure(XFA_Attribute::Size) @@ -1610,7 +1386,7 @@ float CXFA_WidgetAcc::GetCheckButtonSize() { } bool CXFA_WidgetAcc::IsAllowNeutral() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); return pUIChild && pUIChild->JSObject()->GetBoolean(XFA_Attribute::AllowNeutral); } @@ -1797,7 +1573,7 @@ CXFA_Node* CXFA_WidgetAcc::GetExclGroupNextMember(CXFA_Node* pNode) { } bool CXFA_WidgetAcc::IsChoiceListCommitOnSelect() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (pUIChild) { return pUIChild->JSObject()->GetEnum(XFA_Attribute::CommitOn) == XFA_AttributeEnum::Select; @@ -1806,12 +1582,12 @@ bool CXFA_WidgetAcc::IsChoiceListCommitOnSelect() { } bool CXFA_WidgetAcc::IsChoiceListAllowTextEntry() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); return pUIChild && pUIChild->JSObject()->GetBoolean(XFA_Attribute::TextEntry); } bool CXFA_WidgetAcc::IsChoiceListMultiSelect() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (pUIChild) { return pUIChild->JSObject()->GetEnum(XFA_Attribute::Open) == XFA_AttributeEnum::MultiSelect; @@ -1820,7 +1596,7 @@ bool CXFA_WidgetAcc::IsChoiceListMultiSelect() { } bool CXFA_WidgetAcc::IsListBox() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (!pUIChild) return false; @@ -2129,7 +1905,7 @@ void CXFA_WidgetAcc::InsertItem(const WideString& wsLabel, return; m_pNode->GetDocument()->GetNotify()->OnWidgetListItemAdded( - this, wsLabel.c_str(), wsValue.c_str(), nIndex); + m_pNode, wsLabel.c_str(), wsValue.c_str(), nIndex); } void CXFA_WidgetAcc::GetItemLabel(const WideStringView& wsValue, @@ -2251,12 +2027,13 @@ bool CXFA_WidgetAcc::DeleteItem(int32_t nIndex, } } if (bNotify) - m_pNode->GetDocument()->GetNotify()->OnWidgetListItemRemoved(this, nIndex); + m_pNode->GetDocument()->GetNotify()->OnWidgetListItemRemoved(m_pNode, + nIndex); return true; } bool CXFA_WidgetAcc::IsHorizontalScrollPolicyOff() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (pUIChild) { return pUIChild->JSObject()->GetEnum(XFA_Attribute::HScrollPolicy) == XFA_AttributeEnum::Off; @@ -2265,7 +2042,7 @@ bool CXFA_WidgetAcc::IsHorizontalScrollPolicyOff() { } bool CXFA_WidgetAcc::IsVerticalScrollPolicyOff() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (pUIChild) { return pUIChild->JSObject()->GetEnum(XFA_Attribute::VScrollPolicy) == XFA_AttributeEnum::Off; @@ -2274,7 +2051,7 @@ bool CXFA_WidgetAcc::IsVerticalScrollPolicyOff() { } Optional<int32_t> CXFA_WidgetAcc::GetNumberOfCells() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); if (!pUIChild) return {}; if (CXFA_Comb* pNode = @@ -2284,13 +2061,13 @@ Optional<int32_t> CXFA_WidgetAcc::GetNumberOfCells() { } WideString CXFA_WidgetAcc::GetPasswordChar() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); return pUIChild ? pUIChild->JSObject()->GetCData(XFA_Attribute::PasswordChar) : L"*"; } bool CXFA_WidgetAcc::IsMultiLine() { - CXFA_Node* pUIChild = GetUIChild(); + CXFA_Node* pUIChild = m_pNode->GetUIChild(); return pUIChild && pUIChild->JSObject()->GetBoolean(XFA_Attribute::MultiLine); } @@ -2361,7 +2138,7 @@ bool CXFA_WidgetAcc::SetValue(XFA_VALUEPICTURE eValueType, WideString wsPicture = GetPictureContent(eValueType); bool bValidate = true; bool bSyncData = false; - CXFA_Node* pNode = GetUIChild(); + CXFA_Node* pNode = m_pNode->GetUIChild(); if (!pNode) return true; @@ -2488,11 +2265,11 @@ WideString CXFA_WidgetAcc::GetValue(XFA_VALUEPICTURE eValueType) { GetItemLabel(wsValue.AsStringView(), wsValue); WideString wsPicture = GetPictureContent(eValueType); - CXFA_Node* pNode = GetUIChild(); + CXFA_Node* pNode = m_pNode->GetUIChild(); if (!pNode) return wsValue; - switch (GetUIChild()->GetElementType()) { + switch (m_pNode->GetUIChild()->GetElementType()) { case XFA_Element::ChoiceList: { if (eValueType == XFA_VALUEPICTURE_Display) { int32_t iSelItemIndex = GetSelectedItem(0); diff --git a/xfa/fxfa/cxfa_widgetacc.h b/xfa/fxfa/cxfa_widgetacc.h index f21ace9d95..ac885cb2f2 100644 --- a/xfa/fxfa/cxfa_widgetacc.h +++ b/xfa/fxfa/cxfa_widgetacc.h @@ -93,10 +93,6 @@ class CXFA_WidgetAcc { CXFA_Node* GetNode() const { return m_pNode; } - CXFA_Node* GetUIChild(); - XFA_Element GetUIType(); - CFX_RectF GetUIMargin(); - bool IsOpenAccess() const; bool IsListBox(); bool IsAllowNeutral(); @@ -104,8 +100,6 @@ class CXFA_WidgetAcc { bool IsChoiceListAllowTextEntry(); bool IsMultiLine(); - CXFA_Border* GetUIBorder(); - std::vector<CXFA_Event*> GetEventByActivity(XFA_AttributeEnum iActivity, bool bIsFormReady); @@ -221,8 +215,6 @@ class CXFA_WidgetAcc { std::unique_ptr<CXFA_WidgetLayoutData> m_pLayoutData; bool m_bIsNull; bool m_bPreNull; - CXFA_Node* m_pUiChildNode; - XFA_Element m_eUIType; CXFA_Node* m_pNode; }; diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp index 1d2af4c858..935392373a 100644 --- a/xfa/fxfa/parser/cxfa_node.cpp +++ b/xfa/fxfa/parser/cxfa_node.cpp @@ -40,6 +40,7 @@ #include "xfa/fxfa/parser/cxfa_document.h" #include "xfa/fxfa/parser/cxfa_event.h" #include "xfa/fxfa/parser/cxfa_font.h" +#include "xfa/fxfa/parser/cxfa_items.h" #include "xfa/fxfa/parser/cxfa_keep.h" #include "xfa/fxfa/parser/cxfa_layoutprocessor.h" #include "xfa/fxfa/parser/cxfa_localevalue.h" @@ -49,8 +50,10 @@ #include "xfa/fxfa/parser/cxfa_occur.h" #include "xfa/fxfa/parser/cxfa_para.h" #include "xfa/fxfa/parser/cxfa_simple_parser.h" +#include "xfa/fxfa/parser/cxfa_stroke.h" #include "xfa/fxfa/parser/cxfa_subform.h" #include "xfa/fxfa/parser/cxfa_traversestrategy_xfacontainernode.h" +#include "xfa/fxfa/parser/cxfa_ui.h" #include "xfa/fxfa/parser/cxfa_validate.h" #include "xfa/fxfa/parser/cxfa_value.h" #include "xfa/fxfa/parser/xfa_basic_data.h" @@ -150,6 +153,170 @@ void ReorderDataNodes(const std::set<CXFA_Node*>& sSet1, } } +std::pair<XFA_Element, CXFA_Node*> CreateUIChild(CXFA_Node* pNode) { + XFA_Element eType = pNode->GetElementType(); + XFA_Element eWidgetType = eType; + if (eType != XFA_Element::Field && eType != XFA_Element::Draw) + return {eWidgetType, nullptr}; + + eWidgetType = XFA_Element::Unknown; + XFA_Element eUIType = XFA_Element::Unknown; + auto* defValue = + pNode->JSObject()->GetOrCreateProperty<CXFA_Value>(0, XFA_Element::Value); + XFA_Element eValueType = + defValue ? defValue->GetChildValueClassID() : XFA_Element::Unknown; + 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_Ui* pUI = + pNode->JSObject()->GetOrCreateProperty<CXFA_Ui>(0, XFA_Element::Ui); + CXFA_Node* pChild = pUI ? pUI->GetFirstChild() : nullptr; + for (; pChild; pChild = pChild->GetNextSibling()) { + XFA_Element eChildType = pChild->GetElementType(); + if (eChildType == XFA_Element::Extras || + eChildType == XFA_Element::Picture) { + continue; + } + + auto node = CXFA_Node::Create(pChild->GetDocument(), XFA_Element::Ui, + XFA_PacketType::Form); + if (node && node->HasPropertyFlags(eChildType, 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; + if (defValue) { + defValue->JSObject()->GetOrCreateProperty<CXFA_Text>(0, + XFA_Element::Text); + } + } + return {eWidgetType, + pUI ? pUI->JSObject()->GetOrCreateProperty<CXFA_Node>(0, eUIType) + : nullptr}; + } + + if (eUIType != XFA_Element::Unknown) + return {eWidgetType, pUIChild}; + + switch (pUIChild->GetElementType()) { + case XFA_Element::CheckButton: { + eValueType = XFA_Element::Text; + if (CXFA_Items* pItems = + pNode->GetChild<CXFA_Items>(0, XFA_Element::Items, false)) { + if (CXFA_Node* pItem = + pItems->GetChild<CXFA_Node>(0, XFA_Element::Unknown, false)) { + 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->JSObject()->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; + } + if (defValue) + defValue->JSObject()->GetOrCreateProperty<CXFA_Node>(0, eValueType); + + return {eWidgetType, pUIChild}; +} + +float GetEdgeThickness(const std::vector<CXFA_Stroke*>& strokes, + bool b3DStyle, + int32_t nIndex) { + float fThickness = 0; + + CXFA_Stroke* stroke = strokes[nIndex * 2 + 1]; + if (stroke->IsVisible()) { + if (nIndex == 0) + fThickness += 2.5f; + + fThickness += stroke->GetThickness() * (b3DStyle ? 4 : 2); + } + return fThickness; +} + } // namespace // static @@ -2059,7 +2226,7 @@ std::pair<int32_t, bool> CXFA_Node::ExecuteBoolScript( } WideString CXFA_Node::GetBarcodeType() { - CXFA_Node* pUIChild = GetWidgetAcc()->GetUIChild(); + CXFA_Node* pUIChild = GetUIChild(); return pUIChild ? WideString(pUIChild->JSObject()->GetCData(XFA_Attribute::Type)) : WideString(); @@ -2067,8 +2234,7 @@ WideString CXFA_Node::GetBarcodeType() { Optional<BC_CHAR_ENCODING> CXFA_Node::GetBarcodeAttribute_CharEncoding() { Optional<WideString> wsCharEncoding = - GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( - XFA_Attribute::CharEncoding, true); + GetUIChild()->JSObject()->TryCData(XFA_Attribute::CharEncoding, true); if (!wsCharEncoding) return {}; if (wsCharEncoding->CompareNoCase(L"UTF-16")) @@ -2080,8 +2246,7 @@ Optional<BC_CHAR_ENCODING> CXFA_Node::GetBarcodeAttribute_CharEncoding() { Optional<bool> CXFA_Node::GetBarcodeAttribute_Checksum() { Optional<XFA_AttributeEnum> checksum = - GetWidgetAcc()->GetUIChild()->JSObject()->TryEnum(XFA_Attribute::Checksum, - true); + GetUIChild()->JSObject()->TryEnum(XFA_Attribute::Checksum, true); if (!checksum) return {}; @@ -2101,8 +2266,7 @@ Optional<bool> CXFA_Node::GetBarcodeAttribute_Checksum() { Optional<int32_t> CXFA_Node::GetBarcodeAttribute_DataLength() { Optional<WideString> wsDataLength = - GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( - XFA_Attribute::DataLength, true); + GetUIChild()->JSObject()->TryCData(XFA_Attribute::DataLength, true); if (!wsDataLength) return {}; @@ -2111,8 +2275,7 @@ Optional<int32_t> CXFA_Node::GetBarcodeAttribute_DataLength() { Optional<char> CXFA_Node::GetBarcodeAttribute_StartChar() { Optional<WideString> wsStartEndChar = - GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( - XFA_Attribute::StartChar, true); + GetUIChild()->JSObject()->TryCData(XFA_Attribute::StartChar, true); if (!wsStartEndChar || wsStartEndChar->IsEmpty()) return {}; @@ -2121,8 +2284,7 @@ Optional<char> CXFA_Node::GetBarcodeAttribute_StartChar() { Optional<char> CXFA_Node::GetBarcodeAttribute_EndChar() { Optional<WideString> wsStartEndChar = - GetWidgetAcc()->GetUIChild()->JSObject()->TryCData(XFA_Attribute::EndChar, - true); + GetUIChild()->JSObject()->TryCData(XFA_Attribute::EndChar, true); if (!wsStartEndChar || wsStartEndChar->IsEmpty()) return {}; @@ -2130,9 +2292,8 @@ Optional<char> CXFA_Node::GetBarcodeAttribute_EndChar() { } Optional<int32_t> CXFA_Node::GetBarcodeAttribute_ECLevel() { - Optional<WideString> wsECLevel = - GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( - XFA_Attribute::ErrorCorrectionLevel, true); + Optional<WideString> wsECLevel = GetUIChild()->JSObject()->TryCData( + XFA_Attribute::ErrorCorrectionLevel, true); if (!wsECLevel) return {}; return {FXSYS_wtoi(wsECLevel->c_str())}; @@ -2140,8 +2301,7 @@ Optional<int32_t> CXFA_Node::GetBarcodeAttribute_ECLevel() { Optional<int32_t> CXFA_Node::GetBarcodeAttribute_ModuleWidth() { Optional<CXFA_Measurement> moduleWidthHeight = - GetWidgetAcc()->GetUIChild()->JSObject()->TryMeasure( - XFA_Attribute::ModuleWidth, true); + GetUIChild()->JSObject()->TryMeasure(XFA_Attribute::ModuleWidth, true); if (!moduleWidthHeight) return {}; @@ -2150,8 +2310,7 @@ Optional<int32_t> CXFA_Node::GetBarcodeAttribute_ModuleWidth() { Optional<int32_t> CXFA_Node::GetBarcodeAttribute_ModuleHeight() { Optional<CXFA_Measurement> moduleWidthHeight = - GetWidgetAcc()->GetUIChild()->JSObject()->TryMeasure( - XFA_Attribute::ModuleHeight, true); + GetUIChild()->JSObject()->TryMeasure(XFA_Attribute::ModuleHeight, true); if (!moduleWidthHeight) return {}; @@ -2159,14 +2318,13 @@ Optional<int32_t> CXFA_Node::GetBarcodeAttribute_ModuleHeight() { } Optional<bool> CXFA_Node::GetBarcodeAttribute_PrintChecksum() { - return GetWidgetAcc()->GetUIChild()->JSObject()->TryBoolean( - XFA_Attribute::PrintCheckDigit, true); + return GetUIChild()->JSObject()->TryBoolean(XFA_Attribute::PrintCheckDigit, + true); } Optional<BC_TEXT_LOC> CXFA_Node::GetBarcodeAttribute_TextLocation() { Optional<XFA_AttributeEnum> textLocation = - GetWidgetAcc()->GetUIChild()->JSObject()->TryEnum( - XFA_Attribute::TextLocation, true); + GetUIChild()->JSObject()->TryEnum(XFA_Attribute::TextLocation, true); if (!textLocation) return {}; @@ -2188,14 +2346,12 @@ Optional<BC_TEXT_LOC> CXFA_Node::GetBarcodeAttribute_TextLocation() { } Optional<bool> CXFA_Node::GetBarcodeAttribute_Truncate() { - return GetWidgetAcc()->GetUIChild()->JSObject()->TryBoolean( - XFA_Attribute::Truncate, true); + return GetUIChild()->JSObject()->TryBoolean(XFA_Attribute::Truncate, true); } Optional<int8_t> CXFA_Node::GetBarcodeAttribute_WideNarrowRatio() { Optional<WideString> wsWideNarrowRatio = - GetWidgetAcc()->GetUIChild()->JSObject()->TryCData( - XFA_Attribute::WideNarrowRatio, true); + GetUIChild()->JSObject()->TryCData(XFA_Attribute::WideNarrowRatio, true); if (!wsWideNarrowRatio) return {}; @@ -2213,3 +2369,60 @@ Optional<int8_t> CXFA_Node::GetBarcodeAttribute_WideNarrowRatio() { float result = static_cast<float>(fA) / static_cast<float>(fB); return {static_cast<int8_t>(result)}; } + +CXFA_Node* CXFA_Node::GetUIChild() { + if (m_eUIType == XFA_Element::Unknown) + std::tie(m_eUIType, m_pUiChildNode) = CreateUIChild(this); + return m_pUiChildNode; +} + +XFA_Element CXFA_Node::GetUIType() { + GetUIChild(); + return m_eUIType; +} + +CXFA_Border* CXFA_Node::GetUIBorder() { + CXFA_Node* pUIChild = GetUIChild(); + return pUIChild ? pUIChild->JSObject()->GetProperty<CXFA_Border>( + 0, XFA_Element::Border) + : nullptr; +} + +CFX_RectF CXFA_Node::GetUIMargin() { + CXFA_Node* pUIChild = GetUIChild(); + if (!pUIChild) + return CFX_RectF(); + + CXFA_Margin* mgUI = + pUIChild->JSObject()->GetProperty<CXFA_Margin>(0, XFA_Element::Margin); + if (!mgUI) + return CFX_RectF(); + + CXFA_Border* border = GetUIBorder(); + if (border && border->GetPresence() != XFA_AttributeEnum::Visible) + return CFX_RectF(); + + Optional<float> left = mgUI->TryLeftInset(); + Optional<float> top = mgUI->TryTopInset(); + Optional<float> right = mgUI->TryRightInset(); + Optional<float> bottom = mgUI->TryBottomInset(); + if (border) { + bool bVisible = false; + float fThickness = 0; + XFA_AttributeEnum iType = XFA_AttributeEnum::Unknown; + std::tie(iType, bVisible, fThickness) = border->Get3DStyle(); + if (!left || !top || !right || !bottom) { + std::vector<CXFA_Stroke*> strokes = border->GetStrokes(); + if (!top) + top = GetEdgeThickness(strokes, bVisible, 0); + if (!right) + right = GetEdgeThickness(strokes, bVisible, 1); + if (!bottom) + bottom = GetEdgeThickness(strokes, bVisible, 2); + if (!left) + left = GetEdgeThickness(strokes, bVisible, 3); + } + } + return CFX_RectF(left.value_or(0.0), top.value_or(0.0), right.value_or(0.0), + bottom.value_or(0.0)); +} diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h index c08a9affdd..4fae752ea0 100644 --- a/xfa/fxfa/parser/cxfa_node.h +++ b/xfa/fxfa/parser/cxfa_node.h @@ -294,6 +294,11 @@ class CXFA_Node : public CXFA_Object { Optional<bool> GetBarcodeAttribute_Truncate(); Optional<int8_t> GetBarcodeAttribute_WideNarrowRatio(); + CXFA_Node* GetUIChild(); + XFA_Element GetUIType(); + CFX_RectF GetUIMargin(); + CXFA_Border* GetUIBorder(); + protected: CXFA_Node(CXFA_Document* pDoc, XFA_PacketType ePacket, @@ -357,6 +362,8 @@ class CXFA_Node : public CXFA_Object { uint32_t m_dwNameHash; CXFA_Node* m_pAuxNode; std::vector<UnownedPtr<CXFA_Node>> binding_nodes_; + CXFA_Node* m_pUiChildNode = nullptr; + XFA_Element m_eUIType = XFA_Element::Unknown; }; #endif // XFA_FXFA_PARSER_CXFA_NODE_H_ diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp index 422ba4e58a..05846f2e3f 100644 --- a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp +++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp @@ -71,7 +71,8 @@ CXFA_Node* FormValueNode_CreateChild(CXFA_Node* pValueNode, XFA_Element iType) { void FormValueNode_MatchNoneCreateChild(CXFA_Node* pFormNode) { ASSERT(pFormNode->IsWidgetReady()); - pFormNode->GetWidgetAcc()->GetUIType(); + // GetUIChild has the side effect of creating the UI child. + pFormNode->GetUIChild(); } bool FormValueNode_SetChildContent(CXFA_Node* pValueNode, @@ -133,12 +134,11 @@ void CreateDataBinding(CXFA_Node* pFormNode, ASSERT(pFormNode->IsWidgetReady()); CXFA_WidgetAcc* pWidgetAcc = pFormNode->GetWidgetAcc(); - XFA_Element eUIType = pWidgetAcc->GetUIType(); auto* defValue = pFormNode->JSObject()->GetOrCreateProperty<CXFA_Value>( 0, XFA_Element::Value); if (!bDataToForm) { WideString wsValue; - switch (eUIType) { + switch (pFormNode->GetUIType()) { case XFA_Element::ImageEdit: { CXFA_Image* image = defValue ? defValue->GetImageIfExists() : nullptr; WideString wsContentType; @@ -289,7 +289,7 @@ void CreateDataBinding(CXFA_Node* pFormNode, pDataNode->JSObject()->SetAttributeValue(wsNormalizeValue, wsXMLValue, false, false); - switch (eUIType) { + switch (pFormNode->GetUIType()) { case XFA_Element::ImageEdit: { FormValueNode_SetChildContent(defValue, wsNormalizeValue, XFA_Element::Image); diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp index 5d2f222a3b..226aaed83b 100644 --- a/xfa/fxfa/parser/xfa_utils.cpp +++ b/xfa/fxfa/parser/xfa_utils.cpp @@ -142,11 +142,9 @@ bool ContentNodeNeedtoExport(CXFA_Node* pContentNode) { CXFA_Node* pGrandParentNode = pParentNode->GetParent(); if (!pGrandParentNode || !pGrandParentNode->IsContainerNode()) return true; - if (pGrandParentNode->GetBindData()) + if (!pGrandParentNode->GetBindData()) return false; - - XFA_Element eUIType = pGrandParentNode->GetWidgetAcc()->GetUIType(); - if (eUIType == XFA_Element::PasswordEdit) + if (pGrandParentNode->GetUIType() == XFA_Element::PasswordEdit) return false; return true; } |