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