removed all compile- and run-time checks for GTK+ < 2.4; don't include the generic files which are now never used in wxGTK in the build
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49660 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -21,148 +21,12 @@
|
||||
#include "wx/arrstr.h"
|
||||
#endif
|
||||
|
||||
// We use GtkCombo which has been deprecated since GTK+ 2.3.0
|
||||
// in favour of GtkComboBox for <GTK2.4 runtime
|
||||
// We also use GtkList
|
||||
#ifdef GTK_DISABLE_DEPRECATED
|
||||
#undef GTK_DISABLE_DEPRECATED
|
||||
#endif
|
||||
#include "wx/gtk/private.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// data
|
||||
//-----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
// GTK callbacks
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
extern bool g_blockEventsOnDrag;
|
||||
static int g_SelectionBeforePopup = wxID_NONE; // this means the popup is hidden
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "changed" - typing and list item matches get changed, select-child
|
||||
// if it doesn't match an item then just get a single changed
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
extern "C" {
|
||||
static void
|
||||
gtkcombo_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
|
||||
{
|
||||
if (combo->m_ignoreNextUpdate)
|
||||
{
|
||||
combo->m_ignoreNextUpdate = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!combo->m_hasVMT) return;
|
||||
|
||||
wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() );
|
||||
event.SetString( combo->GetValue() );
|
||||
event.SetEventObject( combo );
|
||||
combo->GetEventHandler()->ProcessEvent( event );
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
static void
|
||||
gtkcombo_dummy_callback(GtkEntry *WXUNUSED(entry), GtkCombo *WXUNUSED(combo))
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
static void
|
||||
gtkcombo_popup_hide_callback(GtkCombo *WXUNUSED(gtk_combo), wxComboBox *combo)
|
||||
{
|
||||
// when the popup is hidden, throw a SELECTED event only if the combobox
|
||||
// selection changed.
|
||||
const int curSelection = combo->GetCurrentSelection();
|
||||
|
||||
const bool hasChanged = curSelection != g_SelectionBeforePopup;
|
||||
|
||||
// reset the selection flag to value meaning that it is hidden and do it
|
||||
// now, before generating the events, so that GetSelection() returns the
|
||||
// new value from the event handler
|
||||
g_SelectionBeforePopup = wxID_NONE;
|
||||
|
||||
if ( hasChanged )
|
||||
{
|
||||
wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() );
|
||||
event.SetInt( curSelection );
|
||||
event.SetString( combo->GetStringSelection() );
|
||||
event.SetEventObject( combo );
|
||||
combo->GetEventHandler()->ProcessEvent( event );
|
||||
|
||||
// for consistency with the other ports, send TEXT event
|
||||
wxCommandEvent event2( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() );
|
||||
event2.SetString( combo->GetStringSelection() );
|
||||
event2.SetEventObject( combo );
|
||||
combo->GetEventHandler()->ProcessEvent( event2 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
static void
|
||||
gtkcombo_popup_show_callback(GtkCombo *WXUNUSED(gtk_combo), wxComboBox *combo)
|
||||
{
|
||||
// store the combobox selection value before the popup is shown
|
||||
g_SelectionBeforePopup = combo->GetCurrentSelection();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "select-child" - click/cursor get select-child, changed, select-child
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
extern "C" {
|
||||
static void
|
||||
gtkcombo_combo_select_child_callback( GtkList *WXUNUSED(list), GtkWidget *WXUNUSED(widget), wxComboBox *combo )
|
||||
{
|
||||
if (!combo->m_hasVMT) return;
|
||||
|
||||
if (g_blockEventsOnDrag) return;
|
||||
|
||||
int curSelection = combo->GetCurrentSelection();
|
||||
|
||||
if (combo->m_prevSelection == curSelection) return;
|
||||
|
||||
GtkWidget *list = GTK_COMBO(combo->m_widget)->list;
|
||||
gtk_list_unselect_item( GTK_LIST(list), combo->m_prevSelection );
|
||||
|
||||
combo->m_prevSelection = curSelection;
|
||||
|
||||
// Quickly set the value of the combo box
|
||||
// as GTK+ does that only AFTER the event
|
||||
// is sent.
|
||||
GtkWidget* entry = GTK_COMBO(combo->GetHandle())->entry;
|
||||
g_signal_handlers_block_by_func(
|
||||
entry, (gpointer)gtkcombo_text_changed_callback, combo);
|
||||
combo->SetValue( combo->GetStringSelection() );
|
||||
g_signal_handlers_unblock_by_func(
|
||||
entry, (gpointer)gtkcombo_text_changed_callback, combo);
|
||||
|
||||
// throw a SELECTED event only if the combobox popup is hidden (wxID_NONE)
|
||||
// because when combobox popup is shown, gtkcombo_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 == wxID_NONE)
|
||||
{
|
||||
wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() );
|
||||
event.SetInt( curSelection );
|
||||
event.SetString( combo->GetStringSelection() );
|
||||
event.SetEventObject( combo );
|
||||
combo->GetEventHandler()->ProcessEvent( event );
|
||||
|
||||
// for consistency with the other ports, don't generate text update
|
||||
// events while the user is browsing the combobox neither
|
||||
wxCommandEvent event2( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() );
|
||||
event2.SetString( combo->GetValue() );
|
||||
event2.SetEventObject( combo );
|
||||
combo->GetEventHandler()->ProcessEvent( event2 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
extern "C" {
|
||||
static void
|
||||
gtkcombobox_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
|
||||
@@ -174,9 +38,7 @@ gtkcombobox_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *comb
|
||||
event.SetEventObject( combo );
|
||||
combo->GetEventHandler()->ProcessEvent( event );
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
static void
|
||||
gtkcombobox_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
|
||||
{
|
||||
@@ -193,8 +55,6 @@ gtkcombobox_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxComboBox
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -202,7 +62,6 @@ gtkcombobox_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxComboBox,wxControl)
|
||||
|
||||
BEGIN_EVENT_TABLE(wxComboBox, wxControl)
|
||||
EVT_SIZE(wxComboBox::OnSize)
|
||||
EVT_CHAR(wxComboBox::OnChar)
|
||||
|
||||
EVT_MENU(wxID_CUT, wxComboBox::OnCut)
|
||||
@@ -255,111 +114,47 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
|
||||
if(HasFlag(wxCB_SORT))
|
||||
m_strings = new wxSortedArrayString();
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
m_widget = gtk_combo_box_entry_new_text();
|
||||
m_widget = gtk_combo_box_entry_new_text();
|
||||
|
||||
gtk_entry_set_editable( GTK_ENTRY( GTK_BIN(m_widget)->child ), TRUE );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
m_widget = gtk_combo_new();
|
||||
GtkCombo* combo = GTK_COMBO(m_widget);
|
||||
GtkEntry * const entry = GetEntry();
|
||||
|
||||
// Disable GTK's broken events ...
|
||||
g_signal_handler_disconnect (combo->entry, combo->entry_change_id);
|
||||
// ... and add surrogate handler.
|
||||
combo->entry_change_id = g_signal_connect (combo->entry, "changed",
|
||||
G_CALLBACK (gtkcombo_dummy_callback),
|
||||
combo);
|
||||
|
||||
// make it more useable
|
||||
gtk_combo_set_use_arrows_always( GTK_COMBO(m_widget), TRUE );
|
||||
|
||||
// and case-sensitive
|
||||
gtk_combo_set_case_sensitive( GTK_COMBO(m_widget), TRUE );
|
||||
|
||||
if (style & wxNO_BORDER)
|
||||
g_object_set (combo->entry, "has-frame", FALSE, NULL );
|
||||
}
|
||||
gtk_entry_set_editable( entry, TRUE );
|
||||
|
||||
Append(n, choices);
|
||||
|
||||
m_parent->DoAddChild( this );
|
||||
|
||||
GtkEntry *entry = NULL;
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
entry = GTK_ENTRY( GTK_BIN(m_widget)->child );
|
||||
else
|
||||
#endif
|
||||
entry = GTK_ENTRY( GTK_COMBO(m_widget)->entry );
|
||||
|
||||
m_focusWidget = GTK_WIDGET( entry );
|
||||
|
||||
PostCreation(size);
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
ConnectWidget( m_widget );
|
||||
else
|
||||
#endif
|
||||
ConnectWidget( GTK_COMBO(m_widget)->button );
|
||||
ConnectWidget( m_widget );
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
gtk_entry_set_text( entry, wxGTK_CONV(value) );
|
||||
gtk_entry_set_text( entry, wxGTK_CONV(value) );
|
||||
|
||||
if (style & wxCB_READONLY)
|
||||
gtk_entry_set_editable( entry, FALSE );
|
||||
if (style & wxCB_READONLY)
|
||||
gtk_entry_set_editable( entry, FALSE );
|
||||
|
||||
g_signal_connect_after (entry, "changed",
|
||||
G_CALLBACK (gtkcombobox_text_changed_callback), this);
|
||||
g_signal_connect_after (entry, "changed",
|
||||
G_CALLBACK (gtkcombobox_text_changed_callback), this);
|
||||
|
||||
g_signal_connect_after (m_widget, "changed",
|
||||
G_CALLBACK (gtkcombobox_changed_callback), this);
|
||||
g_signal_connect_after (m_widget, "changed",
|
||||
G_CALLBACK (gtkcombobox_changed_callback), this);
|
||||
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
GtkCombo *combo = GTK_COMBO(m_widget);
|
||||
// MSW's combo box shows the value and the selection is -1
|
||||
gtk_entry_set_text( entry, wxGTK_CONV(value) );
|
||||
gtk_list_unselect_all( GTK_LIST(combo->list) );
|
||||
|
||||
if (style & wxCB_READONLY)
|
||||
gtk_entry_set_editable( 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
|
||||
g_signal_connect (GTK_COMBO(combo)->popwin, "hide",
|
||||
G_CALLBACK (gtkcombo_popup_hide_callback), this);
|
||||
g_signal_connect (GTK_COMBO(combo)->popwin, "show",
|
||||
G_CALLBACK (gtkcombo_popup_show_callback), this);
|
||||
g_signal_connect_after (combo->list, "select-child",
|
||||
G_CALLBACK (gtkcombo_combo_select_child_callback),
|
||||
this);
|
||||
g_signal_connect_after (entry, "changed",
|
||||
G_CALLBACK (gtkcombo_text_changed_callback), this);
|
||||
}
|
||||
|
||||
SetInitialSize(size); // need this too because this is a wxControlWithItems
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
GtkEntry *wxComboBox::GetEntry() const
|
||||
{
|
||||
return GTK_ENTRY(GTK_BIN(m_widget)->child);
|
||||
}
|
||||
|
||||
GtkEditable *wxComboBox::GetEditable() const
|
||||
{
|
||||
#ifdef __WXGTK24__
|
||||
if ( !gtk_check_version(2,4,0) )
|
||||
return GTK_EDITABLE( GTK_BIN(m_widget)->child );
|
||||
else
|
||||
#endif
|
||||
return GTK_EDITABLE( GTK_COMBO(m_widget)->entry );
|
||||
return GTK_EDITABLE( GTK_BIN(m_widget)->child );
|
||||
}
|
||||
|
||||
wxComboBox::~wxComboBox()
|
||||
@@ -393,60 +188,19 @@ int wxComboBox::DoInsertItems(const wxArrayStringsAdapter & items,
|
||||
|
||||
int n = wxNOT_FOUND;
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
for( int i = 0; i < count; ++i )
|
||||
{
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
for( int i = 0; i < count; ++i )
|
||||
{
|
||||
n = pos + i;
|
||||
// If sorted, use this wxSortedArrayStrings to determine
|
||||
// the right insertion point
|
||||
if(m_strings)
|
||||
n = m_strings->Add(items[i]);
|
||||
n = pos + i;
|
||||
// If sorted, use this wxSortedArrayStrings to determine
|
||||
// the right insertion point
|
||||
if(m_strings)
|
||||
n = m_strings->Add(items[i]);
|
||||
|
||||
gtk_combo_box_insert_text( combobox, n, wxGTK_CONV( items[i] ) );
|
||||
gtk_combo_box_insert_text( combobox, n, wxGTK_CONV( items[i] ) );
|
||||
|
||||
m_clientData.Insert( NULL, n );
|
||||
AssignNewItemClientData(n, clientData, i, type);
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
DisableEvents();
|
||||
|
||||
GtkWidget *list = GTK_COMBO(m_widget)->list;
|
||||
for( int i = 0; i < count; ++i )
|
||||
{
|
||||
n = pos + i;
|
||||
// If sorted, use this wxSortedArrayStrings to determine
|
||||
// the right insertion point
|
||||
if(m_strings)
|
||||
n = m_strings->Add(items[i]);
|
||||
|
||||
GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( items[i] ) );
|
||||
|
||||
// TODO construct a list with all items and call gtk_list_insert_items once?
|
||||
GList *gitem_list = g_list_alloc ();
|
||||
gitem_list->data = list_item;
|
||||
gtk_list_insert_items( GTK_LIST (list), gitem_list, n );
|
||||
|
||||
m_clientData.Insert( NULL, n );
|
||||
AssignNewItemClientData(n, clientData, i, type);
|
||||
|
||||
if (GTK_WIDGET_REALIZED(m_widget))
|
||||
{
|
||||
gtk_widget_realize( list_item );
|
||||
gtk_widget_realize( GTK_BIN(list_item)->child );
|
||||
|
||||
ApplyWidgetStyle();
|
||||
}
|
||||
|
||||
gtk_widget_show( list_item );
|
||||
}
|
||||
|
||||
EnableEvents();
|
||||
m_clientData.Insert( NULL, n );
|
||||
AssignNewItemClientData(n, clientData, i, type);
|
||||
}
|
||||
|
||||
InvalidateBestSize();
|
||||
@@ -470,20 +224,10 @@ void wxComboBox::DoClear()
|
||||
|
||||
DisableEvents();
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
const unsigned int count = GetCount();
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
gtk_combo_box_remove_text( combobox, 0 );
|
||||
}
|
||||
else // GTK+ < 2.4.0
|
||||
#endif // __WXGTK24__
|
||||
{
|
||||
GtkWidget *list = GTK_COMBO(m_widget)->list;
|
||||
gtk_list_clear_items( GTK_LIST(list), 0, GetCount() );
|
||||
}
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
const unsigned int count = GetCount();
|
||||
for (unsigned int i = 0; i < count; i++)
|
||||
gtk_combo_box_remove_text( combobox, 0 );
|
||||
|
||||
m_clientData.Clear();
|
||||
|
||||
@@ -499,35 +243,10 @@ void wxComboBox::DoDeleteOneItem(unsigned int n)
|
||||
{
|
||||
wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
wxCHECK_RET( IsValid(n), wxT("invalid index") );
|
||||
wxCHECK_RET( IsValid(n), wxT("invalid index") );
|
||||
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
gtk_combo_box_remove_text( combobox, n );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
GtkList *listbox = GTK_LIST( GTK_COMBO(m_widget)->list );
|
||||
|
||||
GList *child = g_list_nth( listbox->children, n );
|
||||
|
||||
if (!child)
|
||||
{
|
||||
wxFAIL_MSG(wxT("wrong index"));
|
||||
return;
|
||||
}
|
||||
|
||||
DisableEvents();
|
||||
|
||||
GList *list = g_list_append( (GList*) NULL, child->data );
|
||||
gtk_list_remove_items( listbox, list );
|
||||
g_list_free( list );
|
||||
|
||||
EnableEvents();
|
||||
}
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
gtk_combo_box_remove_text( combobox, n );
|
||||
|
||||
m_clientData.RemoveAt( n );
|
||||
if(m_strings)
|
||||
@@ -540,39 +259,18 @@ void wxComboBox::SetString(unsigned int n, const wxString &text)
|
||||
{
|
||||
wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
wxCHECK_RET( IsValid(n), wxT("invalid index") );
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
wxCHECK_RET( IsValid(n), wxT("invalid index") );
|
||||
|
||||
GtkTreeModel *model = gtk_combo_box_get_model( combobox );
|
||||
GtkTreeIter iter;
|
||||
if (gtk_tree_model_iter_nth_child (model, &iter, NULL, n))
|
||||
{
|
||||
GValue value = { 0, };
|
||||
g_value_init( &value, G_TYPE_STRING );
|
||||
g_value_set_string( &value, wxGTK_CONV( text ) );
|
||||
gtk_list_store_set_value( GTK_LIST_STORE(model), &iter, 0, &value );
|
||||
g_value_unset( &value );
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
GtkTreeModel *model = gtk_combo_box_get_model( combobox );
|
||||
GtkTreeIter iter;
|
||||
if (gtk_tree_model_iter_nth_child (model, &iter, NULL, n))
|
||||
{
|
||||
GtkWidget *list = GTK_COMBO(m_widget)->list;
|
||||
|
||||
GList *child = g_list_nth( GTK_LIST(list)->children, n );
|
||||
if (child)
|
||||
{
|
||||
GtkBin *bin = GTK_BIN( child->data );
|
||||
GtkLabel *label = GTK_LABEL( bin->child );
|
||||
gtk_label_set_text(label, wxGTK_CONV(text));
|
||||
}
|
||||
else
|
||||
{
|
||||
wxFAIL_MSG( wxT("wxComboBox: wrong index") );
|
||||
}
|
||||
GValue value = { 0, };
|
||||
g_value_init( &value, G_TYPE_STRING );
|
||||
g_value_set_string( &value, wxGTK_CONV( text ) );
|
||||
gtk_list_store_set_value( GTK_LIST_STORE(model), &iter, 0, &value );
|
||||
g_value_unset( &value );
|
||||
}
|
||||
|
||||
InvalidateBestSize();
|
||||
@@ -582,100 +280,42 @@ int wxComboBox::FindString( const wxString &item, bool bCase ) const
|
||||
{
|
||||
wxCHECK_MSG( m_widget != NULL, wxNOT_FOUND, wxT("invalid combobox") );
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
GtkTreeModel* model = gtk_combo_box_get_model( combobox );
|
||||
GtkTreeIter iter;
|
||||
gtk_tree_model_get_iter_first( model, &iter );
|
||||
if (!gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter ))
|
||||
return -1;
|
||||
int count = 0;
|
||||
do
|
||||
{
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
GtkTreeModel* model = gtk_combo_box_get_model( combobox );
|
||||
GtkTreeIter iter;
|
||||
gtk_tree_model_get_iter_first( model, &iter );
|
||||
if (!gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter ))
|
||||
return -1;
|
||||
int count = 0;
|
||||
do
|
||||
{
|
||||
GValue value = { 0, };
|
||||
gtk_tree_model_get_value( model, &iter, 0, &value );
|
||||
wxString str = wxGTK_CONV_BACK( g_value_get_string( &value ) );
|
||||
g_value_unset( &value );
|
||||
GValue value = { 0, };
|
||||
gtk_tree_model_get_value( model, &iter, 0, &value );
|
||||
wxString str = wxGTK_CONV_BACK( g_value_get_string( &value ) );
|
||||
g_value_unset( &value );
|
||||
|
||||
if (item.IsSameAs( str, bCase ) )
|
||||
return count;
|
||||
if (item.IsSameAs( str, bCase ) )
|
||||
return count;
|
||||
|
||||
count++;
|
||||
|
||||
} while (gtk_tree_model_iter_next( model, &iter ));
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
GtkWidget *list = GTK_COMBO(m_widget)->list;
|
||||
|
||||
GList *child = GTK_LIST(list)->children;
|
||||
int count = 0;
|
||||
while (child)
|
||||
{
|
||||
GtkBin *bin = GTK_BIN( child->data );
|
||||
GtkLabel *label = GTK_LABEL( bin->child );
|
||||
wxString str( wxGTK_CONV_BACK( gtk_label_get_text(label) ) );
|
||||
|
||||
if (item.IsSameAs( str , bCase ) )
|
||||
return count;
|
||||
|
||||
count++;
|
||||
child = child->next;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
while ( gtk_tree_model_iter_next(model, &iter) );
|
||||
|
||||
return wxNOT_FOUND;
|
||||
}
|
||||
|
||||
int wxComboBox::GetSelection() const
|
||||
{
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
return gtk_combo_box_get_active( combobox );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
// if the popup is currently opened, use the selection as it had been
|
||||
// before it dropped down
|
||||
return g_SelectionBeforePopup == wxID_NONE ? GetCurrentSelection()
|
||||
: g_SelectionBeforePopup;
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
return gtk_combo_box_get_active( combobox );
|
||||
}
|
||||
|
||||
int wxComboBox::GetCurrentSelection() const
|
||||
{
|
||||
wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid combobox") );
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
return gtk_combo_box_get_active( combobox );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
GtkWidget *list = GTK_COMBO(m_widget)->list;
|
||||
|
||||
GList *selection = GTK_LIST(list)->selection;
|
||||
if (selection)
|
||||
{
|
||||
GList *child = GTK_LIST(list)->children;
|
||||
int count = 0;
|
||||
while (child)
|
||||
{
|
||||
if (child->data == selection->data) return count;
|
||||
count++;
|
||||
child = child->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
return gtk_combo_box_get_active( combobox );
|
||||
}
|
||||
|
||||
wxString wxComboBox::GetString(unsigned int n) const
|
||||
@@ -684,37 +324,16 @@ wxString wxComboBox::GetString(unsigned int n) const
|
||||
|
||||
wxString str;
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
GtkTreeModel *model = gtk_combo_box_get_model( combobox );
|
||||
GtkTreeIter iter;
|
||||
if (gtk_tree_model_iter_nth_child (model, &iter, NULL, n))
|
||||
{
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
GtkTreeModel *model = gtk_combo_box_get_model( combobox );
|
||||
GtkTreeIter iter;
|
||||
if (gtk_tree_model_iter_nth_child (model, &iter, NULL, n))
|
||||
{
|
||||
GValue value = { 0, };
|
||||
gtk_tree_model_get_value( model, &iter, 0, &value );
|
||||
wxString tmp = wxGTK_CONV_BACK( g_value_get_string( &value ) );
|
||||
g_value_unset( &value );
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
GtkWidget *list = GTK_COMBO(m_widget)->list;
|
||||
|
||||
GList *child = g_list_nth( GTK_LIST(list)->children, n );
|
||||
if (child)
|
||||
{
|
||||
GtkBin *bin = GTK_BIN( child->data );
|
||||
GtkLabel *label = GTK_LABEL( bin->child );
|
||||
str = wxGTK_CONV_BACK( gtk_label_get_text(label) );
|
||||
}
|
||||
else
|
||||
{
|
||||
wxFAIL_MSG( wxT("wxComboBox: wrong index") );
|
||||
}
|
||||
GValue value = { 0, };
|
||||
gtk_tree_model_get_value( model, &iter, 0, &value );
|
||||
wxString tmp = wxGTK_CONV_BACK( g_value_get_string( &value ) );
|
||||
g_value_unset( &value );
|
||||
return tmp;
|
||||
}
|
||||
|
||||
return str;
|
||||
@@ -724,34 +343,16 @@ unsigned int wxComboBox::GetCount() const
|
||||
{
|
||||
wxCHECK_MSG( m_widget != NULL, 0, wxT("invalid combobox") );
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
GtkTreeModel* model = gtk_combo_box_get_model( combobox );
|
||||
GtkTreeIter iter;
|
||||
gtk_tree_model_get_iter_first( model, &iter );
|
||||
if (!gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter ))
|
||||
return 0;
|
||||
unsigned int ret = 1;
|
||||
while (gtk_tree_model_iter_next( model, &iter ))
|
||||
ret++;
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
GtkWidget *list = GTK_COMBO(m_widget)->list;
|
||||
|
||||
GList *child = GTK_LIST(list)->children;
|
||||
unsigned int count = 0;
|
||||
while (child)
|
||||
{
|
||||
count++;
|
||||
child = child->next;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
GtkTreeModel* model = gtk_combo_box_get_model( combobox );
|
||||
GtkTreeIter iter;
|
||||
gtk_tree_model_get_iter_first( model, &iter );
|
||||
if (!gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter ))
|
||||
return 0;
|
||||
unsigned int ret = 1;
|
||||
while (gtk_tree_model_iter_next( model, &iter ))
|
||||
ret++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void wxComboBox::SetSelection( int n )
|
||||
@@ -760,20 +361,8 @@ void wxComboBox::SetSelection( int n )
|
||||
|
||||
DisableEvents();
|
||||
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
gtk_combo_box_set_active( combobox, n );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
GtkWidget *list = GTK_COMBO(m_widget)->list;
|
||||
gtk_list_unselect_item( GTK_LIST(list), m_prevSelection );
|
||||
gtk_list_select_item( GTK_LIST(list), n );
|
||||
m_prevSelection = n;
|
||||
}
|
||||
GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
|
||||
gtk_combo_box_set_active( combobox, n );
|
||||
|
||||
EnableEvents();
|
||||
}
|
||||
@@ -806,131 +395,32 @@ void wxComboBox::OnChar( wxKeyEvent &event )
|
||||
|
||||
void wxComboBox::DisableEvents()
|
||||
{
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
g_signal_handlers_block_by_func(GTK_BIN(m_widget)->child,
|
||||
(gpointer)gtkcombobox_text_changed_callback, this);
|
||||
g_signal_handlers_block_by_func(GTK_BIN(m_widget)->child,
|
||||
(gpointer)gtkcombobox_text_changed_callback, this);
|
||||
|
||||
g_signal_handlers_block_by_func(m_widget,
|
||||
(gpointer)gtkcombobox_changed_callback, this);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
g_signal_handlers_block_by_func(GTK_COMBO(m_widget)->list,
|
||||
(gpointer) gtkcombo_combo_select_child_callback, this);
|
||||
|
||||
g_signal_handlers_block_by_func(GTK_COMBO(m_widget)->entry,
|
||||
(gpointer) gtkcombo_text_changed_callback, this);
|
||||
}
|
||||
g_signal_handlers_block_by_func(m_widget,
|
||||
(gpointer)gtkcombobox_changed_callback, this);
|
||||
}
|
||||
|
||||
void wxComboBox::EnableEvents()
|
||||
{
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
g_signal_handlers_unblock_by_func(GTK_BIN(m_widget)->child,
|
||||
(gpointer)gtkcombobox_text_changed_callback, this);
|
||||
g_signal_handlers_unblock_by_func(GTK_BIN(m_widget)->child,
|
||||
(gpointer)gtkcombobox_text_changed_callback, this);
|
||||
|
||||
g_signal_handlers_unblock_by_func(m_widget,
|
||||
(gpointer)gtkcombobox_changed_callback, this);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
g_signal_handlers_unblock_by_func(GTK_COMBO(m_widget)->list,
|
||||
(gpointer) gtkcombo_combo_select_child_callback, this);
|
||||
|
||||
g_signal_handlers_unblock_by_func(GTK_COMBO(m_widget)->entry,
|
||||
(gpointer) gtkcombo_text_changed_callback, this);
|
||||
}
|
||||
}
|
||||
|
||||
void wxComboBox::OnSize( wxSizeEvent &event )
|
||||
{
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
// NB: In some situations (e.g. on non-first page of a wizard, if the
|
||||
// size used is default size), GtkCombo widget is resized correctly,
|
||||
// but it's look is not updated, it's rendered as if it was much wider.
|
||||
// No other widgets are affected, so it looks like a bug in GTK+.
|
||||
// Manually requesting resize calculation (as gtk_pizza_set_size does)
|
||||
// fixes it.
|
||||
if (GTK_WIDGET_VISIBLE(m_widget))
|
||||
gtk_widget_queue_resize(m_widget);
|
||||
}
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void wxComboBox::DoApplyWidgetStyle(GtkRcStyle *style)
|
||||
{
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
// gtk_widget_modify_style( GTK_COMBO(m_widget)->button, syle );
|
||||
|
||||
gtk_widget_modify_style( GTK_COMBO(m_widget)->entry, style );
|
||||
gtk_widget_modify_style( GTK_COMBO(m_widget)->list, style );
|
||||
|
||||
GtkList *list = GTK_LIST( GTK_COMBO(m_widget)->list );
|
||||
GList *child = list->children;
|
||||
while (child)
|
||||
{
|
||||
gtk_widget_modify_style( GTK_WIDGET(child->data), style );
|
||||
|
||||
GtkBin *bin = GTK_BIN(child->data);
|
||||
gtk_widget_modify_style( bin->child, style );
|
||||
|
||||
child = child->next;
|
||||
}
|
||||
}
|
||||
g_signal_handlers_unblock_by_func(m_widget,
|
||||
(gpointer)gtkcombobox_changed_callback, this);
|
||||
}
|
||||
|
||||
GtkWidget* wxComboBox::GetConnectWidget()
|
||||
{
|
||||
GtkEntry *entry = NULL;
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
entry = GTK_ENTRY( GTK_BIN(m_widget)->child );
|
||||
else
|
||||
#endif
|
||||
entry = GTK_ENTRY( GTK_COMBO(m_widget)->entry );
|
||||
|
||||
return GTK_WIDGET( entry );
|
||||
return GTK_WIDGET( GetEntry() );
|
||||
}
|
||||
|
||||
GdkWindow *wxComboBox::GTKGetWindow(wxArrayGdkWindows& windows) const
|
||||
{
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
{
|
||||
wxUnusedVar(windows);
|
||||
wxUnusedVar(windows);
|
||||
|
||||
return GTK_ENTRY(GTK_BIN(m_widget)->child)->text_area;
|
||||
}
|
||||
else
|
||||
#endif // GTK+ 2.4
|
||||
{
|
||||
windows.push_back(GTK_ENTRY(GTK_COMBO(m_widget)->entry)->text_area);
|
||||
windows.push_back(GTK_COMBO(m_widget)->button->window);
|
||||
|
||||
// indicate that we return multiple windows in the windows array
|
||||
return NULL;
|
||||
}
|
||||
return GetEntry()->text_area;
|
||||
}
|
||||
|
||||
wxSize wxComboBox::DoGetBestSize() const
|
||||
@@ -963,12 +453,7 @@ wxSize wxComboBox::DoGetBestSize() const
|
||||
wxVisualAttributes
|
||||
wxComboBox::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
|
||||
{
|
||||
#ifdef __WXGTK24__
|
||||
if (!gtk_check_version(2,4,0))
|
||||
return GetDefaultAttributesFromGTKWidget(gtk_combo_box_entry_new, true);
|
||||
else
|
||||
#endif
|
||||
return GetDefaultAttributesFromGTKWidget(gtk_combo_new, true);
|
||||
return GetDefaultAttributesFromGTKWidget(gtk_combo_box_entry_new, true);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user