Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Side by Side Diff: xfa/src/fwl/core/fwl_noteimp.cpp

Issue 1803723002: Move xfa/src up to xfa/. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase to master Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/src/fwl/core/fwl_noteimp.h ('k') | xfa/src/fwl/core/fwl_panelimp.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 PDFium Authors. All rights reserved.
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 #include "xfa/src/fwl/core/fwl_noteimp.h"
8
9 #include "core/include/fxcrt/fx_ext.h"
10 #include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
11 #include "xfa/include/fwl/basewidget/fwl_tooltipctrl.h"
12 #include "xfa/include/fwl/core/fwl_app.h"
13 #include "xfa/include/fwl/core/fwl_grid.h"
14 #include "xfa/src/fwl/basewidget/fwl_tooltipctrlimp.h"
15 #include "xfa/src/fwl/core/fwl_appimp.h"
16 #include "xfa/src/fwl/core/fwl_formimp.h"
17 #include "xfa/src/fwl/core/fwl_panelimp.h"
18 #include "xfa/src/fwl/core/fwl_targetimp.h"
19 #include "xfa/src/fwl/core/fwl_threadimp.h"
20 #include "xfa/src/fwl/core/fwl_widgetimp.h"
21 #include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
22
23 CFWL_NoteLoop::CFWL_NoteLoop(CFWL_WidgetImp* pForm)
24 : m_pForm(pForm), m_bContinueModal(TRUE) {}
25 FX_BOOL CFWL_NoteLoop::PreProcessMessage(CFWL_Message* pMessage) {
26 if (!m_pForm) {
27 return FALSE;
28 }
29 return TranslateAccelerator(pMessage);
30 }
31 FWL_ERR CFWL_NoteLoop::Idle(int32_t count) {
32 #if (_FX_OS_ == _FX_WIN32_DESKTOP_)
33 if (count <= 0) {
34 #endif
35 CFWL_EvtIdle ev;
36 IFWL_App* pApp = FWL_GetApp();
37 if (!pApp)
38 return FWL_ERR_Indefinite;
39 IFWL_NoteDriver* pDriver = pApp->GetNoteDriver();
40 if (!pDriver)
41 return FWL_ERR_Indefinite;
42 pDriver->SendNote(&ev);
43 #if (_FX_OS_ == _FX_WIN32_DESKTOP_)
44 }
45 #endif
46 return FWL_ERR_Indefinite;
47 }
48 CFWL_WidgetImp* CFWL_NoteLoop::GetForm() {
49 return m_pForm;
50 }
51 FX_BOOL CFWL_NoteLoop::ContinueModal() {
52 return m_bContinueModal;
53 }
54 FWL_ERR CFWL_NoteLoop::EndModalLoop() {
55 m_bContinueModal = FALSE;
56 #if (_FX_OS_ == _FX_MACOSX_)
57 CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
58 IFWL_AdapterWidgetMgr* adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr();
59 adapterWidgetMgr->EndLoop();
60 #endif
61 return FWL_ERR_Succeeded;
62 }
63 FX_BOOL CFWL_NoteLoop::TranslateAccelerator(CFWL_Message* pMessage) {
64 if (pMessage->GetClassID() != FWL_MSGHASH_Key) {
65 return FALSE;
66 }
67 CFWL_MsgKey* pMsgKey = static_cast<CFWL_MsgKey*>(pMessage);
68 if (pMsgKey->m_dwCmd != FWL_MSGKEYCMD_KeyDown) {
69 return FALSE;
70 }
71 CFX_MapAccelerators& accel =
72 static_cast<CFWL_FormImp*>(m_pForm)->GetAccelerator();
73 FX_POSITION pos = accel.GetStartPosition();
74 if (!pos) {
75 return FALSE;
76 }
77 FX_DWORD vrKey, rValue;
78 while (pos) {
79 accel.GetNextAssoc(pos, vrKey, rValue);
80 FX_DWORD dwFlags = (vrKey & 0xFF00) >> 8;
81 FX_DWORD m_dwKeyCode = vrKey & 0x00FF;
82 if (pMsgKey->m_dwFlags == dwFlags && pMsgKey->m_dwKeyCode == m_dwKeyCode) {
83 GenerateCommondEvent(rValue);
84 return TRUE;
85 }
86 }
87 return FALSE;
88 }
89 FWL_ERR CFWL_NoteLoop::SetMainForm(CFWL_WidgetImp* pForm) {
90 m_pForm = pForm;
91 return FWL_ERR_Succeeded;
92 }
93 void CFWL_NoteLoop::GenerateCommondEvent(FX_DWORD dwCommand) {
94 CFWL_EvtMenuCommand ev;
95 ev.m_iCommand = dwCommand;
96 IFWL_NoteThread* pThread = m_pForm->GetOwnerThread();
97 if (!pThread)
98 return;
99 IFWL_NoteDriver* pDriver = pThread->GetNoteDriver();
100 if (!pDriver)
101 return;
102 pDriver->SendNote(&ev);
103 }
104 CFWL_NoteDriver::CFWL_NoteDriver()
105 : m_sendEventCalled(0),
106 m_maxSize(500),
107 m_bFullScreen(FALSE),
108 m_pHover(nullptr),
109 m_pFocus(nullptr),
110 m_pGrab(nullptr),
111 m_hook(nullptr) {
112 m_pNoteLoop = new CFWL_NoteLoop;
113 PushNoteLoop(m_pNoteLoop);
114 }
115 CFWL_NoteDriver::~CFWL_NoteDriver() {
116 delete m_pNoteLoop;
117 ClearInvalidEventTargets(TRUE);
118 }
119 FX_BOOL CFWL_NoteDriver::SendNote(CFWL_Note* pNote) {
120 if (pNote->IsEvent()) {
121 int32_t iCount = m_eventTargets.GetCount();
122 if (iCount < 1) {
123 return TRUE;
124 }
125 if (FWL_EVTHASH_Mouse == static_cast<CFWL_Event*>(pNote)->GetClassID()) {
126 CFWL_EvtMouse* pMouse = static_cast<CFWL_EvtMouse*>(pNote);
127 if (FWL_MSGMOUSECMD_MouseHover == pMouse->m_dwCmd) {
128 if (m_pNoteLoop->GetForm() &&
129 CFWL_ToolTipContainer::getInstance()->ProcessEnter(
130 pMouse, m_pNoteLoop->GetForm()->GetInterface())) {
131 }
132 } else if (FWL_MSGMOUSECMD_MouseLeave == pMouse->m_dwCmd) {
133 if (CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse)) {
134 }
135 } else if ((FWL_MSGMOUSECMD_LButtonDown <= pMouse->m_dwCmd) &&
136 (FWL_MSGMOUSECMD_MButtonDblClk >= pMouse->m_dwCmd)) {
137 if (CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse)) {
138 }
139 }
140 }
141 m_sendEventCalled++;
142 FX_POSITION pos = m_eventTargets.GetStartPosition();
143 while (pos) {
144 void* key = NULL;
145 CFWL_EventTarget* pEventTarget;
146 m_eventTargets.GetNextAssoc(pos, key, (void*&)pEventTarget);
147 if (pEventTarget && !pEventTarget->IsInvalid()) {
148 pEventTarget->ProcessEvent(static_cast<CFWL_Event*>(pNote));
149 }
150 }
151 m_sendEventCalled--;
152 } else {
153 if (!pNote->m_pDstTarget)
154 return FALSE;
155 IFWL_WidgetDelegate* pDelegate = pNote->m_pDstTarget->SetDelegate(NULL);
156 if (pDelegate) {
157 pDelegate->OnProcessMessage(static_cast<CFWL_Message*>(pNote));
158 }
159 }
160 return TRUE;
161 }
162 extern void FWL_PostMessageToMainRoop(CFWL_Message* pMessage);
163 FX_BOOL CFWL_NoteDriver::PostMessage(CFWL_Message* pMessage) {
164 FWL_PostMessageToMainRoop(pMessage);
165 return TRUE;
166 }
167 #define FWL_NoteDriver_EventKey 1100
168 FWL_ERR CFWL_NoteDriver::RegisterEventTarget(IFWL_Widget* pListener,
169 IFWL_Widget* pEventSource,
170 FX_DWORD dwFilter) {
171 FX_DWORD dwkey = (FX_DWORD)(uintptr_t)pListener->GetPrivateData(
172 (void*)(uintptr_t)FWL_NoteDriver_EventKey);
173 if (dwkey == 0) {
174 void* random = FX_Random_MT_Start(0);
175 dwkey = rand();
176 FX_Random_MT_Close(random);
177 pListener->SetPrivateData((void*)(uintptr_t)FWL_NoteDriver_EventKey,
178 (void*)(uintptr_t)dwkey, NULL);
179 }
180 CFWL_EventTarget* value = NULL;
181 if (!m_eventTargets.Lookup((void*)(uintptr_t)dwkey, (void*&)value)) {
182 value = new CFWL_EventTarget(this, pListener);
183 m_eventTargets.SetAt((void*)(uintptr_t)dwkey, value);
184 }
185 value->SetEventSource(pEventSource, dwFilter);
186 return FWL_ERR_Succeeded;
187 }
188 FWL_ERR CFWL_NoteDriver::UnregisterEventTarget(IFWL_Widget* pListener) {
189 FX_DWORD dwkey = (FX_DWORD)(uintptr_t)pListener->GetPrivateData(
190 (void*)(uintptr_t)FWL_NoteDriver_EventKey);
191 if (dwkey == 0) {
192 return FWL_ERR_Indefinite;
193 }
194 CFWL_EventTarget* value = NULL;
195 if (m_eventTargets.Lookup((void*)(uintptr_t)dwkey, (void*&)value)) {
196 value->FlagInvalid();
197 }
198 return FWL_ERR_Succeeded;
199 }
200 void CFWL_NoteDriver::ClearEventTargets(FX_BOOL bRemoveAll) {
201 ClearInvalidEventTargets(bRemoveAll);
202 }
203 int32_t CFWL_NoteDriver::GetQueueMaxSize() const {
204 return m_maxSize;
205 }
206 FWL_ERR CFWL_NoteDriver::SetQueueMaxSize(const int32_t size) {
207 m_maxSize = size;
208 return FWL_ERR_Succeeded;
209 }
210 IFWL_NoteThread* CFWL_NoteDriver::GetOwnerThread() const {
211 return FWL_GetApp();
212 }
213 FWL_ERR CFWL_NoteDriver::PushNoteLoop(IFWL_NoteLoop* pNoteLoop) {
214 m_noteLoopQueue.Add(pNoteLoop);
215 return FWL_ERR_Succeeded;
216 }
217 IFWL_NoteLoop* CFWL_NoteDriver::PopNoteLoop() {
218 int32_t pos = m_noteLoopQueue.GetSize();
219 if (pos <= 0)
220 return NULL;
221 IFWL_NoteLoop* p =
222 static_cast<IFWL_NoteLoop*>(m_noteLoopQueue.GetAt(pos - 1));
223 m_noteLoopQueue.RemoveAt(pos - 1);
224 return p;
225 }
226 FX_BOOL CFWL_NoteDriver::SetFocus(IFWL_Widget* pFocus, FX_BOOL bNotify) {
227 if (m_pFocus == pFocus) {
228 return TRUE;
229 }
230 IFWL_Widget* pPrev = m_pFocus;
231 m_pFocus = pFocus;
232 if (pPrev) {
233 CFWL_MsgKillFocus ms;
234 ms.m_pDstTarget = pPrev;
235 ms.m_pSrcTarget = pPrev;
236 if (bNotify) {
237 ms.m_dwExtend = 1;
238 }
239 IFWL_WidgetDelegate* pDelegate = pPrev->SetDelegate(NULL);
240 if (pDelegate) {
241 pDelegate->OnProcessMessage(&ms);
242 }
243 }
244 if (pFocus) {
245 IFWL_Widget* pWidget =
246 FWL_GetWidgetMgr()->GetWidget(pFocus, FWL_WGTRELATION_SystemForm);
247 CFWL_FormImp* pForm =
248 pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr;
249 if (pForm) {
250 CFWL_WidgetImp* pNewFocus =
251 static_cast<CFWL_WidgetImp*>(pFocus->GetImpl());
252 pForm->SetSubFocus(pNewFocus);
253 }
254 CFWL_MsgSetFocus ms;
255 ms.m_pDstTarget = pFocus;
256 if (bNotify) {
257 ms.m_dwExtend = 1;
258 }
259 IFWL_WidgetDelegate* pDelegate = pFocus->SetDelegate(NULL);
260 if (pDelegate) {
261 pDelegate->OnProcessMessage(&ms);
262 }
263 }
264 return TRUE;
265 }
266 FWL_ERR CFWL_NoteDriver::Run() {
267 CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
268 if (!pWidgetMgr)
269 return FWL_ERR_Indefinite;
270 #if (_FX_OS_ == _FX_MACOSX_)
271 IFWL_AdapterWidgetMgr* adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr();
272 CFWL_NoteLoop* pTopLoop = GetTopLoop();
273 if (pTopLoop) {
274 CFWL_WidgetImp* formImp = pTopLoop->GetForm();
275 if (formImp) {
276 IFWL_Widget* pForm = formImp->GetInterface();
277 adapterWidgetMgr->RunLoop(pForm);
278 }
279 }
280 #elif(_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
281 FX_BOOL bIdle = TRUE;
282 int32_t iIdleCount = 0;
283 CFWL_NoteLoop* pTopLoop = NULL;
284 for (;;) {
285 pTopLoop = GetTopLoop();
286 if (!pTopLoop || !pTopLoop->ContinueModal()) {
287 break;
288 }
289 if (UnqueueMessage(pTopLoop)) {
290 continue;
291 }
292 while (bIdle && !(pWidgetMgr->CheckMessage_Native())) {
293 if (FWL_ERR_Indefinite == pTopLoop->Idle(iIdleCount++)) {
294 bIdle = FALSE;
295 }
296 }
297 do {
298 if (FWL_ERR_Indefinite == pWidgetMgr->DispatchMessage_Native()) {
299 break;
300 }
301 if (pWidgetMgr->IsIdleMessage_Native()) {
302 bIdle = TRUE;
303 iIdleCount = 0;
304 }
305 } while (pWidgetMgr->CheckMessage_Native());
306 }
307 #elif(_FX_OS_ == _FX_LINUX_DESKTOP_)
308 CFWL_NoteLoop* pTopLoop = NULL;
309 for (;;) {
310 pTopLoop = GetTopLoop();
311 if (!pTopLoop || !pTopLoop->ContinueModal()) {
312 break;
313 }
314 if (UnqueueMessage(pTopLoop)) {
315 continue;
316 }
317 if (pWidgetMgr->CheckMessage_Native()) {
318 pWidgetMgr->DispatchMessage_Native();
319 }
320 }
321 #endif
322 return FWL_ERR_Succeeded;
323 }
324 IFWL_Widget* CFWL_NoteDriver::GetFocus() {
325 return m_pFocus;
326 }
327 IFWL_Widget* CFWL_NoteDriver::GetHover() {
328 return m_pHover;
329 }
330 void CFWL_NoteDriver::SetHover(IFWL_Widget* pHover) {
331 m_pHover = pHover;
332 }
333 void CFWL_NoteDriver::SetGrab(IFWL_Widget* pGrab, FX_BOOL bSet) {
334 m_pGrab = bSet ? pGrab : NULL;
335 }
336 void CFWL_NoteDriver::NotifyTargetHide(IFWL_Widget* pNoteTarget) {
337 if (m_pFocus == pNoteTarget) {
338 m_pFocus = NULL;
339 }
340 if (m_pHover == pNoteTarget) {
341 m_pHover = NULL;
342 }
343 if (m_pGrab == pNoteTarget) {
344 m_pGrab = NULL;
345 }
346 }
347 void CFWL_NoteDriver::NotifyTargetDestroy(IFWL_Widget* pNoteTarget) {
348 if (m_pFocus == pNoteTarget) {
349 m_pFocus = NULL;
350 }
351 if (m_pHover == pNoteTarget) {
352 m_pHover = NULL;
353 }
354 if (m_pGrab == pNoteTarget) {
355 m_pGrab = NULL;
356 }
357 UnregisterEventTarget(pNoteTarget);
358 int32_t count = m_forms.GetSize();
359 for (int32_t nIndex = 0; nIndex < count; nIndex++) {
360 CFWL_FormImp* pForm = static_cast<CFWL_FormImp*>(m_forms[nIndex]);
361 if (!pForm) {
362 continue;
363 }
364 CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus();
365 if (!pSubFocus)
366 return;
367 if (pSubFocus && pSubFocus->GetInterface() == pNoteTarget) {
368 pForm->SetSubFocus(NULL);
369 }
370 }
371 }
372 void CFWL_NoteDriver::NotifyFullScreenMode(IFWL_Widget* pNoteTarget,
373 FX_BOOL bFullScreen) {
374 m_bFullScreen = bFullScreen;
375 }
376 FWL_ERR CFWL_NoteDriver::RegisterForm(CFWL_WidgetImp* pForm) {
377 if (!pForm)
378 return FWL_ERR_Indefinite;
379 if (m_forms.Find(pForm) >= 0) {
380 return FWL_ERR_Indefinite;
381 }
382 m_forms.Add(pForm);
383 if (m_forms.GetSize() == 1) {
384 CFWL_NoteLoop* pLoop =
385 static_cast<CFWL_NoteLoop*>(m_noteLoopQueue.GetAt(0));
386 if (!pLoop)
387 return FWL_ERR_Indefinite;
388 pLoop->SetMainForm(pForm);
389 }
390 return FWL_ERR_Succeeded;
391 }
392 FWL_ERR CFWL_NoteDriver::UnRegisterForm(CFWL_WidgetImp* pForm) {
393 if (!pForm)
394 return FWL_ERR_Indefinite;
395 int32_t nIndex = m_forms.Find(pForm);
396 if (nIndex < 0) {
397 return FWL_ERR_Indefinite;
398 }
399 m_forms.RemoveAt(nIndex);
400 return FWL_ERR_Succeeded;
401 }
402 FX_BOOL CFWL_NoteDriver::QueueMessage(CFWL_Message* pMessage) {
403 pMessage->Retain();
404 m_noteQueue.Add(pMessage);
405 return TRUE;
406 }
407 FX_BOOL CFWL_NoteDriver::UnqueueMessage(CFWL_NoteLoop* pNoteLoop) {
408 if (m_noteQueue.GetSize() < 1) {
409 return FALSE;
410 }
411 CFWL_Message* pMessage = static_cast<CFWL_Message*>(m_noteQueue[0]);
412 m_noteQueue.RemoveAt(0);
413 if (!IsValidMessage(pMessage)) {
414 pMessage->Release();
415 return TRUE;
416 }
417 FX_BOOL bHookMessage = FALSE;
418 if (m_hook) {
419 bHookMessage = (*m_hook)(pMessage, m_hookInfo);
420 }
421 if (!bHookMessage && !pNoteLoop->PreProcessMessage(pMessage)) {
422 ProcessMessage(pMessage);
423 }
424 pMessage->Release();
425 return TRUE;
426 }
427 CFWL_NoteLoop* CFWL_NoteDriver::GetTopLoop() {
428 int32_t size = m_noteLoopQueue.GetSize();
429 if (size <= 0)
430 return NULL;
431 return static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[size - 1]);
432 }
433 int32_t CFWL_NoteDriver::CountLoop() {
434 return m_noteLoopQueue.GetSize();
435 }
436 void CFWL_NoteDriver::SetHook(FWLMessageHookCallback callback, void* info) {
437 m_hook = callback;
438 m_hookInfo = info;
439 }
440 FX_BOOL CFWL_NoteDriver::ProcessMessage(CFWL_Message* pMessage) {
441 CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
442 IFWL_Widget* pMessageForm = pWidgetMgr->IsFormDisabled()
443 ? pMessage->m_pDstTarget
444 : GetMessageForm(pMessage->m_pDstTarget);
445 if (!pMessageForm)
446 return FALSE;
447 if (DispatchMessage(pMessage, pMessageForm)) {
448 if (pMessage->GetClassID() == FWL_MSGHASH_Mouse) {
449 MouseSecondary(static_cast<CFWL_MsgMouse*>(pMessage));
450 }
451 return TRUE;
452 }
453 return FALSE;
454 }
455 FX_BOOL CFWL_NoteDriver::DispatchMessage(CFWL_Message* pMessage,
456 IFWL_Widget* pMessageForm) {
457 FX_BOOL bRet = FALSE;
458 switch (pMessage->GetClassID()) {
459 case FWL_MSGHASH_Activate: {
460 bRet = DoActivate(static_cast<CFWL_MsgActivate*>(pMessage), pMessageForm);
461 break;
462 }
463 case FWL_MSGHASH_Deactivate: {
464 bRet = DoDeactivate(static_cast<CFWL_MsgDeactivate*>(pMessage),
465 pMessageForm);
466 break;
467 }
468 case FWL_MSGHASH_SetFocus: {
469 bRet = DoSetFocus(static_cast<CFWL_MsgSetFocus*>(pMessage), pMessageForm);
470 break;
471 }
472 case FWL_MSGHASH_KillFocus: {
473 bRet =
474 DoKillFocus(static_cast<CFWL_MsgKillFocus*>(pMessage), pMessageForm);
475 break;
476 }
477 case FWL_MSGHASH_Key: {
478 bRet = DoKey(static_cast<CFWL_MsgKey*>(pMessage), pMessageForm);
479 break;
480 }
481 case FWL_MSGHASH_Mouse: {
482 bRet = DoMouse(static_cast<CFWL_MsgMouse*>(pMessage), pMessageForm);
483 break;
484 }
485 case FWL_MSGHASH_MouseWheel: {
486 bRet = DoWheel(static_cast<CFWL_MsgMouseWheel*>(pMessage), pMessageForm);
487 break;
488 }
489 case FWL_MSGHASH_Size: {
490 bRet = DoSize(static_cast<CFWL_MsgSize*>(pMessage));
491 break;
492 }
493 case FWL_MSGHASH_Cursor: {
494 bRet = TRUE;
495 break;
496 }
497 case FWL_MSGHASH_WindowMove: {
498 bRet = DoWindowMove(static_cast<CFWL_MsgWindowMove*>(pMessage),
499 pMessageForm);
500 break;
501 }
502 case FWL_MSGHASH_DropFiles: {
503 bRet =
504 DoDragFiles(static_cast<CFWL_MsgDropFiles*>(pMessage), pMessageForm);
505 break;
506 }
507 default: {
508 bRet = TRUE;
509 break;
510 }
511 }
512 if (bRet) {
513 IFWL_WidgetDelegate* pDelegate = pMessage->m_pDstTarget->SetDelegate(NULL);
514 if (pDelegate) {
515 pDelegate->OnProcessMessage(pMessage);
516 }
517 }
518 return bRet;
519 }
520 FX_BOOL CFWL_NoteDriver::DoActivate(CFWL_MsgActivate* pMsg,
521 IFWL_Widget* pMessageForm) {
522 if (m_bFullScreen) {
523 return FALSE;
524 }
525 pMsg->m_pDstTarget = pMessageForm;
526 return (pMsg->m_pDstTarget)->GetStates() & FWL_WGTSTATE_Deactivated;
527 }
528 FX_BOOL CFWL_NoteDriver::DoDeactivate(CFWL_MsgDeactivate* pMsg,
529 IFWL_Widget* pMessageForm) {
530 if (m_bFullScreen) {
531 return FALSE;
532 }
533 int32_t iTrackLoop = m_noteLoopQueue.GetSize();
534 if (iTrackLoop <= 0)
535 return FALSE;
536 if (iTrackLoop == 1) {
537 if (pMessageForm->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"))) {
538 return FALSE;
539 }
540 if (pMsg->m_pSrcTarget &&
541 pMsg->m_pSrcTarget->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"))) {
542 return FALSE;
543 }
544 if (pMsg->m_pSrcTarget && pMsg->m_pSrcTarget->GetClassID() == 1111984755) {
545 return FALSE;
546 }
547 return TRUE;
548 }
549 IFWL_Widget* pDst = pMsg->m_pDstTarget;
550 if (!pDst)
551 return FALSE;
552 #if (_FX_OS_ == _FX_MACOSX_)
553 if (pDst == pMessageForm && pDst->IsInstance(L"FWL_FORMPROXY")) {
554 return TRUE;
555 }
556 #endif
557 return pDst != pMessageForm &&
558 !pDst->IsInstance(FX_WSTRC(L"FWL_FORMPROXY")) &&
559 !pMessageForm->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"));
560 }
561 FX_BOOL CFWL_NoteDriver::DoSetFocus(CFWL_MsgSetFocus* pMsg,
562 IFWL_Widget* pMessageForm) {
563 CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
564 if (pWidgetMgr->IsFormDisabled()) {
565 m_pFocus = pMsg->m_pDstTarget;
566 return TRUE;
567 } else {
568 IFWL_Widget* pWidget = pMsg->m_pDstTarget;
569 CFWL_FormImp* pForm =
570 pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr;
571 if (pForm) {
572 CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus();
573 if (pSubFocus && ((pSubFocus->GetStates() & FWL_WGTSTATE_Focused) == 0)) {
574 pMsg->m_pDstTarget = pSubFocus->GetInterface();
575 if (m_pFocus != pMsg->m_pDstTarget) {
576 m_pFocus = pMsg->m_pDstTarget;
577 return TRUE;
578 }
579 }
580 }
581 }
582 return FALSE;
583 }
584 FX_BOOL CFWL_NoteDriver::DoKillFocus(CFWL_MsgKillFocus* pMsg,
585 IFWL_Widget* pMessageForm) {
586 CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
587 if (pWidgetMgr->IsFormDisabled()) {
588 if (m_pFocus == pMsg->m_pDstTarget) {
589 m_pFocus = NULL;
590 }
591 return TRUE;
592 }
593 IFWL_Widget* pWidget = pMsg->m_pDstTarget;
594 CFWL_FormImp* pForm =
595 pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr;
596 if (pForm) {
597 CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus();
598 if (pSubFocus && (pSubFocus->GetStates() & FWL_WGTSTATE_Focused)) {
599 pMsg->m_pDstTarget = pSubFocus->GetInterface();
600 if (m_pFocus == pMsg->m_pDstTarget) {
601 m_pFocus = NULL;
602 return TRUE;
603 }
604 }
605 }
606 return FALSE;
607 }
608 FX_BOOL CFWL_NoteDriver::DoKey(CFWL_MsgKey* pMsg, IFWL_Widget* pMessageForm) {
609 #if (_FX_OS_ != _FX_MACOSX_)
610 if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown &&
611 pMsg->m_dwKeyCode == FWL_VKEY_Tab) {
612 CFWL_WidgetMgr* pWidgetMgr =
613 static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
614 IFWL_Widget* pForm = GetMessageForm(pMsg->m_pDstTarget);
615 IFWL_Widget* pFocus = m_pFocus;
616 if (m_pFocus) {
617 if (pWidgetMgr->GetWidget(m_pFocus, FWL_WGTRELATION_SystemForm) !=
618 pForm) {
619 pFocus = NULL;
620 }
621 }
622 FX_BOOL bFind = FALSE;
623 IFWL_Widget* pNextTabStop = pWidgetMgr->nextTab(pForm, pFocus, bFind);
624 if (!pNextTabStop) {
625 bFind = FALSE;
626 pNextTabStop = pWidgetMgr->nextTab(pForm, NULL, bFind);
627 }
628 if (pNextTabStop == pFocus) {
629 return TRUE;
630 }
631 if (pNextTabStop) {
632 SetFocus(pNextTabStop);
633 }
634 return TRUE;
635 }
636 #endif
637 if (!m_pFocus) {
638 if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown &&
639 pMsg->m_dwKeyCode == FWL_VKEY_Return) {
640 CFWL_WidgetMgr* pWidgetMgr =
641 static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
642 IFWL_Widget* defButton = pWidgetMgr->GetDefaultButton(pMessageForm);
643 if (defButton) {
644 pMsg->m_pDstTarget = defButton;
645 return TRUE;
646 }
647 }
648 return FALSE;
649 }
650 pMsg->m_pDstTarget = m_pFocus;
651 return TRUE;
652 }
653 FX_BOOL CFWL_NoteDriver::DoMouse(CFWL_MsgMouse* pMsg,
654 IFWL_Widget* pMessageForm) {
655 if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave ||
656 pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseHover ||
657 pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseEnter) {
658 return pMsg->m_pDstTarget != NULL;
659 }
660 if (pMsg->m_pDstTarget != pMessageForm) {
661 pMsg->m_pDstTarget->TransformTo(pMessageForm, pMsg->m_fx, pMsg->m_fy);
662 }
663 if (!DoMouseEx(pMsg, pMessageForm)) {
664 pMsg->m_pDstTarget = pMessageForm;
665 }
666 return TRUE;
667 }
668 FX_BOOL CFWL_NoteDriver::DoWheel(CFWL_MsgMouseWheel* pMsg,
669 IFWL_Widget* pMessageForm) {
670 CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
671 if (!pWidgetMgr)
672 return FALSE;
673 IFWL_Widget* pDst =
674 pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy);
675 if (!pDst)
676 return FALSE;
677 while (pDst && pDst->GetClassID() == FWL_CLASSHASH_Grid) {
678 pDst = pDst->GetParent();
679 }
680 pMessageForm->TransformTo(pDst, pMsg->m_fx, pMsg->m_fy);
681 pMsg->m_pDstTarget = pDst;
682 return TRUE;
683 }
684 FX_BOOL CFWL_NoteDriver::DoSize(CFWL_MsgSize* pMsg) {
685 CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
686 if (!pWidgetMgr)
687 return FALSE;
688 pWidgetMgr->NotifySizeChanged(pMsg->m_pDstTarget, (FX_FLOAT)pMsg->m_iWidth,
689 (FX_FLOAT)pMsg->m_iHeight);
690 return TRUE;
691 }
692 FX_BOOL CFWL_NoteDriver::DoWindowMove(CFWL_MsgWindowMove* pMsg,
693 IFWL_Widget* pMessageForm) {
694 return pMsg->m_pDstTarget == pMessageForm;
695 }
696 FX_BOOL CFWL_NoteDriver::DoDragFiles(CFWL_MsgDropFiles* pMsg,
697 IFWL_Widget* pMessageForm) {
698 return pMsg->m_pDstTarget == pMessageForm;
699 }
700 FX_BOOL CFWL_NoteDriver::DoMouseEx(CFWL_MsgMouse* pMsg,
701 IFWL_Widget* pMessageForm) {
702 CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
703 if (!pWidgetMgr)
704 return FALSE;
705 IFWL_Widget* pTarget = NULL;
706 if (m_pGrab)
707 pTarget = m_pGrab;
708 if (!pTarget) {
709 pTarget =
710 pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy);
711 while (pTarget && pTarget->GetClassID() == FWL_CLASSHASH_Grid) {
712 pTarget = pTarget->GetParent();
713 }
714 }
715 if (pTarget) {
716 if (pMessageForm != pTarget) {
717 pMessageForm->TransformTo(pTarget, pMsg->m_fx, pMsg->m_fy);
718 }
719 }
720 if (!pTarget)
721 return FALSE;
722 pMsg->m_pDstTarget = pTarget;
723 return TRUE;
724 }
725 void CFWL_NoteDriver::MouseSecondary(CFWL_MsgMouse* pMsg) {
726 IFWL_Widget* pTarget = pMsg->m_pDstTarget;
727 if (pTarget == m_pHover) {
728 return;
729 }
730 if (m_pHover) {
731 CFWL_MsgMouse msLeave;
732 msLeave.m_pDstTarget = m_pHover;
733 msLeave.m_fx = pMsg->m_fx;
734 msLeave.m_fy = pMsg->m_fy;
735 pTarget->TransformTo(m_pHover, msLeave.m_fx, msLeave.m_fy);
736 msLeave.m_dwFlags = 0;
737 msLeave.m_dwCmd = FWL_MSGMOUSECMD_MouseLeave;
738 DispatchMessage(&msLeave, NULL);
739 }
740 if (pTarget->GetClassID() == FWL_CLASSHASH_Form) {
741 m_pHover = NULL;
742 return;
743 }
744 m_pHover = pTarget;
745 CFWL_MsgMouse msHover;
746 msHover.m_pDstTarget = pTarget;
747 msHover.m_fx = pMsg->m_fx;
748 msHover.m_fy = pMsg->m_fy;
749 msHover.m_dwFlags = 0;
750 msHover.m_dwCmd = FWL_MSGMOUSECMD_MouseHover;
751 DispatchMessage(&msHover, NULL);
752 }
753 FX_BOOL CFWL_NoteDriver::IsValidMessage(CFWL_Message* pMessage) {
754 if (pMessage->GetClassID() == FWL_MSGHASH_Post) {
755 return TRUE;
756 }
757 int32_t iCount = m_noteLoopQueue.GetSize();
758 for (int32_t i = 0; i < iCount; i++) {
759 CFWL_NoteLoop* pNoteLoop = static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[i]);
760 CFWL_WidgetImp* pForm = pNoteLoop->GetForm();
761 if (pForm && (pForm->GetInterface() == pMessage->m_pDstTarget)) {
762 return TRUE;
763 }
764 }
765 iCount = m_forms.GetSize();
766 for (int32_t j = 0; j < iCount; j++) {
767 CFWL_FormImp* pForm = static_cast<CFWL_FormImp*>(m_forms[j]);
768 if (pForm->GetInterface() == pMessage->m_pDstTarget) {
769 return TRUE;
770 }
771 }
772 return FALSE;
773 }
774 IFWL_Widget* CFWL_NoteDriver::GetMessageForm(IFWL_Widget* pDstTarget) {
775 int32_t iTrackLoop = m_noteLoopQueue.GetSize();
776 if (iTrackLoop <= 0)
777 return NULL;
778 IFWL_Widget* pMessageForm = NULL;
779 if (iTrackLoop > 1) {
780 CFWL_NoteLoop* pNootLoop =
781 static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[iTrackLoop - 1]);
782 pMessageForm = pNootLoop->GetForm()->GetInterface();
783 } else {
784 pMessageForm = (m_forms.Find(pDstTarget) < 0) ? NULL : pDstTarget;
785 }
786 if (!pMessageForm && pDstTarget) {
787 CFWL_WidgetMgr* pWidgetMgr =
788 static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
789 if (!pWidgetMgr)
790 return NULL;
791 pMessageForm =
792 pWidgetMgr->GetWidget(pDstTarget, FWL_WGTRELATION_SystemForm);
793 }
794 return pMessageForm;
795 }
796 void CFWL_NoteDriver::ClearInvalidEventTargets(FX_BOOL bRemoveAll) {
797 FX_POSITION pos = m_eventTargets.GetStartPosition();
798 while (pos) {
799 void* key = NULL;
800 CFWL_EventTarget* pEventTarget = NULL;
801 m_eventTargets.GetNextAssoc(pos, key, (void*&)pEventTarget);
802 if (pEventTarget && (bRemoveAll || pEventTarget->IsInvalid())) {
803 m_eventTargets.RemoveKey(key);
804 delete pEventTarget;
805 }
806 }
807 }
808 class CFWL_CoreToopTipDP : public IFWL_ToolTipDP {
809 public:
810 FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
811 int32_t GetInitialDelay(IFWL_Widget* pWidget);
812 int32_t GetAutoPopDelay(IFWL_Widget* pWidget);
813 CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget);
814 CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget);
815 CFX_RectF GetAnchor();
816 CFWL_CoreToopTipDP();
817
818 CFX_WideString m_wsCaption;
819 int32_t m_nInitDelayTime;
820 int32_t m_nAutoPopDelayTime;
821 CFX_RectF m_fAnchor;
822 };
823 CFWL_CoreToopTipDP::CFWL_CoreToopTipDP() {
824 m_nInitDelayTime = 500;
825 m_nAutoPopDelayTime = 50000;
826 m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
827 }
828 FWL_ERR CFWL_CoreToopTipDP::GetCaption(IFWL_Widget* pWidget,
829 CFX_WideString& wsCaption) {
830 wsCaption = m_wsCaption;
831 return FWL_ERR_Succeeded;
832 }
833 int32_t CFWL_CoreToopTipDP::GetInitialDelay(IFWL_Widget* pWidget) {
834 return m_nInitDelayTime;
835 }
836 int32_t CFWL_CoreToopTipDP::GetAutoPopDelay(IFWL_Widget* pWidget) {
837 return m_nAutoPopDelayTime;
838 }
839 CFX_DIBitmap* CFWL_CoreToopTipDP::GetToolTipIcon(IFWL_Widget* pWidget) {
840 return NULL;
841 }
842 CFX_SizeF CFWL_CoreToopTipDP::GetToolTipIconSize(IFWL_Widget* pWidget) {
843 return CFX_SizeF();
844 }
845 CFX_RectF CFWL_CoreToopTipDP::GetAnchor() {
846 return m_fAnchor;
847 }
848 CFWL_EventTarget::~CFWL_EventTarget() {
849 m_eventSources.RemoveAll();
850 }
851 int32_t CFWL_EventTarget::SetEventSource(IFWL_Widget* pSource,
852 FX_DWORD dwFilter) {
853 if (pSource) {
854 m_eventSources.SetAt(pSource, dwFilter);
855 return m_eventSources.GetCount();
856 }
857 return 1;
858 }
859 FX_BOOL CFWL_EventTarget::ProcessEvent(CFWL_Event* pEvent) {
860 IFWL_WidgetDelegate* pDelegate = m_pListener->SetDelegate(NULL);
861 if (!pDelegate)
862 return FALSE;
863 if (m_eventSources.GetCount() == 0) {
864 pDelegate->OnProcessEvent(pEvent);
865 return TRUE;
866 }
867 FX_POSITION pos = m_eventSources.GetStartPosition();
868 while (pos) {
869 IFWL_Widget* pSource = NULL;
870 FX_DWORD dwFilter = 0;
871 m_eventSources.GetNextAssoc(pos, (void*&)pSource, dwFilter);
872 if (pSource == pEvent->m_pSrcTarget ||
873 pEvent->GetClassID() == FWL_EVTHASH_Idle) {
874 if (IsFilterEvent(pEvent, dwFilter)) {
875 pDelegate->OnProcessEvent(pEvent);
876 return TRUE;
877 }
878 }
879 }
880 return FALSE;
881 }
882 FX_BOOL CFWL_EventTarget::IsFilterEvent(CFWL_Event* pEvent, FX_DWORD dwFilter) {
883 if (dwFilter == FWL_EVENT_ALL_MASK) {
884 return TRUE;
885 }
886 FX_BOOL bRet = FALSE;
887 switch (pEvent->GetClassID()) {
888 case FWL_EVTHASH_Mouse: {
889 bRet = dwFilter & FWL_EVENT_MOUSE_MASK;
890 break;
891 }
892 case FWL_EVTHASH_MouseWheel: {
893 bRet = dwFilter & FWL_EVENT_MOUSEWHEEL_MASK;
894 break;
895 }
896 case FWL_EVTHASH_Key: {
897 bRet = dwFilter & FWL_EVENT_KEY_MASK;
898 break;
899 }
900 case FWL_EVTHASH_SetFocus:
901 case FWL_EVTHASH_KillFocus: {
902 bRet = dwFilter & FWL_EVENT_FOCUSCHANGED_MASK;
903 break;
904 }
905 case FWL_EVTHASH_Draw: {
906 bRet = dwFilter & FWL_EVENT_DRAW_MASK;
907 break;
908 }
909 case FWL_EVTHASH_Close: {
910 bRet = dwFilter & FWL_EVENT_CLOSE_MASK;
911 break;
912 }
913 case FWL_EVTHASH_SizeChanged: {
914 bRet = dwFilter & FWL_EVENT_SIZECHANGED_MASK;
915 break;
916 }
917 case FWL_EVTHASH_Idle: {
918 bRet = dwFilter & FWL_EVENT_IDLE_MASK;
919 break;
920 }
921 default: {
922 bRet = dwFilter & FWL_EVENT_CONTROL_MASK;
923 break;
924 }
925 }
926 return bRet;
927 }
928
929 CFWL_ToolTipContainer* CFWL_ToolTipContainer::s_pInstance = NULL;
930
931 CFWL_ToolTipContainer::CFWL_ToolTipContainer()
932 : pCurTarget(NULL), m_pToolTipImp(NULL) {
933 m_ToolTipDp = new CFWL_CoreToopTipDP;
934 m_ToolTipDp->m_nInitDelayTime = 0;
935 m_ToolTipDp->m_nAutoPopDelayTime = 2000;
936 }
937 CFWL_ToolTipContainer::~CFWL_ToolTipContainer() {
938 if (m_pToolTipImp) {
939 IFWL_ToolTip* pToolTip =
940 static_cast<IFWL_ToolTip*>(m_pToolTipImp->GetInterface());
941 pToolTip->Finalize();
942 delete pToolTip;
943 }
944 delete m_ToolTipDp;
945 }
946 // static
947 CFWL_ToolTipContainer* CFWL_ToolTipContainer::getInstance() {
948 if (!s_pInstance) {
949 s_pInstance = new CFWL_ToolTipContainer;
950 }
951 return s_pInstance;
952 }
953 // static
954 void CFWL_ToolTipContainer::DeleteInstance() {
955 if (s_pInstance) {
956 delete s_pInstance;
957 s_pInstance = NULL;
958 }
959 }
960 FX_ERR CFWL_ToolTipContainer::AddToolTipTarget(IFWL_ToolTipTarget* pTarget) {
961 if (m_arrWidget.Find((void*)pTarget) < 0) {
962 m_arrWidget.Add((void*)pTarget);
963 return FWL_ERR_Succeeded;
964 }
965 return FWL_ERR_Indefinite;
966 }
967 FX_ERR CFWL_ToolTipContainer::RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget) {
968 int index = m_arrWidget.Find((void*)pTarget);
969 if (index >= 0) {
970 m_arrWidget.RemoveAt(index);
971 return FWL_ERR_Succeeded;
972 }
973 return FWL_ERR_Indefinite;
974 }
975 FX_BOOL CFWL_ToolTipContainer::HasToolTip(IFWL_Widget* pWedget) {
976 int32_t iCount = m_arrWidget.GetSize();
977 for (int32_t i = 0; i < iCount; i++) {
978 IFWL_ToolTipTarget* p = static_cast<IFWL_ToolTipTarget*>(m_arrWidget[i]);
979 if (p->GetWidget() == pWedget) {
980 pCurTarget = p;
981 return TRUE;
982 }
983 }
984 return FALSE;
985 }
986 FX_BOOL CFWL_ToolTipContainer::ProcessEnter(CFWL_EvtMouse* pEvt,
987 IFWL_Widget* pOwner) {
988 if (HasToolTip(pEvt->m_pDstTarget)) {
989 if (NULL == m_pToolTipImp) {
990 CFWL_WidgetImpProperties prop;
991 prop.m_pDataProvider = m_ToolTipDp;
992 prop.m_pOwner = pOwner;
993 CFX_RectF rtTooltip;
994 rtTooltip.Set(150, 150, 100, 50);
995 prop.m_rtWidget = rtTooltip;
996 IFWL_ToolTip* pToolTip = IFWL_ToolTip::Create(prop, nullptr);
997 pToolTip->Initialize();
998 m_pToolTipImp = static_cast<CFWL_ToolTipImp*>(pToolTip->GetImpl());
999 m_pToolTipImp->ModifyStylesEx(FWL_STYLEEXT_TTP_Multiline, 0);
1000 m_pToolTipImp->SetStates(FWL_WGTSTATE_Invisible, TRUE);
1001 }
1002 if (pCurTarget->IsShowed()) {
1003 CFX_WideString wsCaption;
1004 pCurTarget->GetCaption(wsCaption);
1005 if (!wsCaption.IsEmpty()) {
1006 m_ToolTipDp->m_wsCaption = wsCaption;
1007 }
1008 CFX_RectF rt;
1009 CFX_SizeF sz;
1010 pCurTarget->GetToolTipSize(sz);
1011 if (sz.x > 0 && sz.y > 0) {
1012 rt.width = sz.x;
1013 rt.height = sz.y;
1014 } else {
1015 CFX_RectF r;
1016 m_pToolTipImp->GetWidgetRect(r, TRUE);
1017 rt.width = r.width;
1018 rt.height = r.height;
1019 }
1020 CFX_PointF pt(pEvt->m_fx, pEvt->m_fy);
1021 if (pCurTarget->GetToolTipPos(pt) == FWL_ERR_Succeeded) {
1022 rt.left = pt.x;
1023 rt.top = pt.y;
1024 m_pToolTipImp->ModifyStylesEx(FWL_STYLEEXT_TTP_NoAnchor, 0);
1025 } else {
1026 CFX_RectF rtAnchor;
1027 pCurTarget->GetWidget()->GetClientRect(rtAnchor);
1028 pCurTarget->GetWidget()->TransformTo(NULL, rtAnchor.left, rtAnchor.top);
1029 m_pToolTipImp->SetAnchor(rtAnchor);
1030 m_pToolTipImp->ModifyStylesEx(0, FWL_STYLEEXT_TTP_NoAnchor);
1031 }
1032 m_pToolTipImp->SetWidgetRect(rt);
1033 m_pToolTipImp->Update();
1034 m_pToolTipImp->Show();
1035 }
1036 return TRUE;
1037 }
1038 return FALSE;
1039 }
1040 FX_BOOL CFWL_ToolTipContainer::ProcessLeave(CFWL_EvtMouse* pEvt) {
1041 if (HasToolTip(pEvt->m_pDstTarget) && NULL != m_pToolTipImp) {
1042 m_pToolTipImp->Hide();
1043 pCurTarget = NULL;
1044 return TRUE;
1045 }
1046 return FALSE;
1047 }
1048 IFWL_ToolTipTarget* CFWL_ToolTipContainer::GetCurrentToolTipTarget() {
1049 return pCurTarget;
1050 }
1051 FX_ERR CFWL_ToolTipContainer::SetToolTipInitialDelay(int32_t nDelayTime) {
1052 m_ToolTipDp->m_nInitDelayTime = nDelayTime;
1053 return FWL_ERR_Succeeded;
1054 }
1055 FX_ERR CFWL_ToolTipContainer::SetToolTipAutoPopDelay(int32_t nDelayTime) {
1056 m_ToolTipDp->m_nAutoPopDelayTime = nDelayTime;
1057 return FWL_ERR_Succeeded;
1058 }
1059 FWL_ERR FWL_AddToolTipTarget(IFWL_ToolTipTarget* pTarget) {
1060 return CFWL_ToolTipContainer::getInstance()->AddToolTipTarget(pTarget);
1061 }
1062 FWL_ERR FWL_RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget) {
1063 return CFWL_ToolTipContainer::getInstance()->RemoveToolTipTarget(pTarget);
1064 }
1065 FWL_ERR FWL_SetToolTipInitialDelay(int32_t nDelayTime) {
1066 return CFWL_ToolTipContainer::getInstance()->SetToolTipInitialDelay(
1067 nDelayTime);
1068 }
1069 FWL_ERR FWL_SetToolTipAutoPopDelay(int32_t nDelayTime) {
1070 return CFWL_ToolTipContainer::getInstance()->SetToolTipAutoPopDelay(
1071 nDelayTime);
1072 }
1073 IFWL_Widget* FWL_GetCurrentThreadModalWidget(IFWL_NoteThread* pNoteThread) {
1074 if (!pNoteThread)
1075 return NULL;
1076 CFWL_NoteDriver* noteDriver =
1077 static_cast<CFWL_NoteDriver*>(pNoteThread->GetNoteDriver());
1078 if (!noteDriver)
1079 return NULL;
1080 if (noteDriver->CountLoop() == 1) {
1081 return NULL;
1082 }
1083 CFWL_NoteLoop* topLoop = noteDriver->GetTopLoop();
1084 if (!topLoop)
1085 return NULL;
1086 CFWL_WidgetImp* widget = topLoop->GetForm();
1087 if (!widget)
1088 return NULL;
1089 return widget->GetInterface();
1090 }
1091 FWL_ERR FWL_SetHook(IFWL_NoteDriver* driver,
1092 FWLMessageHookCallback callback,
1093 void* info) {
1094 CFWL_NoteDriver* noteDriver = static_cast<CFWL_NoteDriver*>(driver);
1095 noteDriver->SetHook(callback, info);
1096 return FWL_ERR_Succeeded;
1097 }
OLDNEW
« no previous file with comments | « xfa/src/fwl/core/fwl_noteimp.h ('k') | xfa/src/fwl/core/fwl_panelimp.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698