diff options
Diffstat (limited to 'xfa/fwl/core/ifwl_comboboxproxy.cpp')
-rw-r--r-- | xfa/fwl/core/ifwl_comboboxproxy.cpp | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/xfa/fwl/core/ifwl_comboboxproxy.cpp b/xfa/fwl/core/ifwl_comboboxproxy.cpp new file mode 100644 index 0000000000..a0afcd1d72 --- /dev/null +++ b/xfa/fwl/core/ifwl_comboboxproxy.cpp @@ -0,0 +1,118 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa/fwl/core/ifwl_comboboxproxy.h" + +#include "xfa/fwl/core/fwl_noteimp.h" +#include "xfa/fwl/core/ifwl_app.h" +#include "xfa/fwl/core/ifwl_combobox.h" + +IFWL_ComboBoxProxy::IFWL_ComboBoxProxy( + IFWL_ComboBox* pComboBox, + const IFWL_App* app, + const CFWL_WidgetImpProperties& properties, + IFWL_Widget* pOuter) + : IFWL_FormProxy(app, properties, pOuter), + m_bLButtonDown(FALSE), + m_bLButtonUpSelf(FALSE), + m_pComboBox(pComboBox) {} + +IFWL_ComboBoxProxy::~IFWL_ComboBoxProxy() {} + +void IFWL_ComboBoxProxy::OnProcessMessage(CFWL_Message* pMessage) { + if (!pMessage) + return; + + switch (pMessage->GetClassID()) { + case CFWL_MessageType::Mouse: { + CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage); + switch (pMsg->m_dwCmd) { + case FWL_MouseCommand::LeftButtonDown: + OnLButtonDown(pMsg); + break; + case FWL_MouseCommand::LeftButtonUp: + OnLButtonUp(pMsg); + break; + case FWL_MouseCommand::Move: + break; + default: + break; + } + break; + } + case CFWL_MessageType::Deactivate: + OnDeactive(static_cast<CFWL_MsgDeactivate*>(pMessage)); + break; + case CFWL_MessageType::KillFocus: + OnFocusChanged(static_cast<CFWL_MsgKillFocus*>(pMessage), FALSE); + break; + case CFWL_MessageType::SetFocus: + OnFocusChanged(static_cast<CFWL_MsgKillFocus*>(pMessage), TRUE); + break; + default: + break; + } + IFWL_Widget::OnProcessMessage(pMessage); +} + +void IFWL_ComboBoxProxy::OnDrawWidget(CFX_Graphics* pGraphics, + const CFX_Matrix* pMatrix) { + m_pComboBox->DrawStretchHandler(pGraphics, pMatrix); +} + +void IFWL_ComboBoxProxy::OnLButtonDown(CFWL_MsgMouse* pMsg) { + const IFWL_App* pApp = GetOwnerApp(); + if (!pApp) + return; + + CFWL_NoteDriver* pDriver = + static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver()); + CFX_RectF rtWidget; + GetWidgetRect(rtWidget); + rtWidget.left = rtWidget.top = 0; + if (rtWidget.Contains(pMsg->m_fx, pMsg->m_fy)) { + m_bLButtonDown = TRUE; + pDriver->SetGrab(this, TRUE); + } else { + m_bLButtonDown = FALSE; + pDriver->SetGrab(this, FALSE); + m_pComboBox->ShowDropList(FALSE); + } +} + +void IFWL_ComboBoxProxy::OnLButtonUp(CFWL_MsgMouse* pMsg) { + m_bLButtonDown = FALSE; + const IFWL_App* pApp = GetOwnerApp(); + if (!pApp) + return; + + CFWL_NoteDriver* pDriver = + static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver()); + pDriver->SetGrab(this, FALSE); + if (m_bLButtonUpSelf) { + CFX_RectF rect; + GetWidgetRect(rect); + rect.left = rect.top = 0; + if (!rect.Contains(pMsg->m_fx, pMsg->m_fy) && + m_pComboBox->IsDropListShowed()) { + m_pComboBox->ShowDropList(FALSE); + } + } else { + m_bLButtonUpSelf = TRUE; + } +} + +void IFWL_ComboBoxProxy::OnDeactive(CFWL_MsgDeactivate* pMsg) { + m_pComboBox->ShowDropList(FALSE); +} + +void IFWL_ComboBoxProxy::OnFocusChanged(CFWL_MsgKillFocus* pMsg, FX_BOOL bSet) { + if (bSet) + return; + + if (!pMsg->m_pSetFocus) + m_pComboBox->ShowDropList(FALSE); +} |