Implemented wxButton::DoGetBestSize for wxMotif. Now normal buttons

and default buttons are visually the same size, however, given how
wxMotif draws default buttons, the Widget for a default button is
bigger (8 pixels by default), thus setting default border will
make the Widget grow.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19410 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Mattia Barbon
2003-03-02 10:09:25 +00:00
parent 6b9eeef230
commit 458ca8c1fd
4 changed files with 108 additions and 83 deletions

View File

@@ -13,7 +13,7 @@ OTHER CHANGES
All: All:
- added wxCLOSE style for dialogs and frames - added wxCLOSE_BOX style for dialogs and frames
- added wxDateSpan::operator==() and !=() (Lukasz Michalski) - added wxDateSpan::operator==() and !=() (Lukasz Michalski)
- use true/false throughout the library instead of TRUE/FALSE - use true/false throughout the library instead of TRUE/FALSE
- wxStopWatch::Start() resumes the stop watch if paused, as per the docs - wxStopWatch::Start() resumes the stop watch if paused, as per the docs
@@ -95,6 +95,7 @@ wxMotif:
xmcombo; xmcombo is still used for Motif 1.x and Lesstif when compiled xmcombo; xmcombo is still used for Motif 1.x and Lesstif when compiled
with Motif 1.x compatibility with Motif 1.x compatibility
- implemented wxToggleButton - implemented wxToggleButton
- made wxButton a bit smaller by default
wxUniv: wxUniv:

View File

@@ -50,9 +50,9 @@ public:
static wxSize GetDefaultSize(); static wxSize GetDefaultSize();
// Implementation // Implementation
virtual void ChangeFont(bool keepOriginalSize = TRUE); private:
virtual void ChangeBackgroundColour(); virtual wxSize DoGetBestSize() const;
virtual void ChangeForegroundColour(); void SetDefaultShadowThicknessAndResize();
}; };
#endif #endif

View File

@@ -212,39 +212,39 @@ wxSizer *wxDialogBase::CreateButtonSizer( long flags )
if (flags & wxYES) if (flags & wxYES)
{ {
yes = new wxButton( this, wxID_YES, _("Yes"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); yes = new wxButton( this, wxID_YES, _("Yes"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
inner_yes_no->Add( yes, 0, wxLEFT|wxRIGHT, margin ); inner_yes_no->Add( yes, 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, margin );
} }
if (flags & wxNO) if (flags & wxNO)
{ {
no = new wxButton( this, wxID_NO, _("No"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); no = new wxButton( this, wxID_NO, _("No"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
inner_yes_no->Add( no, 0, wxLEFT|wxRIGHT, margin ); inner_yes_no->Add( no, 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, margin );
} }
if (flags & wxOK) if (flags & wxOK)
{ {
ok = new wxButton( this, wxID_OK, _("OK"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); ok = new wxButton( this, wxID_OK, _("OK"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
inner_rest->Add( ok, 0, wxLEFT|wxRIGHT, margin ); inner_rest->Add( ok, 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, margin );
} }
if (flags & wxFORWARD) if (flags & wxFORWARD)
inner_rest->Add( new wxButton( this, wxID_FORWARD, _("Forward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); inner_rest->Add( new wxButton( this, wxID_FORWARD, _("Forward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, margin );
if (flags & wxBACKWARD) if (flags & wxBACKWARD)
inner_rest->Add( new wxButton( this, wxID_BACKWARD, _("Backward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); inner_rest->Add( new wxButton( this, wxID_BACKWARD, _("Backward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, margin );
if (flags & wxSETUP) if (flags & wxSETUP)
inner_rest->Add( new wxButton( this, wxID_SETUP, _("Setup"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); inner_rest->Add( new wxButton( this, wxID_SETUP, _("Setup"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, margin );
if (flags & wxMORE) if (flags & wxMORE)
inner_rest->Add( new wxButton( this, wxID_MORE, _("More..."),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); inner_rest->Add( new wxButton( this, wxID_MORE, _("More..."),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, margin );
if (flags & wxHELP) if (flags & wxHELP)
inner_rest->Add( new wxButton( this, wxID_HELP, _("Help"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); inner_rest->Add( new wxButton( this, wxID_HELP, _("Help"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, margin );
if (flags & wxCANCEL) if (flags & wxCANCEL)
{ {
cancel = new wxButton( this, wxID_CANCEL, _("Cancel"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); cancel = new wxButton( this, wxID_CANCEL, _("Cancel"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
inner_rest->Add( cancel, 0, wxLEFT|wxRIGHT, margin ); inner_rest->Add( cancel, 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, margin );
} }
// choose the default button // choose the default button

View File

@@ -46,26 +46,16 @@ bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label,
const wxValidator& validator, const wxValidator& validator,
const wxString& name) const wxString& name)
{ {
SetName(name); if( !CreateControl( parent, id, pos, size, style, validator, name ) )
SetValidator(validator); return false;
m_windowStyle = style;
m_backgroundColour = parent->GetBackgroundColour();
m_foregroundColour = parent->GetForegroundColour();
m_font = parent->GetFont();
parent->AddChild((wxButton *)this);
if (id == -1)
m_windowId = NewControlId();
else
m_windowId = id;
wxString label1(wxStripMenuCodes(label)); wxString label1(wxStripMenuCodes(label));
wxXmString text( label1 );
XmString text = XmStringCreateSimple ((char*) (const char*) label1);
Widget parentWidget = (Widget) parent->GetClientWidget(); Widget parentWidget = (Widget) parent->GetClientWidget();
XmFontList fontList = (XmFontList) m_font.GetFontList(1.0, XtDisplay(parentWidget)); XmFontList fontList =
(XmFontList)m_font.GetFontList(1.0, XtDisplay(parentWidget));
/* /*
* Patch Note (important) * Patch Note (important)
@@ -80,75 +70,125 @@ bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label,
xmPushButtonWidgetClass, xmPushButtonWidgetClass,
parentWidget, parentWidget,
XmNfontList, fontList, XmNfontList, fontList,
XmNlabelString, text, XmNlabelString, text(),
// XmNdefaultButtonShadowThickness, 1, // See comment for wxButton::SetDefault // See comment for wxButton::SetDefault
// XmNdefaultButtonShadowThickness, 1,
NULL); NULL);
XmStringFree (text); XtAddCallback ((Widget) m_mainWidget,
XmNactivateCallback, (XtCallbackProc) wxButtonCallback,
XtAddCallback ((Widget) m_mainWidget, XmNactivateCallback, (XtCallbackProc) wxButtonCallback, (XtPointer) this);
(XtPointer) this);
SetCanAddEventHandler(TRUE); SetCanAddEventHandler(TRUE);
int x = 0; int y = 0;
wxFont new_font( parent->GetFont() );
GetTextExtent( label1, &x, &y, (int*)NULL, (int*)NULL, &new_font );
wxSize newSize = size; wxSize best = GetBestSize();
if (newSize.x == -1) newSize.x = 30+x; if( size.x != -1 ) best.x = size.x;
if (newSize.y == -1) newSize.y = 27+y; if( size.y != -1 ) best.y = size.y;
SetSize( newSize.x, newSize.y );
AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, newSize.x, newSize.y); pos.x, pos.y, best.x, best.y);
ChangeBackgroundColour(); ChangeBackgroundColour();
return TRUE; return TRUE;
} }
void wxButton::SetDefaultShadowThicknessAndResize()
{
Widget buttonWidget = (Widget)GetMainWidget();
bool managed = XtIsManaged( buttonWidget );
if( managed )
XtUnmanageChild( buttonWidget );
XtVaSetValues( buttonWidget,
XmNdefaultButtonShadowThickness, 1,
NULL );
if( managed )
XtManageChild( buttonWidget );
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 );
}
void wxButton::SetDefault() void wxButton::SetDefault()
{ {
wxWindow *parent = GetParent(); wxWindow *parent = GetParent();
if ( parent ) if ( parent )
parent->SetDefaultItem(this); parent->SetDefaultItem(this);
// We initially do not set XmNdefaultShadowThickness, to have small buttons. // We initially do not set XmNdefaultShadowThickness, to have
// Unfortunately, buttons are now mis-aligned. We try to correct this // small buttons. Unfortunately, buttons are now mis-aligned. We
// now -- setting this ressource to 1 for each button in the same row. // try to correct this now -- setting this ressource to 1 for each
// Because it's very hard to find wxButton in the same row, // button in the same row. Because it's very hard to find
// correction is straighforward: we set resource for all wxButton // wxButton in the same row, correction is straighforward: we set
// in this parent (but not sub panels) // resource for all wxButton in this parent (but not sub panels)
for (wxWindowList::Node * node = parent->GetChildren().GetFirst (); for (wxWindowList::Node * node = parent->GetChildren().GetFirst ();
node; node = node->GetNext ()) node; node = node->GetNext ())
{ {
wxWindow *win = node->GetData (); wxWindow *win = node->GetData ();
wxButton *item = wxDynamicCast(win, wxButton); wxButton *item = wxDynamicCast(win, wxButton);
if (item) if (item)
{ item->SetDefaultShadowThicknessAndResize();
bool managed = XtIsManaged((Widget) item->GetMainWidget()); }
if (managed)
XtUnmanageChild ((Widget) item->GetMainWidget());
XtVaSetValues ((Widget) item->GetMainWidget(), XtVaSetValues ((Widget) parent->GetMainWidget(),
XmNdefaultButtonShadowThickness, 1, XmNdefaultButton, (Widget) GetMainWidget(),
NULL); NULL);
if (managed)
XtManageChild ((Widget) item->GetMainWidget());
}
} // while
// XtVaSetValues((Widget)handle, XmNshowAsDefault, 1, NULL);
XtVaSetValues ((Widget) parent->GetMainWidget(), XmNdefaultButton, (Widget) GetMainWidget(), NULL);
} }
/* static */ /* static */
wxSize wxButton::GetDefaultSize() wxSize wxButton::GetDefaultSize()
{ {
// TODO: check font size as in wxMSW ? MB // TODO: check font size as in wxMSW ? MB
// // Note: this is only the button size (text + margin + shadow)
return wxSize(80,26); return wxSize(70,25);
}
wxSize wxButton::DoGetBestSize() const
{
Dimension xmargin, ymargin, highlight, shadow, defThickness;
XtVaGetValues( (Widget)m_mainWidget,
XmNmarginWidth, &xmargin,
XmNmarginHeight, &ymargin,
XmNhighlightThickness, &highlight,
XmNshadowThickness, &shadow,
XmNdefaultButtonShadowThickness, &defThickness,
NULL );
int x = 0; int y = 0;
GetTextExtent( GetLabel(), &x, &y );
int margin = highlight * 2 +
( defThickness ? ( ( shadow + defThickness ) * 4 ) : ( shadow * 2 ) );
wxSize best( x + xmargin * 2 + margin,
y + ymargin * 2 + margin );
// all buttons have at least the standard size unless the user explicitly
// wants them to be of smaller size and used wxBU_EXACTFIT style when
// creating the button
if( !HasFlag( wxBU_EXACTFIT ) )
{
wxSize def = GetDefaultSize();
int margin = highlight * 2 +
( defThickness ? ( shadow * 4 + defThickness * 4 ) : 0 );
def.x += margin;
def.y += margin;
if( def.x > best.x )
best.x = def.x;
if( def.y > best.y )
best.y = def.y;
}
return best;
} }
void wxButton::Command (wxCommandEvent & event) void wxButton::Command (wxCommandEvent & event)
@@ -167,19 +207,3 @@ void wxButtonCallback (Widget w, XtPointer clientData, XtPointer WXUNUSED(ptr))
event.SetEventObject(item); event.SetEventObject(item);
item->ProcessCommand (event); item->ProcessCommand (event);
} }
void wxButton::ChangeFont(bool keepOriginalSize)
{
wxWindow::ChangeFont(keepOriginalSize);
}
void wxButton::ChangeBackgroundColour()
{
DoChangeBackgroundColour(m_mainWidget, m_backgroundColour, TRUE);
}
void wxButton::ChangeForegroundColour()
{
wxWindow::ChangeForegroundColour();
}