1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffpageview.h"
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
10*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
11*3ac0a46fSAndroid Build Coastguard Worker
12*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/stl_util.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/container_trace.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/xfa/cjx_object.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/containers/contains.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffcheckbutton.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdoc.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdocview.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fffield.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffimageedit.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffpushbutton.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffwidget.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fwladapterwidgetmgr.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_node.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_traversal.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_traverse.h"
28*3ac0a46fSAndroid Build Coastguard Worker
29*3ac0a46fSAndroid Build Coastguard Worker namespace {
30*3ac0a46fSAndroid Build Coastguard Worker
GetPageMatrix(const CFX_RectF & docPageRect,const FX_RECT & devicePageRect,int32_t iRotate)31*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix GetPageMatrix(const CFX_RectF& docPageRect,
32*3ac0a46fSAndroid Build Coastguard Worker const FX_RECT& devicePageRect,
33*3ac0a46fSAndroid Build Coastguard Worker int32_t iRotate) {
34*3ac0a46fSAndroid Build Coastguard Worker DCHECK(iRotate >= 0);
35*3ac0a46fSAndroid Build Coastguard Worker DCHECK(iRotate <= 3);
36*3ac0a46fSAndroid Build Coastguard Worker
37*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix m;
38*3ac0a46fSAndroid Build Coastguard Worker if (iRotate == 0 || iRotate == 2) {
39*3ac0a46fSAndroid Build Coastguard Worker m.a *= (float)devicePageRect.Width() / docPageRect.width;
40*3ac0a46fSAndroid Build Coastguard Worker m.d *= (float)devicePageRect.Height() / docPageRect.height;
41*3ac0a46fSAndroid Build Coastguard Worker } else {
42*3ac0a46fSAndroid Build Coastguard Worker m.a *= (float)devicePageRect.Height() / docPageRect.width;
43*3ac0a46fSAndroid Build Coastguard Worker m.d *= (float)devicePageRect.Width() / docPageRect.height;
44*3ac0a46fSAndroid Build Coastguard Worker }
45*3ac0a46fSAndroid Build Coastguard Worker m.Rotate(iRotate * 1.57079632675f);
46*3ac0a46fSAndroid Build Coastguard Worker switch (iRotate) {
47*3ac0a46fSAndroid Build Coastguard Worker case 0:
48*3ac0a46fSAndroid Build Coastguard Worker m.e = devicePageRect.left;
49*3ac0a46fSAndroid Build Coastguard Worker m.f = devicePageRect.top;
50*3ac0a46fSAndroid Build Coastguard Worker break;
51*3ac0a46fSAndroid Build Coastguard Worker case 1:
52*3ac0a46fSAndroid Build Coastguard Worker m.e = devicePageRect.right;
53*3ac0a46fSAndroid Build Coastguard Worker m.f = devicePageRect.top;
54*3ac0a46fSAndroid Build Coastguard Worker break;
55*3ac0a46fSAndroid Build Coastguard Worker case 2:
56*3ac0a46fSAndroid Build Coastguard Worker m.e = devicePageRect.right;
57*3ac0a46fSAndroid Build Coastguard Worker m.f = devicePageRect.bottom;
58*3ac0a46fSAndroid Build Coastguard Worker break;
59*3ac0a46fSAndroid Build Coastguard Worker case 3:
60*3ac0a46fSAndroid Build Coastguard Worker m.e = devicePageRect.left;
61*3ac0a46fSAndroid Build Coastguard Worker m.f = devicePageRect.bottom;
62*3ac0a46fSAndroid Build Coastguard Worker break;
63*3ac0a46fSAndroid Build Coastguard Worker default:
64*3ac0a46fSAndroid Build Coastguard Worker break;
65*3ac0a46fSAndroid Build Coastguard Worker }
66*3ac0a46fSAndroid Build Coastguard Worker return m;
67*3ac0a46fSAndroid Build Coastguard Worker }
68*3ac0a46fSAndroid Build Coastguard Worker
PageWidgetFilter(CXFA_FFWidget * pWidget,Mask<XFA_WidgetStatus> dwFilter,bool bTraversal,bool bIgnoreRelevant)69*3ac0a46fSAndroid Build Coastguard Worker bool PageWidgetFilter(CXFA_FFWidget* pWidget,
70*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_WidgetStatus> dwFilter,
71*3ac0a46fSAndroid Build Coastguard Worker bool bTraversal,
72*3ac0a46fSAndroid Build Coastguard Worker bool bIgnoreRelevant) {
73*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pNode = pWidget->GetNode();
74*3ac0a46fSAndroid Build Coastguard Worker
75*3ac0a46fSAndroid Build Coastguard Worker if ((dwFilter & XFA_WidgetStatus::kFocused) &&
76*3ac0a46fSAndroid Build Coastguard Worker (!pNode || pNode->GetElementType() != XFA_Element::Field)) {
77*3ac0a46fSAndroid Build Coastguard Worker return false;
78*3ac0a46fSAndroid Build Coastguard Worker }
79*3ac0a46fSAndroid Build Coastguard Worker
80*3ac0a46fSAndroid Build Coastguard Worker CXFA_ContentLayoutItem* pItem = pWidget->GetLayoutItem();
81*3ac0a46fSAndroid Build Coastguard Worker if (bTraversal && pItem->TestStatusBits(XFA_WidgetStatus::kDisabled))
82*3ac0a46fSAndroid Build Coastguard Worker return false;
83*3ac0a46fSAndroid Build Coastguard Worker if (bIgnoreRelevant)
84*3ac0a46fSAndroid Build Coastguard Worker return pItem->TestStatusBits(XFA_WidgetStatus::kVisible);
85*3ac0a46fSAndroid Build Coastguard Worker
86*3ac0a46fSAndroid Build Coastguard Worker dwFilter &= Mask<XFA_WidgetStatus>{XFA_WidgetStatus::kVisible,
87*3ac0a46fSAndroid Build Coastguard Worker XFA_WidgetStatus::kViewable,
88*3ac0a46fSAndroid Build Coastguard Worker XFA_WidgetStatus::kPrintable};
89*3ac0a46fSAndroid Build Coastguard Worker return pItem->TestStatusBits(dwFilter);
90*3ac0a46fSAndroid Build Coastguard Worker }
91*3ac0a46fSAndroid Build Coastguard Worker
IsLayoutElement(XFA_Element eElement)92*3ac0a46fSAndroid Build Coastguard Worker bool IsLayoutElement(XFA_Element eElement) {
93*3ac0a46fSAndroid Build Coastguard Worker switch (eElement) {
94*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Area:
95*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Subform:
96*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::ExclGroup:
97*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::SubformSet:
98*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::PageArea:
99*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Form:
100*3ac0a46fSAndroid Build Coastguard Worker return true;
101*3ac0a46fSAndroid Build Coastguard Worker default:
102*3ac0a46fSAndroid Build Coastguard Worker return false;
103*3ac0a46fSAndroid Build Coastguard Worker }
104*3ac0a46fSAndroid Build Coastguard Worker }
105*3ac0a46fSAndroid Build Coastguard Worker
GetDocForPageView(const CXFA_FFPageView * view)106*3ac0a46fSAndroid Build Coastguard Worker CXFA_Document* GetDocForPageView(const CXFA_FFPageView* view) {
107*3ac0a46fSAndroid Build Coastguard Worker return view->GetDocView()->GetDoc()->GetXFADoc();
108*3ac0a46fSAndroid Build Coastguard Worker }
109*3ac0a46fSAndroid Build Coastguard Worker
IsDocVersionBelow205(const CXFA_Document * doc)110*3ac0a46fSAndroid Build Coastguard Worker bool IsDocVersionBelow205(const CXFA_Document* doc) {
111*3ac0a46fSAndroid Build Coastguard Worker return doc->GetCurVersionMode() < XFA_VERSION_205;
112*3ac0a46fSAndroid Build Coastguard Worker }
113*3ac0a46fSAndroid Build Coastguard Worker
EnsureWidgetLoadedIfVisible(CXFA_FFWidget * pWidget)114*3ac0a46fSAndroid Build Coastguard Worker bool EnsureWidgetLoadedIfVisible(CXFA_FFWidget* pWidget) {
115*3ac0a46fSAndroid Build Coastguard Worker if (!pWidget->IsLoaded() &&
116*3ac0a46fSAndroid Build Coastguard Worker pWidget->GetLayoutItem()->TestStatusBits(XFA_WidgetStatus::kVisible)) {
117*3ac0a46fSAndroid Build Coastguard Worker if (!pWidget->LoadWidget())
118*3ac0a46fSAndroid Build Coastguard Worker return false;
119*3ac0a46fSAndroid Build Coastguard Worker }
120*3ac0a46fSAndroid Build Coastguard Worker return true;
121*3ac0a46fSAndroid Build Coastguard Worker }
122*3ac0a46fSAndroid Build Coastguard Worker
LoadedWidgetFromLayoutItem(CXFA_LayoutItem * pLayoutItem)123*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* LoadedWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem) {
124*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget = CXFA_FFWidget::FromLayoutItem(pLayoutItem);
125*3ac0a46fSAndroid Build Coastguard Worker if (!pWidget)
126*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
127*3ac0a46fSAndroid Build Coastguard Worker
128*3ac0a46fSAndroid Build Coastguard Worker EnsureWidgetLoadedIfVisible(pWidget);
129*3ac0a46fSAndroid Build Coastguard Worker return pWidget;
130*3ac0a46fSAndroid Build Coastguard Worker }
131*3ac0a46fSAndroid Build Coastguard Worker
FilteredLoadedWidgetFromLayoutItem(CXFA_LayoutItem * pLayoutItem,Mask<XFA_WidgetStatus> dwFilter,bool bIgnoreRelevant)132*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* FilteredLoadedWidgetFromLayoutItem(
133*3ac0a46fSAndroid Build Coastguard Worker CXFA_LayoutItem* pLayoutItem,
134*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_WidgetStatus> dwFilter,
135*3ac0a46fSAndroid Build Coastguard Worker bool bIgnoreRelevant) {
136*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget = CXFA_FFWidget::FromLayoutItem(pLayoutItem);
137*3ac0a46fSAndroid Build Coastguard Worker if (!pWidget)
138*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
139*3ac0a46fSAndroid Build Coastguard Worker
140*3ac0a46fSAndroid Build Coastguard Worker if (!PageWidgetFilter(pWidget, dwFilter, false, bIgnoreRelevant))
141*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
142*3ac0a46fSAndroid Build Coastguard Worker
143*3ac0a46fSAndroid Build Coastguard Worker if (!EnsureWidgetLoadedIfVisible(pWidget))
144*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
145*3ac0a46fSAndroid Build Coastguard Worker
146*3ac0a46fSAndroid Build Coastguard Worker return pWidget;
147*3ac0a46fSAndroid Build Coastguard Worker }
148*3ac0a46fSAndroid Build Coastguard Worker
149*3ac0a46fSAndroid Build Coastguard Worker class CXFA_TabParam {
150*3ac0a46fSAndroid Build Coastguard Worker public:
151*3ac0a46fSAndroid Build Coastguard Worker CXFA_TabParam() = default;
CXFA_TabParam(CXFA_FFWidget * pWidget)152*3ac0a46fSAndroid Build Coastguard Worker explicit CXFA_TabParam(CXFA_FFWidget* pWidget)
153*3ac0a46fSAndroid Build Coastguard Worker : m_pItem(pWidget->GetLayoutItem()) {}
154*3ac0a46fSAndroid Build Coastguard Worker CXFA_TabParam(const CXFA_TabParam&) = delete;
155*3ac0a46fSAndroid Build Coastguard Worker CXFA_TabParam(CXFA_TabParam&&) noexcept = default;
156*3ac0a46fSAndroid Build Coastguard Worker ~CXFA_TabParam() = default;
157*3ac0a46fSAndroid Build Coastguard Worker
158*3ac0a46fSAndroid Build Coastguard Worker CXFA_TabParam& operator=(const CXFA_TabParam&) = delete;
159*3ac0a46fSAndroid Build Coastguard Worker CXFA_TabParam& operator=(CXFA_TabParam&&) noexcept = default;
160*3ac0a46fSAndroid Build Coastguard Worker
GetWidget() const161*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* GetWidget() const { return m_pItem->GetFFWidget(); }
GetChildren() const162*3ac0a46fSAndroid Build Coastguard Worker const std::vector<cppgc::Persistent<CXFA_ContentLayoutItem>>& GetChildren()
163*3ac0a46fSAndroid Build Coastguard Worker const {
164*3ac0a46fSAndroid Build Coastguard Worker return m_Children;
165*3ac0a46fSAndroid Build Coastguard Worker }
ClearChildren()166*3ac0a46fSAndroid Build Coastguard Worker void ClearChildren() { m_Children.clear(); }
AppendTabParam(const CXFA_TabParam * pParam)167*3ac0a46fSAndroid Build Coastguard Worker void AppendTabParam(const CXFA_TabParam* pParam) {
168*3ac0a46fSAndroid Build Coastguard Worker m_Children.push_back(pParam->m_pItem);
169*3ac0a46fSAndroid Build Coastguard Worker m_Children.insert(m_Children.end(), pParam->m_Children.begin(),
170*3ac0a46fSAndroid Build Coastguard Worker pParam->m_Children.end());
171*3ac0a46fSAndroid Build Coastguard Worker }
172*3ac0a46fSAndroid Build Coastguard Worker
173*3ac0a46fSAndroid Build Coastguard Worker private:
174*3ac0a46fSAndroid Build Coastguard Worker cppgc::Persistent<CXFA_ContentLayoutItem> m_pItem;
175*3ac0a46fSAndroid Build Coastguard Worker std::vector<cppgc::Persistent<CXFA_ContentLayoutItem>> m_Children;
176*3ac0a46fSAndroid Build Coastguard Worker };
177*3ac0a46fSAndroid Build Coastguard Worker
OrderContainer(CXFA_LayoutItemIterator * sIterator,CXFA_LayoutItem * pViewItem,CXFA_TabParam * pContainer,bool * bCurrentItem,bool * bContentArea,bool bMasterPage)178*3ac0a46fSAndroid Build Coastguard Worker void OrderContainer(CXFA_LayoutItemIterator* sIterator,
179*3ac0a46fSAndroid Build Coastguard Worker CXFA_LayoutItem* pViewItem,
180*3ac0a46fSAndroid Build Coastguard Worker CXFA_TabParam* pContainer,
181*3ac0a46fSAndroid Build Coastguard Worker bool* bCurrentItem,
182*3ac0a46fSAndroid Build Coastguard Worker bool* bContentArea,
183*3ac0a46fSAndroid Build Coastguard Worker bool bMasterPage) {
184*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_TabParam> tabParams;
185*3ac0a46fSAndroid Build Coastguard Worker CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext();
186*3ac0a46fSAndroid Build Coastguard Worker while (pSearchItem) {
187*3ac0a46fSAndroid Build Coastguard Worker if (!pSearchItem->IsContentLayoutItem()) {
188*3ac0a46fSAndroid Build Coastguard Worker *bContentArea = true;
189*3ac0a46fSAndroid Build Coastguard Worker pSearchItem = sIterator->MoveToNext();
190*3ac0a46fSAndroid Build Coastguard Worker continue;
191*3ac0a46fSAndroid Build Coastguard Worker }
192*3ac0a46fSAndroid Build Coastguard Worker if (bMasterPage && *bContentArea) {
193*3ac0a46fSAndroid Build Coastguard Worker break;
194*3ac0a46fSAndroid Build Coastguard Worker }
195*3ac0a46fSAndroid Build Coastguard Worker if (bMasterPage || *bContentArea) {
196*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* hWidget = LoadedWidgetFromLayoutItem(pSearchItem);
197*3ac0a46fSAndroid Build Coastguard Worker if (!hWidget) {
198*3ac0a46fSAndroid Build Coastguard Worker pSearchItem = sIterator->MoveToNext();
199*3ac0a46fSAndroid Build Coastguard Worker continue;
200*3ac0a46fSAndroid Build Coastguard Worker }
201*3ac0a46fSAndroid Build Coastguard Worker if (pViewItem && (pSearchItem->GetParent() != pViewItem)) {
202*3ac0a46fSAndroid Build Coastguard Worker *bCurrentItem = true;
203*3ac0a46fSAndroid Build Coastguard Worker break;
204*3ac0a46fSAndroid Build Coastguard Worker }
205*3ac0a46fSAndroid Build Coastguard Worker tabParams.emplace_back(hWidget);
206*3ac0a46fSAndroid Build Coastguard Worker if (IsLayoutElement(pSearchItem->GetFormNode()->GetElementType())) {
207*3ac0a46fSAndroid Build Coastguard Worker OrderContainer(sIterator, pSearchItem, &tabParams.back(), bCurrentItem,
208*3ac0a46fSAndroid Build Coastguard Worker bContentArea, bMasterPage);
209*3ac0a46fSAndroid Build Coastguard Worker }
210*3ac0a46fSAndroid Build Coastguard Worker }
211*3ac0a46fSAndroid Build Coastguard Worker if (*bCurrentItem) {
212*3ac0a46fSAndroid Build Coastguard Worker pSearchItem = sIterator->GetCurrent();
213*3ac0a46fSAndroid Build Coastguard Worker *bCurrentItem = false;
214*3ac0a46fSAndroid Build Coastguard Worker } else {
215*3ac0a46fSAndroid Build Coastguard Worker pSearchItem = sIterator->MoveToNext();
216*3ac0a46fSAndroid Build Coastguard Worker }
217*3ac0a46fSAndroid Build Coastguard Worker }
218*3ac0a46fSAndroid Build Coastguard Worker std::sort(tabParams.begin(), tabParams.end(),
219*3ac0a46fSAndroid Build Coastguard Worker [](const CXFA_TabParam& arg1, const CXFA_TabParam& arg2) {
220*3ac0a46fSAndroid Build Coastguard Worker const CFX_RectF& rt1 = arg1.GetWidget()->GetWidgetRect();
221*3ac0a46fSAndroid Build Coastguard Worker const CFX_RectF& rt2 = arg2.GetWidget()->GetWidgetRect();
222*3ac0a46fSAndroid Build Coastguard Worker if (rt1.top - rt2.top >= kXFAWidgetPrecision)
223*3ac0a46fSAndroid Build Coastguard Worker return rt1.top < rt2.top;
224*3ac0a46fSAndroid Build Coastguard Worker return rt1.left < rt2.left;
225*3ac0a46fSAndroid Build Coastguard Worker });
226*3ac0a46fSAndroid Build Coastguard Worker for (const auto& param : tabParams)
227*3ac0a46fSAndroid Build Coastguard Worker pContainer->AppendTabParam(¶m);
228*3ac0a46fSAndroid Build Coastguard Worker }
229*3ac0a46fSAndroid Build Coastguard Worker
230*3ac0a46fSAndroid Build Coastguard Worker } // namespace
231*3ac0a46fSAndroid Build Coastguard Worker
CXFA_FFPageView(CXFA_FFDocView * pDocView,CXFA_Node * pPageArea)232*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFPageView::CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea)
233*3ac0a46fSAndroid Build Coastguard Worker : m_pPageArea(pPageArea), m_pDocView(pDocView) {}
234*3ac0a46fSAndroid Build Coastguard Worker
235*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFPageView::~CXFA_FFPageView() = default;
236*3ac0a46fSAndroid Build Coastguard Worker
Trace(cppgc::Visitor * visitor) const237*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFPageView::Trace(cppgc::Visitor* visitor) const {
238*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pPageArea);
239*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pDocView);
240*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pLayoutItem);
241*3ac0a46fSAndroid Build Coastguard Worker }
242*3ac0a46fSAndroid Build Coastguard Worker
GetDocView() const243*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* CXFA_FFPageView::GetDocView() const {
244*3ac0a46fSAndroid Build Coastguard Worker return m_pDocView;
245*3ac0a46fSAndroid Build Coastguard Worker }
246*3ac0a46fSAndroid Build Coastguard Worker
GetPageViewRect() const247*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF CXFA_FFPageView::GetPageViewRect() const {
248*3ac0a46fSAndroid Build Coastguard Worker auto* pItem = GetLayoutItem();
249*3ac0a46fSAndroid Build Coastguard Worker if (!pItem)
250*3ac0a46fSAndroid Build Coastguard Worker return CFX_RectF();
251*3ac0a46fSAndroid Build Coastguard Worker
252*3ac0a46fSAndroid Build Coastguard Worker return CFX_RectF(0, 0, pItem->GetPageSize());
253*3ac0a46fSAndroid Build Coastguard Worker }
254*3ac0a46fSAndroid Build Coastguard Worker
GetDisplayMatrix(const FX_RECT & rtDisp,int32_t iRotate) const255*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix CXFA_FFPageView::GetDisplayMatrix(const FX_RECT& rtDisp,
256*3ac0a46fSAndroid Build Coastguard Worker int32_t iRotate) const {
257*3ac0a46fSAndroid Build Coastguard Worker auto* pItem = GetLayoutItem();
258*3ac0a46fSAndroid Build Coastguard Worker if (!pItem)
259*3ac0a46fSAndroid Build Coastguard Worker return CFX_Matrix();
260*3ac0a46fSAndroid Build Coastguard Worker
261*3ac0a46fSAndroid Build Coastguard Worker return GetPageMatrix(CFX_RectF(0, 0, pItem->GetPageSize()), rtDisp, iRotate);
262*3ac0a46fSAndroid Build Coastguard Worker }
263*3ac0a46fSAndroid Build Coastguard Worker
CreateGCedTraverseWidgetIterator(Mask<XFA_WidgetStatus> dwWidgetFilter)264*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget::IteratorIface* CXFA_FFPageView::CreateGCedTraverseWidgetIterator(
265*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_WidgetStatus> dwWidgetFilter) {
266*3ac0a46fSAndroid Build Coastguard Worker return cppgc::MakeGarbageCollected<CXFA_FFTabOrderPageWidgetIterator>(
267*3ac0a46fSAndroid Build Coastguard Worker GetDocView()->GetDoc()->GetHeap()->GetAllocationHandle(), this,
268*3ac0a46fSAndroid Build Coastguard Worker dwWidgetFilter);
269*3ac0a46fSAndroid Build Coastguard Worker }
270*3ac0a46fSAndroid Build Coastguard Worker
CXFA_FFPageWidgetIterator(CXFA_FFPageView * pPageView,Mask<XFA_WidgetStatus> dwFilter)271*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFPageWidgetIterator::CXFA_FFPageWidgetIterator(
272*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFPageView* pPageView,
273*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_WidgetStatus> dwFilter)
274*3ac0a46fSAndroid Build Coastguard Worker : m_sIterator(pPageView->GetLayoutItem()),
275*3ac0a46fSAndroid Build Coastguard Worker m_dwFilter(dwFilter),
276*3ac0a46fSAndroid Build Coastguard Worker m_bIgnoreRelevant(IsDocVersionBelow205(GetDocForPageView(pPageView))) {}
277*3ac0a46fSAndroid Build Coastguard Worker
278*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFPageWidgetIterator::~CXFA_FFPageWidgetIterator() = default;
279*3ac0a46fSAndroid Build Coastguard Worker
MoveToFirst()280*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToFirst() {
281*3ac0a46fSAndroid Build Coastguard Worker m_sIterator.Reset();
282*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); pLayoutItem;
283*3ac0a46fSAndroid Build Coastguard Worker pLayoutItem = m_sIterator.MoveToNext()) {
284*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* hWidget = FilteredLoadedWidgetFromLayoutItem(
285*3ac0a46fSAndroid Build Coastguard Worker pLayoutItem, m_dwFilter, m_bIgnoreRelevant);
286*3ac0a46fSAndroid Build Coastguard Worker if (hWidget)
287*3ac0a46fSAndroid Build Coastguard Worker return hWidget;
288*3ac0a46fSAndroid Build Coastguard Worker }
289*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
290*3ac0a46fSAndroid Build Coastguard Worker }
291*3ac0a46fSAndroid Build Coastguard Worker
MoveToLast()292*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToLast() {
293*3ac0a46fSAndroid Build Coastguard Worker m_sIterator.SetCurrent(nullptr);
294*3ac0a46fSAndroid Build Coastguard Worker return MoveToPrevious();
295*3ac0a46fSAndroid Build Coastguard Worker }
296*3ac0a46fSAndroid Build Coastguard Worker
MoveToNext()297*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToNext() {
298*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToNext(); pLayoutItem;
299*3ac0a46fSAndroid Build Coastguard Worker pLayoutItem = m_sIterator.MoveToNext()) {
300*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* hWidget = FilteredLoadedWidgetFromLayoutItem(
301*3ac0a46fSAndroid Build Coastguard Worker pLayoutItem, m_dwFilter, m_bIgnoreRelevant);
302*3ac0a46fSAndroid Build Coastguard Worker if (hWidget)
303*3ac0a46fSAndroid Build Coastguard Worker return hWidget;
304*3ac0a46fSAndroid Build Coastguard Worker }
305*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
306*3ac0a46fSAndroid Build Coastguard Worker }
307*3ac0a46fSAndroid Build Coastguard Worker
MoveToPrevious()308*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToPrevious() {
309*3ac0a46fSAndroid Build Coastguard Worker for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToPrev(); pLayoutItem;
310*3ac0a46fSAndroid Build Coastguard Worker pLayoutItem = m_sIterator.MoveToPrev()) {
311*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* hWidget = FilteredLoadedWidgetFromLayoutItem(
312*3ac0a46fSAndroid Build Coastguard Worker pLayoutItem, m_dwFilter, m_bIgnoreRelevant);
313*3ac0a46fSAndroid Build Coastguard Worker if (hWidget)
314*3ac0a46fSAndroid Build Coastguard Worker return hWidget;
315*3ac0a46fSAndroid Build Coastguard Worker }
316*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
317*3ac0a46fSAndroid Build Coastguard Worker }
318*3ac0a46fSAndroid Build Coastguard Worker
GetCurrentWidget()319*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFPageWidgetIterator::GetCurrentWidget() {
320*3ac0a46fSAndroid Build Coastguard Worker CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent();
321*3ac0a46fSAndroid Build Coastguard Worker return pLayoutItem ? CXFA_FFWidget::FromLayoutItem(pLayoutItem) : nullptr;
322*3ac0a46fSAndroid Build Coastguard Worker }
323*3ac0a46fSAndroid Build Coastguard Worker
SetCurrentWidget(CXFA_FFWidget * pWidget)324*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFPageWidgetIterator::SetCurrentWidget(CXFA_FFWidget* pWidget) {
325*3ac0a46fSAndroid Build Coastguard Worker return pWidget && m_sIterator.SetCurrent(pWidget->GetLayoutItem());
326*3ac0a46fSAndroid Build Coastguard Worker }
327*3ac0a46fSAndroid Build Coastguard Worker
CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView * pPageView,Mask<XFA_WidgetStatus> dwFilter)328*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFTabOrderPageWidgetIterator::CXFA_FFTabOrderPageWidgetIterator(
329*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFPageView* pPageView,
330*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_WidgetStatus> dwFilter)
331*3ac0a46fSAndroid Build Coastguard Worker : m_pPageViewLayout(pPageView->GetLayoutItem()),
332*3ac0a46fSAndroid Build Coastguard Worker m_dwFilter(dwFilter),
333*3ac0a46fSAndroid Build Coastguard Worker m_bIgnoreRelevant(IsDocVersionBelow205(GetDocForPageView(pPageView))) {
334*3ac0a46fSAndroid Build Coastguard Worker CreateTabOrderWidgetArray();
335*3ac0a46fSAndroid Build Coastguard Worker }
336*3ac0a46fSAndroid Build Coastguard Worker
337*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFTabOrderPageWidgetIterator::~CXFA_FFTabOrderPageWidgetIterator() =
338*3ac0a46fSAndroid Build Coastguard Worker default;
339*3ac0a46fSAndroid Build Coastguard Worker
Trace(cppgc::Visitor * visitor) const340*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFTabOrderPageWidgetIterator::Trace(cppgc::Visitor* visitor) const {
341*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pPageViewLayout);
342*3ac0a46fSAndroid Build Coastguard Worker ContainerTrace(visitor, m_TabOrderWidgetArray);
343*3ac0a46fSAndroid Build Coastguard Worker }
344*3ac0a46fSAndroid Build Coastguard Worker
MoveToFirst()345*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() {
346*3ac0a46fSAndroid Build Coastguard Worker for (int32_t i = 0; i < fxcrt::CollectionSize<int32_t>(m_TabOrderWidgetArray);
347*3ac0a46fSAndroid Build Coastguard Worker i++) {
348*3ac0a46fSAndroid Build Coastguard Worker if (PageWidgetFilter(m_TabOrderWidgetArray[i]->GetFFWidget(), m_dwFilter,
349*3ac0a46fSAndroid Build Coastguard Worker true, m_bIgnoreRelevant)) {
350*3ac0a46fSAndroid Build Coastguard Worker m_iCurWidget = i;
351*3ac0a46fSAndroid Build Coastguard Worker return m_TabOrderWidgetArray[m_iCurWidget]->GetFFWidget();
352*3ac0a46fSAndroid Build Coastguard Worker }
353*3ac0a46fSAndroid Build Coastguard Worker }
354*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
355*3ac0a46fSAndroid Build Coastguard Worker }
356*3ac0a46fSAndroid Build Coastguard Worker
MoveToLast()357*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToLast() {
358*3ac0a46fSAndroid Build Coastguard Worker for (int32_t i = fxcrt::CollectionSize<int32_t>(m_TabOrderWidgetArray) - 1;
359*3ac0a46fSAndroid Build Coastguard Worker i >= 0; i--) {
360*3ac0a46fSAndroid Build Coastguard Worker if (PageWidgetFilter(m_TabOrderWidgetArray[i]->GetFFWidget(), m_dwFilter,
361*3ac0a46fSAndroid Build Coastguard Worker true, m_bIgnoreRelevant)) {
362*3ac0a46fSAndroid Build Coastguard Worker m_iCurWidget = i;
363*3ac0a46fSAndroid Build Coastguard Worker return m_TabOrderWidgetArray[m_iCurWidget]->GetFFWidget();
364*3ac0a46fSAndroid Build Coastguard Worker }
365*3ac0a46fSAndroid Build Coastguard Worker }
366*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
367*3ac0a46fSAndroid Build Coastguard Worker }
368*3ac0a46fSAndroid Build Coastguard Worker
MoveToNext()369*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToNext() {
370*3ac0a46fSAndroid Build Coastguard Worker for (int32_t i = m_iCurWidget + 1;
371*3ac0a46fSAndroid Build Coastguard Worker i < fxcrt::CollectionSize<int32_t>(m_TabOrderWidgetArray); i++) {
372*3ac0a46fSAndroid Build Coastguard Worker if (PageWidgetFilter(m_TabOrderWidgetArray[i]->GetFFWidget(), m_dwFilter,
373*3ac0a46fSAndroid Build Coastguard Worker true, m_bIgnoreRelevant)) {
374*3ac0a46fSAndroid Build Coastguard Worker m_iCurWidget = i;
375*3ac0a46fSAndroid Build Coastguard Worker return m_TabOrderWidgetArray[m_iCurWidget]->GetFFWidget();
376*3ac0a46fSAndroid Build Coastguard Worker }
377*3ac0a46fSAndroid Build Coastguard Worker }
378*3ac0a46fSAndroid Build Coastguard Worker m_iCurWidget = -1;
379*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
380*3ac0a46fSAndroid Build Coastguard Worker }
381*3ac0a46fSAndroid Build Coastguard Worker
MoveToPrevious()382*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() {
383*3ac0a46fSAndroid Build Coastguard Worker for (int32_t i = m_iCurWidget - 1; i >= 0; i--) {
384*3ac0a46fSAndroid Build Coastguard Worker if (PageWidgetFilter(m_TabOrderWidgetArray[i]->GetFFWidget(), m_dwFilter,
385*3ac0a46fSAndroid Build Coastguard Worker true, m_bIgnoreRelevant)) {
386*3ac0a46fSAndroid Build Coastguard Worker m_iCurWidget = i;
387*3ac0a46fSAndroid Build Coastguard Worker return m_TabOrderWidgetArray[m_iCurWidget]->GetFFWidget();
388*3ac0a46fSAndroid Build Coastguard Worker }
389*3ac0a46fSAndroid Build Coastguard Worker }
390*3ac0a46fSAndroid Build Coastguard Worker m_iCurWidget = -1;
391*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
392*3ac0a46fSAndroid Build Coastguard Worker }
393*3ac0a46fSAndroid Build Coastguard Worker
GetCurrentWidget()394*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() {
395*3ac0a46fSAndroid Build Coastguard Worker return m_iCurWidget >= 0 ? m_TabOrderWidgetArray[m_iCurWidget]->GetFFWidget()
396*3ac0a46fSAndroid Build Coastguard Worker : nullptr;
397*3ac0a46fSAndroid Build Coastguard Worker }
398*3ac0a46fSAndroid Build Coastguard Worker
SetCurrentWidget(CXFA_FFWidget * hWidget)399*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget(
400*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* hWidget) {
401*3ac0a46fSAndroid Build Coastguard Worker auto it = std::find(m_TabOrderWidgetArray.begin(),
402*3ac0a46fSAndroid Build Coastguard Worker m_TabOrderWidgetArray.end(), hWidget->GetLayoutItem());
403*3ac0a46fSAndroid Build Coastguard Worker if (it == m_TabOrderWidgetArray.end())
404*3ac0a46fSAndroid Build Coastguard Worker return false;
405*3ac0a46fSAndroid Build Coastguard Worker
406*3ac0a46fSAndroid Build Coastguard Worker m_iCurWidget =
407*3ac0a46fSAndroid Build Coastguard Worker pdfium::base::checked_cast<int32_t>(it - m_TabOrderWidgetArray.begin());
408*3ac0a46fSAndroid Build Coastguard Worker return true;
409*3ac0a46fSAndroid Build Coastguard Worker }
410*3ac0a46fSAndroid Build Coastguard Worker
GetTraverseWidget(CXFA_FFWidget * pWidget)411*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget(
412*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget) {
413*3ac0a46fSAndroid Build Coastguard Worker CXFA_Traversal* pTraversal = pWidget->GetNode()->GetChild<CXFA_Traversal>(
414*3ac0a46fSAndroid Build Coastguard Worker 0, XFA_Element::Traversal, false);
415*3ac0a46fSAndroid Build Coastguard Worker if (pTraversal) {
416*3ac0a46fSAndroid Build Coastguard Worker CXFA_Traverse* pTraverse =
417*3ac0a46fSAndroid Build Coastguard Worker pTraversal->GetChild<CXFA_Traverse>(0, XFA_Element::Traverse, false);
418*3ac0a46fSAndroid Build Coastguard Worker if (pTraverse) {
419*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> traverseWidgetName =
420*3ac0a46fSAndroid Build Coastguard Worker pTraverse->JSObject()->TryAttribute(XFA_Attribute::Ref, true);
421*3ac0a46fSAndroid Build Coastguard Worker if (traverseWidgetName.has_value())
422*3ac0a46fSAndroid Build Coastguard Worker return FindWidgetByName(traverseWidgetName.value(), pWidget);
423*3ac0a46fSAndroid Build Coastguard Worker }
424*3ac0a46fSAndroid Build Coastguard Worker }
425*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
426*3ac0a46fSAndroid Build Coastguard Worker }
FindWidgetByName(const WideString & wsWidgetName,CXFA_FFWidget * pRefWidget)427*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::FindWidgetByName(
428*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsWidgetName,
429*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pRefWidget) {
430*3ac0a46fSAndroid Build Coastguard Worker return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget);
431*3ac0a46fSAndroid Build Coastguard Worker }
432*3ac0a46fSAndroid Build Coastguard Worker
CreateTabOrderWidgetArray()433*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() {
434*3ac0a46fSAndroid Build Coastguard Worker m_TabOrderWidgetArray.clear();
435*3ac0a46fSAndroid Build Coastguard Worker
436*3ac0a46fSAndroid Build Coastguard Worker const std::vector<CXFA_ContentLayoutItem*> items =
437*3ac0a46fSAndroid Build Coastguard Worker CreateSpaceOrderLayoutItems();
438*3ac0a46fSAndroid Build Coastguard Worker if (items.empty())
439*3ac0a46fSAndroid Build Coastguard Worker return;
440*3ac0a46fSAndroid Build Coastguard Worker
441*3ac0a46fSAndroid Build Coastguard Worker CXFA_ContentLayoutItem* item = items[0];
442*3ac0a46fSAndroid Build Coastguard Worker while (m_TabOrderWidgetArray.size() < items.size()) {
443*3ac0a46fSAndroid Build Coastguard Worker if (!pdfium::Contains(m_TabOrderWidgetArray, item)) {
444*3ac0a46fSAndroid Build Coastguard Worker m_TabOrderWidgetArray.emplace_back(item);
445*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* node = item->GetFFWidget()->GetNode();
446*3ac0a46fSAndroid Build Coastguard Worker if (node->GetFFWidgetType() == XFA_FFWidgetType::kExclGroup) {
447*3ac0a46fSAndroid Build Coastguard Worker auto it = std::find(items.begin(), items.end(), item);
448*3ac0a46fSAndroid Build Coastguard Worker size_t index = it != items.end() ? it - items.begin() + 1 : 0;
449*3ac0a46fSAndroid Build Coastguard Worker while (true) {
450*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* radio = items[index % items.size()]->GetFFWidget();
451*3ac0a46fSAndroid Build Coastguard Worker if (radio->GetNode()->GetExclGroupIfExists() != node)
452*3ac0a46fSAndroid Build Coastguard Worker break;
453*3ac0a46fSAndroid Build Coastguard Worker if (!pdfium::Contains(m_TabOrderWidgetArray, item))
454*3ac0a46fSAndroid Build Coastguard Worker m_TabOrderWidgetArray.emplace_back(radio->GetLayoutItem());
455*3ac0a46fSAndroid Build Coastguard Worker ++index;
456*3ac0a46fSAndroid Build Coastguard Worker }
457*3ac0a46fSAndroid Build Coastguard Worker }
458*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* next_widget = GetTraverseWidget(item->GetFFWidget());
459*3ac0a46fSAndroid Build Coastguard Worker if (next_widget) {
460*3ac0a46fSAndroid Build Coastguard Worker item = next_widget->GetLayoutItem();
461*3ac0a46fSAndroid Build Coastguard Worker continue;
462*3ac0a46fSAndroid Build Coastguard Worker }
463*3ac0a46fSAndroid Build Coastguard Worker }
464*3ac0a46fSAndroid Build Coastguard Worker auto it = std::find(items.begin(), items.end(), item);
465*3ac0a46fSAndroid Build Coastguard Worker size_t index = it != items.end() ? it - items.begin() + 1 : 0;
466*3ac0a46fSAndroid Build Coastguard Worker item = items[index % items.size()];
467*3ac0a46fSAndroid Build Coastguard Worker }
468*3ac0a46fSAndroid Build Coastguard Worker }
469*3ac0a46fSAndroid Build Coastguard Worker
470*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_ContentLayoutItem*>
CreateSpaceOrderLayoutItems()471*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderLayoutItems() {
472*3ac0a46fSAndroid Build Coastguard Worker std::vector<CXFA_ContentLayoutItem*> items;
473*3ac0a46fSAndroid Build Coastguard Worker CXFA_LayoutItemIterator sIterator(m_pPageViewLayout.Get());
474*3ac0a46fSAndroid Build Coastguard Worker CXFA_TabParam tabparam;
475*3ac0a46fSAndroid Build Coastguard Worker bool bCurrentItem = false;
476*3ac0a46fSAndroid Build Coastguard Worker bool bContentArea = false;
477*3ac0a46fSAndroid Build Coastguard Worker OrderContainer(&sIterator, nullptr, &tabparam, &bCurrentItem, &bContentArea,
478*3ac0a46fSAndroid Build Coastguard Worker false);
479*3ac0a46fSAndroid Build Coastguard Worker items.reserve(tabparam.GetChildren().size());
480*3ac0a46fSAndroid Build Coastguard Worker for (const auto& layout_item : tabparam.GetChildren())
481*3ac0a46fSAndroid Build Coastguard Worker items.push_back(layout_item);
482*3ac0a46fSAndroid Build Coastguard Worker
483*3ac0a46fSAndroid Build Coastguard Worker sIterator.Reset();
484*3ac0a46fSAndroid Build Coastguard Worker bCurrentItem = false;
485*3ac0a46fSAndroid Build Coastguard Worker bContentArea = false;
486*3ac0a46fSAndroid Build Coastguard Worker tabparam.ClearChildren();
487*3ac0a46fSAndroid Build Coastguard Worker OrderContainer(&sIterator, nullptr, &tabparam, &bCurrentItem, &bContentArea,
488*3ac0a46fSAndroid Build Coastguard Worker true);
489*3ac0a46fSAndroid Build Coastguard Worker for (const auto& layout_item : tabparam.GetChildren())
490*3ac0a46fSAndroid Build Coastguard Worker items.push_back(layout_item);
491*3ac0a46fSAndroid Build Coastguard Worker
492*3ac0a46fSAndroid Build Coastguard Worker return items;
493*3ac0a46fSAndroid Build Coastguard Worker }
494