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