X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/243dbf1a5088be31980df51b97831b52cb6986cd..bdbcded6a32fc216283b9af03267e02fc915448f:/src/gtk/choice.cpp diff --git a/src/gtk/choice.cpp b/src/gtk/choice.cpp index d746df7874..6eef00f624 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" @@ -72,6 +73,18 @@ wxChoice::wxChoice() m_strings = (wxSortedArrayString *)NULL; } +bool wxChoice::Create( wxWindow *parent, wxWindowID id, + const wxPoint &pos, const wxSize &size, + const wxArrayString& choices, + long style, const wxValidator& validator, + const wxString &name ) +{ + wxCArrayString chs(choices); + + return Create( parent, id, pos, size, chs.GetCount(), chs.GetStrings(), + style, validator, name ); +} + bool wxChoice::Create( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int n, const wxString choices[], @@ -110,14 +123,10 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id, m_parent->DoAddChild( this ); PostCreation(); - - SetFont( parent->GetFont() ); + InheritAttributes(); SetBestSize(size); - SetBackgroundColour( parent->GetBackgroundColour() ); - SetForegroundColour( parent->GetForegroundColour() ); - Show( TRUE ); return TRUE; @@ -156,7 +165,7 @@ 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 ); @@ -166,7 +175,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(); @@ -176,7 +185,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 @@ -188,7 +197,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") ); @@ -208,7 +217,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(); @@ -226,18 +235,49 @@ void wxChoice::Delete( int n ) wxCHECK_RET( m_widget != NULL, wxT("invalid choice") ); // VZ: apparently GTK+ doesn't have a built-in function to do it (not even - // in 2.0), hence this dump implementation - still better than nothing + // in 2.0), hence this dumb implementation -- still better than nothing int i, count = GetCount(); wxCHECK_RET( n >= 0 && n < count, _T("invalid index in wxChoice::Delete") ); + const bool hasClientData = m_clientDataItemsType != wxClientData_None; + const bool hasObjectData = m_clientDataItemsType == wxClientData_Object; + + wxList::compatibility_iterator node = m_clientList.GetFirst(); + wxArrayString items; + wxArrayPtrVoid itemsData; items.Alloc(count); for ( i = 0; i < count; i++ ) { if ( i != n ) + { items.Add(GetString(i)); + if ( hasClientData ) + { + // also save the client data + itemsData.Add(node->GetData()); + } + } + else // need to delete the client object too + { + if ( hasObjectData ) + { + delete (wxClientData *)node->GetData(); + } + } + + if ( hasClientData ) + { + node = node->GetNext(); + } + } + + if ( hasObjectData ) + { + // prevent Clear() from destroying all client data + m_clientDataItemsType = wxClientData_None; } Clear(); @@ -245,6 +285,11 @@ void wxChoice::Delete( int n ) for ( i = 0; i < count - 1; i++ ) { Append(items[i]); + + if ( hasObjectData ) + SetClientObject(i, (wxClientData *)itemsData[i]); + else if ( hasClientData ) + SetClientData(i, itemsData[i]); } } @@ -268,7 +313,7 @@ int wxChoice::FindString( const wxString &string ) const label = GTK_LABEL( BUTTON_CHILD(m_widget) ); wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") ); - + #ifdef __WXGTK20__ wxString tmp( wxGTK_CONV_BACK( gtk_label_get_text( label) ) ); #else @@ -287,15 +332,15 @@ int wxChoice::FindString( const wxString &string ) const int wxChoice::GetSelection() const { wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid choice") ); - + #ifdef __WXGTK20__ return gtk_option_menu_get_history( GTK_OPTION_MENU(m_widget) ); - + #else GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ) ); int count = 0; - + GList *child = menu_shell->children; while (child) { @@ -309,11 +354,33 @@ int wxChoice::GetSelection() const #endif } -void wxChoice::SetString( int WXUNUSED(n), const wxString& WXUNUSED(string) ) +void wxChoice::SetString( int n, const wxString& str ) { wxCHECK_RET( m_widget != NULL, wxT("invalid choice") ); - wxFAIL_MSG(wxT("not implemented")); + GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ) ); + int count = 0; + GList *child = menu_shell->children; + while (child) + { + GtkBin *bin = GTK_BIN( child->data ); + if (count == n) + { + GtkLabel *label = (GtkLabel *) NULL; + if (bin->child) + label = GTK_LABEL(bin->child); + if (!label) + label = GTK_LABEL( BUTTON_CHILD(m_widget) ); + + wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") ); + + gtk_label_set_text( label, wxGTK_CONV( str ) ); + + return; + } + child = child->next; + count++; + } } wxString wxChoice::GetString( int n ) const @@ -502,5 +569,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