xref: /aosp_15_r20/external/pdfium/xfa/fwl/cfwl_notedriver.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_notedriver.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
10*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
11*3ac0a46fSAndroid Build Coastguard Worker 
12*3ac0a46fSAndroid Build Coastguard Worker #include "build/build_config.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_extension.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/container_trace.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_app.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_event.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_messagekey.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_messagekillfocus.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_messagemouse.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_messagemousewheel.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_messagesetfocus.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_widgetmgr.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/fwl_widgetdef.h"
24*3ac0a46fSAndroid Build Coastguard Worker 
25*3ac0a46fSAndroid Build Coastguard Worker namespace {
26*3ac0a46fSAndroid Build Coastguard Worker 
27*3ac0a46fSAndroid Build Coastguard Worker uint64_t g_next_listener_key = 1;
28*3ac0a46fSAndroid Build Coastguard Worker 
29*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
30*3ac0a46fSAndroid Build Coastguard Worker 
CFWL_NoteDriver(CFWL_App * pApp)31*3ac0a46fSAndroid Build Coastguard Worker CFWL_NoteDriver::CFWL_NoteDriver(CFWL_App* pApp) : m_pApp(pApp) {}
32*3ac0a46fSAndroid Build Coastguard Worker 
33*3ac0a46fSAndroid Build Coastguard Worker CFWL_NoteDriver::~CFWL_NoteDriver() = default;
34*3ac0a46fSAndroid Build Coastguard Worker 
Trace(cppgc::Visitor * visitor) const35*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::Trace(cppgc::Visitor* visitor) const {
36*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pApp);
37*3ac0a46fSAndroid Build Coastguard Worker   ContainerTrace(visitor, m_eventTargets);
38*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pHover);
39*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pFocus);
40*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pGrab);
41*3ac0a46fSAndroid Build Coastguard Worker }
42*3ac0a46fSAndroid Build Coastguard Worker 
SendEvent(CFWL_Event * pNote)43*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::SendEvent(CFWL_Event* pNote) {
44*3ac0a46fSAndroid Build Coastguard Worker   for (const auto& pair : m_eventTargets) {
45*3ac0a46fSAndroid Build Coastguard Worker     if (pair.second->IsValid())
46*3ac0a46fSAndroid Build Coastguard Worker       pair.second->ProcessEvent(pNote);
47*3ac0a46fSAndroid Build Coastguard Worker   }
48*3ac0a46fSAndroid Build Coastguard Worker }
49*3ac0a46fSAndroid Build Coastguard Worker 
RegisterEventTarget(CFWL_Widget * pListener,CFWL_Widget * pEventSource)50*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::RegisterEventTarget(CFWL_Widget* pListener,
51*3ac0a46fSAndroid Build Coastguard Worker                                           CFWL_Widget* pEventSource) {
52*3ac0a46fSAndroid Build Coastguard Worker   uint64_t key = pListener->GetEventKey();
53*3ac0a46fSAndroid Build Coastguard Worker   if (key == 0) {
54*3ac0a46fSAndroid Build Coastguard Worker     key = g_next_listener_key++;
55*3ac0a46fSAndroid Build Coastguard Worker     pListener->SetEventKey(key);
56*3ac0a46fSAndroid Build Coastguard Worker   }
57*3ac0a46fSAndroid Build Coastguard Worker   if (!m_eventTargets[key]) {
58*3ac0a46fSAndroid Build Coastguard Worker     m_eventTargets[key] = cppgc::MakeGarbageCollected<Target>(
59*3ac0a46fSAndroid Build Coastguard Worker         m_pApp->GetHeap()->GetAllocationHandle(), pListener);
60*3ac0a46fSAndroid Build Coastguard Worker   }
61*3ac0a46fSAndroid Build Coastguard Worker   m_eventTargets[key]->SetEventSource(pEventSource);
62*3ac0a46fSAndroid Build Coastguard Worker }
63*3ac0a46fSAndroid Build Coastguard Worker 
UnregisterEventTarget(CFWL_Widget * pListener)64*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::UnregisterEventTarget(CFWL_Widget* pListener) {
65*3ac0a46fSAndroid Build Coastguard Worker   uint64_t key = pListener->GetEventKey();
66*3ac0a46fSAndroid Build Coastguard Worker   if (key == 0)
67*3ac0a46fSAndroid Build Coastguard Worker     return;
68*3ac0a46fSAndroid Build Coastguard Worker 
69*3ac0a46fSAndroid Build Coastguard Worker   auto it = m_eventTargets.find(key);
70*3ac0a46fSAndroid Build Coastguard Worker   if (it != m_eventTargets.end())
71*3ac0a46fSAndroid Build Coastguard Worker     it->second->Invalidate();
72*3ac0a46fSAndroid Build Coastguard Worker }
73*3ac0a46fSAndroid Build Coastguard Worker 
NotifyTargetHide(CFWL_Widget * pNoteTarget)74*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::NotifyTargetHide(CFWL_Widget* pNoteTarget) {
75*3ac0a46fSAndroid Build Coastguard Worker   if (m_pFocus == pNoteTarget)
76*3ac0a46fSAndroid Build Coastguard Worker     m_pFocus = nullptr;
77*3ac0a46fSAndroid Build Coastguard Worker   if (m_pHover == pNoteTarget)
78*3ac0a46fSAndroid Build Coastguard Worker     m_pHover = nullptr;
79*3ac0a46fSAndroid Build Coastguard Worker   if (m_pGrab == pNoteTarget)
80*3ac0a46fSAndroid Build Coastguard Worker     m_pGrab = nullptr;
81*3ac0a46fSAndroid Build Coastguard Worker }
82*3ac0a46fSAndroid Build Coastguard Worker 
NotifyTargetDestroy(CFWL_Widget * pNoteTarget)83*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::NotifyTargetDestroy(CFWL_Widget* pNoteTarget) {
84*3ac0a46fSAndroid Build Coastguard Worker   if (m_pFocus == pNoteTarget)
85*3ac0a46fSAndroid Build Coastguard Worker     m_pFocus = nullptr;
86*3ac0a46fSAndroid Build Coastguard Worker   if (m_pHover == pNoteTarget)
87*3ac0a46fSAndroid Build Coastguard Worker     m_pHover = nullptr;
88*3ac0a46fSAndroid Build Coastguard Worker   if (m_pGrab == pNoteTarget)
89*3ac0a46fSAndroid Build Coastguard Worker     m_pGrab = nullptr;
90*3ac0a46fSAndroid Build Coastguard Worker 
91*3ac0a46fSAndroid Build Coastguard Worker   UnregisterEventTarget(pNoteTarget);
92*3ac0a46fSAndroid Build Coastguard Worker }
93*3ac0a46fSAndroid Build Coastguard Worker 
ProcessMessage(CFWL_Message * pMessage)94*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::ProcessMessage(CFWL_Message* pMessage) {
95*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* pMessageForm = pMessage->GetDstTarget();
96*3ac0a46fSAndroid Build Coastguard Worker   if (!pMessageForm)
97*3ac0a46fSAndroid Build Coastguard Worker     return;
98*3ac0a46fSAndroid Build Coastguard Worker 
99*3ac0a46fSAndroid Build Coastguard Worker   if (!DispatchMessage(pMessage, pMessageForm))
100*3ac0a46fSAndroid Build Coastguard Worker     return;
101*3ac0a46fSAndroid Build Coastguard Worker 
102*3ac0a46fSAndroid Build Coastguard Worker   if (pMessage->GetType() == CFWL_Message::Type::kMouse)
103*3ac0a46fSAndroid Build Coastguard Worker     MouseSecondary(pMessage);
104*3ac0a46fSAndroid Build Coastguard Worker }
105*3ac0a46fSAndroid Build Coastguard Worker 
DispatchMessage(CFWL_Message * pMessage,CFWL_Widget * pMessageForm)106*3ac0a46fSAndroid Build Coastguard Worker bool CFWL_NoteDriver::DispatchMessage(CFWL_Message* pMessage,
107*3ac0a46fSAndroid Build Coastguard Worker                                       CFWL_Widget* pMessageForm) {
108*3ac0a46fSAndroid Build Coastguard Worker   switch (pMessage->GetType()) {
109*3ac0a46fSAndroid Build Coastguard Worker     case CFWL_Message::Type::kSetFocus: {
110*3ac0a46fSAndroid Build Coastguard Worker       if (!DoSetFocus(pMessage, pMessageForm))
111*3ac0a46fSAndroid Build Coastguard Worker         return false;
112*3ac0a46fSAndroid Build Coastguard Worker       break;
113*3ac0a46fSAndroid Build Coastguard Worker     }
114*3ac0a46fSAndroid Build Coastguard Worker     case CFWL_Message::Type::kKillFocus: {
115*3ac0a46fSAndroid Build Coastguard Worker       if (!DoKillFocus(pMessage, pMessageForm))
116*3ac0a46fSAndroid Build Coastguard Worker         return false;
117*3ac0a46fSAndroid Build Coastguard Worker       break;
118*3ac0a46fSAndroid Build Coastguard Worker     }
119*3ac0a46fSAndroid Build Coastguard Worker     case CFWL_Message::Type::kKey: {
120*3ac0a46fSAndroid Build Coastguard Worker       if (!DoKey(pMessage, pMessageForm))
121*3ac0a46fSAndroid Build Coastguard Worker         return false;
122*3ac0a46fSAndroid Build Coastguard Worker       break;
123*3ac0a46fSAndroid Build Coastguard Worker     }
124*3ac0a46fSAndroid Build Coastguard Worker     case CFWL_Message::Type::kMouse: {
125*3ac0a46fSAndroid Build Coastguard Worker       if (!DoMouse(pMessage, pMessageForm))
126*3ac0a46fSAndroid Build Coastguard Worker         return false;
127*3ac0a46fSAndroid Build Coastguard Worker       break;
128*3ac0a46fSAndroid Build Coastguard Worker     }
129*3ac0a46fSAndroid Build Coastguard Worker     case CFWL_Message::Type::kMouseWheel: {
130*3ac0a46fSAndroid Build Coastguard Worker       if (!DoWheel(pMessage, pMessageForm))
131*3ac0a46fSAndroid Build Coastguard Worker         return false;
132*3ac0a46fSAndroid Build Coastguard Worker       break;
133*3ac0a46fSAndroid Build Coastguard Worker     }
134*3ac0a46fSAndroid Build Coastguard Worker   }
135*3ac0a46fSAndroid Build Coastguard Worker   IFWL_WidgetDelegate* pDelegate = pMessage->GetDstTarget()->GetDelegate();
136*3ac0a46fSAndroid Build Coastguard Worker   if (pDelegate)
137*3ac0a46fSAndroid Build Coastguard Worker     pDelegate->OnProcessMessage(pMessage);
138*3ac0a46fSAndroid Build Coastguard Worker 
139*3ac0a46fSAndroid Build Coastguard Worker   return true;
140*3ac0a46fSAndroid Build Coastguard Worker }
141*3ac0a46fSAndroid Build Coastguard Worker 
DoSetFocus(CFWL_Message * pMessage,CFWL_Widget * pMessageForm)142*3ac0a46fSAndroid Build Coastguard Worker bool CFWL_NoteDriver::DoSetFocus(CFWL_Message* pMessage,
143*3ac0a46fSAndroid Build Coastguard Worker                                  CFWL_Widget* pMessageForm) {
144*3ac0a46fSAndroid Build Coastguard Worker   m_pFocus = pMessage->GetDstTarget();
145*3ac0a46fSAndroid Build Coastguard Worker   return true;
146*3ac0a46fSAndroid Build Coastguard Worker }
147*3ac0a46fSAndroid Build Coastguard Worker 
DoKillFocus(CFWL_Message * pMessage,CFWL_Widget * pMessageForm)148*3ac0a46fSAndroid Build Coastguard Worker bool CFWL_NoteDriver::DoKillFocus(CFWL_Message* pMessage,
149*3ac0a46fSAndroid Build Coastguard Worker                                   CFWL_Widget* pMessageForm) {
150*3ac0a46fSAndroid Build Coastguard Worker   if (m_pFocus == pMessage->GetDstTarget())
151*3ac0a46fSAndroid Build Coastguard Worker     m_pFocus = nullptr;
152*3ac0a46fSAndroid Build Coastguard Worker   return true;
153*3ac0a46fSAndroid Build Coastguard Worker }
154*3ac0a46fSAndroid Build Coastguard Worker 
DoKey(CFWL_Message * pMessage,CFWL_Widget * pMessageForm)155*3ac0a46fSAndroid Build Coastguard Worker bool CFWL_NoteDriver::DoKey(CFWL_Message* pMessage, CFWL_Widget* pMessageForm) {
156*3ac0a46fSAndroid Build Coastguard Worker   CFWL_MessageKey* pMsg = static_cast<CFWL_MessageKey*>(pMessage);
157*3ac0a46fSAndroid Build Coastguard Worker #if !BUILDFLAG(IS_APPLE)
158*3ac0a46fSAndroid Build Coastguard Worker   if (pMsg->m_dwCmd == CFWL_MessageKey::KeyCommand::kKeyDown &&
159*3ac0a46fSAndroid Build Coastguard Worker       pMsg->m_dwKeyCodeOrChar == XFA_FWL_VKEY_Tab) {
160*3ac0a46fSAndroid Build Coastguard Worker     return true;
161*3ac0a46fSAndroid Build Coastguard Worker   }
162*3ac0a46fSAndroid Build Coastguard Worker #endif
163*3ac0a46fSAndroid Build Coastguard Worker 
164*3ac0a46fSAndroid Build Coastguard Worker   if (m_pFocus) {
165*3ac0a46fSAndroid Build Coastguard Worker     pMsg->SetDstTarget(m_pFocus.Get());
166*3ac0a46fSAndroid Build Coastguard Worker     return true;
167*3ac0a46fSAndroid Build Coastguard Worker   }
168*3ac0a46fSAndroid Build Coastguard Worker 
169*3ac0a46fSAndroid Build Coastguard Worker   if (pMsg->m_dwCmd == CFWL_MessageKey::KeyCommand::kKeyDown &&
170*3ac0a46fSAndroid Build Coastguard Worker       pMsg->m_dwKeyCodeOrChar == XFA_FWL_VKEY_Return) {
171*3ac0a46fSAndroid Build Coastguard Worker     CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetFWLApp()->GetWidgetMgr();
172*3ac0a46fSAndroid Build Coastguard Worker     CFWL_Widget* pDefButton = pWidgetMgr->GetDefaultButton(pMessageForm);
173*3ac0a46fSAndroid Build Coastguard Worker     if (pDefButton) {
174*3ac0a46fSAndroid Build Coastguard Worker       pMsg->SetDstTarget(pDefButton);
175*3ac0a46fSAndroid Build Coastguard Worker       return true;
176*3ac0a46fSAndroid Build Coastguard Worker     }
177*3ac0a46fSAndroid Build Coastguard Worker   }
178*3ac0a46fSAndroid Build Coastguard Worker   return false;
179*3ac0a46fSAndroid Build Coastguard Worker }
180*3ac0a46fSAndroid Build Coastguard Worker 
DoMouse(CFWL_Message * pMessage,CFWL_Widget * pMessageForm)181*3ac0a46fSAndroid Build Coastguard Worker bool CFWL_NoteDriver::DoMouse(CFWL_Message* pMessage,
182*3ac0a46fSAndroid Build Coastguard Worker                               CFWL_Widget* pMessageForm) {
183*3ac0a46fSAndroid Build Coastguard Worker   CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage);
184*3ac0a46fSAndroid Build Coastguard Worker   if (pMsg->m_dwCmd == CFWL_MessageMouse::MouseCommand::kLeave ||
185*3ac0a46fSAndroid Build Coastguard Worker       pMsg->m_dwCmd == CFWL_MessageMouse::MouseCommand::kHover ||
186*3ac0a46fSAndroid Build Coastguard Worker       pMsg->m_dwCmd == CFWL_MessageMouse::MouseCommand::kEnter) {
187*3ac0a46fSAndroid Build Coastguard Worker     return !!pMsg->GetDstTarget();
188*3ac0a46fSAndroid Build Coastguard Worker   }
189*3ac0a46fSAndroid Build Coastguard Worker   if (pMsg->GetDstTarget() != pMessageForm)
190*3ac0a46fSAndroid Build Coastguard Worker     pMsg->m_pos = pMsg->GetDstTarget()->TransformTo(pMessageForm, pMsg->m_pos);
191*3ac0a46fSAndroid Build Coastguard Worker   if (!DoMouseEx(pMsg, pMessageForm))
192*3ac0a46fSAndroid Build Coastguard Worker     pMsg->SetDstTarget(pMessageForm);
193*3ac0a46fSAndroid Build Coastguard Worker   return true;
194*3ac0a46fSAndroid Build Coastguard Worker }
195*3ac0a46fSAndroid Build Coastguard Worker 
DoWheel(CFWL_Message * pMessage,CFWL_Widget * pMessageForm)196*3ac0a46fSAndroid Build Coastguard Worker bool CFWL_NoteDriver::DoWheel(CFWL_Message* pMessage,
197*3ac0a46fSAndroid Build Coastguard Worker                               CFWL_Widget* pMessageForm) {
198*3ac0a46fSAndroid Build Coastguard Worker   CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetFWLApp()->GetWidgetMgr();
199*3ac0a46fSAndroid Build Coastguard Worker   CFWL_MessageMouseWheel* pMsg = static_cast<CFWL_MessageMouseWheel*>(pMessage);
200*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* pDst = pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->pos());
201*3ac0a46fSAndroid Build Coastguard Worker   if (!pDst)
202*3ac0a46fSAndroid Build Coastguard Worker     return false;
203*3ac0a46fSAndroid Build Coastguard Worker 
204*3ac0a46fSAndroid Build Coastguard Worker   pMsg->set_pos(pMessageForm->TransformTo(pDst, pMsg->pos()));
205*3ac0a46fSAndroid Build Coastguard Worker   pMsg->SetDstTarget(pDst);
206*3ac0a46fSAndroid Build Coastguard Worker   return true;
207*3ac0a46fSAndroid Build Coastguard Worker }
208*3ac0a46fSAndroid Build Coastguard Worker 
DoMouseEx(CFWL_Message * pMessage,CFWL_Widget * pMessageForm)209*3ac0a46fSAndroid Build Coastguard Worker bool CFWL_NoteDriver::DoMouseEx(CFWL_Message* pMessage,
210*3ac0a46fSAndroid Build Coastguard Worker                                 CFWL_Widget* pMessageForm) {
211*3ac0a46fSAndroid Build Coastguard Worker   CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetFWLApp()->GetWidgetMgr();
212*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* pTarget = nullptr;
213*3ac0a46fSAndroid Build Coastguard Worker   if (m_pGrab)
214*3ac0a46fSAndroid Build Coastguard Worker     pTarget = m_pGrab.Get();
215*3ac0a46fSAndroid Build Coastguard Worker 
216*3ac0a46fSAndroid Build Coastguard Worker   CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage);
217*3ac0a46fSAndroid Build Coastguard Worker   if (!pTarget)
218*3ac0a46fSAndroid Build Coastguard Worker     pTarget = pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_pos);
219*3ac0a46fSAndroid Build Coastguard Worker   if (!pTarget)
220*3ac0a46fSAndroid Build Coastguard Worker     return false;
221*3ac0a46fSAndroid Build Coastguard Worker   if (pTarget && pMessageForm != pTarget)
222*3ac0a46fSAndroid Build Coastguard Worker     pMsg->m_pos = pMessageForm->TransformTo(pTarget, pMsg->m_pos);
223*3ac0a46fSAndroid Build Coastguard Worker 
224*3ac0a46fSAndroid Build Coastguard Worker   pMsg->SetDstTarget(pTarget);
225*3ac0a46fSAndroid Build Coastguard Worker   return true;
226*3ac0a46fSAndroid Build Coastguard Worker }
227*3ac0a46fSAndroid Build Coastguard Worker 
MouseSecondary(CFWL_Message * pMessage)228*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::MouseSecondary(CFWL_Message* pMessage) {
229*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Widget* pTarget = pMessage->GetDstTarget();
230*3ac0a46fSAndroid Build Coastguard Worker   if (pTarget == m_pHover)
231*3ac0a46fSAndroid Build Coastguard Worker     return;
232*3ac0a46fSAndroid Build Coastguard Worker 
233*3ac0a46fSAndroid Build Coastguard Worker   CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage);
234*3ac0a46fSAndroid Build Coastguard Worker   if (m_pHover) {
235*3ac0a46fSAndroid Build Coastguard Worker     CFWL_MessageMouse msLeave(
236*3ac0a46fSAndroid Build Coastguard Worker         m_pHover.Get(), CFWL_MessageMouse::MouseCommand::kLeave,
237*3ac0a46fSAndroid Build Coastguard Worker         Mask<XFA_FWL_KeyFlag>(),
238*3ac0a46fSAndroid Build Coastguard Worker         pTarget->TransformTo(m_pHover.Get(), pMsg->m_pos));
239*3ac0a46fSAndroid Build Coastguard Worker     DispatchMessage(&msLeave, nullptr);
240*3ac0a46fSAndroid Build Coastguard Worker   }
241*3ac0a46fSAndroid Build Coastguard Worker   if (pTarget->GetClassID() == FWL_Type::Form) {
242*3ac0a46fSAndroid Build Coastguard Worker     m_pHover = nullptr;
243*3ac0a46fSAndroid Build Coastguard Worker     return;
244*3ac0a46fSAndroid Build Coastguard Worker   }
245*3ac0a46fSAndroid Build Coastguard Worker   m_pHover = pTarget;
246*3ac0a46fSAndroid Build Coastguard Worker 
247*3ac0a46fSAndroid Build Coastguard Worker   CFWL_MessageMouse msHover(pTarget, CFWL_MessageMouse::MouseCommand::kHover,
248*3ac0a46fSAndroid Build Coastguard Worker                             Mask<XFA_FWL_KeyFlag>(), pMsg->m_pos);
249*3ac0a46fSAndroid Build Coastguard Worker   DispatchMessage(&msHover, nullptr);
250*3ac0a46fSAndroid Build Coastguard Worker }
251*3ac0a46fSAndroid Build Coastguard Worker 
Target(CFWL_Widget * pListener)252*3ac0a46fSAndroid Build Coastguard Worker CFWL_NoteDriver::Target::Target(CFWL_Widget* pListener)
253*3ac0a46fSAndroid Build Coastguard Worker     : m_pListener(pListener) {}
254*3ac0a46fSAndroid Build Coastguard Worker 
255*3ac0a46fSAndroid Build Coastguard Worker CFWL_NoteDriver::Target::~Target() = default;
256*3ac0a46fSAndroid Build Coastguard Worker 
Trace(cppgc::Visitor * visitor) const257*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::Target::Trace(cppgc::Visitor* visitor) const {
258*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pListener);
259*3ac0a46fSAndroid Build Coastguard Worker   for (auto& widget : m_widgets)
260*3ac0a46fSAndroid Build Coastguard Worker     visitor->Trace(widget);
261*3ac0a46fSAndroid Build Coastguard Worker }
262*3ac0a46fSAndroid Build Coastguard Worker 
SetEventSource(CFWL_Widget * pSource)263*3ac0a46fSAndroid Build Coastguard Worker void CFWL_NoteDriver::Target::SetEventSource(CFWL_Widget* pSource) {
264*3ac0a46fSAndroid Build Coastguard Worker   if (pSource)
265*3ac0a46fSAndroid Build Coastguard Worker     m_widgets.insert(pSource);
266*3ac0a46fSAndroid Build Coastguard Worker }
267*3ac0a46fSAndroid Build Coastguard Worker 
ProcessEvent(CFWL_Event * pEvent)268*3ac0a46fSAndroid Build Coastguard Worker bool CFWL_NoteDriver::Target::ProcessEvent(CFWL_Event* pEvent) {
269*3ac0a46fSAndroid Build Coastguard Worker   IFWL_WidgetDelegate* pDelegate = m_pListener->GetDelegate();
270*3ac0a46fSAndroid Build Coastguard Worker   if (!pDelegate)
271*3ac0a46fSAndroid Build Coastguard Worker     return false;
272*3ac0a46fSAndroid Build Coastguard Worker   if (!m_widgets.empty() && m_widgets.count(pEvent->GetSrcTarget()) == 0)
273*3ac0a46fSAndroid Build Coastguard Worker     return false;
274*3ac0a46fSAndroid Build Coastguard Worker   pDelegate->OnProcessEvent(pEvent);
275*3ac0a46fSAndroid Build Coastguard Worker   return true;
276*3ac0a46fSAndroid Build Coastguard Worker }
277