xref: /aosp_15_r20/external/pdfium/xfa/fwl/cfwl_widgetmgr.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2014 The PDFium Authors
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_FWL_CFWL_WIDGETMGR_H_
8 #define XFA_FWL_CFWL_WIDGETMGR_H_
9 
10 #include <map>
11 
12 #include "core/fxcrt/fx_coordinates.h"
13 #include "fxjs/gc/gced_tree_node.h"
14 #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"
18 
19 class CFGAS_GEGraphics;
20 class CFWL_App;
21 class CFWL_Message;
22 class CFWL_Widget;
23 
24 class CFWL_WidgetMgr final : public cppgc::GarbageCollected<CFWL_WidgetMgr> {
25  public:
26   class AdapterIface : public cppgc::GarbageCollectedMixin {
27    public:
28     virtual ~AdapterIface() = default;
29     virtual void RepaintWidget(CFWL_Widget* pWidget) = 0;
30     virtual bool GetPopupPos(CFWL_Widget* pWidget,
31                              float fMinHeight,
32                              float fMaxHeight,
33                              const CFX_RectF& rtAnchor,
34                              CFX_RectF* pPopupRect) = 0;
35   };
36 
37   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
38   ~CFWL_WidgetMgr();
39 
40   void Trace(cppgc::Visitor* visitor) const;
41 
42   void OnProcessMessageToForm(CFWL_Message* pMessage);
43   void OnDrawWidget(CFWL_Widget* pWidget,
44                     CFGAS_GEGraphics* pGraphics,
45                     const CFX_Matrix& matrix);
46 
47   CFWL_Widget* GetParentWidget(const CFWL_Widget* pWidget) const;
48   CFWL_Widget* GetNextSiblingWidget(CFWL_Widget* pWidget) const;
49   CFWL_Widget* GetFirstChildWidget(CFWL_Widget* pWidget) const;
50 
51   void RepaintWidget(CFWL_Widget* pWidget, const CFX_RectF& pRect);
52 
53   void InsertWidget(CFWL_Widget* pParent, CFWL_Widget* pChild);
54   void RemoveWidget(CFWL_Widget* pWidget);
55 
56   CFWL_Widget* GetWidgetAtPoint(CFWL_Widget* pParent,
57                                 const CFX_PointF& point) const;
58 
59   CFWL_Widget* GetDefaultButton(CFWL_Widget* pParent) const;
60   void GetAdapterPopupPos(CFWL_Widget* pWidget,
61                           float fMinHeight,
62                           float fMaxHeight,
63                           const CFX_RectF& rtAnchor,
64                           CFX_RectF* pPopupRect) const;
65 
66  private:
67   class Item final : public GCedTreeNode<Item> {
68    public:
69     CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
70     ~Item() final;
71 
72     // GcedTreeNode:
73     void Trace(cppgc::Visitor* visitor) const override;
74 
75     cppgc::Member<CFWL_Widget> const pWidget;
76 
77    private:
78     explicit Item(CFWL_Widget* widget);
79   };
80 
81   CFWL_WidgetMgr(AdapterIface* pAdapter, CFWL_App* pApp);
82 
83   CFWL_Widget* GetPriorSiblingWidget(CFWL_Widget* pWidget) const;
84   CFWL_Widget* GetLastChildWidget(CFWL_Widget* pWidget) const;
85 
86   Item* GetWidgetMgrRootItem() const;
87   Item* GetWidgetMgrItem(const CFWL_Widget* pWidget) const;
88   Item* CreateWidgetMgrItem(CFWL_Widget* pWidget);
89 
90   void DrawChildren(CFWL_Widget* pParent,
91                     const CFX_RectF& rtClip,
92                     CFGAS_GEGraphics* pGraphics,
93                     const CFX_Matrix& mtMatrix);
94 
95   cppgc::Member<AdapterIface> const m_pAdapter;
96   cppgc::Member<CFWL_App> const m_pApp;
97   std::map<cppgc::Member<const CFWL_Widget>, cppgc::Member<Item>>
98       m_mapWidgetItem;
99 };
100 
101 #endif  // XFA_FWL_CFWL_WIDGETMGR_H_
102