]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/button.cpp
adapting to init pattern
[wxWidgets.git] / src / gtk / button.cpp
index 88e29ac4f310bb3b297b8dbbb21c76d63e4feba9..2d83f10cbf2cfacf8cf67c4d6565c9d7d9187959 100644 (file)
@@ -83,7 +83,7 @@ wxgtk_button_style_set_callback(GtkWidget* widget, GtkStyle*, wxButton* win)
 {
     /* the default button has a border around it */
     wxWindow* parent = win->GetParent();
-    if (parent && parent->m_wxwindow && GTK_WIDGET_CAN_DEFAULT(widget))
+    if (parent && parent->m_wxwindow && gtk_widget_get_can_default(widget))
     {
         GtkBorder* border = NULL;
         gtk_widget_style_get(widget, "default_border", &border, NULL);
@@ -105,8 +105,6 @@ wxgtk_button_style_set_callback(GtkWidget* widget, GtkStyle*, wxButton* win)
 // wxButton
 //-----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxButton,wxControl)
-
 bool wxButton::Create(wxWindow *parent,
                       wxWindowID id,
                       const wxString &label,
@@ -183,7 +181,7 @@ wxWindow *wxButton::SetDefault()
 {
     wxWindow *oldDefault = wxButtonBase::SetDefault();
 
-    GTK_WIDGET_SET_FLAGS( m_widget, GTK_CAN_DEFAULT );
+    gtk_widget_set_can_default(m_widget, TRUE);
     gtk_widget_grab_default( m_widget );
 
     // resize for default border
@@ -264,12 +262,32 @@ void wxButton::SetLabel( const wxString &lbl )
     GTKApplyWidgetStyle( false );
 }
 
+#if wxUSE_MARKUP
+bool wxButton::DoSetLabelMarkup(const wxString& markup)
+{
+    wxCHECK_MSG( m_widget != NULL, false, "invalid button" );
+
+    const wxString stripped = RemoveMarkup(markup);
+    if ( stripped.empty() && !markup.empty() )
+        return false;
+
+    wxControl::SetLabel(stripped);
+
+    GtkLabel * const label = GTKGetLabel();
+    wxCHECK_MSG( label, false, "no label in this button?" );
+
+    GTKSetLabelWithMarkupForLabel(label, markup);
+
+    return true;
+}
+#endif // wxUSE_MARKUP
+
 bool wxButton::Enable( bool enable )
 {
     if (!base_type::Enable(enable))
         return false;
 
-    gtk_widget_set_sensitive(GTK_BIN(m_widget)->child, enable);
+    gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(m_widget)), enable);
 
     if (enable)
         GTKFixSensitivity();
@@ -284,24 +302,48 @@ GdkWindow *wxButton::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const
     return GTK_BUTTON(m_widget)->event_window;
 }
 
+GtkLabel *wxButton::GTKGetLabel() const
+{
+    GtkWidget* child = gtk_bin_get_child(GTK_BIN(m_widget));
+    if ( GTK_IS_ALIGNMENT(child) )
+    {
+        GtkWidget* box = gtk_bin_get_child(GTK_BIN(child));
+        GtkLabel* label = NULL;
+        GList* list = gtk_container_get_children(GTK_CONTAINER(box));
+        for (GList* item = list; item; item = item->next)
+        {
+            GtkBoxChild* boxChild = static_cast<GtkBoxChild*>(item->data);
+            if ( GTK_IS_LABEL(boxChild->widget) )
+                label = GTK_LABEL(boxChild->widget);
+        }
+        g_list_free(list);
+
+        return label;
+    }
+
+    return GTK_LABEL(child);
+}
+
 void wxButton::DoApplyWidgetStyle(GtkRcStyle *style)
 {
     gtk_widget_modify_style(m_widget, style);
-    GtkWidget *child = GTK_BIN(m_widget)->child;
+    GtkWidget* child = gtk_bin_get_child(GTK_BIN(m_widget));
     gtk_widget_modify_style(child, style);
 
     // for buttons with images, the path to the label is (at least in 2.12)
     // GtkButton -> GtkAlignment -> GtkHBox -> GtkLabel
     if ( GTK_IS_ALIGNMENT(child) )
     {
-        GtkWidget *box = GTK_BIN(child)->child;
+        GtkWidget* box = gtk_bin_get_child(GTK_BIN(child));
         if ( GTK_IS_BOX(box) )
         {
-            for (GList* item = GTK_BOX(box)->children; item; item = item->next)
+            GList* list = gtk_container_get_children(GTK_CONTAINER(box));
+            for (GList* item = list; item; item = item->next)
             {
                 GtkBoxChild* boxChild = static_cast<GtkBoxChild*>(item->data);
                 gtk_widget_modify_style(boxChild->widget, style);
             }
+            g_list_free(list);
         }
     }
 }
@@ -312,11 +354,11 @@ wxSize wxButton::DoGetBestSize() const
     // extra border around it, but we don't want to take it into account in
     // our size calculations (otherwise the result is visually ugly), so
     // always return the size of non default button from here
-    const bool isDefault = GTK_WIDGET_HAS_DEFAULT(m_widget);
+    const bool isDefault = gtk_widget_has_default(m_widget);
     if ( isDefault )
     {
         // temporarily unset default flag
-        GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_DEFAULT );
+        gtk_widget_set_can_default(m_widget, FALSE);
     }
 
     wxSize ret( wxControl::DoGetBestSize() );
@@ -324,7 +366,7 @@ wxSize wxButton::DoGetBestSize() const
     if ( isDefault )
     {
         // set it back again
-        GTK_WIDGET_SET_FLAGS( m_widget, GTK_CAN_DEFAULT );
+        gtk_widget_set_can_default(m_widget, TRUE);
     }
 
     if (!HasFlag(wxBU_EXACTFIT))
@@ -423,7 +465,7 @@ void wxButton::GTKDoShowBitmap(const wxBitmap& bitmap)
     GtkWidget *image;
     if ( DontShowLabel() )
     {
-        image = GTK_BIN(m_widget)->child;
+        image = gtk_bin_get_child(GTK_BIN(m_widget));
     }
     else // have both label and bitmap
     {