]> git.saurik.com Git - wxWidgets.git/commitdiff
Implemented wxButton::DoGetBestSize for wxMotif. Now normal buttons
authorMattia Barbon <mbarbon@cpan.org>
Sun, 2 Mar 2003 10:09:25 +0000 (10:09 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Sun, 2 Mar 2003 10:09:25 +0000 (10:09 +0000)
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
include/wx/motif/button.h
src/common/dlgcmn.cpp
src/motif/button.cpp

index e143f9e7266e7b7960d0200c69fc815355c8236a..9160ed94f6a03571cefaa5b7ade96260e93f909c 100644 (file)
@@ -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:
 
index 08fe446a8a37b526d01f308df765831ba809536c..dc1aec766ff185df933da77dc220a15b45795e1a 100644 (file)
@@ -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
index e1b894b63c44e9bce2de7c8e7888b923c0c7bb2c..0fa83f4475786cc7f42b3041ccdfc3e47a4ba709 100644 (file)
@@ -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
index de02890cb2b3b5d4e9220244a4a7a2a4bc706315..b5abcc320ecd9e4aeca3cf4104ea53bc9fd72f6e 100644 (file)
@@ -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();
-}
-