From 9d6a9fdd13ab25f0ac7c54a3ec8098f8b5c1d118 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 6 Jan 2005 12:49:20 +0000 Subject: [PATCH] Applied patched for combo box SELECTED events (no long get lots of surplus events) Applied patch for menu hihglight colour detection. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31266 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/combobox.cpp | 54 +++++++++++++++++++++++++++++++++++++------ src/gtk/settings.cpp | 32 +++++++++++++++++++++---- src/gtk1/combobox.cpp | 54 +++++++++++++++++++++++++++++++++++++------ src/gtk1/settings.cpp | 32 +++++++++++++++++++++---- 4 files changed, 150 insertions(+), 22 deletions(-) diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 6ced6dccaa..d8746af217 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -38,7 +38,7 @@ extern bool g_isIdle; //----------------------------------------------------------------------------- extern bool g_blockEventsOnDrag; - +static int g_SelectionBeforePopup = -1; //----------------------------------------------------------------------------- // "changed" - typing and list item matches get changed, select-child // if it doesn't match an item then just get a single changed @@ -68,6 +68,32 @@ gtk_dummy_callback(GtkEntry *WXUNUSED(entry), GtkCombo *WXUNUSED(combo)) { } +static void +gtk_popup_hide_callback(GtkCombo *WXUNUSED(gtk_combo), wxComboBox *combo) +{ + // when the popup is hidden, throw a SELECTED event only if the combobox + // selection changed. + int curSelection = combo->GetSelection(); + if (g_SelectionBeforePopup != curSelection) + { + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() ); + event.SetInt( curSelection ); + event.SetString( combo->GetStringSelection() ); + event.SetEventObject( combo ); + combo->GetEventHandler()->ProcessEvent( event ); + } + + // reset the selection flag to an identifiable value + g_SelectionBeforePopup = -1; +} + +static void +gtk_popup_show_callback(GtkCombo *WXUNUSED(gtk_combo), wxComboBox *combo) +{ + // store the combobox selection value before the popup is shown + g_SelectionBeforePopup = combo->GetSelection(); +} + //----------------------------------------------------------------------------- // "select-child" - click/cursor get select-child, changed, select-child //----------------------------------------------------------------------------- @@ -99,12 +125,19 @@ gtk_combo_select_child_callback( GtkList *WXUNUSED(list), GtkWidget *WXUNUSED(wi gtk_signal_connect( GTK_OBJECT(GTK_COMBO(combo->GetHandle())->entry), "changed", GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)combo ); - wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() ); - event.SetInt( curSelection ); - event.SetString( combo->GetStringSelection() ); - event.SetEventObject( combo ); - - combo->GetEventHandler()->ProcessEvent( event ); + // throw a SELECTED event only if the combobox popup is hidden + // because when combobox popup is shown, gtk_combo_select_child_callback is + // called each times the mouse is over an item with a pressed button so a lot + // of SELECTED event could be generated if the user keep the mouse button down + // and select other items ... + if (g_SelectionBeforePopup == -1) + { + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() ); + event.SetInt( curSelection ); + event.SetString( combo->GetStringSelection() ); + event.SetEventObject( combo ); + combo->GetEventHandler()->ProcessEvent( event ); + } // Now send the event ourselves wxCommandEvent event2( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() ); @@ -219,6 +252,13 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, if (style & wxCB_READONLY) gtk_entry_set_editable( GTK_ENTRY( combo->entry ), FALSE ); + // "show" and "hide" events are generated when user click on the combobox button which popups a list + // this list is the "popwin" gtk widget + gtk_signal_connect( GTK_OBJECT(GTK_COMBO(combo)->popwin), "hide", + GTK_SIGNAL_FUNC(gtk_popup_hide_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(GTK_COMBO(combo)->popwin), "show", + GTK_SIGNAL_FUNC(gtk_popup_show_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(combo->entry), "changed", GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this ); diff --git a/src/gtk/settings.cpp b/src/gtk/settings.cpp index 44b3433b3f..dede98aa35 100644 --- a/src/gtk/settings.cpp +++ b/src/gtk/settings.cpp @@ -38,7 +38,8 @@ struct wxSystemObjects m_colHighlight, m_colHighlightText, m_colListBox, - m_colBtnText; + m_colBtnText, + m_colMenuItemHighlight; wxFont m_fontSystem; }; @@ -53,7 +54,8 @@ static wxSystemObjects gs_objects; enum wxGtkWidgetType { wxGTK_BUTTON, - wxGTK_LIST + wxGTK_LIST, + wxGTK_MENUITEM }; // the colour we need @@ -84,6 +86,9 @@ static bool GetColourFromGTKWidget(int& red, int& green, int& blue, case wxGTK_LIST: widget = gtk_list_new(); + + case wxGTK_MENUITEM: + widget = gtk_menu_item_new(); } GtkStyle *def = gtk_rc_get_style( widget ); @@ -135,7 +140,6 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) { case wxSYS_COLOUR_SCROLLBAR: case wxSYS_COLOUR_BACKGROUND: - case wxSYS_COLOUR_ACTIVECAPTION: case wxSYS_COLOUR_INACTIVECAPTION: case wxSYS_COLOUR_MENU: case wxSYS_COLOUR_WINDOWFRAME: @@ -268,10 +272,30 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) case wxSYS_COLOUR_APPWORKSPACE: return *wxWHITE; // ? + case wxSYS_COLOUR_ACTIVECAPTION: + case wxSYS_COLOUR_MENUHILIGHT: + if (!gs_objects.m_colMenuItemHighlight.Ok()) + { + int red, green, blue; + if ( !GetColourFromGTKWidget(red, green, blue, + wxGTK_MENUITEM, + GTK_STATE_SELECTED, + wxGTK_BG) ) + { + red = + green = + blue = 0; + } + + gs_objects.m_colMenuItemHighlight = wxColour( red >> SHIFT, + green >> SHIFT, + blue >> SHIFT ); + } + return gs_objects.m_colMenuItemHighlight; + case wxSYS_COLOUR_HOTLIGHT: case wxSYS_COLOUR_GRADIENTACTIVECAPTION: case wxSYS_COLOUR_GRADIENTINACTIVECAPTION: - case wxSYS_COLOUR_MENUHILIGHT: // TODO return *wxBLACK; diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp index 6ced6dccaa..d8746af217 100644 --- a/src/gtk1/combobox.cpp +++ b/src/gtk1/combobox.cpp @@ -38,7 +38,7 @@ extern bool g_isIdle; //----------------------------------------------------------------------------- extern bool g_blockEventsOnDrag; - +static int g_SelectionBeforePopup = -1; //----------------------------------------------------------------------------- // "changed" - typing and list item matches get changed, select-child // if it doesn't match an item then just get a single changed @@ -68,6 +68,32 @@ gtk_dummy_callback(GtkEntry *WXUNUSED(entry), GtkCombo *WXUNUSED(combo)) { } +static void +gtk_popup_hide_callback(GtkCombo *WXUNUSED(gtk_combo), wxComboBox *combo) +{ + // when the popup is hidden, throw a SELECTED event only if the combobox + // selection changed. + int curSelection = combo->GetSelection(); + if (g_SelectionBeforePopup != curSelection) + { + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() ); + event.SetInt( curSelection ); + event.SetString( combo->GetStringSelection() ); + event.SetEventObject( combo ); + combo->GetEventHandler()->ProcessEvent( event ); + } + + // reset the selection flag to an identifiable value + g_SelectionBeforePopup = -1; +} + +static void +gtk_popup_show_callback(GtkCombo *WXUNUSED(gtk_combo), wxComboBox *combo) +{ + // store the combobox selection value before the popup is shown + g_SelectionBeforePopup = combo->GetSelection(); +} + //----------------------------------------------------------------------------- // "select-child" - click/cursor get select-child, changed, select-child //----------------------------------------------------------------------------- @@ -99,12 +125,19 @@ gtk_combo_select_child_callback( GtkList *WXUNUSED(list), GtkWidget *WXUNUSED(wi gtk_signal_connect( GTK_OBJECT(GTK_COMBO(combo->GetHandle())->entry), "changed", GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)combo ); - wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() ); - event.SetInt( curSelection ); - event.SetString( combo->GetStringSelection() ); - event.SetEventObject( combo ); - - combo->GetEventHandler()->ProcessEvent( event ); + // throw a SELECTED event only if the combobox popup is hidden + // because when combobox popup is shown, gtk_combo_select_child_callback is + // called each times the mouse is over an item with a pressed button so a lot + // of SELECTED event could be generated if the user keep the mouse button down + // and select other items ... + if (g_SelectionBeforePopup == -1) + { + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() ); + event.SetInt( curSelection ); + event.SetString( combo->GetStringSelection() ); + event.SetEventObject( combo ); + combo->GetEventHandler()->ProcessEvent( event ); + } // Now send the event ourselves wxCommandEvent event2( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() ); @@ -219,6 +252,13 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, if (style & wxCB_READONLY) gtk_entry_set_editable( GTK_ENTRY( combo->entry ), FALSE ); + // "show" and "hide" events are generated when user click on the combobox button which popups a list + // this list is the "popwin" gtk widget + gtk_signal_connect( GTK_OBJECT(GTK_COMBO(combo)->popwin), "hide", + GTK_SIGNAL_FUNC(gtk_popup_hide_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(GTK_COMBO(combo)->popwin), "show", + GTK_SIGNAL_FUNC(gtk_popup_show_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(combo->entry), "changed", GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this ); diff --git a/src/gtk1/settings.cpp b/src/gtk1/settings.cpp index 44b3433b3f..dede98aa35 100644 --- a/src/gtk1/settings.cpp +++ b/src/gtk1/settings.cpp @@ -38,7 +38,8 @@ struct wxSystemObjects m_colHighlight, m_colHighlightText, m_colListBox, - m_colBtnText; + m_colBtnText, + m_colMenuItemHighlight; wxFont m_fontSystem; }; @@ -53,7 +54,8 @@ static wxSystemObjects gs_objects; enum wxGtkWidgetType { wxGTK_BUTTON, - wxGTK_LIST + wxGTK_LIST, + wxGTK_MENUITEM }; // the colour we need @@ -84,6 +86,9 @@ static bool GetColourFromGTKWidget(int& red, int& green, int& blue, case wxGTK_LIST: widget = gtk_list_new(); + + case wxGTK_MENUITEM: + widget = gtk_menu_item_new(); } GtkStyle *def = gtk_rc_get_style( widget ); @@ -135,7 +140,6 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) { case wxSYS_COLOUR_SCROLLBAR: case wxSYS_COLOUR_BACKGROUND: - case wxSYS_COLOUR_ACTIVECAPTION: case wxSYS_COLOUR_INACTIVECAPTION: case wxSYS_COLOUR_MENU: case wxSYS_COLOUR_WINDOWFRAME: @@ -268,10 +272,30 @@ wxColour wxSystemSettingsNative::GetColour( wxSystemColour index ) case wxSYS_COLOUR_APPWORKSPACE: return *wxWHITE; // ? + case wxSYS_COLOUR_ACTIVECAPTION: + case wxSYS_COLOUR_MENUHILIGHT: + if (!gs_objects.m_colMenuItemHighlight.Ok()) + { + int red, green, blue; + if ( !GetColourFromGTKWidget(red, green, blue, + wxGTK_MENUITEM, + GTK_STATE_SELECTED, + wxGTK_BG) ) + { + red = + green = + blue = 0; + } + + gs_objects.m_colMenuItemHighlight = wxColour( red >> SHIFT, + green >> SHIFT, + blue >> SHIFT ); + } + return gs_objects.m_colMenuItemHighlight; + case wxSYS_COLOUR_HOTLIGHT: case wxSYS_COLOUR_GRADIENTACTIVECAPTION: case wxSYS_COLOUR_GRADIENTINACTIVECAPTION: - case wxSYS_COLOUR_MENUHILIGHT: // TODO return *wxBLACK;