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