summaryrefslogtreecommitdiff
path: root/xfa
diff options
context:
space:
mode:
Diffstat (limited to 'xfa')
-rw-r--r--xfa/fwl/core/fwl_noteimp.cpp75
-rw-r--r--xfa/fwl/core/fwl_noteimp.h8
2 files changed, 37 insertions, 46 deletions
diff --git a/xfa/fwl/core/fwl_noteimp.cpp b/xfa/fwl/core/fwl_noteimp.cpp
index 5cb66efed6..4db2d6bb5f 100644
--- a/xfa/fwl/core/fwl_noteimp.cpp
+++ b/xfa/fwl/core/fwl_noteimp.cpp
@@ -66,11 +66,10 @@ void CFWL_NoteLoop::GenerateCommondEvent(uint32_t dwCommand) {
pDriver->SendEvent(&ev);
}
CFWL_NoteDriver::CFWL_NoteDriver()
- : m_sendEventCalled(0),
- m_pHover(nullptr),
+ : m_pHover(nullptr),
m_pFocus(nullptr),
- m_pGrab(nullptr) {
- m_pNoteLoop = new CFWL_NoteLoop;
+ m_pGrab(nullptr),
+ m_pNoteLoop(new CFWL_NoteLoop) {
PushNoteLoop(m_pNoteLoop);
}
CFWL_NoteDriver::~CFWL_NoteDriver() {
@@ -78,10 +77,9 @@ CFWL_NoteDriver::~CFWL_NoteDriver() {
ClearInvalidEventTargets(TRUE);
}
-FX_BOOL CFWL_NoteDriver::SendEvent(CFWL_Event* pNote) {
- int32_t iCount = m_eventTargets.GetCount();
- if (iCount < 1)
- return TRUE;
+void CFWL_NoteDriver::SendEvent(CFWL_Event* pNote) {
+ if (m_eventTargets.empty())
+ return;
if (CFWL_EventType::Mouse == pNote->GetClassID()) {
CFWL_EvtMouse* pMouse = static_cast<CFWL_EvtMouse*>(pNote);
if (FWL_MouseCommand::Hover == pMouse->m_dwCmd) {
@@ -96,54 +94,46 @@ FX_BOOL CFWL_NoteDriver::SendEvent(CFWL_Event* pNote) {
CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse);
}
}
- m_sendEventCalled++;
- FX_POSITION pos = m_eventTargets.GetStartPosition();
- while (pos) {
- void* key = nullptr;
- void* value = nullptr;
- m_eventTargets.GetNextAssoc(pos, key, value);
-
- CFWL_EventTarget* pEventTarget = static_cast<CFWL_EventTarget*>(value);
+ for (const auto& pair : m_eventTargets) {
+ CFWL_EventTarget* pEventTarget = pair.second;
if (pEventTarget && !pEventTarget->IsInvalid())
pEventTarget->ProcessEvent(pNote);
}
- m_sendEventCalled--;
- return TRUE;
}
#define FWL_NoteDriver_EventKey 1100
FWL_Error CFWL_NoteDriver::RegisterEventTarget(IFWL_Widget* pListener,
IFWL_Widget* pEventSource,
uint32_t dwFilter) {
- uint32_t dwkey = (uint32_t)(uintptr_t)pListener->GetPrivateData(
+ uint32_t key = (uint32_t)(uintptr_t)pListener->GetPrivateData(
(void*)(uintptr_t)FWL_NoteDriver_EventKey);
- if (dwkey == 0) {
+ if (key == 0) {
void* random = FX_Random_MT_Start(0);
- dwkey = rand();
+ key = rand();
FX_Random_MT_Close(random);
pListener->SetPrivateData((void*)(uintptr_t)FWL_NoteDriver_EventKey,
- (void*)(uintptr_t)dwkey, NULL);
- }
- CFWL_EventTarget* value = NULL;
- if (!m_eventTargets.Lookup((void*)(uintptr_t)dwkey, (void*&)value)) {
- value = new CFWL_EventTarget(this, pListener);
- m_eventTargets.SetAt((void*)(uintptr_t)dwkey, value);
+ (void*)(uintptr_t)key, NULL);
}
- value->SetEventSource(pEventSource, dwFilter);
+ if (!m_eventTargets[key])
+ m_eventTargets[key] = new CFWL_EventTarget(this, pListener);
+
+ m_eventTargets[key]->SetEventSource(pEventSource, dwFilter);
return FWL_Error::Succeeded;
}
+
FWL_Error CFWL_NoteDriver::UnregisterEventTarget(IFWL_Widget* pListener) {
- uint32_t dwkey = (uint32_t)(uintptr_t)pListener->GetPrivateData(
+ uint32_t key = (uint32_t)(uintptr_t)pListener->GetPrivateData(
(void*)(uintptr_t)FWL_NoteDriver_EventKey);
- if (dwkey == 0) {
+ if (key == 0)
return FWL_Error::Indefinite;
- }
- CFWL_EventTarget* value = NULL;
- if (m_eventTargets.Lookup((void*)(uintptr_t)dwkey, (void*&)value)) {
- value->FlagInvalid();
- }
+
+ auto it = m_eventTargets.find(key);
+ if (it != m_eventTargets.end())
+ it->second->FlagInvalid();
+
return FWL_Error::Succeeded;
}
+
void CFWL_NoteDriver::ClearEventTargets(FX_BOOL bRemoveAll) {
ClearInvalidEventTargets(bRemoveAll);
}
@@ -676,17 +666,16 @@ IFWL_Widget* CFWL_NoteDriver::GetMessageForm(IFWL_Widget* pDstTarget) {
}
void CFWL_NoteDriver::ClearInvalidEventTargets(FX_BOOL bRemoveAll) {
- FX_POSITION pos = m_eventTargets.GetStartPosition();
- while (pos) {
- void* key = NULL;
- CFWL_EventTarget* pEventTarget = NULL;
- m_eventTargets.GetNextAssoc(pos, key, (void*&)pEventTarget);
- if (pEventTarget && (bRemoveAll || pEventTarget->IsInvalid())) {
- m_eventTargets.RemoveKey(key);
- delete pEventTarget;
+ auto it = m_eventTargets.begin();
+ while (it != m_eventTargets.end()) {
+ auto old = it++;
+ if (old->second && (bRemoveAll || old->second->IsInvalid())) {
+ delete old->second;
+ m_eventTargets.erase(old);
}
}
}
+
class CFWL_CoreToolTipDP : public IFWL_ToolTipDP {
public:
FWL_Error GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
diff --git a/xfa/fwl/core/fwl_noteimp.h b/xfa/fwl/core/fwl_noteimp.h
index 778eae6045..9116e31e08 100644
--- a/xfa/fwl/core/fwl_noteimp.h
+++ b/xfa/fwl/core/fwl_noteimp.h
@@ -7,6 +7,8 @@
#ifndef XFA_FWL_CORE_FWL_NOTEIMP_H_
#define XFA_FWL_CORE_FWL_NOTEIMP_H_
+#include <unordered_map>
+
#include "xfa/fwl/core/cfwl_event.h"
#include "xfa/fwl/core/cfwl_message.h"
#include "xfa/fwl/core/fwl_error.h"
@@ -24,6 +26,7 @@ enum FWL_KeyFlag {
};
class CFWL_CoreToolTipDP;
+class CFWL_EventTarget;
class CFWL_MsgActivate;
class CFWL_MsgDeactivate;
class CFWL_MsgDropFiles;
@@ -62,7 +65,7 @@ class CFWL_NoteDriver {
CFWL_NoteDriver();
~CFWL_NoteDriver();
- FX_BOOL SendEvent(CFWL_Event* pNote);
+ void SendEvent(CFWL_Event* pNote);
FWL_Error RegisterEventTarget(IFWL_Widget* pListener,
IFWL_Widget* pEventSource = nullptr,
uint32_t dwFilter = FWL_EVENT_ALL_MASK);
@@ -109,8 +112,7 @@ class CFWL_NoteDriver {
CFX_ArrayTemplate<CFWL_WidgetImp*> m_forms;
CFX_ArrayTemplate<CFWL_Message*> m_noteQueue;
CFX_ArrayTemplate<CFWL_NoteLoop*> m_noteLoopQueue;
- CFX_MapPtrToPtr m_eventTargets;
- int32_t m_sendEventCalled;
+ std::unordered_map<uint32_t, CFWL_EventTarget*> m_eventTargets;
IFWL_Widget* m_pHover;
IFWL_Widget* m_pFocus;
IFWL_Widget* m_pGrab;