From: Vadim Zeitlin Date: Wed, 18 Mar 2009 10:42:58 +0000 (+0000) Subject: add combobox drop down/close up events (closes #10587) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/8933fbc62e616831f1708b063f6a369221b1934c add combobox drop down/close up events (closes #10587) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59603 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index fda269e22e..3fcf75e5f0 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -403,6 +403,7 @@ All (GUI): - Also added wxCANCEL_DEFAULT to wxMessageDialog. - Allow copying text in the log dialogs. - Added multisample (anti-aliasing) support to wxGLCanvas (Olivier Playez). +- Added wxEVT_COMMAND_COMBOBOX_DROPDOWN/CLOSEUP events (Igor Korot). - Added wxCAL_SHOW_WEEK_NUMBERS wxCalendarCtrl style (Sören Meyer-Eppler). - Initialize wx{Client,Paint,Window}DC with fonts/colours of its window. - Added wxNativeContainerWindow to allow embedding wx into native windows. diff --git a/include/wx/event.h b/include/wx/event.h index ab5ee9ced1..5f03364ba1 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -596,6 +596,8 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCo wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOL_RCLICKED, wxCommandEvent); wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, wxCommandEvent); wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOL_ENTER, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEvent); // Thread events wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_THREAD, wxThreadEvent); @@ -3749,6 +3751,8 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent& #define EVT_TOOL_RCLICKED_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_TOOL_RCLICKED, id1, id2, wxCommandEventHandler(func)) #define EVT_TOOL_ENTER(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_ENTER, winid, wxCommandEventHandler(func)) #define EVT_CHECKLISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX_DROPDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_COMBOBOX_DROPDOWN, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX_CLOSEUP(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_COMBOBOX_CLOSEUP, winid, wxCommandEventHandler(func)) // Generic command events #define EVT_COMMAND_LEFT_CLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LEFT_CLICK, winid, wxCommandEventHandler(func)) diff --git a/interface/wx/combobox.h b/interface/wx/combobox.h index c3ac2859d0..1e344758af 100644 --- a/interface/wx/combobox.h +++ b/interface/wx/combobox.h @@ -54,6 +54,16 @@ Process a wxEVT_COMMAND_TEXT_ENTER event, when RETURN is pressed in the combobox (notice that the combobox must have been created with wxTE_PROCESS_ENTER style to receive this event). + @event{EVT_COMBOX_DROPDOWN(id, func)} + Process a wxEVT_COMMAND_COMBOBOX_DROPDOWN event, which is generated + when the list box part of the combo box is shown (drops down). + Notice that this event is currently only supported by wxMSW and + wxGTK with GTK+ 2.10 or later. + @event{EVT_COMBOX_CLOSEUP(id, func)} + Process a wxEVT_COMMAND_COMBOBOX_CLOSEUP event, which is generated + when the list box of the combo box disappears (closes up). This + event is only generated for the same platforms as + wxEVT_COMMAND_COMBOBOX_DROPDOWN above. @endEventTable @library{wxcore} diff --git a/samples/widgets/combobox.cpp b/samples/widgets/combobox.cpp index 5916101b6e..ecaea3e419 100644 --- a/samples/widgets/combobox.cpp +++ b/samples/widgets/combobox.cpp @@ -114,6 +114,8 @@ protected: void OnButtonSetValue(wxCommandEvent& event); void OnButtonSetCurrent(wxCommandEvent& event); + void OnDropdown(wxCommandEvent& event); + void OnCloseup(wxCommandEvent& event); void OnComboBox(wxCommandEvent& event); void OnComboText(wxCommandEvent& event); @@ -199,6 +201,8 @@ BEGIN_EVENT_TABLE(ComboboxWidgetsPage, WidgetsPage) EVT_UPDATE_UI(ComboPage_SetCurrent, ComboboxWidgetsPage::OnUpdateUISetCurrent) EVT_COMBOBOX(ComboPage_Combo, ComboboxWidgetsPage::OnComboBox) + EVT_COMBOBOX_DROPDOWN(ComboPage_Combo, ComboboxWidgetsPage::OnDropdown) + EVT_COMBOBOX_CLOSEUP(ComboPage_Combo, ComboboxWidgetsPage::OnCloseup) EVT_TEXT(ComboPage_Combo, ComboboxWidgetsPage::OnComboText) EVT_TEXT_ENTER(ComboPage_Combo, ComboboxWidgetsPage::OnComboText) @@ -636,6 +640,16 @@ void ComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event)) CreateCombo(); } +void ComboboxWidgetsPage::OnDropdown(wxCommandEvent& WXUNUSED(event)) +{ + wxLogMessage(_T("Combobox dropped down")); +} + +void ComboboxWidgetsPage::OnCloseup(wxCommandEvent& WXUNUSED(event)) +{ + wxLogMessage(_T("Combobox closed up")); +} + #endif //wxUSE_COMBOBOX #endif diff --git a/src/common/event.cpp b/src/common/event.cpp index 2a4ff7954e..1024c50332 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -177,6 +177,8 @@ wxDEFINE_EVENT( wxEVT_COMMAND_TOOL_ENTER, wxCommandEvent ); wxDEFINE_EVENT( wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEvent ); wxDEFINE_EVENT( wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, wxCommandEvent ); wxDEFINE_EVENT( wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, wxCommandEvent ); +wxDEFINE_EVENT( wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEvent); +wxDEFINE_EVENT( wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEvent); // Mouse event types wxDEFINE_EVENT( wxEVT_LEFT_DOWN, wxMouseEvent ); diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 7b0fe35ba7..fb9623a2ba 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -44,6 +44,20 @@ gtkcombobox_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) { combo->SendSelectionChangedEvent(wxEVT_COMMAND_COMBOBOX_SELECTED); } + +static void +gtkcombobox_popupshown_callback(GObject *WXUNUSED(gobject), + GParamSpec *WXUNUSED(param_spec), + wxComboBox *combo) +{ + gboolean isShown; + g_object_get( combo->m_widget, "popup-shown", &isShown, NULL ); + wxCommandEvent event( isShown ? wxEVT_COMMAND_COMBOBOX_DROPDOWN + : wxEVT_COMMAND_COMBOBOX_CLOSEUP, + combo->GetId() ); + event.SetEventObject( combo ); + combo->HandleWindowEvent( event ); +} } //----------------------------------------------------------------------------- @@ -158,6 +172,12 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, g_signal_connect_after (m_widget, "changed", G_CALLBACK (gtkcombobox_changed_callback), this); + if ( gtk_check_version(2,10,0) ) + { + g_signal_connect (m_widget, "notify::popup-shown", + G_CALLBACK (gtkcombobox_popupshown_callback), this); + } + SetInitialSize(size); // need this too because this is a wxControlWithItems return true; @@ -210,6 +230,8 @@ void wxComboBox::DisableEvents() g_signal_handlers_block_by_func(m_widget, (gpointer)gtkcombobox_changed_callback, this); + g_signal_handlers_block_by_func(m_widget, + (gpointer)gtkcombobox_popupshown_callback, this); } void wxComboBox::EnableEvents() @@ -220,6 +242,8 @@ void wxComboBox::EnableEvents() g_signal_handlers_unblock_by_func(m_widget, (gpointer)gtkcombobox_changed_callback, this); + g_signal_handlers_unblock_by_func(m_widget, + (gpointer)gtkcombobox_popupshown_callback, this); } GtkWidget* wxComboBox::GetConnectWidget() diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index 7ae8dfc956..bc36474d1a 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -342,8 +342,19 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD id) // down is cancelled (see #8474) m_lastAcceptedSelection = wxID_NONE; } + { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId()); + event.SetEventObject(this); + ProcessCommand(event); + } + break; + case CBN_CLOSEUP: + { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_CLOSEUP, GetId()); + event.SetEventObject(this); + ProcessCommand(event); + } break; - case CBN_SELENDOK: #ifndef __SMARTPHONE__ // we need to reset this to prevent the selection from being undone