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