From a1d5aa9361ecbbe6715ef29d8c69ddaa8a00d4ba Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Sat, 26 Sep 2009 09:15:29 +0000 Subject: [PATCH] Have wxComboCtrl generate wxEVT_COMMAND_COMBOBOX_DROPDOWN and wxEVT_COMMAND_COMBOBOX_CLOSEUP events git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62136 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/combo.h | 4 +-- interface/wx/combo.h | 12 ++++++++- samples/widgets/odcombobox.cpp | 14 ++++++++++ src/common/combocmn.cpp | 49 ++++++++++++++++++++++------------ 4 files changed, 59 insertions(+), 20 deletions(-) diff --git a/include/wx/combo.h b/include/wx/combo.h index 1093a26f5d..c3699fae7c 100644 --- a/include/wx/combo.h +++ b/include/wx/combo.h @@ -158,7 +158,7 @@ public: // show/hide popup window virtual void ShowPopup(); - virtual void HidePopup(); + virtual void HidePopup(bool generateEvent=false); // Override for totally custom combo action virtual void OnButtonClick(); @@ -403,7 +403,7 @@ public: bool IsCreated() const { return m_iFlags & wxCC_IFLAG_CREATED ? true : false; } // common code to be called on popup hide/dismiss - void OnPopupDismiss(); + void OnPopupDismiss(bool generateEvent); // PopupShown states enum diff --git a/interface/wx/combo.h b/interface/wx/combo.h index 12a4192eed..38ef1f9342 100644 --- a/interface/wx/combo.h +++ b/interface/wx/combo.h @@ -304,6 +304,12 @@ struct wxComboCtrlFeatures @event{EVT_TEXT_ENTER(id, func)} Process a wxEVT_COMMAND_TEXT_ENTER event, when RETURN is pressed in the combo control. + @event{EVT_COMBOX_DROPDOWN(id, func)} + Process a wxEVT_COMMAND_COMBOBOX_DROPDOWN event, which is generated + when the popup window is shown (drops down). + @event{EVT_COMBOX_CLOSEUP(id, func)} + Process a wxEVT_COMMAND_COMBOBOX_CLOSEUP event, which is generated + when the popup window of the combo control disappears (closes up). @endEventTable @library{wxbase} @@ -504,8 +510,12 @@ public: /** Dismisses the popup window. + + @param generateEvent + Set this to @true in order to generate + wxEVT_COMMAND_COMBOBOX_CLOSEUP event. */ - virtual void HidePopup(); + virtual void HidePopup(bool generateEvent=false); /** Returns @true if the popup is currently shown diff --git a/samples/widgets/odcombobox.cpp b/samples/widgets/odcombobox.cpp index ae95eab5ac..1e95683e3b 100644 --- a/samples/widgets/odcombobox.cpp +++ b/samples/widgets/odcombobox.cpp @@ -113,6 +113,8 @@ protected: void OnButtonAddMany(wxCommandEvent& event); void OnComboBox(wxCommandEvent& event); + void OnDropDown(wxCommandEvent& event); + void OnCloseUp(wxCommandEvent& event); void OnComboText(wxCommandEvent& event); void OnCheckOrRadioBox(wxCommandEvent& event); @@ -218,6 +220,8 @@ BEGIN_EVENT_TABLE(ODComboboxWidgetsPage, WidgetsPage) EVT_UPDATE_UI(ODComboPage_ChangeText, ODComboboxWidgetsPage::OnUpdateUIDeleteSelButton) EVT_UPDATE_UI(ODComboPage_DeleteSel, ODComboboxWidgetsPage::OnUpdateUIDeleteSelButton) + EVT_COMBOBOX_DROPDOWN(ODComboPage_Combo, ODComboboxWidgetsPage::OnDropDown) + EVT_COMBOBOX_CLOSEUP(ODComboPage_Combo, ODComboboxWidgetsPage::OnCloseUp) EVT_COMBOBOX(ODComboPage_Combo, ODComboboxWidgetsPage::OnComboBox) EVT_TEXT(ODComboPage_Combo, ODComboboxWidgetsPage::OnComboText) EVT_TEXT_ENTER(ODComboPage_Combo, ODComboboxWidgetsPage::OnComboText) @@ -844,4 +848,14 @@ wxBitmap ODComboboxWidgetsPage::CreateBitmap(const wxColour& colour) return bmp; } +void ODComboboxWidgetsPage::OnDropDown(wxCommandEvent& WXUNUSED(event)) +{ + wxLogMessage(wxT("Combobox dropped down")); +} + +void ODComboboxWidgetsPage::OnCloseUp(wxCommandEvent& WXUNUSED(event)) +{ + wxLogMessage(wxT("Combobox closed up")); +} + #endif //wxUSE_ODCOMBOBOX diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index 65066b56c7..c3a2334c47 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -291,7 +291,7 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) winFocused != m_combo->GetButton() // GTK (atleast) requires this ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); } event.Skip(); @@ -299,37 +299,37 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) void wxComboFrameEventHandler::OnMenuEvent( wxMenuEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnMouseEvent( wxMouseEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnClose( wxCloseEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnActivate( wxActivateEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnResize( wxSizeEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnMove( wxMoveEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } @@ -413,7 +413,7 @@ void wxComboPopupWindow::OnDismiss() wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxComboCtrlBase)), wxT("parent might not be wxComboCtrl, but check IMPLEMENT_DYNAMIC_CLASS(2) macro for correctness") ); - combo->OnPopupDismiss(); + combo->OnPopupDismiss(true); } #endif // USES_WXPOPUPTRANSIENTWINDOW @@ -476,7 +476,7 @@ void wxComboPopupWindowEvtHandler::OnActivate( wxActivateEvent& event ) if ( !event.GetActive() ) { // Tell combo control that we are dismissed. - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } @@ -551,7 +551,7 @@ bool wxComboPopup::LazyCreate() void wxComboPopup::Dismiss() { - m_combo->HidePopup(); + m_combo->HidePopup(true); } // ---------------------------------------------------------------------------- @@ -1624,7 +1624,7 @@ bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event, if ( IsPopupWindowState(Visible) && ( evtType == wxEVT_LEFT_DOWN || evtType == wxEVT_RIGHT_DOWN ) ) { - HidePopup(); + HidePopup(true); return true; } } @@ -1652,7 +1652,7 @@ void wxComboCtrlBase::HandleNormalMouseEvent( wxMouseEvent& event ) #if USES_WXPOPUPWINDOW // Click here always hides the popup. if ( m_popupWinType == POPUPWIN_WXPOPUPWINDOW ) - HidePopup(); + HidePopup(true); #endif } else @@ -1808,7 +1808,7 @@ void wxComboCtrlBase::CreatePopup() // Destroy popup window and the child control void wxComboCtrlBase::DestroyPopup() { - HidePopup(); + HidePopup(true); if ( m_popup ) m_popup->RemoveEventHandler(m_popupExtraHandler); @@ -1871,9 +1871,17 @@ void wxComboCtrlBase::OnButtonClick() // Derived classes can override this method for totally custom // popup action if ( !IsPopupWindowState(Visible) ) + { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId()); + event.SetEventObject(this); + ProcessCommand(event); + ShowPopup(); + } else - HidePopup(); + { + HidePopup(true); + } } void wxComboCtrlBase::ShowPopup() @@ -2092,7 +2100,7 @@ void wxComboCtrlBase::DoShowPopup( const wxRect& rect, int WXUNUSED(flags) ) Refresh(); } -void wxComboCtrlBase::OnPopupDismiss() +void wxComboCtrlBase::OnPopupDismiss(bool generateEvent) { // Just in case, avoid double dismiss if ( IsPopupWindowState(Hidden) ) @@ -2144,9 +2152,16 @@ void wxComboCtrlBase::OnPopupDismiss() Refresh(); SetFocus(); + + if ( generateEvent ) + { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_CLOSEUP, GetId()); + event.SetEventObject(this); + ProcessCommand(event); + } } -void wxComboCtrlBase::HidePopup() +void wxComboCtrlBase::HidePopup(bool generateEvent) { // Should be able to call this without popup interface if ( IsPopupWindowState(Hidden) ) @@ -2158,7 +2173,7 @@ void wxComboCtrlBase::HidePopup() m_winPopup->Hide(); - OnPopupDismiss(); + OnPopupDismiss(generateEvent); } // ---------------------------------------------------------------------------- -- 2.45.2