#if wxUSE_BUTTON
#include "wx/button.h"
+#include "wx/stockitem.h"
#include "wx/gtk/private.h"
wxControl::SetLabel( label );
*/
+#ifdef __WXGTK20__
+ m_widget = gtk_button_new_with_mnemonic("");
+#else
m_widget = gtk_button_new_with_label("");
+#endif
float x_alignment = 0.5;
if (HasFlag(wxBU_LEFT))
else if (HasFlag(wxBU_BOTTOM))
y_alignment = 1.0;
- gtk_misc_set_alignment (GTK_MISC (BUTTON_CHILD (m_widget)),
- x_alignment, y_alignment);
+#if __WXGTK24__
+ if (!gtk_check_version(2,4,0))
+ {
+ gtk_button_set_alignment(GTK_BUTTON(m_widget), x_alignment, y_alignment);
+ }
+ else
+#endif
+ {
+ if (GTK_IS_MISC(BUTTON_CHILD(m_widget)))
+ gtk_misc_set_alignment (GTK_MISC (BUTTON_CHILD (m_widget)),
+ x_alignment, y_alignment);
+ }
- SetLabel( label );
+ SetLabel(label);
if (style & wxNO_BORDER)
gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE );
- gtk_signal_connect( GTK_OBJECT(m_widget), "clicked",
+ gtk_signal_connect_after( GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_button_clicked_callback), (gpointer*)this );
m_parent->DoAddChild( this );
PostCreation(size);
- return TRUE;
+ return true;
}
+
void wxButton::SetDefault()
{
}
/* static */
-wxSize wxButton::GetDefaultSize()
+wxSize wxButtonBase::GetDefaultSize()
{
+#ifdef __WXGTK20__
+ static wxSize size = wxDefaultSize;
+ if (size == wxDefaultSize)
+ {
+ // NB: Default size of buttons should be same as size of stock
+ // buttons as used in most GTK+ apps. Unfortunately it's a little
+ // tricky to obtain this size: stock button's size may be smaller
+ // than size of button in GtkButtonBox and vice versa,
+ // GtkButtonBox's minimal button size may be smaller than stock
+ // button's size. We have to retrieve both values and combine them.
+
+ GtkWidget *wnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ GtkWidget *box = gtk_hbutton_box_new();
+ GtkWidget *btn = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+ gtk_container_add(GTK_CONTAINER(box), btn);
+ gtk_container_add(GTK_CONTAINER(wnd), box);
+ GtkRequisition req;
+ gtk_widget_size_request(btn, &req);
+
+ gint minwidth, minheight;
+ gtk_widget_style_get(box,
+ "child-min-width", &minwidth,
+ "child-min-height", &minheight,
+ NULL);
+
+ size.x = wxMax(minwidth, req.width);
+ size.y = wxMax(minheight, req.height);
+
+ gtk_widget_destroy(wnd);
+ }
+ return size;
+#else
return wxSize(80,26);
+#endif
}
-void wxButton::SetLabel( const wxString &label )
+void wxButton::SetLabel( const wxString &lbl )
{
wxCHECK_RET( m_widget != NULL, wxT("invalid button") );
- wxControl::SetLabel( label );
+ wxString label(lbl);
+
+ if (label.empty() && wxIsStockID(m_windowId))
+ label = wxGetStockLabel(m_windowId);
+
+ wxControl::SetLabel(label);
#ifdef __WXGTK20__
- wxString label2 = PrepareLabelMnemonics( label );
- gtk_label_set_text_with_mnemonic( GTK_LABEL( BUTTON_CHILD(m_widget) ), wxGTK_CONV( label2 ) );
+ if (wxIsStockID(m_windowId) && wxIsStockLabel(m_windowId, label))
+ {
+ const char *stock = wxGetStockGtkID(m_windowId);
+ if (stock)
+ {
+ gtk_button_set_label(GTK_BUTTON(m_widget), stock);
+ gtk_button_set_use_stock(GTK_BUTTON(m_widget), TRUE);
+ return;
+ }
+ }
+
+ wxString label2 = PrepareLabelMnemonics(label);
+ gtk_button_set_label(GTK_BUTTON(m_widget), wxGTK_CONV(label2));
+ gtk_button_set_use_stock(GTK_BUTTON(m_widget), FALSE);
#else
- gtk_label_set( GTK_LABEL( BUTTON_CHILD(m_widget) ), wxGTK_CONV( GetLabel() ) );
+ gtk_label_set(GTK_LABEL(BUTTON_CHILD(m_widget)), wxGTK_CONV(GetLabel()));
#endif
}
#endif
}
-void wxButton::ApplyWidgetStyle()
+void wxButton::DoApplyWidgetStyle(GtkRcStyle *style)
{
- SetWidgetStyle();
- gtk_widget_set_style( m_widget, m_widgetStyle );
- gtk_widget_set_style( BUTTON_CHILD(m_widget), m_widgetStyle );
+ gtk_widget_modify_style(m_widget, style);
+ gtk_widget_modify_style(BUTTON_CHILD(m_widget), style);
}
wxSize wxButton::DoGetBestSize() const
if (!HasFlag(wxBU_EXACTFIT))
{
- if (ret.x < 80) ret.x = 80;
+ wxSize defaultSize = GetDefaultSize();
+ if (ret.x < defaultSize.x) ret.x = defaultSize.x;
+ if (ret.y < defaultSize.y) ret.y = defaultSize.y;
}
+ CacheBestSize(ret);
return ret;
}