xref: /aosp_15_r20/external/pdfium/xfa/fxfa/cxfa_ffpageview.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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(&param);
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