X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da494b405d0826b343ea6d249bbac27061e11d3e..d2e66707deb10dea6f92e3e4092f8a43ef942a5d:/src/motif/button.cpp diff --git a/src/motif/button.cpp b/src/motif/button.cpp index 01c739addb..9df9eab55c 100644 --- a/src/motif/button.cpp +++ b/src/motif/button.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: button.cpp +// Name: src/motif/button.cpp // Purpose: wxButton // Author: Julian Smart // Modified by: @@ -9,19 +9,10 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "button.h" -#endif - -#ifdef __VMS -#define XtDisplay XTDISPLAY -#endif - -#include "wx/defs.h" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #include "wx/button.h" -#include "wx/utils.h" -#include "wx/panel.h" #ifdef __VMS__ #pragma message disable nosimpint @@ -32,25 +23,37 @@ #pragma message enable nosimpint #endif + +#ifndef WX_PRECOMP + #include "wx/toplevel.h" +#endif + +#include "wx/stockitem.h" #include "wx/motif/private.h" +#include "wx/sysopt.h" void wxButtonCallback (Widget w, XtPointer clientData, XtPointer ptr); -IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl) +#define MIN_WIDTH 78 +#define MIN_LARGE_HEIGHT 30 // Button -bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, +bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& lbl, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { + wxString label(lbl); + if (label.empty() && wxIsStockID(id)) + label = wxGetStockLabel(id); + if( !CreateControl( parent, id, pos, size, style, validator, name ) ) return false; + PreCreation(); - wxString label1(wxStripMenuCodes(label)); - wxXmString text( label1 ); + wxXmString text( GetLabelText(label) ); Widget parentWidget = (Widget) parent->GetClientWidget(); @@ -66,28 +69,26 @@ bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, m_mainWidget = (WXWidget) XtVaCreateManagedWidget ("button", xmPushButtonWidgetClass, parentWidget, - wxFont::GetFontTag(), m_font.GetFontType(XtDisplay(parentWidget)), + wxFont::GetFontTag(), m_font.GetFontTypeC(XtDisplay(parentWidget)), XmNlabelString, text(), + XmNrecomputeSize, False, // See comment for wxButton::SetDefault - // XmNdefaultButtonShadowThickness, 1, + // XmNdefaultButtonShadowThickness, 1, NULL); XtAddCallback ((Widget) m_mainWidget, XmNactivateCallback, (XtCallbackProc) wxButtonCallback, (XtPointer) this); - SetCanAddEventHandler(TRUE); - wxSize best = GetBestSize(); if( size.x != -1 ) best.x = size.x; if( size.y != -1 ) best.y = size.y; + PostCreation(); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, best.x, best.y); - ChangeBackgroundColour(); - - return TRUE; + return true; } void wxButton::SetDefaultShadowThicknessAndResize() @@ -104,20 +105,23 @@ void wxButton::SetDefaultShadowThicknessAndResize() if( managed ) XtManageChild( buttonWidget ); + // this can't currently be done, because user code that calls SetDefault + // will break otherwise +#if 0 wxSize best = GetBestSize(), actual = GetSize(); if( best.x < actual.x ) best.x = actual.x; if( best.y < actual.y ) best.y = actual.y; if( best != actual ) SetSize( best ); +#endif + InvalidateBestSize(); } -void wxButton::SetDefault() +wxWindow *wxButton::SetDefault() { - wxWindow *parent = GetParent(); - if ( parent ) - parent->SetDefaultItem(this); + wxWindow *oldDefault = wxButtonBase::SetDefault(); // We initially do not set XmNdefaultShadowThickness, to have // small buttons. Unfortunately, buttons are now mis-aligned. We @@ -126,7 +130,8 @@ void wxButton::SetDefault() // wxButton in the same row, correction is straighforward: we set // resource for all wxButton in this parent (but not sub panels) - for (wxWindowList::Node * node = parent->GetChildren().GetFirst (); + wxWindow *parent = GetParent(); + for (wxWindowList::compatibility_iterator node = parent->GetChildren().GetFirst (); node; node = node->GetNext ()) { wxWindow *win = node->GetData (); @@ -138,17 +143,53 @@ void wxButton::SetDefault() XtVaSetValues ((Widget) parent->GetMainWidget(), XmNdefaultButton, (Widget) GetMainWidget(), NULL); + + return oldDefault; +} + +static inline bool wxMotifLargeButtons() +{ + return wxSystemOptions::HasOption("motif.largebuttons") + && wxSystemOptions::GetOptionInt("motif.largebuttons") != 0; } /* static */ wxSize wxButton::GetDefaultSize() { // TODO: check font size as in wxMSW ? MB - // Note: this is only the button size (text + margin + shadow) - return wxSize(70,25); + // Note: this is the button size (text + margin + shadow + defaultBorder) + return wxSize( MIN_WIDTH, MIN_LARGE_HEIGHT ); } wxSize wxButton::DoGetBestSize() const +{ + if( wxMotifLargeButtons() ) + return OldGetBestSize(); + + wxSize best = wxControl::DoGetBestSize(); + + if( HasFlag( wxBU_EXACTFIT ) ) + return best; + else if( best.x < MIN_WIDTH ) + best.x = MIN_WIDTH; + + return best; +} + +wxSize wxButton::GetMinSize() const +{ + if( wxMotifLargeButtons() ) + return OldGetMinSize(); + + return DoGetBestSize(); +} + +wxSize wxButton::OldGetMinSize() const +{ + return OldGetBestSize(); +} + +wxSize wxButton::OldGetBestSize() const { Dimension xmargin, ymargin, highlight, shadow, defThickness; @@ -165,6 +206,7 @@ wxSize wxButton::DoGetBestSize() const int margin = highlight * 2 + ( defThickness ? ( ( shadow + defThickness ) * 4 ) : ( shadow * 2 ) ); + wxSize best( x + xmargin * 2 + margin, y + ymargin * 2 + margin );