/////////////////////////////////////////////////////////////////////////////
-// Name: button.cpp
+// Name: src/motif/button.cpp
// Purpose: wxButton
// Author: Julian Smart
// Modified by:
// 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
#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();
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()
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
// 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 ();
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;
int margin = highlight * 2 +
( defThickness ? ( ( shadow + defThickness ) * 4 ) : ( shadow * 2 ) );
+
wxSize best( x + xmargin * 2 + margin,
y + ymargin * 2 + margin );