+ wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
+ wxCHECK_RET( tlw, _T("button without top level window?") );
+
+ tlw->SetDefaultItem(this);
+
+ GTK_WIDGET_SET_FLAGS( m_widget, GTK_CAN_DEFAULT );
+ gtk_widget_grab_default( m_widget );
+
+ // resize for default border
+ gtk_button_style_set_callback( m_widget, NULL, this );
+}
+
+/* static */
+wxSize wxButtonBase::GetDefaultSize()
+{
+ 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;
+}
+
+void wxButton::SetLabel( const wxString &lbl )
+{
+ wxCHECK_RET( m_widget != NULL, wxT("invalid button") );
+
+ wxString label(lbl);
+
+ if (label.empty() && wxIsStockID(m_windowId))
+ label = wxGetStockLabel(m_windowId);
+
+ wxControl::SetLabel(label);
+
+ const wxString labelGTK = GTKConvertMnemonics(label);
+
+ 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;
+ }
+ }
+
+ gtk_button_set_label(GTK_BUTTON(m_widget), wxGTK_CONV(labelGTK));
+ gtk_button_set_use_stock(GTK_BUTTON(m_widget), FALSE);
+
+ ApplyWidgetStyle( false );