From 458ca8c1fdad48cf05476338b946634eec03fe16 Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Sun, 2 Mar 2003 10:09:25 +0000 Subject: [PATCH] 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 --- docs/changes.txt | 3 +- include/wx/motif/button.h | 6 +- src/common/dlgcmn.cpp | 18 ++--- src/motif/button.cpp | 166 ++++++++++++++++++++++---------------- 4 files changed, 109 insertions(+), 84 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index e143f9e726..9160ed94f6 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -13,7 +13,7 @@ OTHER CHANGES All: -- added wxCLOSE style for dialogs and frames +- added wxCLOSE_BOX style for dialogs and frames - added wxDateSpan::operator==() and !=() (Lukasz Michalski) - use true/false throughout the library instead of TRUE/FALSE - 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 with Motif 1.x compatibility - implemented wxToggleButton +- made wxButton a bit smaller by default wxUniv: diff --git a/include/wx/motif/button.h b/include/wx/motif/button.h index 08fe446a8a..dc1aec766f 100644 --- a/include/wx/motif/button.h +++ b/include/wx/motif/button.h @@ -50,9 +50,9 @@ public: static wxSize GetDefaultSize(); // Implementation - virtual void ChangeFont(bool keepOriginalSize = TRUE); - virtual void ChangeBackgroundColour(); - virtual void ChangeForegroundColour(); +private: + virtual wxSize DoGetBestSize() const; + void SetDefaultShadowThicknessAndResize(); }; #endif diff --git a/src/common/dlgcmn.cpp b/src/common/dlgcmn.cpp index e1b894b63c..0fa83f4475 100644 --- a/src/common/dlgcmn.cpp +++ b/src/common/dlgcmn.cpp @@ -212,39 +212,39 @@ wxSizer *wxDialogBase::CreateButtonSizer( long flags ) if (flags & wxYES) { 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) { 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) { 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) - 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) - 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) - 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) - 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) - 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) { 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 diff --git a/src/motif/button.cpp b/src/motif/button.cpp index de02890cb2..b5abcc320e 100644 --- a/src/motif/button.cpp +++ b/src/motif/button.cpp @@ -46,26 +46,16 @@ bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, const wxValidator& validator, const wxString& name) { - SetName(name); - SetValidator(validator); - 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; + if( !CreateControl( parent, id, pos, size, style, validator, name ) ) + return false; wxString label1(wxStripMenuCodes(label)); + wxXmString text( label1 ); - XmString text = XmStringCreateSimple ((char*) (const char*) label1); 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) @@ -80,75 +70,125 @@ bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, xmPushButtonWidgetClass, parentWidget, XmNfontList, fontList, - XmNlabelString, text, - // XmNdefaultButtonShadowThickness, 1, // See comment for wxButton::SetDefault + XmNlabelString, text(), + // See comment for wxButton::SetDefault + // XmNdefaultButtonShadowThickness, 1, NULL); - XmStringFree (text); - - XtAddCallback ((Widget) m_mainWidget, XmNactivateCallback, (XtCallbackProc) wxButtonCallback, - (XtPointer) this); + XtAddCallback ((Widget) m_mainWidget, + XmNactivateCallback, (XtCallbackProc) wxButtonCallback, + (XtPointer) this); 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; - if (newSize.x == -1) newSize.x = 30+x; - if (newSize.y == -1) newSize.y = 27+y; - SetSize( newSize.x, newSize.y ); - - AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, newSize.x, newSize.y); + wxSize best = GetBestSize(); + if( size.x != -1 ) best.x = size.x; + if( size.y != -1 ) best.y = size.y; + + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, + pos.x, pos.y, best.x, best.y); ChangeBackgroundColour(); 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() { wxWindow *parent = GetParent(); if ( parent ) parent->SetDefaultItem(this); - // We initially do not set XmNdefaultShadowThickness, to have small buttons. - // Unfortunately, buttons are now mis-aligned. We try to correct this - // now -- setting this ressource to 1 for each button in the same row. - // Because it's very hard to find wxButton in the same row, - // correction is straighforward: we set resource for all wxButton - // in this parent (but not sub panels) + // We initially do not set XmNdefaultShadowThickness, to have + // small buttons. Unfortunately, buttons are now mis-aligned. We + // try to correct this now -- setting this ressource to 1 for each + // button in the same row. Because it's very hard to find + // 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 (); node; node = node->GetNext ()) { wxWindow *win = node->GetData (); wxButton *item = wxDynamicCast(win, wxButton); if (item) - { - bool managed = XtIsManaged((Widget) item->GetMainWidget()); - if (managed) - XtUnmanageChild ((Widget) item->GetMainWidget()); - - XtVaSetValues ((Widget) item->GetMainWidget(), - XmNdefaultButtonShadowThickness, 1, - NULL); - - if (managed) - XtManageChild ((Widget) item->GetMainWidget()); - } - } // while - - // XtVaSetValues((Widget)handle, XmNshowAsDefault, 1, NULL); - XtVaSetValues ((Widget) parent->GetMainWidget(), XmNdefaultButton, (Widget) GetMainWidget(), NULL); + item->SetDefaultShadowThicknessAndResize(); + } + + XtVaSetValues ((Widget) parent->GetMainWidget(), + XmNdefaultButton, (Widget) GetMainWidget(), + NULL); } /* static */ wxSize wxButton::GetDefaultSize() { // TODO: check font size as in wxMSW ? MB - // - return wxSize(80,26); + // Note: this is only the button size (text + margin + shadow) + 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) @@ -167,19 +207,3 @@ void wxButtonCallback (Widget w, XtPointer clientData, XtPointer WXUNUSED(ptr)) event.SetEventObject(item); 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(); -} - -- 2.45.2