• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
21 namespace pdfium {
22 
23 class CFWL_App;
24 class CFWL_Message;
25 class CFWL_Widget;
26 
27 class CFWL_WidgetMgr final : public cppgc::GarbageCollected<CFWL_WidgetMgr> {
28  public:
29   class AdapterIface : public cppgc::GarbageCollectedMixin {
30    public:
31     virtual ~AdapterIface() = default;
32     virtual void RepaintWidget(CFWL_Widget* pWidget) = 0;
33     virtual bool GetPopupPos(CFWL_Widget* pWidget,
34                              float fMinHeight,
35                              float fMaxHeight,
36                              const CFX_RectF& rtAnchor,
37                              CFX_RectF* pPopupRect) = 0;
38   };
39 
40   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
41   ~CFWL_WidgetMgr();
42 
43   void Trace(cppgc::Visitor* visitor) const;
44 
45   void OnProcessMessageToForm(CFWL_Message* pMessage);
46   void OnDrawWidget(CFWL_Widget* pWidget,
47                     CFGAS_GEGraphics* pGraphics,
48                     const CFX_Matrix& matrix);
49 
50   CFWL_Widget* GetParentWidget(const CFWL_Widget* pWidget) const;
51   CFWL_Widget* GetNextSiblingWidget(CFWL_Widget* pWidget) const;
52   CFWL_Widget* GetFirstChildWidget(CFWL_Widget* pWidget) const;
53 
54   void RepaintWidget(CFWL_Widget* pWidget, const CFX_RectF& pRect);
55 
56   void InsertWidget(CFWL_Widget* pParent, CFWL_Widget* pChild);
57   void RemoveWidget(CFWL_Widget* pWidget);
58 
59   CFWL_Widget* GetWidgetAtPoint(CFWL_Widget* pParent,
60                                 const CFX_PointF& point) const;
61 
62   CFWL_Widget* GetDefaultButton(CFWL_Widget* pParent) const;
63   void GetAdapterPopupPos(CFWL_Widget* pWidget,
64                           float fMinHeight,
65                           float fMaxHeight,
66                           const CFX_RectF& rtAnchor,
67                           CFX_RectF* pPopupRect) const;
68 
69  private:
70   class Item final : public GCedTreeNode<Item> {
71    public:
72     CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
73     ~Item() final;
74 
75     // GcedTreeNode:
76     void Trace(cppgc::Visitor* visitor) const override;
77 
78     cppgc::Member<CFWL_Widget> const pWidget;
79 
80    private:
81     explicit Item(CFWL_Widget* widget);
82   };
83 
84   CFWL_WidgetMgr(AdapterIface* pAdapter, CFWL_App* pApp);
85 
86   CFWL_Widget* GetPriorSiblingWidget(CFWL_Widget* pWidget) const;
87   CFWL_Widget* GetLastChildWidget(CFWL_Widget* pWidget) const;
88 
89   Item* GetWidgetMgrRootItem() const;
90   Item* GetWidgetMgrItem(const CFWL_Widget* pWidget) const;
91   Item* CreateWidgetMgrItem(CFWL_Widget* pWidget);
92 
93   void DrawChildren(CFWL_Widget* pParent,
94                     const CFX_RectF& rtClip,
95                     CFGAS_GEGraphics* pGraphics,
96                     const CFX_Matrix& mtMatrix);
97 
98   cppgc::Member<AdapterIface> const m_pAdapter;
99   cppgc::Member<CFWL_App> const m_pApp;
100   std::map<cppgc::Member<const CFWL_Widget>, cppgc::Member<Item>>
101       m_mapWidgetItem;
102 };
103 
104 }  // namespace pdfium
105 
106 // TODO(crbug.com/42271761): Remove.
107 using pdfium::CFWL_WidgetMgr;
108 
109 #endif  // XFA_FWL_CFWL_WIDGETMGR_H_
110