]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/motif/statbox.cpp
fixing infinite recursion
[wxWidgets.git] / src / motif / statbox.cpp
... / ...
CommitLineData
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
32IMPLEMENT_DYNAMIC_CLASS(wxStaticBox, wxControl)
33
34BEGIN_EVENT_TABLE(wxStaticBox, wxControl)
35//EVT_ERASE_BACKGROUND(wxStaticBox::OnEraseBackground)
36END_EVENT_TABLE()
37
38// ----------------------------------------------------------------------------
39// wxXmSizeKeeper
40// ----------------------------------------------------------------------------
41
42// helper class to reduce code duplication
43class wxXmSizeKeeper
44{
45 Dimension m_x, m_y;
46 Widget m_widget;
47public:
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
77wxStaticBox::wxStaticBox()
78{
79 m_labelWidget = (WXWidget) 0;
80}
81
82bool 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
127wxStaticBox::~wxStaticBox()
128{
129 DetachWidget(m_mainWidget);
130 XtDestroyWidget((Widget) m_mainWidget);
131
132 m_mainWidget = (WXWidget) 0;
133 m_labelWidget = (WXWidget) 0;
134}
135
136void wxStaticBox::SetLabel( const wxString& label )
137{
138 wxXmSizeKeeper sk( (Widget)GetMainWidget() );
139
140 wxStaticBoxBase::SetLabel( label );
141
142 sk.Restore();
143}
144
145void 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}