blob: 32dd1d94ddc13d879776d174fd63688a1ae9854d [file] [log] [blame]
K. Moon832a6942022-10-31 20:11:31 +00001// Copyright 2014 The PDFium Authors
Dan Sinclair1770c022016-03-14 14:14:16 -04002// 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
Dan Sinclair80c48782017-03-23 12:11:20 -04007#ifndef XFA_FXFA_CXFA_FFPAGEVIEW_H_
8#define XFA_FXFA_CXFA_FFPAGEVIEW_H_
Dan Sinclair1770c022016-03-14 14:14:16 -04009
tsepeza0b2d232017-01-23 11:32:36 -080010#include <vector>
11
Tom Sepez6f9e9f62021-08-11 17:01:53 +000012#include "core/fxcrt/mask.h"
Tom Sepez1e151c62021-11-22 23:46:09 +000013#include "core/fxcrt/widestring.h"
Tom Sepez017cbc62020-08-18 23:25:17 +000014#include "fxjs/gc/heap.h"
15#include "v8/include/cppgc/garbage-collected.h"
16#include "v8/include/cppgc/member.h"
17#include "v8/include/cppgc/visitor.h"
Tom Sepez3d4afc92021-06-09 01:03:59 +000018#include "xfa/fxfa/cxfa_ffwidget.h"
Tom Sepez8ec3cb12019-02-06 17:47:32 +000019#include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
20#include "xfa/fxfa/layout/cxfa_traversestrategy_layoutitem.h"
Tom Sepez685d24f2019-04-09 21:11:56 +000021#include "xfa/fxfa/layout/cxfa_viewlayoutitem.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040022
23class CXFA_FFWidget;
24class CXFA_FFDocView;
thestig9f3dbbc2016-04-13 13:18:21 -070025
Tom Sepez6fda8072020-09-08 23:47:45 +000026class CXFA_FFPageView final : public cppgc::GarbageCollected<CXFA_FFPageView> {
Dan Sinclair1770c022016-03-14 14:14:16 -040027 public:
Tom Sepez017cbc62020-08-18 23:25:17 +000028 CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
Tom Sepez0fb55ab2019-04-22 22:02:35 +000029 ~CXFA_FFPageView();
30
Tom Sepez017cbc62020-08-18 23:25:17 +000031 void Trace(cppgc::Visitor* visitor) const;
32
33 CXFA_ViewLayoutItem* GetLayoutItem() const { return m_pLayoutItem; }
Tom Sepez0fb55ab2019-04-22 22:02:35 +000034 void SetLayoutItem(CXFA_ViewLayoutItem* pItem) { m_pLayoutItem = pItem; }
Dan Sinclair1770c022016-03-14 14:14:16 -040035
thestig9f3dbbc2016-04-13 13:18:21 -070036 CXFA_FFDocView* GetDocView() const;
Dan Sinclair1b08df12017-02-09 09:17:20 -050037 CFX_RectF GetPageViewRect() const;
Lei Zhang7d865b62018-04-10 19:29:25 +000038 CFX_Matrix GetDisplayMatrix(const FX_RECT& rtDisp, int32_t iRotate) const;
Tom Sepezc2564692020-01-09 23:34:16 +000039
Stefan Zager359cbde2023-03-07 17:10:23 +000040 // This always returns a non-null iterator from the gc heap.
Tom Sepez3d4afc92021-06-09 01:03:59 +000041 CXFA_FFWidget::IteratorIface* CreateGCedTraverseWidgetIterator(
Tom Sepez6f9e9f62021-08-11 17:01:53 +000042 Mask<XFA_WidgetStatus> dwWidgetFilter);
Dan Sinclair1770c022016-03-14 14:14:16 -040043
Tom Sepezcb798252018-09-17 18:25:32 +000044 private:
Tom Sepez017cbc62020-08-18 23:25:17 +000045 CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea);
46
47 cppgc::Member<CXFA_Node> const m_pPageArea;
48 cppgc::Member<CXFA_FFDocView> const m_pDocView;
49 cppgc::Member<CXFA_ViewLayoutItem> m_pLayoutItem;
Dan Sinclair1770c022016-03-14 14:14:16 -040050};
thestig9f3dbbc2016-04-13 13:18:21 -070051
Stefan Zager359cbde2023-03-07 17:10:23 +000052class CXFA_FFPageWidgetIterator final : public CXFA_FFWidget::IteratorIface {
53 CPPGC_STACK_ALLOCATED();
54
Dan Sinclair1770c022016-03-14 14:14:16 -040055 public:
Stefan Zager359cbde2023-03-07 17:10:23 +000056 CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView,
57 Mask<XFA_WidgetStatus> dwFilter);
tsepezcc4d6d82016-05-16 13:21:03 -070058 ~CXFA_FFPageWidgetIterator() override;
dsinclairdf4bc592016-03-31 20:34:43 -070059
Tom Sepez3d4afc92021-06-09 01:03:59 +000060 // CXFA_FFWidget::IteratorIface:
dsinclairdf4bc592016-03-31 20:34:43 -070061 CXFA_FFWidget* MoveToFirst() override;
62 CXFA_FFWidget* MoveToLast() override;
63 CXFA_FFWidget* MoveToNext() override;
64 CXFA_FFWidget* MoveToPrevious() override;
65 CXFA_FFWidget* GetCurrentWidget() override;
tsepezd19e9122016-11-02 15:43:18 -070066 bool SetCurrentWidget(CXFA_FFWidget* hWidget) override;
Dan Sinclair1770c022016-03-14 14:14:16 -040067
Tom Sepezcb798252018-09-17 18:25:32 +000068 private:
Lei Zhangccb8ca62020-06-02 00:28:38 +000069 CXFA_LayoutItemIterator m_sIterator;
Tom Sepez6f9e9f62021-08-11 17:01:53 +000070 const Mask<XFA_WidgetStatus> m_dwFilter;
Lei Zhang78b7e032020-03-11 17:46:53 +000071 const bool m_bIgnoreRelevant;
Dan Sinclair1770c022016-03-14 14:14:16 -040072};
weili47bcd4c2016-06-16 08:00:06 -070073
Tom Sepez017cbc62020-08-18 23:25:17 +000074class CXFA_FFTabOrderPageWidgetIterator final
Tom Sepez1249e092021-04-07 20:02:16 +000075 : public cppgc::GarbageCollected<CXFA_FFTabOrderPageWidgetIterator>,
Tom Sepez3d4afc92021-06-09 01:03:59 +000076 public CXFA_FFWidget::IteratorIface {
Dan Sinclair1770c022016-03-14 14:14:16 -040077 public:
Tom Sepez017cbc62020-08-18 23:25:17 +000078 CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
tsepezcc4d6d82016-05-16 13:21:03 -070079 ~CXFA_FFTabOrderPageWidgetIterator() override;
Dan Sinclair1770c022016-03-14 14:14:16 -040080
Tom Sepez017cbc62020-08-18 23:25:17 +000081 void Trace(cppgc::Visitor* visitor) const;
82
Tom Sepez3d4afc92021-06-09 01:03:59 +000083 // CXFA_FFWidget::IteratorIface:
dsinclairdf4bc592016-03-31 20:34:43 -070084 CXFA_FFWidget* MoveToFirst() override;
85 CXFA_FFWidget* MoveToLast() override;
86 CXFA_FFWidget* MoveToNext() override;
87 CXFA_FFWidget* MoveToPrevious() override;
88 CXFA_FFWidget* GetCurrentWidget() override;
tsepezd19e9122016-11-02 15:43:18 -070089 bool SetCurrentWidget(CXFA_FFWidget* hWidget) override;
Dan Sinclair1770c022016-03-14 14:14:16 -040090
Tom Sepezcb798252018-09-17 18:25:32 +000091 private:
Tom Sepez017cbc62020-08-18 23:25:17 +000092 CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView* pPageView,
Tom Sepez6f9e9f62021-08-11 17:01:53 +000093 Mask<XFA_WidgetStatus> dwFilter);
Tom Sepez017cbc62020-08-18 23:25:17 +000094
Dan Sinclair1770c022016-03-14 14:14:16 -040095 CXFA_FFWidget* GetTraverseWidget(CXFA_FFWidget* pWidget);
Ryan Harrison275e2602017-09-18 14:23:18 -040096 CXFA_FFWidget* FindWidgetByName(const WideString& wsWidgetName,
Dan Sinclair1770c022016-03-14 14:14:16 -040097 CXFA_FFWidget* pRefWidget);
98 void CreateTabOrderWidgetArray();
Tom Sepez017cbc62020-08-18 23:25:17 +000099 std::vector<CXFA_ContentLayoutItem*> CreateSpaceOrderLayoutItems();
dsinclairdf4bc592016-03-31 20:34:43 -0700100
Tom Sepez017cbc62020-08-18 23:25:17 +0000101 cppgc::Member<CXFA_ViewLayoutItem> const m_pPageViewLayout;
102 std::vector<cppgc::Member<CXFA_ContentLayoutItem>> m_TabOrderWidgetArray;
Tom Sepez6f9e9f62021-08-11 17:01:53 +0000103 const Mask<XFA_WidgetStatus> m_dwFilter;
Lei Zhang78b7e032020-03-11 17:46:53 +0000104 int32_t m_iCurWidget = -1;
105 const bool m_bIgnoreRelevant;
Dan Sinclair1770c022016-03-14 14:14:16 -0400106};
107
Dan Sinclair80c48782017-03-23 12:11:20 -0400108#endif // XFA_FXFA_CXFA_FFPAGEVIEW_H_