1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef XFA_FXFA_INCLUDE_XFA_FFPAGEVIEW_H_
8 #define XFA_FXFA_INCLUDE_XFA_FFPAGEVIEW_H_
9 
10 #include "xfa/fxfa/parser/xfa_doclayout.h"
11 
12 class CXFA_FFWidget;
13 class CXFA_FFDocView;
14 
15 class CXFA_FFPageView : public CXFA_ContainerLayoutItem {
16  public:
17   CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea);
18   ~CXFA_FFPageView() override;
19 
20   CXFA_FFDocView* GetDocView() const;
21   void GetPageViewRect(CFX_RectF& rtPage) const;
22   void GetDisplayMatrix(CFX_Matrix& mt,
23                         const CFX_Rect& rtDisp,
24                         int32_t iRotate) const;
25   IXFA_WidgetIterator* CreateWidgetIterator(
26       uint32_t dwTraverseWay = XFA_TRAVERSEWAY_Form,
27       uint32_t dwWidgetFilter = XFA_WidgetStatus_Visible |
28                                 XFA_WidgetStatus_Viewable);
29 
30  protected:
31   CXFA_FFDocView* const m_pDocView;
32 };
33 
34 typedef CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
35                                   CXFA_TraverseStrategy_LayoutItem>
36     CXFA_LayoutItemIterator;
37 
38 class CXFA_FFPageWidgetIterator : public IXFA_WidgetIterator {
39  public:
40   CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, uint32_t dwFilter);
41   ~CXFA_FFPageWidgetIterator() override;
42 
43   void Reset() override;
44   CXFA_FFWidget* MoveToFirst() override;
45   CXFA_FFWidget* MoveToLast() override;
46   CXFA_FFWidget* MoveToNext() override;
47   CXFA_FFWidget* MoveToPrevious() override;
48   CXFA_FFWidget* GetCurrentWidget() override;
49   FX_BOOL SetCurrentWidget(CXFA_FFWidget* hWidget) override;
50 
51  protected:
52   CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
53 
54   CXFA_FFPageView* m_pPageView;
55   CXFA_FFWidget* m_hCurWidget;
56   uint32_t m_dwFilter;
57   FX_BOOL m_bIgnorerelevant;
58   CXFA_LayoutItemIterator m_sIterator;
59 };
60 typedef CFX_ArrayTemplate<CXFA_FFWidget*> CXFA_WidgetArray;
61 
62 class CXFA_TabParam {
63  public:
64   CXFA_TabParam();
65   ~CXFA_TabParam();
66 
67   CXFA_FFWidget* m_pWidget;
68   CXFA_WidgetArray m_Children;
69 };
70 
71 class CXFA_FFTabOrderPageWidgetIterator : public IXFA_WidgetIterator {
72  public:
73   CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView* pPageView,
74                                     uint32_t dwFilter);
75   ~CXFA_FFTabOrderPageWidgetIterator() override;
76 
77   void Reset() override;
78   CXFA_FFWidget* MoveToFirst() override;
79   CXFA_FFWidget* MoveToLast() override;
80   CXFA_FFWidget* MoveToNext() override;
81   CXFA_FFWidget* MoveToPrevious() override;
82   CXFA_FFWidget* GetCurrentWidget() override;
83   FX_BOOL SetCurrentWidget(CXFA_FFWidget* hWidget) override;
84 
85  protected:
86   CXFA_FFWidget* GetTraverseWidget(CXFA_FFWidget* pWidget);
87   CXFA_FFWidget* FindWidgetByName(const CFX_WideString& wsWidgetName,
88                                   CXFA_FFWidget* pRefWidget);
89   void CreateTabOrderWidgetArray();
90   void CreateSpaceOrderWidgetArray(CXFA_WidgetArray& WidgetArray);
91   CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
92   void OrderContainer(CXFA_LayoutItemIterator* sIterator,
93                       CXFA_LayoutItem* pContainerItem,
94                       CXFA_TabParam* pContainer,
95                       FX_BOOL& bCurrentItem,
96                       FX_BOOL& bContentArea,
97                       FX_BOOL bMarsterPage = FALSE);
98 
99   CXFA_WidgetArray m_TabOrderWidgetArray;
100   CXFA_FFPageView* m_pPageView;
101   uint32_t m_dwFilter;
102   int32_t m_iCurWidget;
103   FX_BOOL m_bIgnorerelevant;
104 };
105 
106 #endif  // XFA_FXFA_INCLUDE_XFA_FFPAGEVIEW_H_
107