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