//-----------------------------------------------------------------------------
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
{
}
+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
//-----------------------------------------------------------------------------
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() );
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 );
m_colHighlight,
m_colHighlightText,
m_colListBox,
- m_colBtnText;
+ m_colBtnText,
+ m_colMenuItemHighlight;
wxFont m_fontSystem;
};
enum wxGtkWidgetType
{
wxGTK_BUTTON,
- wxGTK_LIST
+ wxGTK_LIST,
+ wxGTK_MENUITEM
};
// the colour we need
case wxGTK_LIST:
widget = gtk_list_new();
+
+ case wxGTK_MENUITEM:
+ widget = gtk_menu_item_new();
}
GtkStyle *def = gtk_rc_get_style( widget );
{
case wxSYS_COLOUR_SCROLLBAR:
case wxSYS_COLOUR_BACKGROUND:
- case wxSYS_COLOUR_ACTIVECAPTION:
case wxSYS_COLOUR_INACTIVECAPTION:
case wxSYS_COLOUR_MENU:
case wxSYS_COLOUR_WINDOWFRAME:
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;
//-----------------------------------------------------------------------------
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
{
}
+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
//-----------------------------------------------------------------------------
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() );
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 );
m_colHighlight,
m_colHighlightText,
m_colListBox,
- m_colBtnText;
+ m_colBtnText,
+ m_colMenuItemHighlight;
wxFont m_fontSystem;
};
enum wxGtkWidgetType
{
wxGTK_BUTTON,
- wxGTK_LIST
+ wxGTK_LIST,
+ wxGTK_MENUITEM
};
// the colour we need
case wxGTK_LIST:
widget = gtk_list_new();
+
+ case wxGTK_MENUITEM:
+ widget = gtk_menu_item_new();
}
GtkStyle *def = gtk_rc_get_style( widget );
{
case wxSYS_COLOUR_SCROLLBAR:
case wxSYS_COLOUR_BACKGROUND:
- case wxSYS_COLOUR_ACTIVECAPTION:
case wxSYS_COLOUR_INACTIVECAPTION:
case wxSYS_COLOUR_MENU:
case wxSYS_COLOUR_WINDOWFRAME:
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;