X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4bb6408c2631988fab9925014c6619358bf867de..a4f4d548ce0d3533fe9e84d812643cc7c21dd580:/src/motif/statbox.cpp?ds=sidebyside diff --git a/src/motif/statbox.cpp b/src/motif/statbox.cpp index 9b46697f96..6c96295e52 100644 --- a/src/motif/statbox.cpp +++ b/src/motif/statbox.cpp @@ -6,28 +6,82 @@ // Created: 17/09/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "statbox.h" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __VMS +#define XtDisplay XTDISPLAY #endif +#include "wx/defs.h" + #include "wx/statbox.h" +#include "wx/utils.h" + +#ifdef __VMS__ +#pragma message disable nosimpint +#endif +#include +#include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif + +#include "wx/motif/private.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxStaticBox, wxControl) BEGIN_EVENT_TABLE(wxStaticBox, wxControl) - EVT_ERASE_BACKGROUND(wxStaticBox::OnEraseBackground) +//EVT_ERASE_BACKGROUND(wxStaticBox::OnEraseBackground) END_EVENT_TABLE() -#endif +// ---------------------------------------------------------------------------- +// wxXmSizeKeeper +// ---------------------------------------------------------------------------- + +// helper class to reduce code duplication +class wxXmSizeKeeper +{ + Dimension m_x, m_y; + Widget m_widget; +public: + wxXmSizeKeeper( Widget w ) + : m_widget( w ) + { + XtVaGetValues( m_widget, + XmNwidth, &m_x, + XmNheight, &m_y, + NULL ); + } + + void Restore() + { + int x, y; + + XtVaGetValues( m_widget, + XmNwidth, &x, + XmNheight, &y, + NULL ); + if( x != m_x || y != m_y ) + XtVaSetValues( m_widget, + XmNwidth, m_x, + XmNheight, m_y, + NULL ); + } +}; /* * Static box */ - + +wxStaticBox::wxStaticBox() +{ + m_labelWidget = (WXWidget) 0; +} + bool wxStaticBox::Create(wxWindow *parent, wxWindowID id, const wxString& label, const wxPoint& pos, @@ -35,28 +89,81 @@ bool wxStaticBox::Create(wxWindow *parent, wxWindowID id, long style, const wxString& name) { - SetName(name); + if( !CreateControl( parent, id, pos, size, style, + wxDefaultValidator, name ) ) + return false; - if (parent) parent->AddChild(this); + Widget parentWidget = (Widget) parent->GetClientWidget(); - if ( id == -1 ) - m_windowId = (int)NewControlId(); - else - m_windowId = id; + m_mainWidget = XtVaCreateManagedWidget ("staticboxframe", + xmFrameWidgetClass, parentWidget, + // MBN: why override default? + // XmNshadowType, XmSHADOW_IN, + NULL); - m_windowStyle = style; + bool hasLabel = (!label.IsNull() && !label.IsEmpty()) ; + if (hasLabel) + { + wxString label1(wxStripMenuCodes(label)); + wxXmString text(label1); + Display* dpy = XtDisplay( parentWidget ); + + m_labelWidget = (WXWidget) XtVaCreateManagedWidget ("staticboxlabel", + xmLabelWidgetClass, (Widget)m_mainWidget, + wxFont::GetFontTag(), m_font.GetFontTypeC(dpy), + XmNlabelString, text(), +#if wxCHECK_MOTIF_VERSION( 2, 0 ) + XmNframeChildType, XmFRAME_TITLE_CHILD, +#else + XmNchildType, XmFRAME_TITLE_CHILD, +#endif + NULL); + } + + AttachWidget (parent, m_mainWidget, NULL, pos.x, pos.y, size.x, size.y); + ChangeBackgroundColour(); - // TODO: create static box - return FALSE; + return true; } -void wxStaticBox::SetLabel(const wxString& label) +wxStaticBox::~wxStaticBox() { - // TODO + DetachWidget(m_mainWidget); + XtDestroyWidget((Widget) m_mainWidget); + + m_mainWidget = (WXWidget) 0; + m_labelWidget = (WXWidget) 0; } -void wxStaticBox::SetSize(int x, int y, int width, int height, int sizeFlags) +void wxStaticBox::SetLabel( const wxString& label ) { - // TODO + wxXmSizeKeeper sk( (Widget)GetMainWidget() ); + + wxStaticBoxBase::SetLabel( label ); + + sk.Restore(); } +void wxStaticBox::GetBordersForSizer(int *borderTop, int *borderOther) const +{ + Dimension shadow, border; + + XtVaGetValues( (Widget) GetMainWidget(), + XmNshadowThickness, &shadow, + XmNborderWidth, &border, + NULL); + + *borderOther = shadow + border; + + if( GetLabelWidget() ) + { + XtWidgetGeometry preferred; + XtQueryGeometry( (Widget) GetLabelWidget(), NULL, &preferred ); + + *borderTop = preferred.height; + } + else + { + *borderTop = shadow; + } +}