xref: /aosp_15_r20/external/pdfium/xfa/fwl/cfwl_widgetmgr.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_widgetmgr.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include "build/build_config.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/container_trace.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_app.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_message.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_notedriver.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_pushbutton.h"
16*3ac0a46fSAndroid Build Coastguard Worker 
CFWL_WidgetMgr(AdapterIface * pAdapter,CFWL_App * pApp)17*3ac0a46fSAndroid Build Coastguard Worker CFWL_WidgetMgr::CFWL_WidgetMgr(AdapterIface* pAdapter, CFWL_App* pApp)
18*3ac0a46fSAndroid Build Coastguard Worker     : m_pAdapter(pAdapter), m_pApp(pApp) {
19*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pAdapter);
20*3ac0a46fSAndroid Build Coastguard Worker   m_mapWidgetItem[nullptr] = cppgc::MakeGarbageCollected<Item>(
21*3ac0a46fSAndroid Build Coastguard Worker       pApp->GetHeap()->GetAllocationHandle(), nullptr);
22*3ac0a46fSAndroid Build Coastguard Worker }
23*3ac0a46fSAndroid Build Coastguard Worker 
24*3ac0a46fSAndroid Build Coastguard Worker CFWL_WidgetMgr::~CFWL_WidgetMgr() = default;
25*3ac0a46fSAndroid Build Coastguard Worker 
Trace(cppgc::Visitor * visitor) const26*3ac0a46fSAndroid Build Coastguard Worker void CFWL_WidgetMgr::Trace(cppgc::Visitor* visitor) const {
27*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pApp);
28*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pAdapter);
29*3ac0a46fSAndroid Build Coastguard Worker   ContainerTrace(visitor, m_mapWidgetItem);
30*3ac0a46fSAndroid Build Coastguard Worker }
31*3ac0a46fSAndroid Build Coastguard Worker 
GetParentWidget(const CFWL_Widget * pWidget) const32*3ac0a46fSAndroid Build Coastguard Worker CFWL_Widget* CFWL_WidgetMgr::GetParentWidget(const CFWL_Widget* pWidget) const {
33*3ac0a46fSAndroid Build Coastguard Worker   Item* pItem = GetWidgetMgrItem(pWidget);
34*3ac0a46fSAndroid Build Coastguard Worker   if (!pItem)
35*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
36*3ac0a46fSAndroid Build Coastguard Worker 
37*3ac0a46fSAndroid Build Coastguard Worker   Item* pParent = pItem->GetParent();
38*3ac0a46fSAndroid Build Coastguard Worker   return pParent ? pParent->pWidget : nullptr;
39*3ac0a46fSAndroid Build Coastguard Worker }
40*3ac0a46fSAndroid Build Coastguard Worker 
GetPriorSiblingWidget(CFWL_Widget * pWidget) const41*3ac0a46fSAndroid Build Coastguard Worker CFWL_Widget* CFWL_WidgetMgr::GetPriorSiblingWidget(CFWL_Widget* pWidget) const {
42*3ac0a46fSAndroid Build Coastguard Worker   Item* pItem = GetWidgetMgrItem(pWidget);
43*3ac0a46fSAndroid Build Coastguard Worker   if (!pItem)
44*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
45*3ac0a46fSAndroid Build Coastguard Worker 
46*3ac0a46fSAndroid Build Coastguard Worker   Item* pSibling = pItem->GetPrevSibling();
47*3ac0a46fSAndroid Build Coastguard Worker   return pSibling ? pSibling->pWidget : nullptr;
48*3ac0a46fSAndroid Build Coastguard Worker }
49*3ac0a46fSAndroid Build Coastguard Worker 
GetNextSiblingWidget(CFWL_Widget * pWidget) const50*3ac0a46fSAndroid Build Coastguard Worker CFWL_Widget* CFWL_WidgetMgr::GetNextSiblingWidget(CFWL_Widget* pWidget) const {
51*3ac0a46fSAndroid Build Coastguard Worker   Item* pItem = GetWidgetMgrItem(pWidget);
52*3ac0a46fSAndroid Build Coastguard Worker   if (!pItem)
53*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
54*3ac0a46fSAndroid Build Coastguard Worker 
55*3ac0a46fSAndroid Build Coastguard Worker   Item* pSibling = pItem->GetNextSibling();
56*3ac0a46fSAndroid Build Coastguard Worker   return pSibling ? pSibling->pWidget : nullptr;
57*3ac0a46fSAndroid Build Coastguard Worker }
58*3ac0a46fSAndroid Build Coastguard Worker 
GetFirstChildWidget(CFWL_Widget * pWidget) const59*3ac0a46fSAndroid Build Coastguard Worker CFWL_Widget* CFWL_WidgetMgr::GetFirstChildWidget(CFWL_Widget* pWidget) const {
60*3ac0a46fSAndroid Build Coastguard Worker   Item* pItem = GetWidgetMgrItem(pWidget);
61*3ac0a46fSAndroid Build Coastguard Worker   if (!pItem)
62*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
63*3ac0a46fSAndroid Build Coastguard Worker 
64*3ac0a46fSAndroid Build Coastguard Worker   Item* pChild = pItem->GetFirstChild();
65*3ac0a46fSAndroid Build Coastguard Worker   return pChild ? pChild->pWidget : nullptr;
66*3ac0a46fSAndroid Build Coastguard Worker }
67*3ac0a46fSAndroid Build Coastguard Worker 
GetLastChildWidget(CFWL_Widget * pWidget) const68*3ac0a46fSAndroid Build Coastguard Worker CFWL_Widget* CFWL_WidgetMgr::GetLastChildWidget(CFWL_Widget* pWidget) const {
69*3ac0a46fSAndroid Build Coastguard Worker   Item* pItem = GetWidgetMgrItem(pWidget);
70*3ac0a46fSAndroid Build Coastguard Worker   if (!pItem)
71*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
72*3ac0a46fSAndroid Build Coastguard Worker 
73*3ac0a46fSAndroid Build Coastguard Worker   Item* pChild = pItem->GetLastChild();
74*3ac0a46fSAndroid Build Coastguard Worker   return pChild ? pChild->pWidget : nullptr;
75*3ac0a46fSAndroid Build Coastguard Worker }
76*3ac0a46fSAndroid Build Coastguard Worker 
RepaintWidget(CFWL_Widget * pWidget,const CFX_RectF & rect)77*3ac0a46fSAndroid Build Coastguard Worker void CFWL_WidgetMgr::RepaintWidget(CFWL_Widget* pWidget,
78*3ac0a46fSAndroid Build Coastguard Worker                                    const CFX_RectF& rect) {
79*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* pNative = pWidget;
80*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF transformedRect = rect;
81*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* pOuter = pWidget->GetOuter();
82*3ac0a46fSAndroid Build Coastguard Worker   while (pOuter) {
83*3ac0a46fSAndroid Build Coastguard Worker     CFX_RectF rtTemp = pNative->GetWidgetRect();
84*3ac0a46fSAndroid Build Coastguard Worker     transformedRect.left += rtTemp.left;
85*3ac0a46fSAndroid Build Coastguard Worker     transformedRect.top += rtTemp.top;
86*3ac0a46fSAndroid Build Coastguard Worker     pNative = pOuter;
87*3ac0a46fSAndroid Build Coastguard Worker     pOuter = pOuter->GetOuter();
88*3ac0a46fSAndroid Build Coastguard Worker   }
89*3ac0a46fSAndroid Build Coastguard Worker   m_pAdapter->RepaintWidget(pNative);
90*3ac0a46fSAndroid Build Coastguard Worker }
91*3ac0a46fSAndroid Build Coastguard Worker 
InsertWidget(CFWL_Widget * pParent,CFWL_Widget * pChild)92*3ac0a46fSAndroid Build Coastguard Worker void CFWL_WidgetMgr::InsertWidget(CFWL_Widget* pParent, CFWL_Widget* pChild) {
93*3ac0a46fSAndroid Build Coastguard Worker   Item* pParentItem = GetWidgetMgrItem(pParent);
94*3ac0a46fSAndroid Build Coastguard Worker   if (!pParentItem) {
95*3ac0a46fSAndroid Build Coastguard Worker     pParentItem = CreateWidgetMgrItem(pParent);
96*3ac0a46fSAndroid Build Coastguard Worker     GetWidgetMgrRootItem()->AppendLastChild(pParentItem);
97*3ac0a46fSAndroid Build Coastguard Worker   }
98*3ac0a46fSAndroid Build Coastguard Worker   Item* pChildItem = GetWidgetMgrItem(pChild);
99*3ac0a46fSAndroid Build Coastguard Worker   if (!pChildItem)
100*3ac0a46fSAndroid Build Coastguard Worker     pChildItem = CreateWidgetMgrItem(pChild);
101*3ac0a46fSAndroid Build Coastguard Worker   pParentItem->AppendLastChild(pChildItem);
102*3ac0a46fSAndroid Build Coastguard Worker }
103*3ac0a46fSAndroid Build Coastguard Worker 
RemoveWidget(CFWL_Widget * pWidget)104*3ac0a46fSAndroid Build Coastguard Worker void CFWL_WidgetMgr::RemoveWidget(CFWL_Widget* pWidget) {
105*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pWidget);
106*3ac0a46fSAndroid Build Coastguard Worker   Item* pItem = GetWidgetMgrItem(pWidget);
107*3ac0a46fSAndroid Build Coastguard Worker   if (!pItem)
108*3ac0a46fSAndroid Build Coastguard Worker     return;
109*3ac0a46fSAndroid Build Coastguard Worker 
110*3ac0a46fSAndroid Build Coastguard Worker   while (pItem->GetFirstChild())
111*3ac0a46fSAndroid Build Coastguard Worker     RemoveWidget(pItem->GetFirstChild()->pWidget);
112*3ac0a46fSAndroid Build Coastguard Worker 
113*3ac0a46fSAndroid Build Coastguard Worker   pItem->RemoveSelfIfParented();
114*3ac0a46fSAndroid Build Coastguard Worker   m_mapWidgetItem.erase(pWidget);
115*3ac0a46fSAndroid Build Coastguard Worker }
116*3ac0a46fSAndroid Build Coastguard Worker 
GetWidgetAtPoint(CFWL_Widget * parent,const CFX_PointF & point) const117*3ac0a46fSAndroid Build Coastguard Worker CFWL_Widget* CFWL_WidgetMgr::GetWidgetAtPoint(CFWL_Widget* parent,
118*3ac0a46fSAndroid Build Coastguard Worker                                               const CFX_PointF& point) const {
119*3ac0a46fSAndroid Build Coastguard Worker   if (!parent)
120*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
121*3ac0a46fSAndroid Build Coastguard Worker 
122*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* child = GetLastChildWidget(parent);
123*3ac0a46fSAndroid Build Coastguard Worker   while (child) {
124*3ac0a46fSAndroid Build Coastguard Worker     if (child->IsVisible()) {
125*3ac0a46fSAndroid Build Coastguard Worker       CFX_PointF pos = parent->GetMatrix().GetInverse().Transform(point);
126*3ac0a46fSAndroid Build Coastguard Worker       CFX_RectF bounds = child->GetWidgetRect();
127*3ac0a46fSAndroid Build Coastguard Worker       if (bounds.Contains(pos)) {
128*3ac0a46fSAndroid Build Coastguard Worker         pos -= bounds.TopLeft();
129*3ac0a46fSAndroid Build Coastguard Worker         return GetWidgetAtPoint(child, pos);
130*3ac0a46fSAndroid Build Coastguard Worker       }
131*3ac0a46fSAndroid Build Coastguard Worker     }
132*3ac0a46fSAndroid Build Coastguard Worker     child = GetPriorSiblingWidget(child);
133*3ac0a46fSAndroid Build Coastguard Worker   }
134*3ac0a46fSAndroid Build Coastguard Worker   return parent;
135*3ac0a46fSAndroid Build Coastguard Worker }
136*3ac0a46fSAndroid Build Coastguard Worker 
GetDefaultButton(CFWL_Widget * pParent) const137*3ac0a46fSAndroid Build Coastguard Worker CFWL_Widget* CFWL_WidgetMgr::GetDefaultButton(CFWL_Widget* pParent) const {
138*3ac0a46fSAndroid Build Coastguard Worker   if (pParent->GetClassID() == FWL_Type::PushButton &&
139*3ac0a46fSAndroid Build Coastguard Worker       (pParent->GetStates() & FWL_STATE_PSB_Default)) {
140*3ac0a46fSAndroid Build Coastguard Worker     return pParent;
141*3ac0a46fSAndroid Build Coastguard Worker   }
142*3ac0a46fSAndroid Build Coastguard Worker 
143*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* child = GetFirstChildWidget(pParent);
144*3ac0a46fSAndroid Build Coastguard Worker   while (child) {
145*3ac0a46fSAndroid Build Coastguard Worker     if (child->GetClassID() == FWL_Type::PushButton &&
146*3ac0a46fSAndroid Build Coastguard Worker         (child->GetStates() & FWL_STATE_PSB_Default)) {
147*3ac0a46fSAndroid Build Coastguard Worker       return child;
148*3ac0a46fSAndroid Build Coastguard Worker     }
149*3ac0a46fSAndroid Build Coastguard Worker     if (CFWL_Widget* find = GetDefaultButton(child))
150*3ac0a46fSAndroid Build Coastguard Worker       return find;
151*3ac0a46fSAndroid Build Coastguard Worker 
152*3ac0a46fSAndroid Build Coastguard Worker     child = GetNextSiblingWidget(child);
153*3ac0a46fSAndroid Build Coastguard Worker   }
154*3ac0a46fSAndroid Build Coastguard Worker   return nullptr;
155*3ac0a46fSAndroid Build Coastguard Worker }
156*3ac0a46fSAndroid Build Coastguard Worker 
GetWidgetMgrRootItem() const157*3ac0a46fSAndroid Build Coastguard Worker CFWL_WidgetMgr::Item* CFWL_WidgetMgr::GetWidgetMgrRootItem() const {
158*3ac0a46fSAndroid Build Coastguard Worker   return GetWidgetMgrItem(nullptr);
159*3ac0a46fSAndroid Build Coastguard Worker }
160*3ac0a46fSAndroid Build Coastguard Worker 
GetWidgetMgrItem(const CFWL_Widget * pWidget) const161*3ac0a46fSAndroid Build Coastguard Worker CFWL_WidgetMgr::Item* CFWL_WidgetMgr::GetWidgetMgrItem(
162*3ac0a46fSAndroid Build Coastguard Worker     const CFWL_Widget* pWidget) const {
163*3ac0a46fSAndroid Build Coastguard Worker   auto it = m_mapWidgetItem.find(pWidget);
164*3ac0a46fSAndroid Build Coastguard Worker   return it != m_mapWidgetItem.end() ? it->second : nullptr;
165*3ac0a46fSAndroid Build Coastguard Worker }
166*3ac0a46fSAndroid Build Coastguard Worker 
CreateWidgetMgrItem(CFWL_Widget * pWidget)167*3ac0a46fSAndroid Build Coastguard Worker CFWL_WidgetMgr::Item* CFWL_WidgetMgr::CreateWidgetMgrItem(
168*3ac0a46fSAndroid Build Coastguard Worker     CFWL_Widget* pWidget) {
169*3ac0a46fSAndroid Build Coastguard Worker   auto* pItem = cppgc::MakeGarbageCollected<Item>(
170*3ac0a46fSAndroid Build Coastguard Worker       m_pApp->GetHeap()->GetAllocationHandle(), pWidget);
171*3ac0a46fSAndroid Build Coastguard Worker   m_mapWidgetItem[pWidget] = pItem;
172*3ac0a46fSAndroid Build Coastguard Worker   return pItem;
173*3ac0a46fSAndroid Build Coastguard Worker }
174*3ac0a46fSAndroid Build Coastguard Worker 
GetAdapterPopupPos(CFWL_Widget * pWidget,float fMinHeight,float fMaxHeight,const CFX_RectF & rtAnchor,CFX_RectF * pPopupRect) const175*3ac0a46fSAndroid Build Coastguard Worker void CFWL_WidgetMgr::GetAdapterPopupPos(CFWL_Widget* pWidget,
176*3ac0a46fSAndroid Build Coastguard Worker                                         float fMinHeight,
177*3ac0a46fSAndroid Build Coastguard Worker                                         float fMaxHeight,
178*3ac0a46fSAndroid Build Coastguard Worker                                         const CFX_RectF& rtAnchor,
179*3ac0a46fSAndroid Build Coastguard Worker                                         CFX_RectF* pPopupRect) const {
180*3ac0a46fSAndroid Build Coastguard Worker   m_pAdapter->GetPopupPos(pWidget, fMinHeight, fMaxHeight, rtAnchor,
181*3ac0a46fSAndroid Build Coastguard Worker                           pPopupRect);
182*3ac0a46fSAndroid Build Coastguard Worker }
183*3ac0a46fSAndroid Build Coastguard Worker 
OnProcessMessageToForm(CFWL_Message * pMessage)184*3ac0a46fSAndroid Build Coastguard Worker void CFWL_WidgetMgr::OnProcessMessageToForm(CFWL_Message* pMessage) {
185*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* pDstWidget = pMessage->GetDstTarget();
186*3ac0a46fSAndroid Build Coastguard Worker   if (!pDstWidget)
187*3ac0a46fSAndroid Build Coastguard Worker     return;
188*3ac0a46fSAndroid Build Coastguard Worker 
189*3ac0a46fSAndroid Build Coastguard Worker   CFWL_NoteDriver* pNoteDriver = pDstWidget->GetFWLApp()->GetNoteDriver();
190*3ac0a46fSAndroid Build Coastguard Worker   pNoteDriver->ProcessMessage(pMessage);
191*3ac0a46fSAndroid Build Coastguard Worker }
192*3ac0a46fSAndroid Build Coastguard Worker 
OnDrawWidget(CFWL_Widget * pWidget,CFGAS_GEGraphics * pGraphics,const CFX_Matrix & matrix)193*3ac0a46fSAndroid Build Coastguard Worker void CFWL_WidgetMgr::OnDrawWidget(CFWL_Widget* pWidget,
194*3ac0a46fSAndroid Build Coastguard Worker                                   CFGAS_GEGraphics* pGraphics,
195*3ac0a46fSAndroid Build Coastguard Worker                                   const CFX_Matrix& matrix) {
196*3ac0a46fSAndroid Build Coastguard Worker   if (!pWidget || !pGraphics)
197*3ac0a46fSAndroid Build Coastguard Worker     return;
198*3ac0a46fSAndroid Build Coastguard Worker 
199*3ac0a46fSAndroid Build Coastguard Worker   pWidget->GetDelegate()->OnDrawWidget(pGraphics, matrix);
200*3ac0a46fSAndroid Build Coastguard Worker 
201*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF clipBounds = pGraphics->GetClipRect();
202*3ac0a46fSAndroid Build Coastguard Worker   if (!clipBounds.IsEmpty())
203*3ac0a46fSAndroid Build Coastguard Worker     DrawChildren(pWidget, clipBounds, pGraphics, matrix);
204*3ac0a46fSAndroid Build Coastguard Worker }
205*3ac0a46fSAndroid Build Coastguard Worker 
DrawChildren(CFWL_Widget * parent,const CFX_RectF & rtClip,CFGAS_GEGraphics * pGraphics,const CFX_Matrix & mtMatrix)206*3ac0a46fSAndroid Build Coastguard Worker void CFWL_WidgetMgr::DrawChildren(CFWL_Widget* parent,
207*3ac0a46fSAndroid Build Coastguard Worker                                   const CFX_RectF& rtClip,
208*3ac0a46fSAndroid Build Coastguard Worker                                   CFGAS_GEGraphics* pGraphics,
209*3ac0a46fSAndroid Build Coastguard Worker                                   const CFX_Matrix& mtMatrix) {
210*3ac0a46fSAndroid Build Coastguard Worker   if (!parent)
211*3ac0a46fSAndroid Build Coastguard Worker     return;
212*3ac0a46fSAndroid Build Coastguard Worker 
213*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* pNextChild = GetFirstChildWidget(parent);
214*3ac0a46fSAndroid Build Coastguard Worker   while (pNextChild) {
215*3ac0a46fSAndroid Build Coastguard Worker     CFWL_Widget* child = pNextChild;
216*3ac0a46fSAndroid Build Coastguard Worker     pNextChild = GetNextSiblingWidget(child);
217*3ac0a46fSAndroid Build Coastguard Worker     if (!child->IsVisible())
218*3ac0a46fSAndroid Build Coastguard Worker       continue;
219*3ac0a46fSAndroid Build Coastguard Worker 
220*3ac0a46fSAndroid Build Coastguard Worker     CFX_RectF rtWidget = child->GetWidgetRect();
221*3ac0a46fSAndroid Build Coastguard Worker     if (rtWidget.IsEmpty())
222*3ac0a46fSAndroid Build Coastguard Worker       continue;
223*3ac0a46fSAndroid Build Coastguard Worker 
224*3ac0a46fSAndroid Build Coastguard Worker     CFX_Matrix widgetMatrix;
225*3ac0a46fSAndroid Build Coastguard Worker     CFX_RectF clipBounds(rtWidget);
226*3ac0a46fSAndroid Build Coastguard Worker     widgetMatrix.Concat(mtMatrix);
227*3ac0a46fSAndroid Build Coastguard Worker     widgetMatrix.TranslatePrepend(rtWidget.left, rtWidget.top);
228*3ac0a46fSAndroid Build Coastguard Worker 
229*3ac0a46fSAndroid Build Coastguard Worker     if (IFWL_WidgetDelegate* pDelegate = child->GetDelegate())
230*3ac0a46fSAndroid Build Coastguard Worker       pDelegate->OnDrawWidget(pGraphics, widgetMatrix);
231*3ac0a46fSAndroid Build Coastguard Worker 
232*3ac0a46fSAndroid Build Coastguard Worker     DrawChildren(child, clipBounds, pGraphics, widgetMatrix);
233*3ac0a46fSAndroid Build Coastguard Worker   }
234*3ac0a46fSAndroid Build Coastguard Worker }
235*3ac0a46fSAndroid Build Coastguard Worker 
Item(CFWL_Widget * widget)236*3ac0a46fSAndroid Build Coastguard Worker CFWL_WidgetMgr::Item::Item(CFWL_Widget* widget) : pWidget(widget) {}
237*3ac0a46fSAndroid Build Coastguard Worker 
238*3ac0a46fSAndroid Build Coastguard Worker CFWL_WidgetMgr::Item::~Item() = default;
239*3ac0a46fSAndroid Build Coastguard Worker 
Trace(cppgc::Visitor * visitor) const240*3ac0a46fSAndroid Build Coastguard Worker void CFWL_WidgetMgr::Item::Trace(cppgc::Visitor* visitor) const {
241*3ac0a46fSAndroid Build Coastguard Worker   GCedTreeNode<Item>::Trace(visitor);
242*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(pWidget);
243*3ac0a46fSAndroid Build Coastguard Worker }
244