From 4a1de7211af344f6acc784f4fe346ef8c8da7bd1 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Thu, 4 Jan 2018 13:40:07 -0500 Subject: Change CXFA_WidgetAcc::GetNextWidget to not require the FFDocView This CL changes GetNextWidget to assume that a valid parameter is passed to the method. For callers which passed nullptr, we change to get a vaild initial widget from the doc view directly. Change-Id: I50c06082831645f62339ade59d5026f546e07840 Reviewed-on: https://pdfium-review.googlesource.com/22254 Reviewed-by: Ryan Harrison Commit-Queue: dsinclair --- xfa/fxfa/cxfa_ffdocview.cpp | 13 ++++++++++--- xfa/fxfa/cxfa_ffdocview.h | 1 + xfa/fxfa/cxfa_ffnotify.cpp | 20 ++++++++++++-------- xfa/fxfa/cxfa_ffwidget.cpp | 5 ++++- xfa/fxfa/cxfa_widgetacc.cpp | 12 +++--------- 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp index cb4c72d0b3..5856809167 100644 --- a/xfa/fxfa/cxfa_ffdocview.cpp +++ b/xfa/fxfa/cxfa_ffdocview.cpp @@ -309,6 +309,10 @@ int32_t CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam, return XFA_EVENTERROR_Success; } +CXFA_FFWidget* CXFA_FFDocView::GetWidgetForNode(CXFA_Node* node) { + return static_cast(GetXFALayout()->GetLayoutItem(node)); +} + CXFA_FFWidgetHandler* CXFA_FFDocView::GetWidgetHandler() { if (!m_pWidgetHandler) m_pWidgetHandler = pdfium::MakeUnique(this); @@ -376,8 +380,9 @@ bool CXFA_FFDocView::SetFocus(CXFA_FFWidget* hWidget) { } void CXFA_FFDocView::SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) { - CXFA_FFWidget* pNewFocus = - pWidgetAcc ? pWidgetAcc->GetNextWidget(nullptr) : nullptr; + CXFA_FFWidget* pNewFocus = nullptr; + if (pWidgetAcc) + pNewFocus = GetWidgetForNode(pWidgetAcc->GetNode()); if (!SetFocus(pNewFocus)) return; @@ -487,7 +492,9 @@ CXFA_FFWidget* CXFA_FFDocView::GetWidgetByName(const WideString& wsName, CXFA_FFWidget* pRefWidget) { CXFA_WidgetAcc* pRefAcc = pRefWidget ? pRefWidget->GetDataAcc() : nullptr; CXFA_WidgetAcc* pAcc = GetWidgetAccByName(wsName, pRefAcc); - return pAcc ? pAcc->GetNextWidget(nullptr) : nullptr; + if (!pAcc) + return nullptr; + return GetWidgetForNode(pAcc->GetNode()); } CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName( diff --git a/xfa/fxfa/cxfa_ffdocview.h b/xfa/fxfa/cxfa_ffdocview.h index fcaa7162dd..5c8f0176d8 100644 --- a/xfa/fxfa/cxfa_ffdocview.h +++ b/xfa/fxfa/cxfa_ffdocview.h @@ -62,6 +62,7 @@ class CXFA_FFDocView { CXFA_FFWidget* GetFocusWidget() const { return m_pFocusWidget.Get(); } void KillFocus(); bool SetFocus(CXFA_FFWidget* hWidget); + CXFA_FFWidget* GetWidgetForNode(CXFA_Node* node); CXFA_FFWidget* GetWidgetByName(const WideString& wsName, CXFA_FFWidget* pRefWidget); CXFA_WidgetAcc* GetWidgetAccByName(const WideString& wsName, diff --git a/xfa/fxfa/cxfa_ffnotify.cpp b/xfa/fxfa/cxfa_ffnotify.cpp index 616edf7507..c7872f662b 100644 --- a/xfa/fxfa/cxfa_ffnotify.cpp +++ b/xfa/fxfa/cxfa_ffnotify.cpp @@ -70,8 +70,9 @@ void CXFA_FFNotify::OnWidgetListItemAdded(CXFA_WidgetAcc* pSender, if (pSender->GetUIType() != XFA_Element::ChoiceList) return; - CXFA_FFWidget* pWidget = nullptr; - while ((pWidget = pSender->GetNextWidget(pWidget)) != nullptr) { + CXFA_FFWidget* pWidget = + m_pDoc->GetDocView()->GetWidgetForNode(pSender->GetNode()); + for (; pWidget; pWidget = pSender->GetNextWidget(pWidget)) { if (pWidget->IsLoaded()) { if (pSender->IsListBox()) ToListBox(pWidget)->InsertItem(pLabel, iIndex); @@ -86,8 +87,9 @@ void CXFA_FFNotify::OnWidgetListItemRemoved(CXFA_WidgetAcc* pSender, if (pSender->GetUIType() != XFA_Element::ChoiceList) return; - CXFA_FFWidget* pWidget = nullptr; - while ((pWidget = pSender->GetNextWidget(pWidget)) != nullptr) { + CXFA_FFWidget* pWidget = + m_pDoc->GetDocView()->GetWidgetForNode(pSender->GetNode()); + for (; pWidget; pWidget = pSender->GetNextWidget(pWidget)) { if (pWidget->IsLoaded()) { if (pSender->IsListBox()) ToListBox(pWidget)->DeleteItem(iIndex); @@ -369,8 +371,9 @@ void CXFA_FFNotify::OnValueChanging(CXFA_Node* pSender, XFA_Attribute eAttr) { if (!pWidgetAcc) return; - CXFA_FFWidget* pWidget = nullptr; - while ((pWidget = pWidgetAcc->GetNextWidget(pWidget)) != nullptr) { + CXFA_FFWidget* pWidget = + m_pDoc->GetDocView()->GetWidgetForNode(pWidgetAcc->GetNode()); + for (; pWidget; pWidget = pWidgetAcc->GetNextWidget(pWidget)) { if (pWidget->IsLoaded()) pWidget->AddInvalidateRect(); } @@ -432,8 +435,9 @@ void CXFA_FFNotify::OnValueChanged(CXFA_Node* pSender, } } - CXFA_FFWidget* pWidget = nullptr; - while ((pWidget = pWidgetAcc->GetNextWidget(pWidget)) != nullptr) { + CXFA_FFWidget* pWidget = + m_pDoc->GetDocView()->GetWidgetForNode(pWidgetAcc->GetNode()); + for (; pWidget; pWidget = pWidgetAcc->GetNextWidget(pWidget)) { if (!pWidget->IsLoaded()) continue; diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp index 82ed1aeffe..2f4dcb4755 100644 --- a/xfa/fxfa/cxfa_ffwidget.cpp +++ b/xfa/fxfa/cxfa_ffwidget.cpp @@ -36,6 +36,7 @@ #include "xfa/fxfa/parser/cxfa_edge.h" #include "xfa/fxfa/parser/cxfa_fill.h" #include "xfa/fxfa/parser/cxfa_image.h" +#include "xfa/fxfa/parser/cxfa_layoutprocessor.h" #include "xfa/fxfa/parser/cxfa_margin.h" #include "xfa/fxfa/parser/cxfa_node.h" #include "xfa/fxgraphics/cxfa_gecolor.h" @@ -1282,7 +1283,9 @@ CXFA_FFWidget* CXFA_FFWidget::GetParent() { CXFA_WidgetAcc* pParentWidgetAcc = static_cast(pParentNode->GetWidgetAcc()); if (pParentWidgetAcc) { - return pParentWidgetAcc->GetNextWidget(nullptr); + CXFA_LayoutProcessor* layout = GetDocView()->GetXFALayout(); + return static_cast( + layout->GetLayoutItem(pParentWidgetAcc->GetNode())); } } return nullptr; diff --git a/xfa/fxfa/cxfa_widgetacc.cpp b/xfa/fxfa/cxfa_widgetacc.cpp index f735633abe..8851d269c6 100644 --- a/xfa/fxfa/cxfa_widgetacc.cpp +++ b/xfa/fxfa/cxfa_widgetacc.cpp @@ -864,18 +864,12 @@ std::pair CXFA_WidgetAcc::ExecuteBoolScript( } CXFA_FFWidget* CXFA_WidgetAcc::GetNextWidget(CXFA_FFWidget* pWidget) { - CXFA_LayoutItem* pLayout = nullptr; - if (pWidget) - pLayout = pWidget->GetNext(); - else - pLayout = m_pDocView->GetXFALayout()->GetLayoutItem(m_pNode); - - return static_cast(pLayout); + return static_cast(pWidget->GetNext()); } void CXFA_WidgetAcc::UpdateUIDisplay(CXFA_FFWidget* pExcept) { - CXFA_FFWidget* pWidget = nullptr; - while ((pWidget = GetNextWidget(pWidget)) != nullptr) { + CXFA_FFWidget* pWidget = m_pDocView->GetWidgetForNode(m_pNode); + for (; pWidget; pWidget = GetNextWidget(pWidget)) { if (pWidget == pExcept || !pWidget->IsLoaded() || (GetUIType() != XFA_Element::CheckButton && pWidget->IsFocused())) { continue; -- cgit v1.2.3