X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/14f355c2b5c71fc7c3d680aea366582d2ac60f7b..7b25d8e7bd0eca9f0f6efe62b3721d14c394dac9:/src/gtk/choice.cpp diff --git a/src/gtk/choice.cpp b/src/gtk/choice.cpp index d6bac5341e..4bef419b40 100644 --- a/src/gtk/choice.cpp +++ b/src/gtk/choice.cpp @@ -73,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,16 +122,8 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id, m_parent->DoAddChild( this ); - PostCreation(); - - SetFont( parent->GetFont() ); - - SetBestSize(size); - - SetBackgroundColour( parent->GetBackgroundColour() ); - SetForegroundColour( parent->GetForegroundColour() ); - - Show( TRUE ); + PostCreation(size); + SetBestSize(size); // need this too because this is a wxControlWithItems return TRUE; } @@ -227,18 +231,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(); @@ -246,6 +281,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]); } } @@ -269,7 +309,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 @@ -288,15 +328,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) { @@ -310,11 +350,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 @@ -375,19 +437,17 @@ void wxChoice::SetSelection( int n ) gtk_option_menu_set_history( GTK_OPTION_MENU(m_widget), (gint)tmp ); } -void wxChoice::ApplyWidgetStyle() +void wxChoice::DoApplyWidgetStyle(GtkRcStyle *style) { - SetWidgetStyle(); - GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ) ); - gtk_widget_set_style( m_widget, m_widgetStyle ); - gtk_widget_set_style( GTK_WIDGET( menu_shell ), m_widgetStyle ); + gtk_widget_modify_style( m_widget, style ); + gtk_widget_modify_style( GTK_WIDGET( menu_shell ), style ); GList *child = menu_shell->children; while (child) { - gtk_widget_set_style( GTK_WIDGET( child->data ), m_widgetStyle ); + gtk_widget_modify_style( GTK_WIDGET( child->data ), style ); GtkBin *bin = GTK_BIN( child->data ); GtkWidget *label = (GtkWidget *) NULL; @@ -396,7 +456,7 @@ void wxChoice::ApplyWidgetStyle() if (!label) label = BUTTON_CHILD(m_widget); - gtk_widget_set_style( label, m_widgetStyle ); + gtk_widget_modify_style( label, style ); child = child->next; } @@ -451,7 +511,7 @@ int wxChoice::GtkAddHelper(GtkWidget *menu, int pos, const wxString& item) gtk_widget_realize( menu_item ); gtk_widget_realize( GTK_BIN(menu_item)->child ); - if (m_widgetStyle) ApplyWidgetStyle(); + ApplyWidgetStyle(); } gtk_signal_connect( GTK_OBJECT( menu_item ), "activate", @@ -476,7 +536,7 @@ wxSize wxChoice::DoGetBestSize() const size_t count = GetCount(); for ( size_t n = 0; n < count; n++ ) { - GetTextExtent( GetString(n), &width, NULL, NULL, NULL, &m_font ); + GetTextExtent( GetString(n), &width, NULL, NULL, NULL ); if ( width > ret.x ) ret.x = width; } @@ -498,8 +558,13 @@ wxSize wxChoice::DoGetBestSize() const if ( ret.x < 80 ) ret.x = 80; - ret.y = 16 + GetCharHeight(); + // If this request_size is called with no entries then + // the returned height is wrong. Give it a reasonable + // default value. + if (ret.y <= 18) + ret.y = 8 + GetCharHeight(); + CacheBestSize(ret); return ret; } @@ -512,6 +577,13 @@ bool wxChoice::IsOwnGtkWindow( GdkWindow *window ) #endif } +// static +wxVisualAttributes +wxChoice::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) +{ + return GetDefaultAttributesFromGTKWidget(gtk_option_menu_new); +} + #endif // wxUSE_CHOICE