Rework wxMotif font/color inheritance so it works
[wxWidgets.git] / src / motif / statbox.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/motif/statbox.cpp
3 // Purpose: wxStaticBox
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 17/09/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
14
15 #ifdef __VMS
16 #define XtDisplay XTDISPLAY
17 #endif
18
19 #include "wx/statbox.h"
20
21 #ifndef WX_PRECOMP
22 #include "wx/utils.h"
23 #endif
24
25 #ifdef __VMS__
26 #pragma message disable nosimpint
27 #endif
28 #include <Xm/Frame.h>
29 #include <Xm/Label.h>
30 #ifdef __VMS__
31 #pragma message enable nosimpint
32 #endif
33
34 #include "wx/motif/private.h"
35
36 IMPLEMENT_DYNAMIC_CLASS(wxStaticBox, wxControl)
37
38 BEGIN_EVENT_TABLE(wxStaticBox, wxControl)
39 //EVT_ERASE_BACKGROUND(wxStaticBox::OnEraseBackground)
40 END_EVENT_TABLE()
41
42 // ----------------------------------------------------------------------------
43 // wxXmSizeKeeper
44 // ----------------------------------------------------------------------------
45
46 // helper class to reduce code duplication
47 class wxXmSizeKeeper
48 {
49 Dimension m_x, m_y;
50 Widget m_widget;
51 public:
52 wxXmSizeKeeper( Widget w )
53 : m_widget( w )
54 {
55 XtVaGetValues( m_widget,
56 XmNwidth, &m_x,
57 XmNheight, &m_y,
58 NULL );
59 }
60
61 void Restore()
62 {
63 int x, y;
64
65 XtVaGetValues( m_widget,
66 XmNwidth, &x,
67 XmNheight, &y,
68 NULL );
69 if( x != m_x || y != m_y )
70 XtVaSetValues( m_widget,
71 XmNwidth, m_x,
72 XmNheight, m_y,
73 NULL );
74 }
75 };
76
77 /*
78 * Static box
79 */
80
81 wxStaticBox::wxStaticBox()
82 {
83 m_labelWidget = (WXWidget) 0;
84 }
85
86 bool wxStaticBox::Create(wxWindow *parent, wxWindowID id,
87 const wxString& label,
88 const wxPoint& pos,
89 const wxSize& size,
90 long style,
91 const wxString& name)
92 {
93 if( !CreateControl( parent, id, pos, size, style,
94 wxDefaultValidator, name ) )
95 return false;
96 m_labelWidget = (WXWidget) 0;
97 PreCreation();
98
99 Widget parentWidget = (Widget) parent->GetClientWidget();
100
101 m_mainWidget = XtVaCreateManagedWidget ("staticboxframe",
102 xmFrameWidgetClass, parentWidget,
103 // MBN: why override default?
104 // XmNshadowType, XmSHADOW_IN,
105 NULL);
106
107 if (!label.empty())
108 {
109 wxString label1(GetLabelText(label));
110 wxXmString text(label1);
111 Display* dpy = XtDisplay( parentWidget );
112
113 m_labelWidget = (WXWidget) XtVaCreateManagedWidget ("staticboxlabel",
114 xmLabelWidgetClass, (Widget)m_mainWidget,
115 wxFont::GetFontTag(), m_font.GetFontTypeC(dpy),
116 XmNlabelString, text(),
117 #if wxCHECK_MOTIF_VERSION( 2, 0 )
118 XmNframeChildType, XmFRAME_TITLE_CHILD,
119 #else
120 XmNchildType, XmFRAME_TITLE_CHILD,
121 #endif
122 NULL);
123 }
124
125 PostCreation();
126 AttachWidget (parent, m_mainWidget, NULL, pos.x, pos.y, size.x, size.y);
127
128 return true;
129 }
130
131 wxStaticBox::~wxStaticBox()
132 {
133 DetachWidget(m_mainWidget);
134 XtDestroyWidget((Widget) m_mainWidget);
135
136 m_mainWidget = (WXWidget) 0;
137 m_labelWidget = (WXWidget) 0;
138 }
139
140 void wxStaticBox::SetLabel( const wxString& label )
141 {
142 wxXmSizeKeeper sk( (Widget)GetMainWidget() );
143
144 wxStaticBoxBase::SetLabel( label );
145
146 sk.Restore();
147 }
148
149 void wxStaticBox::GetBordersForSizer(int *borderTop, int *borderOther) const
150 {
151 Dimension shadow, border;
152
153 XtVaGetValues( (Widget) GetMainWidget(),
154 XmNshadowThickness, &shadow,
155 XmNborderWidth, &border,
156 NULL);
157
158 *borderOther = shadow + border;
159
160 if( GetLabelWidget() )
161 {
162 XtWidgetGeometry preferred;
163 XtQueryGeometry( (Widget) GetLabelWidget(), NULL, &preferred );
164
165 *borderTop = preferred.height;
166 }
167 else
168 {
169 *borderTop = shadow;
170 }
171 }