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

@@ -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());
item->SetDefaultShadowThicknessAndResize();
}
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);
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();
}