// wxButton
//-----------------------------------------------------------------------------
-IMPLEMENT_DYNAMIC_CLASS(wxButton,wxControl)
-
bool wxButton::Create(wxWindow *parent,
wxWindowID id,
const wxString &label,
return false;
}
- m_widget = gtk_button_new_with_mnemonic("");
+ // create either a standard button with text label (which may still contain
+ // an image under GTK+ 2.6+) or a bitmap-only button if we don't have any
+ // label
+ const bool
+ useLabel = !(style & wxBU_NOTEXT) && (!label.empty() || wxIsStockID(id));
+ if ( useLabel )
+ {
+ m_widget = gtk_button_new_with_mnemonic("");
+ }
+ else // no label, suppose we will have a bitmap
+ {
+ m_widget = gtk_button_new();
+
+ GtkWidget *image = gtk_image_new();
+ gtk_widget_show(image);
+ gtk_container_add(GTK_CONTAINER(m_widget), image);
+ }
+
g_object_ref(m_widget);
float x_alignment = 0.5;
gtk_button_set_alignment(GTK_BUTTON(m_widget), x_alignment, y_alignment);
- SetLabel(label);
+ if ( useLabel )
+ SetLabel(label);
if (style & wxNO_BORDER)
gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE );
wxControl::SetLabel(label);
+ // don't use label if it was explicitly disabled
+ if ( HasFlag(wxBU_NOTEXT) )
+ return;
+
if (wxIsStockID(m_windowId) && wxIsStockLabel(m_windowId, label))
{
const char *stock = wxGetStockGtkID(m_windowId);
}
}
+ // this call is necessary if the button had been initially created without
+ // a (text) label -- then we didn't use gtk_button_new_with_mnemonic() and
+ // so "use-underline" GtkButton property remained unset
+ gtk_button_set_use_underline(GTK_BUTTON(m_widget), TRUE);
const wxString labelGTK = GTKConvertMnemonics(label);
gtk_button_set_label(GTK_BUTTON(m_widget), wxGTK_CONV(labelGTK));
gtk_button_set_use_stock(GTK_BUTTON(m_widget), FALSE);
GTKApplyWidgetStyle( false );
}
-bool wxButton::Enable( bool enable )
+#if wxUSE_MARKUP
+bool wxButton::DoSetLabelMarkup(const wxString& markup)
{
- bool isEnabled = IsEnabled();
+ wxCHECK_MSG( m_widget != NULL, false, "invalid button" );
+
+ const wxString stripped = RemoveMarkup(markup);
+ if ( stripped.empty() && !markup.empty() )
+ return false;
+
+ wxControl::SetLabel(stripped);
- if ( !wxControl::Enable( enable ) )
+ 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);
- if (!isEnabled && enable)
- {
+ if (enable)
GTKFixSensitivity();
- }
GTKUpdateBitmap();
return GTK_BUTTON(m_widget)->event_window;
}
+GtkLabel *wxButton::GTKGetLabel() const
+{
+ GtkWidget *child = GTK_BIN(m_widget)->child;
+ if ( GTK_IS_ALIGNMENT(child) )
+ {
+ GtkWidget *box = GTK_BIN(child)->child;
+ for (GList* item = GTK_BOX(box)->children; item; item = item->next)
+ {
+ GtkBoxChild* boxChild = static_cast<GtkBoxChild*>(item->data);
+ if ( GTK_IS_LABEL(boxChild->widget) )
+ return GTK_LABEL(boxChild->widget);
+ }
+
+ return NULL;
+ }
+
+ return GTK_LABEL(child);
+}
+
void wxButton::DoApplyWidgetStyle(GtkRcStyle *style)
{
gtk_widget_modify_style(m_widget, style);
void wxButton::GTKUpdateBitmap()
{
- State state = GTKGetCurrentState();
+ // if we don't show bitmaps at all, there is nothing to update
+ if ( m_bitmaps[State_Normal].IsOk() )
+ {
+ // if we do show them, this will return a state for which we do have a
+ // valid bitmap
+ State state = GTKGetCurrentState();
- GTKDoShowBitmap(m_bitmaps[state]);
+ GTKDoShowBitmap(m_bitmaps[state]);
+ }
}
void wxButton::GTKDoShowBitmap(const wxBitmap& bitmap)
{
wxASSERT_MSG( bitmap.IsOk(), "invalid bitmap" );
-#ifdef __WXGTK26__
- if ( !gtk_check_version(2,6,0) )
+ GtkWidget *image;
+ if ( DontShowLabel() )
{
- GtkWidget *image = gtk_button_get_image(GTK_BUTTON(m_widget));
- wxCHECK_RET( image, "must have image widget" );
-
- gtk_image_set_from_pixbuf(GTK_IMAGE(image), bitmap.GetPixbuf());
+ image = GTK_BIN(m_widget)->child;
}
+ else // have both label and bitmap
+ {
+#ifdef __WXGTK26__
+ if ( !gtk_check_version(2,6,0) )
+ {
+ image = gtk_button_get_image(GTK_BUTTON(m_widget));
+ }
+ else
#endif // __WXGTK26__
+ {
+ // buttons with both label and bitmap are only supported with GTK+
+ // 2.6 so far
+ //
+ // it shouldn't be difficult to implement them ourselves for the
+ // previous GTK+ versions by stuffing a container with a label and
+ // an image inside GtkButton but there doesn't seem to be much
+ // point in doing this for ancient GTK+ versions
+ return;
+ }
+ }
+
+ wxCHECK_RET( image && GTK_IS_IMAGE(image), "must have image widget" );
+
+ gtk_image_set_from_pixbuf(GTK_IMAGE(image), bitmap.GetPixbuf());
}
wxBitmap wxButton::DoGetBitmap(State which) const
switch ( which )
{
case State_Normal:
+ if ( DontShowLabel() )
+ {
+ // we only have the bitmap in this button, never remove it but
+ // do invalidate the best size when the bitmap (and presumably
+ // its size) changes
+ InvalidateBestSize();
+ }
#ifdef __WXGTK26__
// normal image is special: setting it enables images for the button and
// resetting it to nothing disables all of them
- if ( !gtk_check_version(2,6,0) )
+ else if ( !gtk_check_version(2,6,0) )
{
GtkWidget *image = gtk_button_get_image(GTK_BUTTON(m_widget));
if ( image && !bitmap.IsOk() )
}
gtk_button_set_image_position(GTK_BUTTON(m_widget), gtkpos);
+ InvalidateBestSize();
}
#endif // GTK+ 2.10+
}