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