Make CXFA_TabParam private to cxfa_ffpageview.cpp
-- make some methods into helper functions along the way.
Change-Id: I4f3824e57fb9973a36409222d507db9acb668d3e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/73910
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fxfa/cxfa_ffpageview.cpp b/xfa/fxfa/cxfa_ffpageview.cpp
index 3eb8fca..a4dc4ec 100644
--- a/xfa/fxfa/cxfa_ffpageview.cpp
+++ b/xfa/fxfa/cxfa_ffpageview.cpp
@@ -113,7 +113,39 @@
return doc->GetCurVersionMode() < XFA_VERSION_205;
}
-} // namespace
+bool EnsureWidgetLoadedIfVisible(CXFA_FFWidget* pWidget) {
+ if (!pWidget->IsLoaded() &&
+ pWidget->GetLayoutItem()->TestStatusBits(XFA_WidgetStatus_Visible)) {
+ if (!pWidget->LoadWidget())
+ return false;
+ }
+ return true;
+}
+
+CXFA_FFWidget* LoadedWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem) {
+ CXFA_FFWidget* pWidget = CXFA_FFWidget::FromLayoutItem(pLayoutItem);
+ if (!pWidget)
+ return nullptr;
+
+ EnsureWidgetLoadedIfVisible(pWidget);
+ return pWidget;
+}
+
+CXFA_FFWidget* FilteredLoadedWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem,
+ uint32_t dwFilter,
+ bool bIgnoreRelevant) {
+ CXFA_FFWidget* pWidget = CXFA_FFWidget::FromLayoutItem(pLayoutItem);
+ if (!pWidget)
+ return nullptr;
+
+ if (!PageWidgetFilter(pWidget, dwFilter, false, bIgnoreRelevant))
+ return nullptr;
+
+ if (!EnsureWidgetLoadedIfVisible(pWidget))
+ return nullptr;
+
+ return pWidget;
+}
class CXFA_TabParam {
public:
@@ -140,6 +172,61 @@
std::vector<cppgc::Persistent<CXFA_ContentLayoutItem>> m_Children;
};
+void OrderContainer(CXFA_LayoutItemIterator* sIterator,
+ CXFA_LayoutItem* pViewItem,
+ CXFA_TabParam* pContainer,
+ bool* bCurrentItem,
+ bool* bContentArea,
+ bool bMasterPage) {
+ std::vector<std::unique_ptr<CXFA_TabParam>> tabParams;
+ CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext();
+ while (pSearchItem) {
+ if (!pSearchItem->IsContentLayoutItem()) {
+ *bContentArea = true;
+ pSearchItem = sIterator->MoveToNext();
+ continue;
+ }
+ if (bMasterPage && *bContentArea) {
+ break;
+ }
+ if (bMasterPage || *bContentArea) {
+ CXFA_FFWidget* hWidget = LoadedWidgetFromLayoutItem(pSearchItem);
+ if (!hWidget) {
+ pSearchItem = sIterator->MoveToNext();
+ continue;
+ }
+ if (pViewItem && (pSearchItem->GetParent() != pViewItem)) {
+ *bCurrentItem = true;
+ break;
+ }
+ tabParams.push_back(std::make_unique<CXFA_TabParam>(hWidget));
+ if (IsLayoutElement(pSearchItem->GetFormNode()->GetElementType(), true)) {
+ OrderContainer(sIterator, pSearchItem, tabParams.back().get(),
+ bCurrentItem, bContentArea, bMasterPage);
+ }
+ }
+ if (*bCurrentItem) {
+ pSearchItem = sIterator->GetCurrent();
+ *bCurrentItem = false;
+ } else {
+ pSearchItem = sIterator->MoveToNext();
+ }
+ }
+ std::sort(tabParams.begin(), tabParams.end(),
+ [](const std::unique_ptr<CXFA_TabParam>& arg1,
+ const std::unique_ptr<CXFA_TabParam>& arg2) {
+ const CFX_RectF& rt1 = arg1->GetWidget()->GetWidgetRect();
+ const CFX_RectF& rt2 = arg2->GetWidget()->GetWidgetRect();
+ if (rt1.top - rt2.top >= kXFAWidgetPrecision)
+ return rt1.top < rt2.top;
+ return rt1.left < rt2.left;
+ });
+ for (const auto& pParam : tabParams)
+ pContainer->AppendTabParam(pParam.get());
+}
+
+} // namespace
+
CXFA_FFPageView::CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea)
: m_pPageArea(pPageArea), m_pDocView(pDocView) {}
@@ -202,9 +289,10 @@
m_sIterator.Reset();
for (CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); pLayoutItem;
pLayoutItem = m_sIterator.MoveToNext()) {
- if (CXFA_FFWidget* hWidget = GetWidget(pLayoutItem)) {
+ CXFA_FFWidget* hWidget = FilteredLoadedWidgetFromLayoutItem(
+ pLayoutItem, m_dwFilter, m_bIgnoreRelevant);
+ if (hWidget)
return hWidget;
- }
}
return nullptr;
}
@@ -217,9 +305,10 @@
CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToNext() {
for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToNext(); pLayoutItem;
pLayoutItem = m_sIterator.MoveToNext()) {
- if (CXFA_FFWidget* hWidget = GetWidget(pLayoutItem)) {
+ CXFA_FFWidget* hWidget = FilteredLoadedWidgetFromLayoutItem(
+ pLayoutItem, m_dwFilter, m_bIgnoreRelevant);
+ if (hWidget)
return hWidget;
- }
}
return nullptr;
}
@@ -227,9 +316,10 @@
CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToPrevious() {
for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToPrev(); pLayoutItem;
pLayoutItem = m_sIterator.MoveToPrev()) {
- if (CXFA_FFWidget* hWidget = GetWidget(pLayoutItem)) {
+ CXFA_FFWidget* hWidget = FilteredLoadedWidgetFromLayoutItem(
+ pLayoutItem, m_dwFilter, m_bIgnoreRelevant);
+ if (hWidget)
return hWidget;
- }
}
return nullptr;
}
@@ -243,23 +333,6 @@
return pWidget && m_sIterator.SetCurrent(pWidget->GetLayoutItem());
}
-CXFA_FFWidget* CXFA_FFPageWidgetIterator::GetWidget(
- CXFA_LayoutItem* pLayoutItem) {
- CXFA_FFWidget* pWidget = CXFA_FFWidget::FromLayoutItem(pLayoutItem);
- if (!pWidget)
- return nullptr;
-
- if (!PageWidgetFilter(pWidget, m_dwFilter, false, m_bIgnoreRelevant))
- return nullptr;
-
- if (!pWidget->IsLoaded() &&
- pWidget->GetLayoutItem()->TestStatusBits(XFA_WidgetStatus_Visible)) {
- if (!pWidget->LoadWidget())
- return nullptr;
- }
- return pWidget;
-}
-
CXFA_FFTabOrderPageWidgetIterator::CXFA_FFTabOrderPageWidgetIterator(
CXFA_FFPageView* pPageView,
uint32_t dwFilter)
@@ -406,60 +479,6 @@
}
}
-void CXFA_FFTabOrderPageWidgetIterator::OrderContainer(
- CXFA_LayoutItemIterator* sIterator,
- CXFA_LayoutItem* pViewItem,
- CXFA_TabParam* pContainer,
- bool* bCurrentItem,
- bool* bContentArea,
- bool bMasterPage) {
- std::vector<std::unique_ptr<CXFA_TabParam>> tabParams;
- CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext();
- while (pSearchItem) {
- if (!pSearchItem->IsContentLayoutItem()) {
- *bContentArea = true;
- pSearchItem = sIterator->MoveToNext();
- continue;
- }
- if (bMasterPage && *bContentArea) {
- break;
- }
- if (bMasterPage || *bContentArea) {
- CXFA_FFWidget* hWidget = GetWidget(pSearchItem);
- if (!hWidget) {
- pSearchItem = sIterator->MoveToNext();
- continue;
- }
- if (pViewItem && (pSearchItem->GetParent() != pViewItem)) {
- *bCurrentItem = true;
- break;
- }
- tabParams.push_back(std::make_unique<CXFA_TabParam>(hWidget));
- if (IsLayoutElement(pSearchItem->GetFormNode()->GetElementType(), true)) {
- OrderContainer(sIterator, pSearchItem, tabParams.back().get(),
- bCurrentItem, bContentArea, bMasterPage);
- }
- }
- if (*bCurrentItem) {
- pSearchItem = sIterator->GetCurrent();
- *bCurrentItem = false;
- } else {
- pSearchItem = sIterator->MoveToNext();
- }
- }
- std::sort(tabParams.begin(), tabParams.end(),
- [](const std::unique_ptr<CXFA_TabParam>& arg1,
- const std::unique_ptr<CXFA_TabParam>& arg2) {
- const CFX_RectF& rt1 = arg1->GetWidget()->GetWidgetRect();
- const CFX_RectF& rt2 = arg2->GetWidget()->GetWidgetRect();
- if (rt1.top - rt2.top >= kXFAWidgetPrecision)
- return rt1.top < rt2.top;
- return rt1.left < rt2.left;
- });
- for (const auto& pParam : tabParams)
- pContainer->AppendTabParam(pParam.get());
-}
-
std::vector<CXFA_ContentLayoutItem*>
CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderLayoutItems() {
std::vector<CXFA_ContentLayoutItem*> items;
@@ -484,16 +503,3 @@
return items;
}
-
-CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget(
- CXFA_LayoutItem* pLayoutItem) {
- CXFA_FFWidget* pWidget = CXFA_FFWidget::FromLayoutItem(pLayoutItem);
- if (!pWidget)
- return nullptr;
-
- if (!pWidget->IsLoaded() &&
- pWidget->GetLayoutItem()->TestStatusBits(XFA_WidgetStatus_Visible)) {
- pWidget->LoadWidget();
- }
- return pWidget;
-}
diff --git a/xfa/fxfa/cxfa_ffpageview.h b/xfa/fxfa/cxfa_ffpageview.h
index ce2a1d6..c41c61e 100644
--- a/xfa/fxfa/cxfa_ffpageview.h
+++ b/xfa/fxfa/cxfa_ffpageview.h
@@ -20,7 +20,6 @@
class CXFA_FFWidget;
class CXFA_FFDocView;
-class CXFA_TabParam;
class CXFA_FFPageView final : public cppgc::GarbageCollected<CXFA_FFPageView> {
public:
@@ -69,8 +68,6 @@
private:
CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, uint32_t dwFilter);
- CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
-
CXFA_LayoutItemIterator m_sIterator;
const uint32_t m_dwFilter;
const bool m_bIgnoreRelevant;
@@ -102,13 +99,6 @@
CXFA_FFWidget* pRefWidget);
void CreateTabOrderWidgetArray();
std::vector<CXFA_ContentLayoutItem*> CreateSpaceOrderLayoutItems();
- CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
- void OrderContainer(CXFA_LayoutItemIterator* sIterator,
- CXFA_LayoutItem* pViewItem,
- CXFA_TabParam* pContainer,
- bool* bCurrentItem,
- bool* bContentArea,
- bool bMasterPage);
cppgc::Member<CXFA_ViewLayoutItem> const m_pPageViewLayout;
std::vector<cppgc::Member<CXFA_ContentLayoutItem>> m_TabOrderWidgetArray;