| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fwl/core/fwl_noteimp.h" | 7 #include "xfa/fwl/core/fwl_noteimp.h" |
| 8 | 8 |
| 9 #include "core/fxcrt/fx_ext.h" | 9 #include "core/fxcrt/fx_ext.h" |
| 10 #include "third_party/base/ptr_util.h" | 10 #include "third_party/base/ptr_util.h" |
| 11 #include "third_party/base/stl_util.h" | 11 #include "third_party/base/stl_util.h" |
| 12 #include "xfa/fwl/core/cfwl_message.h" | 12 #include "xfa/fwl/core/cfwl_message.h" |
| 13 #include "xfa/fwl/core/cfwl_widgetmgr.h" | 13 #include "xfa/fwl/core/cfwl_widgetmgr.h" |
| 14 #include "xfa/fwl/core/ifwl_app.h" | 14 #include "xfa/fwl/core/ifwl_app.h" |
| 15 #include "xfa/fwl/core/ifwl_tooltip.h" | 15 #include "xfa/fwl/core/ifwl_tooltip.h" |
| 16 | 16 |
| 17 CFWL_NoteLoop::CFWL_NoteLoop() : m_bContinueModal(true) {} | 17 CFWL_NoteLoop::CFWL_NoteLoop() : m_bContinueModal(true) {} |
| 18 | 18 |
| 19 CFWL_NoteDriver::CFWL_NoteDriver() | 19 CFWL_NoteDriver::CFWL_NoteDriver() |
| 20 : m_pHover(nullptr), | 20 : m_pHover(nullptr), |
| 21 m_pFocus(nullptr), | 21 m_pFocus(nullptr), |
| 22 m_pGrab(nullptr), | 22 m_pGrab(nullptr), |
| 23 m_pNoteLoop(pdfium::MakeUnique<CFWL_NoteLoop>()) { | 23 m_pNoteLoop(pdfium::MakeUnique<CFWL_NoteLoop>()) { |
| 24 PushNoteLoop(m_pNoteLoop.get()); | 24 PushNoteLoop(m_pNoteLoop.get()); |
| 25 } | 25 } |
| 26 |
| 26 CFWL_NoteDriver::~CFWL_NoteDriver() { | 27 CFWL_NoteDriver::~CFWL_NoteDriver() { |
| 27 ClearEventTargets(true); | 28 ClearEventTargets(true); |
| 28 } | 29 } |
| 29 | 30 |
| 30 void CFWL_NoteDriver::SendEvent(CFWL_Event* pNote) { | 31 void CFWL_NoteDriver::SendEvent(CFWL_Event* pNote) { |
| 31 if (m_eventTargets.empty()) | 32 if (m_eventTargets.empty()) |
| 32 return; | 33 return; |
| 33 | 34 |
| 34 for (const auto& pair : m_eventTargets) { | 35 for (const auto& pair : m_eventTargets) { |
| 35 CFWL_EventTarget* pEventTarget = pair.second; | 36 CFWL_EventTarget* pEventTarget = pair.second; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 | 71 |
| 71 CFWL_NoteLoop* CFWL_NoteDriver::PopNoteLoop() { | 72 CFWL_NoteLoop* CFWL_NoteDriver::PopNoteLoop() { |
| 72 int32_t pos = m_noteLoopQueue.GetSize(); | 73 int32_t pos = m_noteLoopQueue.GetSize(); |
| 73 if (pos <= 0) | 74 if (pos <= 0) |
| 74 return nullptr; | 75 return nullptr; |
| 75 | 76 |
| 76 CFWL_NoteLoop* p = m_noteLoopQueue.GetAt(pos - 1); | 77 CFWL_NoteLoop* p = m_noteLoopQueue.GetAt(pos - 1); |
| 77 m_noteLoopQueue.RemoveAt(pos - 1); | 78 m_noteLoopQueue.RemoveAt(pos - 1); |
| 78 return p; | 79 return p; |
| 79 } | 80 } |
| 81 |
| 80 bool CFWL_NoteDriver::SetFocus(IFWL_Widget* pFocus, bool bNotify) { | 82 bool CFWL_NoteDriver::SetFocus(IFWL_Widget* pFocus, bool bNotify) { |
| 81 if (m_pFocus == pFocus) { | 83 if (m_pFocus == pFocus) |
| 82 return true; | 84 return true; |
| 83 } | 85 |
| 84 IFWL_Widget* pPrev = m_pFocus; | 86 IFWL_Widget* pPrev = m_pFocus; |
| 85 m_pFocus = pFocus; | 87 m_pFocus = pFocus; |
| 86 if (pPrev) { | 88 if (pPrev) { |
| 87 CFWL_MsgKillFocus ms; | 89 CFWL_MsgKillFocus ms; |
| 88 ms.m_pDstTarget = pPrev; | 90 ms.m_pDstTarget = pPrev; |
| 89 ms.m_pSrcTarget = pPrev; | 91 ms.m_pSrcTarget = pPrev; |
| 90 if (bNotify) { | 92 if (bNotify) |
| 91 ms.m_dwExtend = 1; | 93 ms.m_dwExtend = 1; |
| 92 } | 94 |
| 93 if (IFWL_WidgetDelegate* pDelegate = pPrev->GetDelegate()) | 95 if (IFWL_WidgetDelegate* pDelegate = pPrev->GetDelegate()) |
| 94 pDelegate->OnProcessMessage(&ms); | 96 pDelegate->OnProcessMessage(&ms); |
| 95 } | 97 } |
| 96 if (pFocus) { | 98 if (pFocus) { |
| 97 IFWL_Widget* pWidget = | 99 IFWL_Widget* pWidget = |
| 98 pFocus->GetOwnerApp()->GetWidgetMgr()->GetSystemFormWidget(pFocus); | 100 pFocus->GetOwnerApp()->GetWidgetMgr()->GetSystemFormWidget(pFocus); |
| 99 IFWL_Form* pForm = static_cast<IFWL_Form*>(pWidget); | 101 IFWL_Form* pForm = static_cast<IFWL_Form*>(pWidget); |
| 100 if (pForm) | 102 if (pForm) |
| 101 pForm->SetSubFocus(pFocus); | 103 pForm->SetSubFocus(pFocus); |
| 102 | 104 |
| 103 CFWL_MsgSetFocus ms; | 105 CFWL_MsgSetFocus ms; |
| 104 ms.m_pDstTarget = pFocus; | 106 ms.m_pDstTarget = pFocus; |
| 105 if (bNotify) { | 107 if (bNotify) |
| 106 ms.m_dwExtend = 1; | 108 ms.m_dwExtend = 1; |
| 107 } | |
| 108 | |
| 109 if (IFWL_WidgetDelegate* pDelegate = pFocus->GetDelegate()) | 109 if (IFWL_WidgetDelegate* pDelegate = pFocus->GetDelegate()) |
| 110 pDelegate->OnProcessMessage(&ms); | 110 pDelegate->OnProcessMessage(&ms); |
| 111 } | 111 } |
| 112 return true; | 112 return true; |
| 113 } | 113 } |
| 114 | 114 |
| 115 void CFWL_NoteDriver::Run() { | 115 void CFWL_NoteDriver::Run() { |
| 116 #if (_FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_WIN32_DESKTOP_ || \ | 116 #if (_FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_WIN32_DESKTOP_ || \ |
| 117 _FX_OS_ == _FX_WIN64_) | 117 _FX_OS_ == _FX_WIN64_) |
| 118 CFWL_NoteLoop* pTopLoop = nullptr; | |
| 119 for (;;) { | 118 for (;;) { |
| 120 pTopLoop = GetTopLoop(); | 119 CFWL_NoteLoop* pTopLoop = GetTopLoop(); |
| 121 if (!pTopLoop || !pTopLoop->ContinueModal()) | 120 if (!pTopLoop || !pTopLoop->ContinueModal()) |
| 122 break; | 121 break; |
| 123 if (UnqueueMessage(pTopLoop)) | 122 UnqueueMessage(pTopLoop); |
| 124 continue; | |
| 125 } | 123 } |
| 126 #endif | 124 #endif |
| 127 } | 125 } |
| 128 | 126 |
| 129 void CFWL_NoteDriver::NotifyTargetHide(IFWL_Widget* pNoteTarget) { | 127 void CFWL_NoteDriver::NotifyTargetHide(IFWL_Widget* pNoteTarget) { |
| 130 if (m_pFocus == pNoteTarget) { | 128 if (m_pFocus == pNoteTarget) |
| 131 m_pFocus = nullptr; | 129 m_pFocus = nullptr; |
| 132 } | 130 if (m_pHover == pNoteTarget) |
| 133 if (m_pHover == pNoteTarget) { | |
| 134 m_pHover = nullptr; | 131 m_pHover = nullptr; |
| 135 } | 132 if (m_pGrab == pNoteTarget) |
| 136 if (m_pGrab == pNoteTarget) { | |
| 137 m_pGrab = nullptr; | 133 m_pGrab = nullptr; |
| 138 } | |
| 139 } | 134 } |
| 135 |
| 140 void CFWL_NoteDriver::NotifyTargetDestroy(IFWL_Widget* pNoteTarget) { | 136 void CFWL_NoteDriver::NotifyTargetDestroy(IFWL_Widget* pNoteTarget) { |
| 141 if (m_pFocus == pNoteTarget) { | 137 if (m_pFocus == pNoteTarget) |
| 142 m_pFocus = nullptr; | 138 m_pFocus = nullptr; |
| 143 } | 139 if (m_pHover == pNoteTarget) |
| 144 if (m_pHover == pNoteTarget) { | |
| 145 m_pHover = nullptr; | 140 m_pHover = nullptr; |
| 146 } | 141 if (m_pGrab == pNoteTarget) |
| 147 if (m_pGrab == pNoteTarget) { | |
| 148 m_pGrab = nullptr; | 142 m_pGrab = nullptr; |
| 149 } | 143 |
| 150 UnregisterEventTarget(pNoteTarget); | 144 UnregisterEventTarget(pNoteTarget); |
| 151 int32_t count = m_forms.GetSize(); | 145 |
| 152 for (int32_t nIndex = 0; nIndex < count; nIndex++) { | 146 for (int32_t nIndex = 0; nIndex < m_forms.GetSize(); nIndex++) { |
| 153 IFWL_Form* pForm = static_cast<IFWL_Form*>(m_forms[nIndex]); | 147 IFWL_Form* pForm = static_cast<IFWL_Form*>(m_forms[nIndex]); |
| 154 if (!pForm) { | 148 if (!pForm) |
| 155 continue; | 149 continue; |
| 156 } | 150 |
| 157 IFWL_Widget* pSubFocus = pForm->GetSubFocus(); | 151 IFWL_Widget* pSubFocus = pForm->GetSubFocus(); |
| 158 if (!pSubFocus) | 152 if (!pSubFocus) |
| 159 return; | 153 return; |
| 160 if (pSubFocus == pNoteTarget) { | 154 if (pSubFocus == pNoteTarget) |
| 161 pForm->SetSubFocus(nullptr); | 155 pForm->SetSubFocus(nullptr); |
| 162 } | |
| 163 } | 156 } |
| 164 } | 157 } |
| 165 | 158 |
| 166 void CFWL_NoteDriver::RegisterForm(IFWL_Widget* pForm) { | 159 void CFWL_NoteDriver::RegisterForm(IFWL_Widget* pForm) { |
| 167 if (!pForm || m_forms.Find(pForm) >= 0) | 160 if (!pForm || m_forms.Find(pForm) >= 0) |
| 168 return; | 161 return; |
| 169 | 162 |
| 170 m_forms.Add(pForm); | 163 m_forms.Add(pForm); |
| 171 if (m_forms.GetSize() == 1) { | 164 if (m_forms.GetSize() != 1) |
| 172 CFWL_NoteLoop* pLoop = | 165 return; |
| 173 static_cast<CFWL_NoteLoop*>(m_noteLoopQueue.GetAt(0)); | 166 |
| 174 if (!pLoop) | 167 CFWL_NoteLoop* pLoop = m_noteLoopQueue.GetAt(0); |
| 175 return; | 168 if (!pLoop) |
| 176 pLoop->SetMainForm(pForm); | 169 return; |
| 177 } | 170 |
| 171 pLoop->SetMainForm(pForm); |
| 178 } | 172 } |
| 179 | 173 |
| 180 void CFWL_NoteDriver::UnRegisterForm(IFWL_Widget* pForm) { | 174 void CFWL_NoteDriver::UnRegisterForm(IFWL_Widget* pForm) { |
| 181 if (!pForm) | 175 if (!pForm) |
| 182 return; | 176 return; |
| 177 |
| 183 int32_t nIndex = m_forms.Find(pForm); | 178 int32_t nIndex = m_forms.Find(pForm); |
| 184 if (nIndex < 0) | 179 if (nIndex < 0) |
| 185 return; | 180 return; |
| 181 |
| 186 m_forms.RemoveAt(nIndex); | 182 m_forms.RemoveAt(nIndex); |
| 187 } | 183 } |
| 188 bool CFWL_NoteDriver::QueueMessage(CFWL_Message* pMessage) { | 184 |
| 185 void CFWL_NoteDriver::QueueMessage(CFWL_Message* pMessage) { |
| 189 pMessage->Retain(); | 186 pMessage->Retain(); |
| 190 m_noteQueue.Add(pMessage); | 187 m_noteQueue.Add(pMessage); |
| 191 return true; | |
| 192 } | 188 } |
| 193 bool CFWL_NoteDriver::UnqueueMessage(CFWL_NoteLoop* pNoteLoop) { | 189 |
| 194 if (m_noteQueue.GetSize() < 1) { | 190 void CFWL_NoteDriver::UnqueueMessage(CFWL_NoteLoop* pNoteLoop) { |
| 195 return false; | 191 if (m_noteQueue.GetSize() < 1) |
| 196 } | 192 return; |
| 193 |
| 197 CFWL_Message* pMessage = m_noteQueue[0]; | 194 CFWL_Message* pMessage = m_noteQueue[0]; |
| 198 m_noteQueue.RemoveAt(0); | 195 m_noteQueue.RemoveAt(0); |
| 199 if (!IsValidMessage(pMessage)) { | 196 if (!IsValidMessage(pMessage)) { |
| 200 pMessage->Release(); | 197 pMessage->Release(); |
| 201 return true; | 198 return; |
| 202 } | 199 } |
| 203 ProcessMessage(pMessage); | 200 ProcessMessage(pMessage); |
| 201 pMessage->Release(); |
| 202 } |
| 204 | 203 |
| 205 pMessage->Release(); | |
| 206 return true; | |
| 207 } | |
| 208 CFWL_NoteLoop* CFWL_NoteDriver::GetTopLoop() const { | 204 CFWL_NoteLoop* CFWL_NoteDriver::GetTopLoop() const { |
| 209 int32_t size = m_noteLoopQueue.GetSize(); | 205 int32_t size = m_noteLoopQueue.GetSize(); |
| 210 if (size <= 0) | 206 if (size <= 0) |
| 211 return nullptr; | 207 return nullptr; |
| 212 return static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[size - 1]); | 208 return m_noteLoopQueue[size - 1]; |
| 213 } | 209 } |
| 214 | 210 |
| 215 bool CFWL_NoteDriver::ProcessMessage(CFWL_Message* pMessage) { | 211 void CFWL_NoteDriver::ProcessMessage(CFWL_Message* pMessage) { |
| 216 CFWL_WidgetMgr* pWidgetMgr = | 212 CFWL_WidgetMgr* pWidgetMgr = |
| 217 pMessage->m_pDstTarget->GetOwnerApp()->GetWidgetMgr(); | 213 pMessage->m_pDstTarget->GetOwnerApp()->GetWidgetMgr(); |
| 218 IFWL_Widget* pMessageForm = pWidgetMgr->IsFormDisabled() | 214 IFWL_Widget* pMessageForm = pWidgetMgr->IsFormDisabled() |
| 219 ? pMessage->m_pDstTarget | 215 ? pMessage->m_pDstTarget |
| 220 : GetMessageForm(pMessage->m_pDstTarget); | 216 : GetMessageForm(pMessage->m_pDstTarget); |
| 221 if (!pMessageForm) | 217 if (!pMessageForm) |
| 218 return; |
| 219 if (!DispatchMessage(pMessage, pMessageForm)) |
| 220 return; |
| 221 |
| 222 if (pMessage->GetClassID() == CFWL_MessageType::Mouse) |
| 223 MouseSecondary(pMessage); |
| 224 } |
| 225 |
| 226 bool CFWL_NoteDriver::DispatchMessage(CFWL_Message* pMessage, |
| 227 IFWL_Widget* pMessageForm) { |
| 228 switch (pMessage->GetClassID()) { |
| 229 case CFWL_MessageType::SetFocus: { |
| 230 if (!DoSetFocus(pMessage, pMessageForm)) |
| 231 return false; |
| 232 break; |
| 233 } |
| 234 case CFWL_MessageType::KillFocus: { |
| 235 if (!DoKillFocus(pMessage, pMessageForm)) |
| 236 return false; |
| 237 break; |
| 238 } |
| 239 case CFWL_MessageType::Key: { |
| 240 if (!DoKey(pMessage, pMessageForm)) |
| 241 return false; |
| 242 break; |
| 243 } |
| 244 case CFWL_MessageType::Mouse: { |
| 245 if (!DoMouse(pMessage, pMessageForm)) |
| 246 return false; |
| 247 break; |
| 248 } |
| 249 case CFWL_MessageType::MouseWheel: { |
| 250 if (!DoWheel(pMessage, pMessageForm)) |
| 251 return false; |
| 252 break; |
| 253 } |
| 254 default: |
| 255 break; |
| 256 } |
| 257 if (IFWL_WidgetDelegate* pDelegate = pMessage->m_pDstTarget->GetDelegate()) |
| 258 pDelegate->OnProcessMessage(pMessage); |
| 259 |
| 260 return true; |
| 261 } |
| 262 |
| 263 bool CFWL_NoteDriver::DoSetFocus(CFWL_Message* pMessage, |
| 264 IFWL_Widget* pMessageForm) { |
| 265 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); |
| 266 if (pWidgetMgr->IsFormDisabled()) { |
| 267 m_pFocus = pMessage->m_pDstTarget; |
| 268 return true; |
| 269 } |
| 270 |
| 271 IFWL_Widget* pWidget = pMessage->m_pDstTarget; |
| 272 if (!pWidget) |
| 222 return false; | 273 return false; |
| 223 if (DispatchMessage(pMessage, pMessageForm)) { | 274 |
| 224 if (pMessage->GetClassID() == CFWL_MessageType::Mouse) | 275 IFWL_Form* pForm = static_cast<IFWL_Form*>(pWidget); |
| 225 MouseSecondary(static_cast<CFWL_MsgMouse*>(pMessage)); | 276 IFWL_Widget* pSubFocus = pForm->GetSubFocus(); |
| 226 return true; | 277 if (pSubFocus && ((pSubFocus->GetStates() & FWL_WGTSTATE_Focused) == 0)) { |
| 278 pMessage->m_pDstTarget = pSubFocus; |
| 279 if (m_pFocus != pMessage->m_pDstTarget) { |
| 280 m_pFocus = pMessage->m_pDstTarget; |
| 281 return true; |
| 282 } |
| 227 } | 283 } |
| 228 return false; | 284 return false; |
| 229 } | 285 } |
| 230 | 286 |
| 231 bool CFWL_NoteDriver::DispatchMessage(CFWL_Message* pMessage, | 287 bool CFWL_NoteDriver::DoKillFocus(CFWL_Message* pMessage, |
| 232 IFWL_Widget* pMessageForm) { | 288 IFWL_Widget* pMessageForm) { |
| 233 bool bRet = false; | |
| 234 switch (pMessage->GetClassID()) { | |
| 235 case CFWL_MessageType::SetFocus: { | |
| 236 bRet = DoSetFocus(static_cast<CFWL_MsgSetFocus*>(pMessage), pMessageForm); | |
| 237 break; | |
| 238 } | |
| 239 case CFWL_MessageType::KillFocus: { | |
| 240 bRet = | |
| 241 DoKillFocus(static_cast<CFWL_MsgKillFocus*>(pMessage), pMessageForm); | |
| 242 break; | |
| 243 } | |
| 244 case CFWL_MessageType::Key: { | |
| 245 bRet = DoKey(static_cast<CFWL_MsgKey*>(pMessage), pMessageForm); | |
| 246 break; | |
| 247 } | |
| 248 case CFWL_MessageType::Mouse: { | |
| 249 bRet = DoMouse(static_cast<CFWL_MsgMouse*>(pMessage), pMessageForm); | |
| 250 break; | |
| 251 } | |
| 252 case CFWL_MessageType::MouseWheel: { | |
| 253 bRet = DoWheel(static_cast<CFWL_MsgMouseWheel*>(pMessage), pMessageForm); | |
| 254 break; | |
| 255 } | |
| 256 default: { | |
| 257 bRet = true; | |
| 258 break; | |
| 259 } | |
| 260 } | |
| 261 if (bRet) { | |
| 262 if (IFWL_WidgetDelegate* pDelegate = | |
| 263 pMessage->m_pDstTarget->GetDelegate()) { | |
| 264 pDelegate->OnProcessMessage(pMessage); | |
| 265 } | |
| 266 } | |
| 267 return bRet; | |
| 268 } | |
| 269 | |
| 270 bool CFWL_NoteDriver::DoSetFocus(CFWL_MsgSetFocus* pMsg, | |
| 271 IFWL_Widget* pMessageForm) { | |
| 272 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); | 289 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); |
| 273 if (pWidgetMgr->IsFormDisabled()) { | 290 if (pWidgetMgr->IsFormDisabled()) { |
| 274 m_pFocus = pMsg->m_pDstTarget; | 291 if (m_pFocus == pMessage->m_pDstTarget) |
| 292 m_pFocus = nullptr; |
| 275 return true; | 293 return true; |
| 276 } | 294 } |
| 277 IFWL_Widget* pWidget = pMsg->m_pDstTarget; | 295 |
| 278 if (pWidget) { | 296 IFWL_Form* pForm = static_cast<IFWL_Form*>(pMessage->m_pDstTarget); |
| 279 IFWL_Form* pForm = static_cast<IFWL_Form*>(pWidget); | 297 if (!pForm) |
| 280 IFWL_Widget* pSubFocus = pForm->GetSubFocus(); | 298 return false; |
| 281 if (pSubFocus && ((pSubFocus->GetStates() & FWL_WGTSTATE_Focused) == 0)) { | 299 |
| 282 pMsg->m_pDstTarget = pSubFocus; | 300 IFWL_Widget* pSubFocus = pForm->GetSubFocus(); |
| 283 if (m_pFocus != pMsg->m_pDstTarget) { | 301 if (pSubFocus && (pSubFocus->GetStates() & FWL_WGTSTATE_Focused)) { |
| 284 m_pFocus = pMsg->m_pDstTarget; | 302 pMessage->m_pDstTarget = pSubFocus; |
| 285 return true; | 303 if (m_pFocus == pMessage->m_pDstTarget) { |
| 286 } | 304 m_pFocus = nullptr; |
| 305 return true; |
| 287 } | 306 } |
| 288 } | 307 } |
| 289 return false; | 308 return false; |
| 290 } | 309 } |
| 291 bool CFWL_NoteDriver::DoKillFocus(CFWL_MsgKillFocus* pMsg, | 310 |
| 292 IFWL_Widget* pMessageForm) { | 311 bool CFWL_NoteDriver::DoKey(CFWL_Message* pMessage, IFWL_Widget* pMessageForm) { |
| 293 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); | 312 CFWL_MsgKey* pMsg = static_cast<CFWL_MsgKey*>(pMessage); |
| 294 if (pWidgetMgr->IsFormDisabled()) { | |
| 295 if (m_pFocus == pMsg->m_pDstTarget) { | |
| 296 m_pFocus = nullptr; | |
| 297 } | |
| 298 return true; | |
| 299 } | |
| 300 IFWL_Form* pForm = static_cast<IFWL_Form*>(pMsg->m_pDstTarget); | |
| 301 if (pForm) { | |
| 302 IFWL_Widget* pSubFocus = pForm->GetSubFocus(); | |
| 303 if (pSubFocus && (pSubFocus->GetStates() & FWL_WGTSTATE_Focused)) { | |
| 304 pMsg->m_pDstTarget = pSubFocus; | |
| 305 if (m_pFocus == pMsg->m_pDstTarget) { | |
| 306 m_pFocus = nullptr; | |
| 307 return true; | |
| 308 } | |
| 309 } | |
| 310 } | |
| 311 return false; | |
| 312 } | |
| 313 bool CFWL_NoteDriver::DoKey(CFWL_MsgKey* pMsg, IFWL_Widget* pMessageForm) { | |
| 314 #if (_FX_OS_ != _FX_MACOSX_) | 313 #if (_FX_OS_ != _FX_MACOSX_) |
| 315 if (pMsg->m_dwCmd == FWL_KeyCommand::KeyDown && | 314 if (pMsg->m_dwCmd == FWL_KeyCommand::KeyDown && |
| 316 pMsg->m_dwKeyCode == FWL_VKEY_Tab) { | 315 pMsg->m_dwKeyCode == FWL_VKEY_Tab) { |
| 317 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); | 316 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); |
| 318 IFWL_Widget* pForm = GetMessageForm(pMsg->m_pDstTarget); | 317 IFWL_Widget* pForm = GetMessageForm(pMsg->m_pDstTarget); |
| 319 IFWL_Widget* pFocus = m_pFocus; | 318 IFWL_Widget* pFocus = m_pFocus; |
| 320 if (m_pFocus) { | 319 if (m_pFocus && pWidgetMgr->GetSystemFormWidget(m_pFocus) != pForm) |
| 321 if (pWidgetMgr->GetSystemFormWidget(m_pFocus) != pForm) | 320 pFocus = nullptr; |
| 322 pFocus = nullptr; | 321 |
| 323 } | |
| 324 bool bFind = false; | 322 bool bFind = false; |
| 325 IFWL_Widget* pNextTabStop = pWidgetMgr->NextTab(pForm, pFocus, bFind); | 323 IFWL_Widget* pNextTabStop = pWidgetMgr->NextTab(pForm, pFocus, bFind); |
| 326 if (!pNextTabStop) { | 324 if (!pNextTabStop) { |
| 327 bFind = false; | 325 bFind = false; |
| 328 pNextTabStop = pWidgetMgr->NextTab(pForm, nullptr, bFind); | 326 pNextTabStop = pWidgetMgr->NextTab(pForm, nullptr, bFind); |
| 329 } | 327 } |
| 330 if (pNextTabStop == pFocus) { | 328 if (pNextTabStop == pFocus) |
| 331 return true; | 329 return true; |
| 332 } | 330 if (pNextTabStop) |
| 333 if (pNextTabStop) { | |
| 334 SetFocus(pNextTabStop); | 331 SetFocus(pNextTabStop); |
| 335 } | |
| 336 return true; | 332 return true; |
| 337 } | 333 } |
| 338 #endif | 334 #endif |
| 335 |
| 339 if (!m_pFocus) { | 336 if (!m_pFocus) { |
| 340 if (pMsg->m_dwCmd == FWL_KeyCommand::KeyDown && | 337 if (pMsg->m_dwCmd == FWL_KeyCommand::KeyDown && |
| 341 pMsg->m_dwKeyCode == FWL_VKEY_Return) { | 338 pMsg->m_dwKeyCode == FWL_VKEY_Return) { |
| 342 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); | 339 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); |
| 343 IFWL_Widget* defButton = pWidgetMgr->GetDefaultButton(pMessageForm); | 340 IFWL_Widget* defButton = pWidgetMgr->GetDefaultButton(pMessageForm); |
| 344 if (defButton) { | 341 if (defButton) { |
| 345 pMsg->m_pDstTarget = defButton; | 342 pMsg->m_pDstTarget = defButton; |
| 346 return true; | 343 return true; |
| 347 } | 344 } |
| 348 } | 345 } |
| 349 return false; | 346 return false; |
| 350 } | 347 } |
| 351 pMsg->m_pDstTarget = m_pFocus; | 348 pMsg->m_pDstTarget = m_pFocus; |
| 352 return true; | 349 return true; |
| 353 } | 350 } |
| 354 bool CFWL_NoteDriver::DoMouse(CFWL_MsgMouse* pMsg, IFWL_Widget* pMessageForm) { | 351 |
| 352 bool CFWL_NoteDriver::DoMouse(CFWL_Message* pMessage, |
| 353 IFWL_Widget* pMessageForm) { |
| 354 CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage); |
| 355 if (pMsg->m_dwCmd == FWL_MouseCommand::Leave || | 355 if (pMsg->m_dwCmd == FWL_MouseCommand::Leave || |
| 356 pMsg->m_dwCmd == FWL_MouseCommand::Hover || | 356 pMsg->m_dwCmd == FWL_MouseCommand::Hover || |
| 357 pMsg->m_dwCmd == FWL_MouseCommand::Enter) { | 357 pMsg->m_dwCmd == FWL_MouseCommand::Enter) { |
| 358 return !!pMsg->m_pDstTarget; | 358 return !!pMsg->m_pDstTarget; |
| 359 } | 359 } |
| 360 if (pMsg->m_pDstTarget != pMessageForm) { | 360 if (pMsg->m_pDstTarget != pMessageForm) |
| 361 pMsg->m_pDstTarget->TransformTo(pMessageForm, pMsg->m_fx, pMsg->m_fy); | 361 pMsg->m_pDstTarget->TransformTo(pMessageForm, pMsg->m_fx, pMsg->m_fy); |
| 362 } | 362 if (!DoMouseEx(pMsg, pMessageForm)) |
| 363 if (!DoMouseEx(pMsg, pMessageForm)) { | |
| 364 pMsg->m_pDstTarget = pMessageForm; | 363 pMsg->m_pDstTarget = pMessageForm; |
| 365 } | |
| 366 return true; | 364 return true; |
| 367 } | 365 } |
| 368 bool CFWL_NoteDriver::DoWheel(CFWL_MsgMouseWheel* pMsg, | 366 |
| 367 bool CFWL_NoteDriver::DoWheel(CFWL_Message* pMessage, |
| 369 IFWL_Widget* pMessageForm) { | 368 IFWL_Widget* pMessageForm) { |
| 370 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); | 369 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); |
| 371 if (!pWidgetMgr) | 370 if (!pWidgetMgr) |
| 372 return false; | 371 return false; |
| 373 | 372 |
| 373 CFWL_MsgMouseWheel* pMsg = static_cast<CFWL_MsgMouseWheel*>(pMessage); |
| 374 IFWL_Widget* pDst = | 374 IFWL_Widget* pDst = |
| 375 pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy); | 375 pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy); |
| 376 if (!pDst) | 376 if (!pDst) |
| 377 return false; | 377 return false; |
| 378 | 378 |
| 379 pMessageForm->TransformTo(pDst, pMsg->m_fx, pMsg->m_fy); | 379 pMessageForm->TransformTo(pDst, pMsg->m_fx, pMsg->m_fy); |
| 380 pMsg->m_pDstTarget = pDst; | 380 pMsg->m_pDstTarget = pDst; |
| 381 return true; | 381 return true; |
| 382 } | 382 } |
| 383 | 383 |
| 384 bool CFWL_NoteDriver::DoMouseEx(CFWL_MsgMouse* pMsg, | 384 bool CFWL_NoteDriver::DoMouseEx(CFWL_Message* pMessage, |
| 385 IFWL_Widget* pMessageForm) { | 385 IFWL_Widget* pMessageForm) { |
| 386 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); | 386 CFWL_WidgetMgr* pWidgetMgr = pMessageForm->GetOwnerApp()->GetWidgetMgr(); |
| 387 if (!pWidgetMgr) | 387 if (!pWidgetMgr) |
| 388 return false; | 388 return false; |
| 389 IFWL_Widget* pTarget = nullptr; | 389 IFWL_Widget* pTarget = nullptr; |
| 390 if (m_pGrab) | 390 if (m_pGrab) |
| 391 pTarget = m_pGrab; | 391 pTarget = m_pGrab; |
| 392 |
| 393 CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage); |
| 392 if (!pTarget) { | 394 if (!pTarget) { |
| 393 pTarget = | 395 pTarget = |
| 394 pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy); | 396 pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy); |
| 395 } | 397 } |
| 396 if (pTarget) { | 398 if (pTarget) { |
| 397 if (pMessageForm != pTarget) { | 399 if (pMessageForm != pTarget) |
| 398 pMessageForm->TransformTo(pTarget, pMsg->m_fx, pMsg->m_fy); | 400 pMessageForm->TransformTo(pTarget, pMsg->m_fx, pMsg->m_fy); |
| 399 } | |
| 400 } | 401 } |
| 401 if (!pTarget) | 402 if (!pTarget) |
| 402 return false; | 403 return false; |
| 404 |
| 403 pMsg->m_pDstTarget = pTarget; | 405 pMsg->m_pDstTarget = pTarget; |
| 404 return true; | 406 return true; |
| 405 } | 407 } |
| 406 void CFWL_NoteDriver::MouseSecondary(CFWL_MsgMouse* pMsg) { | 408 |
| 407 IFWL_Widget* pTarget = pMsg->m_pDstTarget; | 409 void CFWL_NoteDriver::MouseSecondary(CFWL_Message* pMessage) { |
| 408 if (pTarget == m_pHover) { | 410 IFWL_Widget* pTarget = pMessage->m_pDstTarget; |
| 411 if (pTarget == m_pHover) |
| 409 return; | 412 return; |
| 410 } | 413 |
| 414 CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage); |
| 411 if (m_pHover) { | 415 if (m_pHover) { |
| 412 CFWL_MsgMouse msLeave; | 416 CFWL_MsgMouse msLeave; |
| 413 msLeave.m_pDstTarget = m_pHover; | 417 msLeave.m_pDstTarget = m_pHover; |
| 414 msLeave.m_fx = pMsg->m_fx; | 418 msLeave.m_fx = pMsg->m_fx; |
| 415 msLeave.m_fy = pMsg->m_fy; | 419 msLeave.m_fy = pMsg->m_fy; |
| 416 pTarget->TransformTo(m_pHover, msLeave.m_fx, msLeave.m_fy); | 420 pTarget->TransformTo(m_pHover, msLeave.m_fx, msLeave.m_fy); |
| 421 |
| 417 msLeave.m_dwFlags = 0; | 422 msLeave.m_dwFlags = 0; |
| 418 msLeave.m_dwCmd = FWL_MouseCommand::Leave; | 423 msLeave.m_dwCmd = FWL_MouseCommand::Leave; |
| 419 DispatchMessage(&msLeave, nullptr); | 424 DispatchMessage(&msLeave, nullptr); |
| 420 } | 425 } |
| 421 if (pTarget->GetClassID() == FWL_Type::Form) { | 426 if (pTarget->GetClassID() == FWL_Type::Form) { |
| 422 m_pHover = nullptr; | 427 m_pHover = nullptr; |
| 423 return; | 428 return; |
| 424 } | 429 } |
| 425 m_pHover = pTarget; | 430 m_pHover = pTarget; |
| 431 |
| 426 CFWL_MsgMouse msHover; | 432 CFWL_MsgMouse msHover; |
| 427 msHover.m_pDstTarget = pTarget; | 433 msHover.m_pDstTarget = pTarget; |
| 428 msHover.m_fx = pMsg->m_fx; | 434 msHover.m_fx = pMsg->m_fx; |
| 429 msHover.m_fy = pMsg->m_fy; | 435 msHover.m_fy = pMsg->m_fy; |
| 430 msHover.m_dwFlags = 0; | 436 msHover.m_dwFlags = 0; |
| 431 msHover.m_dwCmd = FWL_MouseCommand::Hover; | 437 msHover.m_dwCmd = FWL_MouseCommand::Hover; |
| 432 DispatchMessage(&msHover, nullptr); | 438 DispatchMessage(&msHover, nullptr); |
| 433 } | 439 } |
| 440 |
| 434 bool CFWL_NoteDriver::IsValidMessage(CFWL_Message* pMessage) { | 441 bool CFWL_NoteDriver::IsValidMessage(CFWL_Message* pMessage) { |
| 435 int32_t iCount = m_noteLoopQueue.GetSize(); | 442 for (int32_t i = 0; i < m_noteLoopQueue.GetSize(); i++) { |
| 436 for (int32_t i = 0; i < iCount; i++) { | 443 CFWL_NoteLoop* pNoteLoop = m_noteLoopQueue[i]; |
| 437 CFWL_NoteLoop* pNoteLoop = static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[i]); | |
| 438 IFWL_Widget* pForm = pNoteLoop->GetForm(); | 444 IFWL_Widget* pForm = pNoteLoop->GetForm(); |
| 439 if (pForm && (pForm == pMessage->m_pDstTarget)) | 445 if (pForm && (pForm == pMessage->m_pDstTarget)) |
| 440 return true; | 446 return true; |
| 441 } | 447 } |
| 442 iCount = m_forms.GetSize(); | 448 |
| 443 for (int32_t j = 0; j < iCount; j++) { | 449 for (int32_t j = 0; j < m_forms.GetSize(); j++) { |
| 444 IFWL_Form* pForm = static_cast<IFWL_Form*>(m_forms[j]); | 450 IFWL_Form* pForm = static_cast<IFWL_Form*>(m_forms[j]); |
| 445 if (pForm == pMessage->m_pDstTarget) | 451 if (pForm == pMessage->m_pDstTarget) |
| 446 return true; | 452 return true; |
| 447 } | 453 } |
| 448 return false; | 454 return false; |
| 449 } | 455 } |
| 450 | 456 |
| 451 IFWL_Widget* CFWL_NoteDriver::GetMessageForm(IFWL_Widget* pDstTarget) { | 457 IFWL_Widget* CFWL_NoteDriver::GetMessageForm(IFWL_Widget* pDstTarget) { |
| 452 int32_t iTrackLoop = m_noteLoopQueue.GetSize(); | 458 int32_t iTrackLoop = m_noteLoopQueue.GetSize(); |
| 453 if (iTrackLoop <= 0) | 459 if (iTrackLoop <= 0) |
| 454 return nullptr; | 460 return nullptr; |
| 461 |
| 455 IFWL_Widget* pMessageForm = nullptr; | 462 IFWL_Widget* pMessageForm = nullptr; |
| 456 if (iTrackLoop > 1) { | 463 if (iTrackLoop > 1) |
| 457 CFWL_NoteLoop* pNootLoop = | 464 pMessageForm = m_noteLoopQueue[iTrackLoop - 1]->GetForm(); |
| 458 static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[iTrackLoop - 1]); | 465 else if (m_forms.Find(pDstTarget) < 0) |
| 459 pMessageForm = pNootLoop->GetForm(); | |
| 460 } else if (m_forms.Find(pDstTarget) < 0) { | |
| 461 pMessageForm = pDstTarget; | 466 pMessageForm = pDstTarget; |
| 462 } | |
| 463 if (!pMessageForm && pDstTarget) { | 467 if (!pMessageForm && pDstTarget) { |
| 464 CFWL_WidgetMgr* pWidgetMgr = pDstTarget->GetOwnerApp()->GetWidgetMgr(); | 468 CFWL_WidgetMgr* pWidgetMgr = pDstTarget->GetOwnerApp()->GetWidgetMgr(); |
| 465 if (!pWidgetMgr) | 469 if (!pWidgetMgr) |
| 466 return nullptr; | 470 return nullptr; |
| 467 pMessageForm = pWidgetMgr->GetSystemFormWidget(pDstTarget); | 471 pMessageForm = pWidgetMgr->GetSystemFormWidget(pDstTarget); |
| 468 } | 472 } |
| 469 return pMessageForm; | 473 return pMessageForm; |
| 470 } | 474 } |
| 471 | 475 |
| 472 void CFWL_NoteDriver::ClearEventTargets(bool bRemoveAll) { | 476 void CFWL_NoteDriver::ClearEventTargets(bool bRemoveAll) { |
| 473 auto it = m_eventTargets.begin(); | 477 auto it = m_eventTargets.begin(); |
| 474 while (it != m_eventTargets.end()) { | 478 while (it != m_eventTargets.end()) { |
| 475 auto old = it++; | 479 auto old = it++; |
| 476 if (old->second && (bRemoveAll || old->second->IsInvalid())) { | 480 if (old->second && (bRemoveAll || old->second->IsInvalid())) { |
| 477 delete old->second; | 481 delete old->second; |
| 478 m_eventTargets.erase(old); | 482 m_eventTargets.erase(old); |
| 479 } | 483 } |
| 480 } | 484 } |
| 481 } | 485 } |
| 482 | 486 |
| 483 CFWL_EventTarget::CFWL_EventTarget(IFWL_Widget* pListener) | 487 CFWL_EventTarget::CFWL_EventTarget(IFWL_Widget* pListener) |
| 484 : m_pListener(pListener), m_bInvalid(false) {} | 488 : m_pListener(pListener), m_bInvalid(false) {} |
| 489 |
| 485 CFWL_EventTarget::~CFWL_EventTarget() { | 490 CFWL_EventTarget::~CFWL_EventTarget() { |
| 486 m_eventSources.RemoveAll(); | 491 m_eventSources.RemoveAll(); |
| 487 } | 492 } |
| 488 | 493 |
| 489 int32_t CFWL_EventTarget::SetEventSource(IFWL_Widget* pSource, | 494 int32_t CFWL_EventTarget::SetEventSource(IFWL_Widget* pSource, |
| 490 uint32_t dwFilter) { | 495 uint32_t dwFilter) { |
| 491 if (pSource) { | 496 if (pSource) { |
| 492 m_eventSources.SetAt(pSource, dwFilter); | 497 m_eventSources.SetAt(pSource, dwFilter); |
| 493 return m_eventSources.GetCount(); | 498 return m_eventSources.GetCount(); |
| 494 } | 499 } |
| 495 return 1; | 500 return 1; |
| 496 } | 501 } |
| 497 | 502 |
| 498 bool CFWL_EventTarget::ProcessEvent(CFWL_Event* pEvent) { | 503 bool CFWL_EventTarget::ProcessEvent(CFWL_Event* pEvent) { |
| 499 IFWL_WidgetDelegate* pDelegate = m_pListener->GetDelegate(); | 504 IFWL_WidgetDelegate* pDelegate = m_pListener->GetDelegate(); |
| 500 if (!pDelegate) | 505 if (!pDelegate) |
| 501 return false; | 506 return false; |
| 502 if (m_eventSources.GetCount() == 0) { | 507 if (m_eventSources.GetCount() == 0) { |
| 503 pDelegate->OnProcessEvent(pEvent); | 508 pDelegate->OnProcessEvent(pEvent); |
| 504 return true; | 509 return true; |
| 505 } | 510 } |
| 511 |
| 506 FX_POSITION pos = m_eventSources.GetStartPosition(); | 512 FX_POSITION pos = m_eventSources.GetStartPosition(); |
| 507 while (pos) { | 513 while (pos) { |
| 508 IFWL_Widget* pSource = nullptr; | 514 IFWL_Widget* pSource = nullptr; |
| 509 uint32_t dwFilter = 0; | 515 uint32_t dwFilter = 0; |
| 510 m_eventSources.GetNextAssoc(pos, (void*&)pSource, dwFilter); | 516 m_eventSources.GetNextAssoc(pos, (void*&)pSource, dwFilter); |
| 511 if (pSource == pEvent->m_pSrcTarget) { | 517 if (pSource == pEvent->m_pSrcTarget) { |
| 512 if (IsFilterEvent(pEvent, dwFilter)) { | 518 if (IsFilterEvent(pEvent, dwFilter)) { |
| 513 pDelegate->OnProcessEvent(pEvent); | 519 pDelegate->OnProcessEvent(pEvent); |
| 514 return true; | 520 return true; |
| 515 } | 521 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 534 case CFWL_EventType::KillFocus: | 540 case CFWL_EventType::KillFocus: |
| 535 return !!(dwFilter & FWL_EVENT_FOCUSCHANGED_MASK); | 541 return !!(dwFilter & FWL_EVENT_FOCUSCHANGED_MASK); |
| 536 case CFWL_EventType::Close: | 542 case CFWL_EventType::Close: |
| 537 return !!(dwFilter & FWL_EVENT_CLOSE_MASK); | 543 return !!(dwFilter & FWL_EVENT_CLOSE_MASK); |
| 538 case CFWL_EventType::SizeChanged: | 544 case CFWL_EventType::SizeChanged: |
| 539 return !!(dwFilter & FWL_EVENT_SIZECHANGED_MASK); | 545 return !!(dwFilter & FWL_EVENT_SIZECHANGED_MASK); |
| 540 default: | 546 default: |
| 541 return !!(dwFilter & FWL_EVENT_CONTROL_MASK); | 547 return !!(dwFilter & FWL_EVENT_CONTROL_MASK); |
| 542 } | 548 } |
| 543 } | 549 } |
| OLD | NEW |