1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Layout sample
4 // Author: Julian Smart
5 // Modified by: Robin Dunn, Vadim Zeitlin
8 // Copyright: (c) 1998 Julian Smart
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
13 // ----------------------------------------------------------------------------
15 // ----------------------------------------------------------------------------
17 // For compilers that support precompilation, includes "wx/wx.h".
18 #include "wx/wxprec.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"
38 #ifndef wxHAS_IMAGES_IN_RESOURCES
39 #include "../sample.xpm"
43 // ----------------------------------------------------------------------------
45 // ----------------------------------------------------------------------------
51 if ( !wxApp::OnInit() )
54 // Create the main frame window
55 MyFrame
*frame
= new MyFrame
;
62 // ----------------------------------------------------------------------------
64 // ----------------------------------------------------------------------------
66 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
67 EVT_MENU(LAYOUT_ABOUT
, MyFrame::OnAbout
)
68 EVT_MENU(LAYOUT_QUIT
, MyFrame::OnQuit
)
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
)
79 // Define my frame constructor
81 : wxFrame(NULL
, wxID_ANY
, wxT("wxWidgets Layout Demo"))
83 SetIcon(wxICON(sample
));
86 wxMenu
*file_menu
= new wxMenu
;
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 ¬ebook 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"));
96 file_menu
->AppendSeparator();
97 file_menu
->Append(LAYOUT_QUIT
, wxT("E&xit"), wxT("Quit program"));
99 wxMenu
*help_menu
= new wxMenu
;
100 help_menu
->Append(LAYOUT_ABOUT
, wxT("&About"), wxT("About layout demo..."));
102 wxMenuBar
*menu_bar
= new wxMenuBar
;
104 menu_bar
->Append(file_menu
, wxT("&File"));
105 menu_bar
->Append(help_menu
, wxT("&Help"));
107 // Associate the menu bar with the frame
108 SetMenuBar(menu_bar
);
112 SetStatusText(wxT("wxWidgets layout demo"));
113 #endif // wxUSE_STATUSBAR
115 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
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.
121 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
123 // 1) top: create wxStaticText with minimum size equal to its default size
125 new wxStaticText( p
, wxID_ANY
, wxT("An explanation (wxALIGN_RIGHT).") ),
126 wxSizerFlags().Align(wxALIGN_RIGHT
).Border(wxALL
& ~wxBOTTOM
, 5));
128 new wxStaticText( p
, wxID_ANY
, wxT("An explanation (wxALIGN_LEFT).") ),
129 wxSizerFlags().Align(wxALIGN_LEFT
).Border(wxALL
& ~wxBOTTOM
, 5));
131 new wxStaticText( p
, wxID_ANY
, wxT("An explanation (wxALIGN_CENTRE_HORIZONTAL).") ),
132 wxSizerFlags().Align(wxALIGN_CENTRE_HORIZONTAL
).Border(wxALL
& ~wxBOTTOM
, 5));
134 // 2) top: create wxTextCtrl with minimum size (100x60)
136 new wxTextCtrl( p
, wxID_ANY
, wxT("My text (wxEXPAND)."), wxDefaultPosition
, wxSize(100,60), wxTE_MULTILINE
),
137 wxSizerFlags(1).Expand().Border(wxALL
, 5));
139 // 2.5) Gratuitous test of wxStaticBoxSizers
140 wxBoxSizer
*statsizer
= new wxStaticBoxSizer(
141 new wxStaticBox(p
, wxID_ANY
, wxT("A wxStaticBoxSizer")), wxVERTICAL
);
143 new wxStaticText(p
, wxID_ANY
, wxT("And some TEXT inside it")),
144 wxSizerFlags().Border(wxALL
, 30));
147 wxSizerFlags(1).Expand().Border(wxALL
, 10));
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
));
165 wxSizerFlags().Proportion(1).Expand().Border(wxALL
, 10));
169 // 3) middle: create wxStaticLine with minimum size (3x3)
171 new wxStaticLine( p
, wxID_ANY
, wxDefaultPosition
, wxSize(3,3), wxHORIZONTAL
),
172 wxSizerFlags().Expand());
173 #endif // wxUSE_STATLINE
176 // 4) bottom: create two centred wxButtons
177 wxBoxSizer
*button_box
= new wxBoxSizer( wxHORIZONTAL
);
179 new wxButton( p
, wxID_ANY
, wxT("Two buttons in a box") ),
180 wxSizerFlags().Border(wxALL
, 7));
182 new wxButton( p
, wxID_ANY
, wxT("(wxCENTER)") ),
183 wxSizerFlags().Border(wxALL
, 7));
185 topsizer
->Add(button_box
, wxSizerFlags().Center());
187 p
->SetSizer( topsizer
);
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 );
194 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
199 void MyFrame::TestProportions(wxCommandEvent
& WXUNUSED(event
))
201 (new MyProportionsFrame(this))->Show();
204 void MyFrame::TestFlexSizers(wxCommandEvent
& WXUNUSED(event
) )
206 (new MyFlexSizerFrame(this))->Show();
209 void MyFrame::TestNotebookSizers(wxCommandEvent
& WXUNUSED(event
) )
211 MySizerDialog
dialog( this, wxT("Notebook Sizer Test Dialog") );
216 void MyFrame::TestSetMinimal(wxCommandEvent
& WXUNUSED(event
) )
218 (new MySimpleSizerFrame(this))->Show();
221 void MyFrame::TestNested(wxCommandEvent
& WXUNUSED(event
) )
223 (new MyNestedSizerFrame(this))->Show();
226 void MyFrame::TestWrap(wxCommandEvent
& WXUNUSED(event
) )
228 (new MyWrapSizerFrame(this))->Show();
232 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
) )
234 (void)wxMessageBox(wxT("wxWidgets GUI library layout demo\n"),
235 wxT("About Layout Demo"), wxOK
|wxICON_INFORMATION
);
238 void MyFrame::TestGridBagSizer(wxCommandEvent
& WXUNUSED(event
) )
240 (new MyGridBagSizerFrame(this))->Show();
243 // ----------------------------------------------------------------------------
244 // MyProportionsFrame
245 // ----------------------------------------------------------------------------
247 MyProportionsFrame::MyProportionsFrame(wxFrame
*parent
)
248 : wxFrame(parent
, wxID_ANY
, wxT("Box Sizer Proportions Demo"))
252 // create the controls
253 wxPanel
*panel
= new wxPanel(this, wxID_ANY
);
254 for ( n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
256 m_spins
[n
] = new wxSpinCtrl(panel
);
257 m_spins
[n
]->SetValue(n
);
261 m_sizer
= new wxStaticBoxSizer(wxHORIZONTAL
, panel
,
262 wxT("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());
266 // put everything together
267 panel
->SetSizer(m_sizer
);
268 wxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
269 sizerTop
->Add(panel
, wxSizerFlags(1).Expand().Border());
271 SetSizerAndFit(sizerTop
);
273 // and connect the events
275 wxCommandEventHandler(MyProportionsFrame::OnProportionUpdated
));
276 Connect(wxEVT_SPINCTRL
,
277 wxSpinEventHandler(MyProportionsFrame::OnProportionChanged
));
280 void MyProportionsFrame::UpdateProportions()
282 for ( size_t n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
284 m_sizer
->GetItem(n
)->SetProportion(m_spins
[n
]->GetValue());
290 void MyProportionsFrame::OnProportionUpdated(wxCommandEvent
& WXUNUSED(event
))
295 void MyProportionsFrame::OnProportionChanged(wxSpinEvent
& WXUNUSED(event
))
300 // ----------------------------------------------------------------------------
302 // ----------------------------------------------------------------------------
304 void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer
*sizer
, wxWindow
* parent
)
306 for ( int i
= 0; i
< 3; i
++ )
308 for ( int j
= 0; j
< 3; j
++ )
310 wxWindow
* const cell
= new wxGenericStaticText
314 wxString::Format("(%d, %d)",
318 cell
->SetBackgroundColour( *wxLIGHT_GREY
);
319 sizer
->Add(cell
, 0, wxEXPAND
| wxALIGN_CENTER_VERTICAL
| wxALL
, 3);
324 MyFlexSizerFrame::MyFlexSizerFrame(wxFrame
* parent
)
325 : wxFrame(parent
, wxID_ANY
, "Flex Sizer Test Frame")
327 wxFlexGridSizer
*sizerFlex
;
328 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
330 // consttuct the first column
331 wxSizer
*sizerCol1
= new wxBoxSizer(wxVERTICAL
);
332 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Ungrowable:")), 0, wxCENTER
| wxTOP
, 20);
333 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
334 InitFlexSizer(sizerFlex
, p
);
335 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
337 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Growable middle column:")), 0, wxCENTER
| wxTOP
, 20);
338 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
339 InitFlexSizer(sizerFlex
, p
);
340 sizerFlex
->AddGrowableCol(1);
341 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
343 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Growable middle row:")), 0, wxCENTER
| wxTOP
, 20);
344 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
345 InitFlexSizer(sizerFlex
, p
);
346 sizerFlex
->AddGrowableRow(1);
347 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
349 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, wxT("All growable columns:")), 0, wxCENTER
| wxTOP
, 20);
350 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
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);
358 wxSizer
*sizerCol2
= new wxBoxSizer(wxVERTICAL
);
359 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Growable middle row and column:")), 0, wxCENTER
| wxTOP
, 20);
360 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
361 InitFlexSizer(sizerFlex
, p
);
362 sizerFlex
->AddGrowableCol(1);
363 sizerFlex
->AddGrowableRow(1);
364 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
366 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Same with horz flex direction")), 0, wxCENTER
| wxTOP
, 20);
367 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
368 InitFlexSizer(sizerFlex
, p
);
369 sizerFlex
->AddGrowableCol(1);
370 sizerFlex
->AddGrowableRow(1);
371 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
372 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
374 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Same with grow mode == \"none\"")), 0, wxCENTER
| wxTOP
, 20);
375 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
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);
383 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Same with grow mode == \"all\"")), 0, wxCENTER
| wxTOP
, 20);
384 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
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);
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
);
397 p
->SetSizer(sizerTop
);
398 sizerTop
->SetSizeHints(this);
401 // ----------------------------------------------------------------------------
403 // ----------------------------------------------------------------------------
405 MySizerDialog::MySizerDialog(wxWindow
*parent
, const wxString
&title
)
406 : wxDialog(parent
, wxID_ANY
, wxString(title
))
408 // Begin with first hierarchy: a notebook at the top and
409 // and OK button at the bottom.
411 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
413 wxNotebook
*notebook
= new wxNotebook( this, wxID_ANY
);
414 topsizer
->Add( notebook
, 1, wxGROW
);
416 wxButton
*button
= new wxButton( this, wxID_OK
, wxT("OK") );
417 topsizer
->Add( button
, 0, wxALIGN_RIGHT
| wxALL
, 10 );
419 // First page: one big text ctrl
420 wxTextCtrl
*multi
= new wxTextCtrl( notebook
, wxID_ANY
, wxT("TextCtrl."), wxDefaultPosition
, wxDefaultSize
, wxTE_MULTILINE
);
421 notebook
->AddPage( multi
, wxT("Page One") );
423 // Second page: a text ctrl and a button
424 wxPanel
*panel
= new wxPanel( notebook
, wxID_ANY
);
425 notebook
->AddPage( panel
, wxT("Page Two") );
427 wxSizer
*panelsizer
= new wxBoxSizer( wxVERTICAL
);
429 wxTextCtrl
*text
= new wxTextCtrl( panel
, wxID_ANY
, wxT("TextLine 1."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
430 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
431 text
= new wxTextCtrl( panel
, wxID_ANY
, wxT("TextLine 2."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
432 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
433 wxButton
*button2
= new wxButton( panel
, wxID_ANY
, wxT("Hallo") );
434 panelsizer
->Add( button2
, 0, wxALIGN_RIGHT
| wxLEFT
|wxRIGHT
|wxBOTTOM
, 30 );
436 panel
->SetSizer( panelsizer
);
438 // Tell dialog to use sizer
439 SetSizerAndFit( topsizer
);
442 // ----------------------------------------------------------------------------
443 // MyGridBagSizerFrame
444 // ----------------------------------------------------------------------------
446 // some simple macros to help make the sample code below more clear
447 #define TEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, wxT(text))
448 #define MLTEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, wxT(text), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE)
449 #define POS(r, c) wxGBPosition(r,c)
450 #define SPAN(r, c) wxGBSpan(r,c)
452 const wxChar gbsDescription
[] =wxT("\
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.");
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
)
477 MyGridBagSizerFrame::MyGridBagSizerFrame(wxFrame
* parent
)
478 : wxFrame(parent
, wxID_ANY
, "wxGridBagSizer Test Frame")
480 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
482 m_gbs
= new wxGridBagSizer();
485 m_gbs
->Add( new wxStaticText(p
, wxID_ANY
, gbsDescription
),
486 POS(0,0), SPAN(1, 7),
487 wxALIGN_CENTER
| wxALL
, 5);
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) );
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
505 m_moveBtn1
= new wxButton(p
, GBS_MOVE_BTN1
, wxT("Move this to (3,6)"));
506 m_moveBtn2
= new wxButton(p
, GBS_MOVE_BTN2
, wxT("Move this to (3,6)"));
507 m_gbs
->Add( m_moveBtn1
, POS(10,2) );
508 m_gbs
->Add( m_moveBtn2
, POS(10,3) );
510 m_hideBtn
= new wxButton(p
, GBS_HIDE_BTN
, wxT("Hide this item -->"));
511 m_gbs
->Add(m_hideBtn
, POS(12, 3));
513 m_hideTxt
= new wxTextCtrl(p
, wxID_ANY
, wxT("pos(12,4), size(150, wxDefaultCoord)"),
514 wxDefaultPosition
, wxSize(150,wxDefaultCoord
));
515 m_gbs
->Add( m_hideTxt
, POS(12,4) );
517 m_showBtn
= new wxButton(p
, GBS_SHOW_BTN
, wxT("<-- Show it again"));
518 m_gbs
->Add(m_showBtn
, POS(12, 5));
519 m_showBtn
->Disable();
521 m_gbs
->Add(10,10, POS(14,0));
523 m_gbs
->AddGrowableRow(3);
524 m_gbs
->AddGrowableCol(2);
526 p
->SetSizerAndFit(m_gbs
);
527 SetClientSize(p
->GetSize());
531 void MyGridBagSizerFrame::OnHideBtn(wxCommandEvent
&)
533 m_gbs
->Hide(m_hideTxt
);
534 m_hideBtn
->Disable();
539 void MyGridBagSizerFrame::OnShowBtn(wxCommandEvent
&)
541 m_gbs
->Show(m_hideTxt
);
543 m_showBtn
->Disable();
548 void MyGridBagSizerFrame::OnMoveBtn(wxCommandEvent
& event
)
550 wxButton
* btn
= (wxButton
*)event
.GetEventObject();
551 wxGBPosition curPos
= m_gbs
->GetItemPosition(btn
);
553 // if it's already at the "other" spot then move it back
554 if (curPos
== wxGBPosition(3,6))
556 m_gbs
->SetItemPosition(btn
, m_lastPos
);
557 btn
->SetLabel(wxT("Move this to (3,6)"));
561 if ( m_gbs
->CheckForIntersection(wxGBPosition(3,6), wxGBSpan(1,1)) )
563 wxT("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."), wxT("Warning"), wxOK
| wxICON_INFORMATION
);
567 if ( m_gbs
->SetItemPosition(btn
, wxGBPosition(3,6)) )
570 btn
->SetLabel(wxT("Move it back"));
576 // ----------------------------------------------------------------------------
577 // MySimpleSizerFrame
578 // ----------------------------------------------------------------------------
586 BEGIN_EVENT_TABLE(MySimpleSizerFrame
, wxFrame
)
587 EVT_MENU( ID_SET_SMALL
, MySimpleSizerFrame::OnSetSmallSize
)
588 EVT_MENU( ID_SET_BIG
, MySimpleSizerFrame::OnSetBigSize
)
591 MySimpleSizerFrame::MySimpleSizerFrame(wxFrame
* parent
)
592 : wxFrame(parent
, wxID_ANY
, "Simple Sizer Test Frame")
594 wxMenu
*menu
= new wxMenu
;
596 menu
->Append(ID_SET_SMALL
, wxT("Make text control small\tF4"));
597 menu
->Append(ID_SET_BIG
, wxT("Make text control big\tF5"));
599 wxMenuBar
*menu_bar
= new wxMenuBar
;
600 menu_bar
->Append(menu
, wxT("&File"));
602 SetMenuBar( menu_bar
);
604 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxHORIZONTAL
);
606 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
607 main_sizer
->Add( m_target
, 1, wxALL
, 5 );
609 main_sizer
->Add( new wxStaticText( this, wxID_ANY
, wxT("Set alternating sizes using F4 and F5") ), 0, wxALL
, 5 );
611 SetSizer( main_sizer
);
614 GetSizer()->Fit( this );
617 void MySimpleSizerFrame::OnSetSmallSize( wxCommandEvent
& WXUNUSED(event
))
619 GetSizer()->SetItemMinSize( m_target
, 40, -1 );
621 GetSizer()->Fit( this );
624 void MySimpleSizerFrame::OnSetBigSize( wxCommandEvent
& WXUNUSED(event
))
626 GetSizer()->SetItemMinSize( m_target
, 140, -1 );
628 GetSizer()->Fit( this );
632 // ----------------------------------------------------------------------------
633 // MyNestedSizerFrame
634 // ----------------------------------------------------------------------------
637 MyNestedSizerFrame::MyNestedSizerFrame(wxFrame
* parent
)
638 : wxFrame(parent
, wxID_ANY
, "Nested Sizer Test Frame")
640 wxMenu
*menu
= new wxMenu
;
642 menu
->Append(wxID_ABOUT
, wxT("Do nothing"));
644 wxMenuBar
*menu_bar
= new wxMenuBar
;
645 menu_bar
->Append(menu
, wxT("&File"));
647 SetMenuBar( menu_bar
);
649 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxVERTICAL
);
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
);
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") ) );
665 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
667 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
668 main_sizer
->Add( m_target
, 1, wxALL
|wxGROW
, 5 );
670 SetSizerAndFit( main_sizer
);
674 // ----------------------------------------------------------------------------
676 // ----------------------------------------------------------------------------
678 BEGIN_EVENT_TABLE(MyWrapSizerFrame
, wxFrame
)
679 EVT_MENU(wxID_ADD
, MyWrapSizerFrame::OnAddCheckbox
)
680 EVT_MENU(wxID_REMOVE
, MyWrapSizerFrame::OnRemoveCheckbox
)
683 MyWrapSizerFrame::MyWrapSizerFrame(wxFrame
* parent
)
684 : wxFrame(parent
, wxID_ANY
, "Wrap Sizer Test Frame",
685 wxDefaultPosition
, wxSize(200,-1))
687 wxMenu
*menu
= new wxMenu
;
689 menu
->Append(wxID_ADD
, "&Add a checkbox\tCtrl-+");
690 menu
->Append(wxID_REMOVE
, "&Remove a checkbox\tCtrl--");
692 wxMenuBar
*menu_bar
= new wxMenuBar
;
693 menu_bar
->Append(menu
, "&Wrap sizer");
695 SetMenuBar( menu_bar
);
697 wxBoxSizer
*root
= new wxBoxSizer( wxVERTICAL
);
699 wxStaticBoxSizer
*topSizer
= new wxStaticBoxSizer( wxVERTICAL
, this, "Wrapping check-boxes" );
700 m_checkboxParent
= topSizer
->GetStaticBox();
701 m_wrapSizer
= new wxWrapSizer(wxHORIZONTAL
);
703 // A number of checkboxes inside a wrap sizer
704 for( int i
= 0; i
< 6; i
++ )
707 topSizer
->Add( m_wrapSizer
, wxSizerFlags(1).Expand());
708 root
->Add( topSizer
, wxSizerFlags().Expand().Border());
710 // A shaped item inside a box sizer
711 wxSizer
*bottomSizer
= new wxStaticBoxSizer( wxVERTICAL
, this, "With wxSHAPED item" );
712 wxSizer
*horzBoxSizer
= new wxBoxSizer(wxHORIZONTAL
);
713 bottomSizer
->Add( horzBoxSizer
, 100, wxEXPAND
);
714 horzBoxSizer
->Add( new wxListBox(this,wxID_ANY
,wxPoint(0,0),wxSize(70,70)), 0, wxEXPAND
|wxSHAPED
);
715 horzBoxSizer
->Add( 10,10 );
716 horzBoxSizer
->Add( new wxCheckBox(this,wxID_ANY
,"A much longer option..."), 100, 0, 5 );
718 root
->Add( bottomSizer
, 1, wxEXPAND
| wxALL
, 5 );
720 // Set sizer for window
721 SetSizerAndFit( root
);
724 void MyWrapSizerFrame::DoAddCheckbox()
726 m_wrapSizer
->Add(new wxCheckBox
733 (int)m_wrapSizer
->GetItemCount() + 1
736 wxSizerFlags().Centre().Border());
739 void MyWrapSizerFrame::OnAddCheckbox(wxCommandEvent
& WXUNUSED(event
))
745 void MyWrapSizerFrame::OnRemoveCheckbox(wxCommandEvent
& WXUNUSED(event
))
747 if ( m_wrapSizer
->IsEmpty() )
749 wxLogStatus(this, "No more checkboxes to remove.");
753 delete m_wrapSizer
->GetItem(m_wrapSizer
->GetItemCount() - 1)->GetWindow();