1 /////////////////////////////////////////////////////////////////////////////
2 // Program:     wxWidgets Widgets Sample
3 // Name:        static.cpp
4 // Purpose:     Part of the widgets sample showing various static controls
5 // Author:      Vadim Zeitlin
6 // Created:     11.04.01
7 // Id:          $Id: static.cpp 43755 2006-12-03 13:43:44Z VZ $
8 // Copyright:   (c) 2001 Vadim Zeitlin
9 // License:     wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11 
12 // ============================================================================
13 // declarations
14 // ============================================================================
15 
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19 
20 // for compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
22 
23 #ifdef __BORLANDC__
24     #pragma hdrstop
25 #endif
26 
27 // for all others, include the necessary headers
28 #ifndef WX_PRECOMP
29     #include "wx/log.h"
30 
31     #include "wx/bitmap.h"
32     #include "wx/button.h"
33     #include "wx/checkbox.h"
34     #include "wx/radiobox.h"
35     #include "wx/statbox.h"
36     #include "wx/stattext.h"
37     #include "wx/textctrl.h"
38 #endif
39 
40 #include "wx/sizer.h"
41 
42 #include "wx/statline.h"
43 
44 #include "widgets.h"
45 #include "icons/statbox.xpm"
46 
47 // ----------------------------------------------------------------------------
48 // constants
49 // ----------------------------------------------------------------------------
50 
51 // control ids
52 enum
53 {
54     StaticPage_Reset = wxID_HIGHEST,
55     StaticPage_BoxText,
56     StaticPage_LabelText
57 };
58 
59 // alignment radiobox values
60 enum
61 {
62     StaticHAlign_Left,
63     StaticHAlign_Centre,
64     StaticHAlign_Right,
65     StaticHAlign_Max
66 };
67 
68 enum
69 {
70     StaticVAlign_Top,
71     StaticVAlign_Centre,
72     StaticVAlign_Bottom,
73     StaticVAlign_Max
74 };
75 
76 // ----------------------------------------------------------------------------
77 // MyStaticText and MyStaticBox
78 // ----------------------------------------------------------------------------
79 
80 // these 2 classes simply show that the static controls can get the mouse
81 // clicks too -- this used to be broken under MSW but works now
82 
83 class MyStaticText : public wxStaticText
84 {
85 public:
MyStaticText(wxWindow * parent,wxWindowID id,const wxString & label,const wxPoint & pos=wxDefaultPosition,const wxSize & size=wxDefaultSize,long style=0)86     MyStaticText(wxWindow* parent,
87                       wxWindowID id,
88                       const wxString& label,
89                       const wxPoint& pos = wxDefaultPosition,
90                       const wxSize& size = wxDefaultSize,
91                       long style = 0)
92         : wxStaticText(parent, id, label, pos, size, style)
93     {
94     }
95 
96 protected:
OnMouseEvent(wxMouseEvent & WXUNUSED (event))97     void OnMouseEvent(wxMouseEvent& WXUNUSED(event))
98     {
99         wxLogMessage(wxT("Clicked on static text"));
100     }
101 
102     DECLARE_EVENT_TABLE()
103 };
104 
105 class MyStaticBox : public wxStaticBox
106 {
107 public:
MyStaticBox(wxWindow * parent,wxWindowID id,const wxString & label,const wxPoint & pos=wxDefaultPosition,const wxSize & size=wxDefaultSize,long style=0)108     MyStaticBox(wxWindow* parent,
109                 wxWindowID id,
110                 const wxString& label,
111                 const wxPoint& pos = wxDefaultPosition,
112                 const wxSize& size = wxDefaultSize,
113                 long style = 0)
114         : wxStaticBox(parent, id, label, pos, size, style)
115     {
116     }
117 
118 protected:
OnMouseEvent(wxMouseEvent & WXUNUSED (event))119     void OnMouseEvent(wxMouseEvent& WXUNUSED(event))
120     {
121         wxLogMessage(wxT("Clicked on static box"));
122     }
123 
124     DECLARE_EVENT_TABLE()
125 };
126 
127 BEGIN_EVENT_TABLE(MyStaticText, wxStaticText)
128     EVT_LEFT_UP(MyStaticText::OnMouseEvent)
129 END_EVENT_TABLE()
130 
131 BEGIN_EVENT_TABLE(MyStaticBox, wxStaticBox)
132     EVT_LEFT_UP(MyStaticBox::OnMouseEvent)
133 END_EVENT_TABLE()
134 
135 // ----------------------------------------------------------------------------
136 // StaticWidgetsPage
137 // ----------------------------------------------------------------------------
138 
139 class StaticWidgetsPage : public WidgetsPage
140 {
141 public:
142     StaticWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
~StaticWidgetsPage()143     virtual ~StaticWidgetsPage(){};
144 
GetWidget() const145     virtual wxControl *GetWidget() const { return m_statText; }
RecreateWidget()146     virtual void RecreateWidget() { CreateStatic(); }
147 
148     // lazy creation of the content
149     virtual void CreateContent();
150 
151 protected:
152     // event handlers
153     void OnCheckOrRadioBox(wxCommandEvent& event);
154 
155     void OnButtonReset(wxCommandEvent& event);
156     void OnButtonBoxText(wxCommandEvent& event);
157     void OnButtonLabelText(wxCommandEvent& event);
158 
159     // reset all parameters
160     void Reset();
161 
162     // (re)create all controls
163     void CreateStatic();
164 
165     // the controls
166     // ------------
167 
168     // the check/radio boxes for styles
169     wxCheckBox *m_chkVert,
170                *m_chkAutoResize;
171 
172     wxRadioBox *m_radioHAlign,
173                *m_radioVAlign;
174 
175     // the controls and the sizer containing them
176     wxStaticBox *m_staticBox;
177     wxStaticBoxSizer *m_sizerStatBox;
178     wxStaticText *m_statText;
179 #if wxUSE_STATLINE
180     wxStaticLine *m_statLine;
181 #endif // wxUSE_STATLINE
182     wxSizer *m_sizerStatic;
183 
184     // the text entries for command parameters
185     wxTextCtrl *m_textBox,
186                *m_textLabel;
187 
188 private:
189     DECLARE_EVENT_TABLE()
190     DECLARE_WIDGETS_PAGE(StaticWidgetsPage)
191 };
192 
193 // ----------------------------------------------------------------------------
194 // event tables
195 // ----------------------------------------------------------------------------
196 
197 BEGIN_EVENT_TABLE(StaticWidgetsPage, WidgetsPage)
198     EVT_BUTTON(StaticPage_Reset, StaticWidgetsPage::OnButtonReset)
199     EVT_BUTTON(StaticPage_LabelText, StaticWidgetsPage::OnButtonLabelText)
200     EVT_BUTTON(StaticPage_BoxText, StaticWidgetsPage::OnButtonBoxText)
201 
202     EVT_CHECKBOX(wxID_ANY, StaticWidgetsPage::OnCheckOrRadioBox)
203     EVT_RADIOBOX(wxID_ANY, StaticWidgetsPage::OnCheckOrRadioBox)
204 END_EVENT_TABLE()
205 
206 // ============================================================================
207 // implementation
208 // ============================================================================
209 
210 IMPLEMENT_WIDGETS_PAGE(StaticWidgetsPage, _T("Static"),
211                        (int)wxPlatform(GENERIC_CTRLS).If(wxOS_WINDOWS,NATIVE_CTRLS)
212                        );
213 
StaticWidgetsPage(WidgetsBookCtrl * book,wxImageList * imaglist)214 StaticWidgetsPage::StaticWidgetsPage(WidgetsBookCtrl *book,
215                                      wxImageList *imaglist)
216                   : WidgetsPage(book, imaglist, statbox_xpm)
217 {
218     // init everything
219     m_chkVert =
220     m_chkAutoResize = (wxCheckBox *)NULL;
221 
222     m_radioHAlign =
223     m_radioVAlign = (wxRadioBox *)NULL;
224 
225 #if wxUSE_STATLINE
226     m_statLine = (wxStaticLine *)NULL;
227 #endif // wxUSE_STATLINE
228     m_statText = (wxStaticText *)NULL;
229 
230     m_staticBox = (wxStaticBox *)NULL;
231     m_sizerStatBox = (wxStaticBoxSizer *)NULL;
232     m_sizerStatic = (wxSizer *)NULL;
233 }
234 
CreateContent()235 void StaticWidgetsPage::CreateContent()
236 {
237     wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
238 
239     // left pane
240     wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style"));
241 
242     wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
243 
244     m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Vertical line"));
245     m_chkAutoResize = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Fit to text"));
246     sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
247 
248     static const wxString halign[] =
249     {
250         _T("left"),
251         _T("centre"),
252         _T("right"),
253     };
254 
255     static const wxString valign[] =
256     {
257         _T("top"),
258         _T("centre"),
259         _T("bottom"),
260     };
261 
262     m_radioHAlign = new wxRadioBox(this, wxID_ANY, _T("&Horz alignment"),
263                                    wxDefaultPosition, wxDefaultSize,
264                                    WXSIZEOF(halign), halign);
265     m_radioVAlign = new wxRadioBox(this, wxID_ANY, _T("&Vert alignment"),
266                                    wxDefaultPosition, wxDefaultSize,
267                                    WXSIZEOF(valign), valign);
268 
269     sizerLeft->Add(m_radioHAlign, 0, wxGROW | wxALL, 5);
270     sizerLeft->Add(m_radioVAlign, 0, wxGROW | wxALL, 5);
271 
272     wxButton *btn = new wxButton(this, StaticPage_Reset, _T("&Reset"));
273     sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
274 
275     // middle pane
276     wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, _T("&Change labels"));
277     wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
278 
279     wxSizer *sizerRow;
280 
281     sizerRow = CreateSizerWithTextAndButton(StaticPage_BoxText,
282                                             _T("Change &box label"),
283                                             wxID_ANY, &m_textBox);
284     sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5);
285 
286     sizerRow = CreateSizerWithTextAndButton(StaticPage_LabelText,
287                                             _T("Change &text label"),
288                                             wxID_ANY, &m_textLabel);
289     sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5);
290 
291     m_textBox->SetValue(_T("This is a box"));
292     m_textLabel->SetValue(_T("And this is a label\ninside the box"));
293 
294     // right pane
295     wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL);
296     sizerRight->SetMinSize(150, 0);
297     m_sizerStatic = sizerRight;
298 
299     CreateStatic();
300 
301     // the 3 panes panes compose the window
302     sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
303     sizerTop->Add(sizerMiddle, 0, wxGROW | wxALL, 10);
304     sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
305 
306     // final initializations
307     Reset();
308 
309     SetSizer(sizerTop);
310 }
311 
312 // ----------------------------------------------------------------------------
313 // operations
314 // ----------------------------------------------------------------------------
315 
Reset()316 void StaticWidgetsPage::Reset()
317 {
318     m_chkVert->SetValue(false);
319     m_chkAutoResize->SetValue(true);
320 
321     m_radioHAlign->SetSelection(StaticHAlign_Left);
322     m_radioVAlign->SetSelection(StaticVAlign_Top);
323 }
324 
CreateStatic()325 void StaticWidgetsPage::CreateStatic()
326 {
327     bool isVert = m_chkVert->GetValue();
328 
329     if ( m_sizerStatBox )
330     {
331         delete m_staticBox;
332         // delete m_sizerStatBox; -- deleted by Remove()
333         m_sizerStatic->Remove(m_sizerStatBox);
334         delete m_statText;
335 #if wxUSE_STATLINE
336         delete m_statLine;
337 #endif // wxUSE_STATLINE
338     }
339 
340     int flagsBox = 0,
341         flagsText = ms_defaultFlags;
342 
343     if ( !m_chkAutoResize->GetValue() )
344     {
345         flagsText |= wxST_NO_AUTORESIZE;
346     }
347 
348     int align = 0;
349     switch ( m_radioHAlign->GetSelection() )
350     {
351         default:
352             wxFAIL_MSG(_T("unexpected radiobox selection"));
353             // fall through
354 
355         case StaticHAlign_Left:
356             align |= wxALIGN_LEFT;
357             break;
358 
359         case StaticHAlign_Centre:
360             align |= wxALIGN_CENTRE_HORIZONTAL;
361             break;
362 
363         case StaticHAlign_Right:
364             align |= wxALIGN_RIGHT;
365             break;
366     }
367 
368     switch ( m_radioVAlign->GetSelection() )
369     {
370         default:
371             wxFAIL_MSG(_T("unexpected radiobox selection"));
372             // fall through
373 
374         case StaticVAlign_Top:
375             align |= wxALIGN_TOP;
376             break;
377 
378         case StaticVAlign_Centre:
379             align |= wxALIGN_CENTRE_VERTICAL;
380             break;
381 
382         case StaticVAlign_Bottom:
383             align |= wxALIGN_BOTTOM;
384             break;
385     }
386 
387     flagsText |= align;
388     flagsBox |= align;
389 
390     m_staticBox = new MyStaticBox(this, wxID_ANY, m_textBox->GetValue(),
391                                   wxDefaultPosition, wxDefaultSize,
392                                   flagsBox);
393     m_sizerStatBox = new wxStaticBoxSizer(m_staticBox, isVert ? wxHORIZONTAL
394                                                               : wxVERTICAL);
395 
396     m_statText = new MyStaticText(this, wxID_ANY, m_textLabel->GetValue(),
397                                   wxDefaultPosition, wxDefaultSize,
398                                   flagsText);
399 
400 #if wxUSE_STATLINE
401     m_statLine = new wxStaticLine(this, wxID_ANY,
402                                   wxDefaultPosition, wxDefaultSize,
403                                   isVert ? wxLI_VERTICAL : wxLI_HORIZONTAL);
404 #endif // wxUSE_STATLINE
405 
406     m_sizerStatBox->Add(m_statText, 1, wxGROW | wxALL, 5);
407 #if wxUSE_STATLINE
408     m_sizerStatBox->Add(m_statLine, 0, wxGROW | wxALL, 5);
409 #endif // wxUSE_STATLINE
410     m_sizerStatBox->Add(0, 0, 1);
411 
412     m_sizerStatic->Add(m_sizerStatBox, 1, wxGROW);
413 
414     m_sizerStatic->Layout();
415 }
416 
417 // ----------------------------------------------------------------------------
418 // event handlers
419 // ----------------------------------------------------------------------------
420 
OnButtonReset(wxCommandEvent & WXUNUSED (event))421 void StaticWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
422 {
423     Reset();
424 
425     CreateStatic();
426 }
427 
OnCheckOrRadioBox(wxCommandEvent & WXUNUSED (event))428 void StaticWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
429 {
430     CreateStatic();
431 }
432 
OnButtonBoxText(wxCommandEvent & WXUNUSED (event))433 void StaticWidgetsPage::OnButtonBoxText(wxCommandEvent& WXUNUSED(event))
434 {
435     m_sizerStatBox->GetStaticBox()->SetLabel(m_textBox->GetValue());
436 }
437 
OnButtonLabelText(wxCommandEvent & WXUNUSED (event))438 void StaticWidgetsPage::OnButtonLabelText(wxCommandEvent& WXUNUSED(event))
439 {
440     m_statText->SetLabel(m_textLabel->GetValue());
441 }
442 
443