]> git.saurik.com Git - wxWidgets.git/blame_incremental - samples/layout/layout.cpp
no real changes; just cosmetic
[wxWidgets.git] / samples / layout / layout.cpp
... / ...
CommitLineData
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
41IMPLEMENT_APP(MyApp)
42
43bool 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
60BEGIN_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)
71END_EVENT_TABLE()
72
73// Define my frame constructor
74MyFrame::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
188void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
189{
190 Close(true);
191}
192
193void MyFrame::TestProportions(wxCommandEvent& WXUNUSED(event))
194{
195 (new MyProportionsFrame(this))->Show();
196}
197
198void MyFrame::TestFlexSizers(wxCommandEvent& WXUNUSED(event) )
199{
200 MyFlexSizerFrame *newFrame = new MyFlexSizerFrame(_T("Flex Sizer Test Frame"), 50, 50);
201 newFrame->Show(true);
202}
203
204void MyFrame::TestNotebookSizers(wxCommandEvent& WXUNUSED(event) )
205{
206 MySizerDialog dialog( this, _T("Notebook Sizer Test Dialog") );
207
208 dialog.ShowModal();
209}
210
211void MyFrame::TestSetMinimal(wxCommandEvent& WXUNUSED(event) )
212{
213 MySimpleSizerFrame *newFrame = new MySimpleSizerFrame(_T("Simple Sizer Test Frame"), 50, 50);
214 newFrame->Show(true);
215}
216
217void MyFrame::TestNested(wxCommandEvent& WXUNUSED(event) )
218{
219 MyNestedSizerFrame *newFrame = new MyNestedSizerFrame(_T("Nested Sizer Test Frame"), 50, 50);
220 newFrame->Show(true);
221}
222
223void 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
230void 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
236void 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
247MyProportionsFrame::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
280void 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
290void MyProportionsFrame::OnProportionUpdated(wxCommandEvent& WXUNUSED(event))
291{
292 UpdateProportions();
293}
294
295void MyProportionsFrame::OnProportionChanged(wxSpinEvent& WXUNUSED(event))
296{
297 UpdateProportions();
298}
299
300// ----------------------------------------------------------------------------
301// MyFlexSizerFrame
302// ----------------------------------------------------------------------------
303
304void 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
324MyFlexSizerFrame::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
405MySizerDialog::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
452const wxChar gbsDescription[] =_T("\
453The wxGridBagSizer is similar to the wxFlexGridSizer except the items are explicitly positioned\n\
454in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this\n\
455static text is positioned at (0,0) and it spans 7 columns.");
456
457
458// Some IDs
459enum {
460 GBS_HIDE_BTN = 1212,
461 GBS_SHOW_BTN,
462 GBS_MOVE_BTN1,
463 GBS_MOVE_BTN2,
464
465 GBS_MAX
466};
467
468
469BEGIN_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)
474END_EVENT_TABLE()
475
476
477MyGridBagSizerFrame::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
531void MyGridBagSizerFrame::OnHideBtn(wxCommandEvent&)
532{
533 m_gbs->Hide(m_hideTxt);
534 m_hideBtn->Disable();
535 m_showBtn->Enable();
536 m_gbs->Layout();
537}
538
539void 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
548void 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\
564another item, so this operation will fail. You will also get an assert\n\
565when 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
581enum {
582 ID_SET_SMALL = 1300,
583 ID_SET_BIG
584};
585
586BEGIN_EVENT_TABLE(MySimpleSizerFrame, wxFrame)
587 EVT_MENU( ID_SET_SMALL, MySimpleSizerFrame::OnSetSmallSize)
588 EVT_MENU( ID_SET_BIG, MySimpleSizerFrame::OnSetBigSize)
589END_EVENT_TABLE()
590
591MySimpleSizerFrame::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
617void MySimpleSizerFrame::OnSetSmallSize( wxCommandEvent& WXUNUSED(event))
618{
619 GetSizer()->SetItemMinSize( m_target, 40, -1 );
620 Layout();
621 GetSizer()->Fit( this );
622}
623
624void 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
637MyNestedSizerFrame::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
679MyWrapSizerFrame::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