X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/288059b2b9d1d4b562e1a0d06f7026936793bc79..9d39cef7ef8f2dddce244846cca3a346508ae2af:/src/gtk/choice.cpp diff --git a/src/gtk/choice.cpp b/src/gtk/choice.cpp index 4edcdc8b94..d6bac5341e 100644 --- a/src/gtk/choice.cpp +++ b/src/gtk/choice.cpp @@ -8,7 +8,7 @@ ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "choice.h" #endif @@ -17,6 +17,7 @@ #if wxUSE_CHOICE #include "wx/choice.h" +#include "wx/arrstr.h" #include "wx/gtk/private.h" @@ -102,7 +103,7 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id, for (int i = 0; i < n; i++) { - GtkAppendHelper(menu, choices[i]); + GtkAddHelper(menu, i, choices[i]); } gtk_option_menu_set_menu( GTK_OPTION_MENU(m_widget), menu ); @@ -136,14 +137,27 @@ int wxChoice::DoAppend( const wxString &item ) GtkWidget *menu = gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ); - return GtkAppendHelper(menu, item); + return GtkAddHelper(menu, GetCount(), item); +} + +int wxChoice::DoInsert( const wxString &item, int pos ) +{ + wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid choice control") ); + wxCHECK_MSG( (pos>=0) && (pos<=GetCount()), -1, wxT("invalid index")); + + if (pos == GetCount()) + return DoAppend(item); + + GtkWidget *menu = gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ); + + return GtkAddHelper(menu, pos, item); } void wxChoice::DoSetItemClientData( int n, void* clientData ) { wxCHECK_RET( m_widget != NULL, wxT("invalid choice control") ); - wxNode *node = m_clientList.Item( n ); + wxList::compatibility_iterator node = m_clientList.Item( n ); wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetItemClientData") ); node->SetData( (wxObject*) clientData ); @@ -153,7 +167,7 @@ void* wxChoice::DoGetItemClientData( int n ) const { wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid choice control") ); - wxNode *node = m_clientList.Item( n ); + wxList::compatibility_iterator node = m_clientList.Item( n ); wxCHECK_MSG( node, NULL, wxT("invalid index in wxChoice::DoGetItemClientData") ); return node->GetData(); @@ -163,7 +177,7 @@ void wxChoice::DoSetItemClientObject( int n, wxClientData* clientData ) { wxCHECK_RET( m_widget != NULL, wxT("invalid choice control") ); - wxNode *node = m_clientList.Item( n ); + wxList::compatibility_iterator node = m_clientList.Item( n ); wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetItemClientObject") ); // wxItemContainer already deletes data for us @@ -175,7 +189,7 @@ wxClientData* wxChoice::DoGetItemClientObject( int n ) const { wxCHECK_MSG( m_widget != NULL, (wxClientData*) NULL, wxT("invalid choice control") ); - wxNode *node = m_clientList.Item( n ); + wxList::compatibility_iterator node = m_clientList.Item( n ); wxCHECK_MSG( node, (wxClientData *)NULL, wxT("invalid index in wxChoice::DoGetItemClientObject") ); @@ -195,7 +209,7 @@ void wxChoice::Clear() // destroy the data (due to Robert's idea of using wxList // and not wxList we can't just say // m_clientList.DeleteContents(TRUE) - this would crash! - wxNode *node = m_clientList.GetFirst(); + wxList::compatibility_iterator node = m_clientList.GetFirst(); while ( node ) { delete (wxClientData *)node->GetData(); @@ -388,8 +402,10 @@ void wxChoice::ApplyWidgetStyle() } } -size_t wxChoice::GtkAppendHelper(GtkWidget *menu, const wxString& item) +int wxChoice::GtkAddHelper(GtkWidget *menu, int pos, const wxString& item) { + wxCHECK_MSG((pos>=0) && (pos<=(int)m_clientList.GetCount()), -1, wxT("invalid index")); + GtkWidget *menu_item = gtk_menu_item_new_with_label( wxGTK_CONV( item ) ); size_t index; @@ -412,14 +428,22 @@ size_t wxChoice::GtkAppendHelper(GtkWidget *menu, const wxString& item) } else { + // don't call wxChoice::GetCount() from here because it doesn't work + // if we're called from ctor (and GtkMenuShell is still NULL) + // normal control, just append + if (pos == (int)m_clientList.GetCount()) + { gtk_menu_append( GTK_MENU(menu), menu_item ); - m_clientList.Append( (wxObject*) NULL ); - - // don't call wxChoice::GetCount() from here because it doesn't work - // if we're called from ctor (and GtkMenuShell is still NULL) index = m_clientList.GetCount() - 1; + } + else + { + gtk_menu_insert( GTK_MENU(menu), menu_item, pos ); + m_clientList.Insert( pos, (wxObject*) NULL ); + index = pos; + } } if (GTK_WIDGET_REALIZED(m_widget)) @@ -479,5 +503,15 @@ wxSize wxChoice::DoGetBestSize() const return ret; } +bool wxChoice::IsOwnGtkWindow( GdkWindow *window ) +{ +#ifdef __WXGTK20__ + return GTK_BUTTON(m_widget)->event_window; +#else + return (window == m_widget->window); +#endif +} + + #endif // wxUSE_CHOICE