1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        layout.cpp
3 // Purpose:     Layout sample
4 // Author:      Julian Smart
5 // Modified by: Robin Dunn, Vadim Zeitlin
6 // Created:     04/01/98
7 // Copyright:   (c) 1998 Julian Smart
8 //                  2005 Vadim Zeitlin
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 // ----------------------------------------------------------------------------
13 // headers
14 // ----------------------------------------------------------------------------
15 
16 // For compilers that support precompilation, includes "wx/wx.h".
17 #include "wx/wxprec.h"
18 
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22 
23 #ifndef WX_PRECOMP
24 #include "wx/wx.h"
25 #endif
26 
27 #include "wx/sizer.h"
28 #include "wx/gbsizer.h"
29 #include "wx/statline.h"
30 #include "wx/notebook.h"
31 #include "wx/spinctrl.h"
32 #include "wx/wrapsizer.h"
33 #include "wx/generic/stattextg.h"
34 
35 #include "layout.h"
36 
37 #ifndef wxHAS_IMAGES_IN_RESOURCES
38     #include "../sample.xpm"
39 #endif
40 
41 
42 // ----------------------------------------------------------------------------
43 // MyApp
44 // ----------------------------------------------------------------------------
45 
IMPLEMENT_APP(MyApp)46 IMPLEMENT_APP(MyApp)
47 
48 bool MyApp::OnInit()
49 {
50   if ( !wxApp::OnInit() )
51       return false;
52 
53   // Create the main frame window
54   MyFrame *frame = new MyFrame;
55 
56   frame->Show(true);
57 
58   return true;
59 }
60 
61 // ----------------------------------------------------------------------------
62 // MyFrame
63 // ----------------------------------------------------------------------------
64 
wxBEGIN_EVENT_TABLE(MyFrame,wxFrame)65 wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
66   EVT_MENU(LAYOUT_ABOUT, MyFrame::OnAbout)
67   EVT_MENU(LAYOUT_QUIT, MyFrame::OnQuit)
68 
69   EVT_MENU(LAYOUT_TEST_PROPORTIONS, MyFrame::TestProportions)
70   EVT_MENU(LAYOUT_TEST_SIZER, MyFrame::TestFlexSizers)
71   EVT_MENU(LAYOUT_TEST_NB_SIZER, MyFrame::TestNotebookSizers)
72   EVT_MENU(LAYOUT_TEST_GB_SIZER, MyFrame::TestGridBagSizer)
73   EVT_MENU(LAYOUT_TEST_SET_MINIMAL, MyFrame::TestSetMinimal)
74   EVT_MENU(LAYOUT_TEST_NESTED, MyFrame::TestNested)
75   EVT_MENU(LAYOUT_TEST_WRAP, MyFrame::TestWrap)
76 wxEND_EVENT_TABLE()
77 
78 // Define my frame constructor
79 MyFrame::MyFrame()
80        : wxFrame(NULL, wxID_ANY, wxT("wxWidgets Layout Demo"))
81 {
82     SetIcon(wxICON(sample));
83 
84     // Make a menubar
85     wxMenu *file_menu = new wxMenu;
86 
87     file_menu->Append(LAYOUT_TEST_PROPORTIONS, wxT("&Proportions demo...\tF1"));
88     file_menu->Append(LAYOUT_TEST_SIZER, wxT("Test wx&FlexSizer...\tF2"));
89     file_menu->Append(LAYOUT_TEST_NB_SIZER, wxT("Test &notebook sizers...\tF3"));
90     file_menu->Append(LAYOUT_TEST_GB_SIZER, wxT("Test &gridbag sizer...\tF4"));
91     file_menu->Append(LAYOUT_TEST_SET_MINIMAL, wxT("Test Set&ItemMinSize...\tF5"));
92     file_menu->Append(LAYOUT_TEST_NESTED, wxT("Test nested sizer in a wxPanel...\tF6"));
93     file_menu->Append(LAYOUT_TEST_WRAP, wxT("Test wrap sizers...\tF7"));
94 
95     file_menu->AppendSeparator();
96     file_menu->Append(LAYOUT_QUIT, wxT("E&xit"), wxT("Quit program"));
97 
98     wxMenu *help_menu = new wxMenu;
99     help_menu->Append(LAYOUT_ABOUT, wxT("&About"), wxT("About layout demo..."));
100 
101     wxMenuBar *menu_bar = new wxMenuBar;
102 
103     menu_bar->Append(file_menu, wxT("&File"));
104     menu_bar->Append(help_menu, wxT("&Help"));
105 
106     // Associate the menu bar with the frame
107     SetMenuBar(menu_bar);
108 
109 #if wxUSE_STATUSBAR
110     CreateStatusBar(2);
111     SetStatusText(wxT("wxWidgets layout demo"));
112 #endif // wxUSE_STATUSBAR
113 
114     wxPanel* p = new wxPanel(this, wxID_ANY);
115 
116     // we want to get a dialog that is stretchable because it
117     // has a text ctrl in the middle. at the bottom, we have
118     // two buttons which.
119 
120     wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
121 
122     // 1) top: create wxStaticText with minimum size equal to its default size
123     topsizer->Add(
124         new wxStaticText( p, wxID_ANY, wxT("An explanation (wxALIGN_RIGHT).") ),
125         wxSizerFlags().Align(wxALIGN_RIGHT).Border(wxALL & ~wxBOTTOM, 5));
126     topsizer->Add(
127         new wxStaticText( p, wxID_ANY, wxT("An explanation (wxALIGN_LEFT).") ),
128         wxSizerFlags().Align(wxALIGN_LEFT).Border(wxALL & ~wxBOTTOM, 5));
129     topsizer->Add(
130         new wxStaticText( p, wxID_ANY, wxT("An explanation (wxALIGN_CENTRE_HORIZONTAL).") ),
131         wxSizerFlags().Align(wxALIGN_CENTRE_HORIZONTAL).Border(wxALL & ~wxBOTTOM, 5));
132 
133     // 2) top: create wxTextCtrl with minimum size (100x60)
134     topsizer->Add(
135         new wxTextCtrl( p, wxID_ANY, wxT("My text (wxEXPAND)."), wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE),
136         wxSizerFlags(1).Expand().Border(wxALL, 5));
137 
138     // 2.5) Gratuitous test of wxStaticBoxSizers
139     wxBoxSizer *statsizer = new wxStaticBoxSizer(
140         new wxStaticBox(p, wxID_ANY, wxT("A wxStaticBoxSizer")), wxVERTICAL );
141     statsizer->Add(
142         new wxStaticText(p, wxID_ANY, wxT("And some TEXT inside it")),
143         wxSizerFlags().Border(wxALL, 30));
144     topsizer->Add(
145         statsizer,
146         wxSizerFlags(1).Expand().Border(wxALL, 10));
147 
148     // 2.7) And a test of wxGridSizer
149     wxGridSizer *gridsizer = new wxGridSizer(2, 5, 5);
150     gridsizer->Add(new wxStaticText(p, wxID_ANY, wxT("Label")),
151                 wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));
152     gridsizer->Add(new wxTextCtrl(p, wxID_ANY, wxT("Grid sizer demo")),
153                 wxSizerFlags(1).Align(wxGROW | wxALIGN_CENTER_VERTICAL));
154     gridsizer->Add(new wxStaticText(p, wxID_ANY, wxT("Another label")),
155                 wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));
156     gridsizer->Add(new wxTextCtrl(p, wxID_ANY, wxT("More text")),
157                 wxSizerFlags(1).Align(wxGROW | wxALIGN_CENTER_VERTICAL));
158     gridsizer->Add(new wxStaticText(p, wxID_ANY, wxT("Final label")),
159                 wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));
160     gridsizer->Add(new wxTextCtrl(p, wxID_ANY, wxT("And yet more text")),
161                 wxSizerFlags().Align(wxGROW | wxALIGN_CENTER_VERTICAL));
162     topsizer->Add(
163         gridsizer,
164         wxSizerFlags().Proportion(1).Expand().Border(wxALL, 10));
165 
166 
167 #if wxUSE_STATLINE
168     // 3) middle: create wxStaticLine with minimum size (3x3)
169     topsizer->Add(
170         new wxStaticLine( p, wxID_ANY, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL),
171         wxSizerFlags().Expand());
172 #endif // wxUSE_STATLINE
173 
174 
175     // 4) bottom: create two centred wxButtons
176     wxBoxSizer *button_box = new wxBoxSizer( wxHORIZONTAL );
177     button_box->Add(
178         new wxButton( p, wxID_ANY, wxT("Two buttons in a box") ),
179         wxSizerFlags().Border(wxALL, 7));
180     button_box->Add(
181         new wxButton( p, wxID_ANY, wxT("(wxCENTER)") ),
182         wxSizerFlags().Border(wxALL, 7));
183 
184     topsizer->Add(button_box, wxSizerFlags().Center());
185 
186     p->SetSizer( topsizer );
187 
188     // don't allow frame to get smaller than what the sizers tell it and also set
189     // the initial size as calculated by the sizers
190     topsizer->SetSizeHints( this );
191 }
192 
OnQuit(wxCommandEvent & WXUNUSED (event))193 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
194 {
195     Close(true);
196 }
197 
TestProportions(wxCommandEvent & WXUNUSED (event))198 void MyFrame::TestProportions(wxCommandEvent& WXUNUSED(event))
199 {
200     (new MyProportionsFrame(this))->Show();
201 }
202 
TestFlexSizers(wxCommandEvent & WXUNUSED (event))203 void MyFrame::TestFlexSizers(wxCommandEvent& WXUNUSED(event) )
204 {
205     (new MyFlexSizerFrame(this))->Show();
206 }
207 
TestNotebookSizers(wxCommandEvent & WXUNUSED (event))208 void MyFrame::TestNotebookSizers(wxCommandEvent& WXUNUSED(event) )
209 {
210     MySizerDialog dialog( this, wxT("Notebook Sizer Test Dialog") );
211 
212     dialog.ShowModal();
213 }
214 
TestSetMinimal(wxCommandEvent & WXUNUSED (event))215 void MyFrame::TestSetMinimal(wxCommandEvent& WXUNUSED(event) )
216 {
217     (new MySimpleSizerFrame(this))->Show();
218 }
219 
TestNested(wxCommandEvent & WXUNUSED (event))220 void MyFrame::TestNested(wxCommandEvent& WXUNUSED(event) )
221 {
222     (new MyNestedSizerFrame(this))->Show();
223 }
224 
TestWrap(wxCommandEvent & WXUNUSED (event))225 void MyFrame::TestWrap(wxCommandEvent& WXUNUSED(event) )
226 {
227     (new MyWrapSizerFrame(this))->Show();
228 }
229 
230 
OnAbout(wxCommandEvent & WXUNUSED (event))231 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
232 {
233     (void)wxMessageBox(wxT("wxWidgets GUI library layout demo\n"),
234             wxT("About Layout Demo"), wxOK|wxICON_INFORMATION);
235 }
236 
TestGridBagSizer(wxCommandEvent & WXUNUSED (event))237 void MyFrame::TestGridBagSizer(wxCommandEvent& WXUNUSED(event) )
238 {
239     (new MyGridBagSizerFrame(this))->Show();
240 }
241 
242 // ----------------------------------------------------------------------------
243 // MyProportionsFrame
244 // ----------------------------------------------------------------------------
245 
MyProportionsFrame(wxFrame * parent)246 MyProportionsFrame::MyProportionsFrame(wxFrame *parent)
247                   : wxFrame(parent, wxID_ANY, wxT("Box Sizer Proportions Demo"))
248 {
249     size_t n;
250 
251     // create the controls
252     wxPanel *panel = new wxPanel(this, wxID_ANY);
253     for ( n = 0; n < WXSIZEOF(m_spins); n++ )
254     {
255         m_spins[n] = new wxSpinCtrl(panel);
256         m_spins[n]->SetValue(n);
257     }
258 
259     // lay them out
260     m_sizer = new wxStaticBoxSizer(wxHORIZONTAL, panel,
261                 wxT("Try changing elements proportions and resizing the window"));
262     for ( n = 0; n < WXSIZEOF(m_spins); n++ )
263         m_sizer->Add(m_spins[n], wxSizerFlags().Border());
264 
265     // put everything together
266     panel->SetSizer(m_sizer);
267     wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
268     sizerTop->Add(panel, wxSizerFlags(1).Expand().Border());
269     UpdateProportions();
270     SetSizerAndFit(sizerTop);
271 
272     // and connect the events
273     Connect(wxEVT_TEXT,
274                 wxCommandEventHandler(MyProportionsFrame::OnProportionUpdated));
275     Connect(wxEVT_SPINCTRL,
276             wxSpinEventHandler(MyProportionsFrame::OnProportionChanged));
277 }
278 
UpdateProportions()279 void MyProportionsFrame::UpdateProportions()
280 {
281     for ( size_t n = 0; n < WXSIZEOF(m_spins); n++ )
282     {
283         m_sizer->GetItem(n)->SetProportion(m_spins[n]->GetValue());
284     }
285 
286     m_sizer->Layout();
287 }
288 
OnProportionUpdated(wxCommandEvent & WXUNUSED (event))289 void MyProportionsFrame::OnProportionUpdated(wxCommandEvent& WXUNUSED(event))
290 {
291     UpdateProportions();
292 }
293 
OnProportionChanged(wxSpinEvent & WXUNUSED (event))294 void MyProportionsFrame::OnProportionChanged(wxSpinEvent& WXUNUSED(event))
295 {
296     UpdateProportions();
297 }
298 
299 // ----------------------------------------------------------------------------
300 //  MyFlexSizerFrame
301 // ----------------------------------------------------------------------------
302 
InitFlexSizer(wxFlexGridSizer * sizer,wxWindow * parent)303 void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer *sizer, wxWindow* parent)
304 {
305     for ( int i = 0; i < 3; i++ )
306     {
307         for ( int j = 0; j < 3; j++ )
308         {
309             wxWindow * const cell = new wxGenericStaticText
310                                         (
311                                             parent,
312                                             wxID_ANY,
313                                             wxString::Format("(%d, %d)",
314                                                              i + 1, j + 1)
315                                         );
316             if ( (i + j) % 2 )
317                 cell->SetBackgroundColour( *wxLIGHT_GREY );
318             sizer->Add(cell, 0, wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 3);
319         }
320     }
321 }
322 
MyFlexSizerFrame(wxFrame * parent)323 MyFlexSizerFrame::MyFlexSizerFrame(wxFrame* parent)
324             : wxFrame(parent, wxID_ANY, "Flex Sizer Test Frame")
325 {
326     wxFlexGridSizer *sizerFlex;
327     wxPanel* p = new wxPanel(this, wxID_ANY);
328 
329     // consttuct the first column
330     wxSizer *sizerCol1 = new wxBoxSizer(wxVERTICAL);
331     sizerCol1->Add(new wxStaticText(p, wxID_ANY, wxT("Ungrowable:")), 0, wxCENTER | wxTOP, 20);
332     sizerFlex = new wxFlexGridSizer(3, 3, wxSize(5, 5));
333     InitFlexSizer(sizerFlex, p);
334     sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
335 
336     sizerCol1->Add(new wxStaticText(p, wxID_ANY, wxT("Growable middle column:")), 0, wxCENTER | wxTOP, 20);
337     sizerFlex = new wxFlexGridSizer(3, 3, wxSize(5, 5));
338     InitFlexSizer(sizerFlex, p);
339     sizerFlex->AddGrowableCol(1);
340     sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
341 
342     sizerCol1->Add(new wxStaticText(p, wxID_ANY, wxT("Growable middle row:")), 0, wxCENTER | wxTOP, 20);
343     sizerFlex = new wxFlexGridSizer(3, 3, wxSize(5, 5));
344     InitFlexSizer(sizerFlex, p);
345     sizerFlex->AddGrowableRow(1);
346     sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
347 
348     sizerCol1->Add(new wxStaticText(p, wxID_ANY, wxT("All growable columns:")), 0, wxCENTER | wxTOP, 20);
349     sizerFlex = new wxFlexGridSizer(3, 3, wxSize(5, 5));
350     InitFlexSizer(sizerFlex, p);
351     sizerFlex->AddGrowableCol(0, 1);
352     sizerFlex->AddGrowableCol(1, 2);
353     sizerFlex->AddGrowableCol(2, 3);
354     sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
355 
356     // the second one
357     wxSizer *sizerCol2 = new wxBoxSizer(wxVERTICAL);
358     sizerCol2->Add(new wxStaticText(p, wxID_ANY, wxT("Growable middle row and column:")), 0, wxCENTER | wxTOP, 20);
359     sizerFlex = new wxFlexGridSizer(3, 3, wxSize(5, 5));
360     InitFlexSizer(sizerFlex, p);
361     sizerFlex->AddGrowableCol(1);
362     sizerFlex->AddGrowableRow(1);
363     sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
364 
365     sizerCol2->Add(new wxStaticText(p, wxID_ANY, wxT("Same with horz flex direction")), 0, wxCENTER | wxTOP, 20);
366     sizerFlex = new wxFlexGridSizer(3, 3, wxSize(5, 5));
367     InitFlexSizer(sizerFlex, p);
368     sizerFlex->AddGrowableCol(1);
369     sizerFlex->AddGrowableRow(1);
370     sizerFlex->SetFlexibleDirection(wxHORIZONTAL);
371     sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
372 
373     sizerCol2->Add(new wxStaticText(p, wxID_ANY, wxT("Same with grow mode == \"none\"")), 0, wxCENTER | wxTOP, 20);
374     sizerFlex = new wxFlexGridSizer(3, 3, wxSize(5, 5));
375     InitFlexSizer(sizerFlex, p);
376     sizerFlex->AddGrowableCol(1);
377     sizerFlex->AddGrowableRow(1);
378     sizerFlex->SetFlexibleDirection(wxHORIZONTAL);
379     sizerFlex->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_NONE);
380     sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
381 
382     sizerCol2->Add(new wxStaticText(p, wxID_ANY, wxT("Same with grow mode == \"all\"")), 0, wxCENTER | wxTOP, 20);
383     sizerFlex = new wxFlexGridSizer(3, 3, wxSize(5, 5));
384     InitFlexSizer(sizerFlex, p);
385     sizerFlex->AddGrowableCol(1);
386     sizerFlex->AddGrowableRow(1);
387     sizerFlex->SetFlexibleDirection(wxHORIZONTAL);
388     sizerFlex->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_ALL);
389     sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
390 
391     // add both columns to grid sizer
392     wxGridSizer *sizerTop = new wxGridSizer(2, 0, 20);
393     sizerTop->Add(sizerCol1, 1, wxEXPAND);
394     sizerTop->Add(sizerCol2, 1, wxEXPAND);
395 
396     p->SetSizer(sizerTop);
397     sizerTop->SetSizeHints(this);
398 }
399 
400 // ----------------------------------------------------------------------------
401 // MySizerDialog
402 // ----------------------------------------------------------------------------
403 
MySizerDialog(wxWindow * parent,const wxString & title)404 MySizerDialog::MySizerDialog(wxWindow *parent, const wxString &title)
405              : wxDialog(parent, wxID_ANY, wxString(title))
406 {
407     // Begin with first hierarchy: a notebook at the top and
408     // and OK button at the bottom.
409 
410     wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
411 
412     wxNotebook *notebook = new wxNotebook( this, wxID_ANY );
413     topsizer->Add( notebook, 1, wxGROW );
414 
415     wxButton *button = new wxButton( this, wxID_OK, wxT("OK") );
416     topsizer->Add( button, 0, wxALIGN_RIGHT | wxALL, 10 );
417 
418     // First page: one big text ctrl
419     wxTextCtrl *multi = new wxTextCtrl( notebook, wxID_ANY, wxT("TextCtrl."), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
420     notebook->AddPage( multi, wxT("Page One") );
421 
422     // Second page: a text ctrl and a button
423     wxPanel *panel = new wxPanel( notebook, wxID_ANY );
424     notebook->AddPage( panel, wxT("Page Two") );
425 
426     wxSizer *panelsizer = new wxBoxSizer( wxVERTICAL );
427 
428     wxTextCtrl *text = new wxTextCtrl( panel, wxID_ANY, wxT("TextLine 1."), wxDefaultPosition, wxSize(250,wxDefaultCoord) );
429     panelsizer->Add( text, 0, wxGROW|wxALL, 30 );
430     text = new wxTextCtrl( panel, wxID_ANY, wxT("TextLine 2."), wxDefaultPosition, wxSize(250,wxDefaultCoord) );
431     panelsizer->Add( text, 0, wxGROW|wxALL, 30 );
432     wxButton *button2 = new wxButton( panel, wxID_ANY, wxT("Hallo") );
433     panelsizer->Add( button2, 0, wxALIGN_RIGHT | wxLEFT|wxRIGHT|wxBOTTOM, 30 );
434 
435     panel->SetSizer( panelsizer );
436 
437     // Tell dialog to use sizer
438     SetSizerAndFit( topsizer );
439 }
440 
441 // ----------------------------------------------------------------------------
442 // MyGridBagSizerFrame
443 // ----------------------------------------------------------------------------
444 
445 // some simple macros to help make the sample code below more clear
446 #define TEXTCTRL(text)   new wxTextCtrl(p, wxID_ANY, wxT(text))
447 #define MLTEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, wxT(text), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE)
448 #define POS(r, c)        wxGBPosition(r,c)
449 #define SPAN(r, c)       wxGBSpan(r,c)
450 
451 const wxChar gbsDescription[] =wxT("\
452 The wxGridBagSizer is similar to the wxFlexGridSizer except the items are explicitly positioned\n\
453 in a virtual cell of the layout grid, and column or row spanning is allowed.  For example, this\n\
454 static text is positioned at (0,0) and it spans 7 columns.");
455 
456 
457 // Some IDs
458 enum {
459     GBS_HIDE_BTN = 1212,
460     GBS_SHOW_BTN,
461     GBS_MOVE_BTN1,
462     GBS_MOVE_BTN2,
463 
464     GBS_MAX
465 };
466 
467 
wxBEGIN_EVENT_TABLE(MyGridBagSizerFrame,wxFrame)468 wxBEGIN_EVENT_TABLE(MyGridBagSizerFrame, wxFrame)
469     EVT_BUTTON( GBS_HIDE_BTN,  MyGridBagSizerFrame::OnHideBtn)
470     EVT_BUTTON( GBS_SHOW_BTN,  MyGridBagSizerFrame::OnShowBtn)
471     EVT_BUTTON( GBS_MOVE_BTN1, MyGridBagSizerFrame::OnMoveBtn)
472     EVT_BUTTON( GBS_MOVE_BTN2, MyGridBagSizerFrame::OnMoveBtn)
473 wxEND_EVENT_TABLE()
474 
475 
476 MyGridBagSizerFrame::MyGridBagSizerFrame(wxFrame* parent)
477     : wxFrame(parent, wxID_ANY, "wxGridBagSizer Test Frame")
478 {
479     wxPanel* p = new wxPanel(this, wxID_ANY);
480     m_panel = p;
481     m_gbs = new wxGridBagSizer();
482 
483 
484     m_gbs->Add( new wxStaticText(p, wxID_ANY, gbsDescription),
485                 POS(0,0), SPAN(1, 7),
486                 wxALIGN_CENTER | wxALL, 5);
487 
488     m_gbs->Add( TEXTCTRL("pos(1,0)"),   POS(1,0) );
489     m_gbs->Add( TEXTCTRL("pos(1,1)"),   POS(1,1) );
490     m_gbs->Add( TEXTCTRL("pos(2,0)"),   POS(2,0) );
491     m_gbs->Add( TEXTCTRL("pos(2,1)"),   POS(2,1) );
492     m_gbs->Add( MLTEXTCTRL("pos(3,2), span(1,2)\nthis row and col are growable"),
493               POS(3,2), SPAN(1,2), wxEXPAND );
494     m_gbs->Add( MLTEXTCTRL("pos(4,3)\nspan(3,1)"),
495               POS(4,3), SPAN(3,1), wxEXPAND );
496     m_gbs->Add( TEXTCTRL("pos(5,4)"),   POS(5,4), wxDefaultSpan, wxEXPAND );
497     m_gbs->Add( TEXTCTRL("pos(6,5)"),   POS(6,5), wxDefaultSpan, wxEXPAND );
498     m_gbs->Add( TEXTCTRL("pos(7,6)"),   POS(7,6) );
499 
500     //m_gbs->Add( TEXTCTRL("bad position"), POS(4,3) );  // Test for assert
501     //m_gbs->Add( TEXTCTRL("bad position"), POS(5,3) );  // Test for assert
502 
503 
504     m_moveBtn1 = new wxButton(p, GBS_MOVE_BTN1, wxT("Move this to (3,6)"));
505     m_moveBtn2 = new wxButton(p, GBS_MOVE_BTN2, wxT("Move this to (3,6)"));
506     m_gbs->Add( m_moveBtn1, POS(10,2) );
507     m_gbs->Add( m_moveBtn2, POS(10,3) );
508 
509     m_hideBtn = new wxButton(p, GBS_HIDE_BTN, wxT("Hide this item -->"));
510     m_gbs->Add(m_hideBtn, POS(12, 3));
511 
512     m_hideTxt = new wxTextCtrl(p, wxID_ANY, wxT("pos(12,4), size(150, wxDefaultCoord)"),
513                                 wxDefaultPosition, wxSize(150,wxDefaultCoord));
514     m_gbs->Add( m_hideTxt, POS(12,4) );
515 
516     m_showBtn = new wxButton(p, GBS_SHOW_BTN, wxT("<-- Show it again"));
517     m_gbs->Add(m_showBtn, POS(12, 5));
518     m_showBtn->Disable();
519 
520     m_gbs->Add(10,10, POS(14,0));
521 
522     m_gbs->AddGrowableRow(3);
523     m_gbs->AddGrowableCol(2);
524 
525     p->SetSizerAndFit(m_gbs);
526     SetClientSize(p->GetSize());
527 }
528 
529 
OnHideBtn(wxCommandEvent &)530 void MyGridBagSizerFrame::OnHideBtn(wxCommandEvent&)
531 {
532     m_gbs->Hide(m_hideTxt);
533     m_hideBtn->Disable();
534     m_showBtn->Enable();
535     m_gbs->Layout();
536 }
537 
OnShowBtn(wxCommandEvent &)538 void MyGridBagSizerFrame::OnShowBtn(wxCommandEvent&)
539 {
540     m_gbs->Show(m_hideTxt);
541     m_hideBtn->Enable();
542     m_showBtn->Disable();
543     m_gbs->Layout();
544 }
545 
546 
OnMoveBtn(wxCommandEvent & event)547 void MyGridBagSizerFrame::OnMoveBtn(wxCommandEvent& event)
548 {
549     wxButton* btn = (wxButton*)event.GetEventObject();
550     wxGBPosition curPos = m_gbs->GetItemPosition(btn);
551 
552     // if it's already at the "other" spot then move it back
553     if (curPos == wxGBPosition(3,6))
554     {
555         m_gbs->SetItemPosition(btn, m_lastPos);
556         btn->SetLabel(wxT("Move this to (3,6)"));
557     }
558     else
559     {
560         if ( m_gbs->CheckForIntersection(wxGBPosition(3,6), wxGBSpan(1,1)) )
561             wxMessageBox(
562 wxT("wxGridBagSizer will not allow items to be in the same cell as\n\
563 another item, so this operation will fail.  You will also get an assert\n\
564 when compiled in debug mode."), wxT("Warning"), wxOK | wxICON_INFORMATION);
565 
566         if ( m_gbs->SetItemPosition(btn, wxGBPosition(3,6)) )
567         {
568             m_lastPos = curPos;
569             btn->SetLabel(wxT("Move it back"));
570         }
571     }
572     m_gbs->Layout();
573 }
574 
575 // ----------------------------------------------------------------------------
576 // MySimpleSizerFrame
577 // ----------------------------------------------------------------------------
578 
579 // Some IDs
580 enum {
581     ID_SET_SMALL = 1300,
582     ID_SET_BIG
583 };
584 
wxBEGIN_EVENT_TABLE(MySimpleSizerFrame,wxFrame)585 wxBEGIN_EVENT_TABLE(MySimpleSizerFrame, wxFrame)
586     EVT_MENU( ID_SET_SMALL, MySimpleSizerFrame::OnSetSmallSize)
587     EVT_MENU( ID_SET_BIG, MySimpleSizerFrame::OnSetBigSize)
588 wxEND_EVENT_TABLE()
589 
590 MySimpleSizerFrame::MySimpleSizerFrame(wxFrame* parent)
591     : wxFrame(parent, wxID_ANY, "Simple Sizer Test Frame")
592 {
593     wxMenu *menu = new wxMenu;
594 
595     menu->Append(ID_SET_SMALL, wxT("Make text control small\tF4"));
596     menu->Append(ID_SET_BIG, wxT("Make text control big\tF5"));
597 
598     wxMenuBar *menu_bar = new wxMenuBar;
599     menu_bar->Append(menu, wxT("&File"));
600 
601     SetMenuBar( menu_bar );
602 
603     wxBoxSizer *main_sizer = new wxBoxSizer( wxHORIZONTAL );
604 
605     m_target = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80, wxDefaultCoord ) );
606     main_sizer->Add( m_target, 1, wxALL, 5 );
607 
608     main_sizer->Add( new wxStaticText( this, wxID_ANY, wxT("Set alternating sizes using F4 and F5") ), 0, wxALL, 5 );
609 
610     SetSizer( main_sizer);
611 
612     Layout();
613     GetSizer()->Fit( this );
614 }
615 
OnSetSmallSize(wxCommandEvent & WXUNUSED (event))616 void MySimpleSizerFrame::OnSetSmallSize( wxCommandEvent& WXUNUSED(event))
617 {
618     GetSizer()->SetItemMinSize( m_target, 40, -1 );
619     Layout();
620     GetSizer()->Fit( this );
621 }
622 
OnSetBigSize(wxCommandEvent & WXUNUSED (event))623 void MySimpleSizerFrame::OnSetBigSize( wxCommandEvent& WXUNUSED(event))
624 {
625     GetSizer()->SetItemMinSize( m_target, 140, -1 );
626     Layout();
627     GetSizer()->Fit( this );
628 }
629 
630 
631 // ----------------------------------------------------------------------------
632 // MyNestedSizerFrame
633 // ----------------------------------------------------------------------------
634 
635 
MyNestedSizerFrame(wxFrame * parent)636 MyNestedSizerFrame::MyNestedSizerFrame(wxFrame* parent)
637     : wxFrame(parent, wxID_ANY, "Nested Sizer Test Frame")
638 {
639     wxMenu *menu = new wxMenu;
640 
641     menu->Append(wxID_ABOUT, wxT("Do nothing"));
642 
643     wxMenuBar *menu_bar = new wxMenuBar;
644     menu_bar->Append(menu, wxT("&File"));
645 
646     SetMenuBar( menu_bar );
647 
648     wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
649 
650     main_sizer->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER );
651     main_sizer->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER );
652     main_sizer->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER );
653     main_sizer->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER );
654 
655     wxPanel *panel = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize,
656                                   wxTAB_TRAVERSAL | wxSUNKEN_BORDER );
657     main_sizer->Add( panel, 0, wxALIGN_CENTER );
658     wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
659     panel->SetSizer( panel_sizer );
660     panel_sizer->Add( new wxStaticText( panel, -1, wxT("Hello inside") ) );
661     panel_sizer->Add( new wxStaticText( panel, -1, wxT("Hello inside") ) );
662     panel_sizer->Add( new wxStaticText( panel, -1, wxT("Hello inside") ) );
663 
664     main_sizer->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER );
665 
666     m_target = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80, wxDefaultCoord ) );
667     main_sizer->Add( m_target, 1, wxALL|wxGROW, 5 );
668 
669     SetSizerAndFit( main_sizer);
670 }
671 
672 
673 // ----------------------------------------------------------------------------
674 // MyWrapSizerFrame
675 // ----------------------------------------------------------------------------
676 
wxBEGIN_EVENT_TABLE(MyWrapSizerFrame,wxFrame)677 wxBEGIN_EVENT_TABLE(MyWrapSizerFrame, wxFrame)
678     EVT_MENU(wxID_ADD, MyWrapSizerFrame::OnAddCheckbox)
679     EVT_MENU(wxID_REMOVE, MyWrapSizerFrame::OnRemoveCheckbox)
680 wxEND_EVENT_TABLE()
681 
682 MyWrapSizerFrame::MyWrapSizerFrame(wxFrame* parent)
683     : wxFrame(parent, wxID_ANY, "Wrap Sizer Test Frame",
684               wxDefaultPosition, wxSize(200,-1))
685 {
686     wxMenu *menu = new wxMenu;
687 
688     menu->Append(wxID_ADD, "&Add a checkbox\tCtrl-+");
689     menu->Append(wxID_REMOVE, "&Remove a checkbox\tCtrl--");
690 
691     wxMenuBar *menu_bar = new wxMenuBar;
692     menu_bar->Append(menu, "&Wrap sizer");
693 
694     SetMenuBar( menu_bar );
695 
696     wxBoxSizer *root = new wxBoxSizer( wxVERTICAL );
697 
698     wxStaticBoxSizer *topSizer = new wxStaticBoxSizer( wxVERTICAL, this, "Wrapping check-boxes" );
699     m_checkboxParent = topSizer->GetStaticBox();
700     m_wrapSizer = new wxWrapSizer(wxHORIZONTAL);
701 
702     // A number of checkboxes inside a wrap sizer
703     for( int i = 0; i < 6; i++ )
704         DoAddCheckbox();
705 
706     topSizer->Add( m_wrapSizer, wxSizerFlags(1).Expand());
707     root->Add( topSizer, wxSizerFlags().Expand().Border());
708 
709     // A shaped item inside a box sizer
710     wxSizer *bottomSizer = new wxStaticBoxSizer( wxVERTICAL, this, "With wxSHAPED item" );
711     wxSizer *horzBoxSizer = new wxBoxSizer(wxHORIZONTAL);
712     bottomSizer->Add( horzBoxSizer, 100, wxEXPAND );
713     horzBoxSizer->Add( new wxListBox(this,wxID_ANY,wxPoint(0,0),wxSize(70,70)), 0, wxEXPAND|wxSHAPED );
714     horzBoxSizer->Add( 10,10 );
715     horzBoxSizer->Add( new wxCheckBox(this,wxID_ANY,"A much longer option..."), 100, 0, 5 );
716 
717     root->Add( bottomSizer, 1, wxEXPAND | wxALL, 5 );
718 
719     // Set sizer for window
720     SetSizerAndFit( root );
721 }
722 
DoAddCheckbox()723 void MyWrapSizerFrame::DoAddCheckbox()
724 {
725     m_wrapSizer->Add(new wxCheckBox
726                          (
727                             m_checkboxParent,
728                             wxID_ANY,
729                             wxString::Format
730                             (
731                                 "Option %d",
732                                 (int)m_wrapSizer->GetItemCount() + 1
733                             )
734                          ),
735                      wxSizerFlags().Centre().Border());
736 }
737 
OnAddCheckbox(wxCommandEvent & WXUNUSED (event))738 void MyWrapSizerFrame::OnAddCheckbox(wxCommandEvent& WXUNUSED(event))
739 {
740     DoAddCheckbox();
741     Layout();
742 }
743 
OnRemoveCheckbox(wxCommandEvent & WXUNUSED (event))744 void MyWrapSizerFrame::OnRemoveCheckbox(wxCommandEvent& WXUNUSED(event))
745 {
746     if ( m_wrapSizer->IsEmpty() )
747     {
748         wxLogStatus(this, "No more checkboxes to remove.");
749         return;
750     }
751 
752     delete m_wrapSizer->GetItem(m_wrapSizer->GetItemCount() - 1)->GetWindow();
753     Layout();
754 }
755