1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Layout sample
4 // Author: Julian Smart
5 // Modified by: Robin Dunn, Vadim Zeitlin
7 // Copyright: (c) 1998 Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ----------------------------------------------------------------------------
14 // ----------------------------------------------------------------------------
16 // For compilers that support precompilation, includes "wx/wx.h".
17 #include "wx/wxprec.h"
28 #include "wx/gbsizer.h"
29 #include "wx/statline.h"
30 #include "wx/notebook.h"
31 #include "wx/spinctrl.h"
32 #include "wx/wrapsizer.h"
33 #include "wx/generic/stattextg.h"
37 #ifndef wxHAS_IMAGES_IN_RESOURCES
38 #include "../sample.xpm"
42 // ----------------------------------------------------------------------------
44 // ----------------------------------------------------------------------------
50 if ( !wxApp::OnInit() )
53 // Create the main frame window
54 MyFrame
*frame
= new MyFrame
;
61 // ----------------------------------------------------------------------------
63 // ----------------------------------------------------------------------------
65 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
66 EVT_MENU(LAYOUT_ABOUT
, MyFrame::OnAbout
)
67 EVT_MENU(LAYOUT_QUIT
, MyFrame::OnQuit
)
69 EVT_MENU(LAYOUT_TEST_PROPORTIONS
, MyFrame::TestProportions
)
70 EVT_MENU(LAYOUT_TEST_SIZER
, MyFrame::TestFlexSizers
)
71 EVT_MENU(LAYOUT_TEST_NB_SIZER
, MyFrame::TestNotebookSizers
)
72 EVT_MENU(LAYOUT_TEST_GB_SIZER
, MyFrame::TestGridBagSizer
)
73 EVT_MENU(LAYOUT_TEST_SET_MINIMAL
, MyFrame::TestSetMinimal
)
74 EVT_MENU(LAYOUT_TEST_NESTED
, MyFrame::TestNested
)
75 EVT_MENU(LAYOUT_TEST_WRAP
, MyFrame::TestWrap
)
78 // Define my frame constructor
80 : wxFrame(NULL
, wxID_ANY
, wxT("wxWidgets Layout Demo"))
82 SetIcon(wxICON(sample
));
85 wxMenu
*file_menu
= new wxMenu
;
87 file_menu
->Append(LAYOUT_TEST_PROPORTIONS
, wxT("&Proportions demo...\tF1"));
88 file_menu
->Append(LAYOUT_TEST_SIZER
, wxT("Test wx&FlexSizer...\tF2"));
89 file_menu
->Append(LAYOUT_TEST_NB_SIZER
, wxT("Test ¬ebook sizers...\tF3"));
90 file_menu
->Append(LAYOUT_TEST_GB_SIZER
, wxT("Test &gridbag sizer...\tF4"));
91 file_menu
->Append(LAYOUT_TEST_SET_MINIMAL
, wxT("Test Set&ItemMinSize...\tF5"));
92 file_menu
->Append(LAYOUT_TEST_NESTED
, wxT("Test nested sizer in a wxPanel...\tF6"));
93 file_menu
->Append(LAYOUT_TEST_WRAP
, wxT("Test wrap sizers...\tF7"));
95 file_menu
->AppendSeparator();
96 file_menu
->Append(LAYOUT_QUIT
, wxT("E&xit"), wxT("Quit program"));
98 wxMenu
*help_menu
= new wxMenu
;
99 help_menu
->Append(LAYOUT_ABOUT
, wxT("&About"), wxT("About layout demo..."));
101 wxMenuBar
*menu_bar
= new wxMenuBar
;
103 menu_bar
->Append(file_menu
, wxT("&File"));
104 menu_bar
->Append(help_menu
, wxT("&Help"));
106 // Associate the menu bar with the frame
107 SetMenuBar(menu_bar
);
111 SetStatusText(wxT("wxWidgets layout demo"));
112 #endif // wxUSE_STATUSBAR
114 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
116 // we want to get a dialog that is stretchable because it
117 // has a text ctrl in the middle. at the bottom, we have
118 // two buttons which.
120 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
122 // 1) top: create wxStaticText with minimum size equal to its default size
124 new wxStaticText( p
, wxID_ANY
, wxT("An explanation (wxALIGN_RIGHT).") ),
125 wxSizerFlags().Align(wxALIGN_RIGHT
).Border(wxALL
& ~wxBOTTOM
, 5));
127 new wxStaticText( p
, wxID_ANY
, wxT("An explanation (wxALIGN_LEFT).") ),
128 wxSizerFlags().Align(wxALIGN_LEFT
).Border(wxALL
& ~wxBOTTOM
, 5));
130 new wxStaticText( p
, wxID_ANY
, wxT("An explanation (wxALIGN_CENTRE_HORIZONTAL).") ),
131 wxSizerFlags().Align(wxALIGN_CENTRE_HORIZONTAL
).Border(wxALL
& ~wxBOTTOM
, 5));
133 // 2) top: create wxTextCtrl with minimum size (100x60)
135 new wxTextCtrl( p
, wxID_ANY
, wxT("My text (wxEXPAND)."), wxDefaultPosition
, wxSize(100,60), wxTE_MULTILINE
),
136 wxSizerFlags(1).Expand().Border(wxALL
, 5));
138 // 2.5) Gratuitous test of wxStaticBoxSizers
139 wxBoxSizer
*statsizer
= new wxStaticBoxSizer(
140 new wxStaticBox(p
, wxID_ANY
, wxT("A wxStaticBoxSizer")), wxVERTICAL
);
142 new wxStaticText(p
, wxID_ANY
, wxT("And some TEXT inside it")),
143 wxSizerFlags().Border(wxALL
, 30));
146 wxSizerFlags(1).Expand().Border(wxALL
, 10));
148 // 2.7) And a test of wxGridSizer
149 wxGridSizer
*gridsizer
= new wxGridSizer(2, 5, 5);
150 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Label")),
151 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
152 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, wxT("Grid sizer demo")),
153 wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
154 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Another label")),
155 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
156 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, wxT("More text")),
157 wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
158 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Final label")),
159 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
160 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, wxT("And yet more text")),
161 wxSizerFlags().Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
164 wxSizerFlags().Proportion(1).Expand().Border(wxALL
, 10));
168 // 3) middle: create wxStaticLine with minimum size (3x3)
170 new wxStaticLine( p
, wxID_ANY
, wxDefaultPosition
, wxSize(3,3), wxHORIZONTAL
),
171 wxSizerFlags().Expand());
172 #endif // wxUSE_STATLINE
175 // 4) bottom: create two centred wxButtons
176 wxBoxSizer
*button_box
= new wxBoxSizer( wxHORIZONTAL
);
178 new wxButton( p
, wxID_ANY
, wxT("Two buttons in a box") ),
179 wxSizerFlags().Border(wxALL
, 7));
181 new wxButton( p
, wxID_ANY
, wxT("(wxCENTER)") ),
182 wxSizerFlags().Border(wxALL
, 7));
184 topsizer
->Add(button_box
, wxSizerFlags().Center());
186 p
->SetSizer( topsizer
);
188 // don't allow frame to get smaller than what the sizers tell it and also set
189 // the initial size as calculated by the sizers
190 topsizer
->SetSizeHints( this );
193 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
198 void MyFrame::TestProportions(wxCommandEvent
& WXUNUSED(event
))
200 (new MyProportionsFrame(this))->Show();
203 void MyFrame::TestFlexSizers(wxCommandEvent
& WXUNUSED(event
) )
205 (new MyFlexSizerFrame(this))->Show();
208 void MyFrame::TestNotebookSizers(wxCommandEvent
& WXUNUSED(event
) )
210 MySizerDialog
dialog( this, wxT("Notebook Sizer Test Dialog") );
215 void MyFrame::TestSetMinimal(wxCommandEvent
& WXUNUSED(event
) )
217 (new MySimpleSizerFrame(this))->Show();
220 void MyFrame::TestNested(wxCommandEvent
& WXUNUSED(event
) )
222 (new MyNestedSizerFrame(this))->Show();
225 void MyFrame::TestWrap(wxCommandEvent
& WXUNUSED(event
) )
227 (new MyWrapSizerFrame(this))->Show();
231 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
) )
233 (void)wxMessageBox(wxT("wxWidgets GUI library layout demo\n"),
234 wxT("About Layout Demo"), wxOK
|wxICON_INFORMATION
);
237 void MyFrame::TestGridBagSizer(wxCommandEvent
& WXUNUSED(event
) )
239 (new MyGridBagSizerFrame(this))->Show();
242 // ----------------------------------------------------------------------------
243 // MyProportionsFrame
244 // ----------------------------------------------------------------------------
246 MyProportionsFrame::MyProportionsFrame(wxFrame
*parent
)
247 : wxFrame(parent
, wxID_ANY
, wxT("Box Sizer Proportions Demo"))
251 // create the controls
252 wxPanel
*panel
= new wxPanel(this, wxID_ANY
);
253 for ( n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
255 m_spins
[n
] = new wxSpinCtrl(panel
);
256 m_spins
[n
]->SetValue(n
);
260 m_sizer
= new wxStaticBoxSizer(wxHORIZONTAL
, panel
,
261 wxT("Try changing elements proportions and resizing the window"));
262 for ( n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
263 m_sizer
->Add(m_spins
[n
], wxSizerFlags().Border());
265 // put everything together
266 panel
->SetSizer(m_sizer
);
267 wxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
268 sizerTop
->Add(panel
, wxSizerFlags(1).Expand().Border());
270 SetSizerAndFit(sizerTop
);
272 // and connect the events
274 wxCommandEventHandler(MyProportionsFrame::OnProportionUpdated
));
275 Connect(wxEVT_SPINCTRL
,
276 wxSpinEventHandler(MyProportionsFrame::OnProportionChanged
));
279 void MyProportionsFrame::UpdateProportions()
281 for ( size_t n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
283 m_sizer
->GetItem(n
)->SetProportion(m_spins
[n
]->GetValue());
289 void MyProportionsFrame::OnProportionUpdated(wxCommandEvent
& WXUNUSED(event
))
294 void MyProportionsFrame::OnProportionChanged(wxSpinEvent
& WXUNUSED(event
))
299 // ----------------------------------------------------------------------------
301 // ----------------------------------------------------------------------------
303 void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer
*sizer
, wxWindow
* parent
)
305 for ( int i
= 0; i
< 3; i
++ )
307 for ( int j
= 0; j
< 3; j
++ )
309 wxWindow
* const cell
= new wxGenericStaticText
313 wxString::Format("(%d, %d)",
317 cell
->SetBackgroundColour( *wxLIGHT_GREY
);
318 sizer
->Add(cell
, 0, wxEXPAND
| wxALIGN_CENTER_VERTICAL
| wxALL
, 3);
323 MyFlexSizerFrame::MyFlexSizerFrame(wxFrame
* parent
)
324 : wxFrame(parent
, wxID_ANY
, "Flex Sizer Test Frame")
326 wxFlexGridSizer
*sizerFlex
;
327 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
329 // consttuct the first column
330 wxSizer
*sizerCol1
= new wxBoxSizer(wxVERTICAL
);
331 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Ungrowable:")), 0, wxCENTER
| wxTOP
, 20);
332 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
333 InitFlexSizer(sizerFlex
, p
);
334 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
336 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Growable middle column:")), 0, wxCENTER
| wxTOP
, 20);
337 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
338 InitFlexSizer(sizerFlex
, p
);
339 sizerFlex
->AddGrowableCol(1);
340 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
342 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Growable middle row:")), 0, wxCENTER
| wxTOP
, 20);
343 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
344 InitFlexSizer(sizerFlex
, p
);
345 sizerFlex
->AddGrowableRow(1);
346 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
348 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, wxT("All growable columns:")), 0, wxCENTER
| wxTOP
, 20);
349 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
350 InitFlexSizer(sizerFlex
, p
);
351 sizerFlex
->AddGrowableCol(0, 1);
352 sizerFlex
->AddGrowableCol(1, 2);
353 sizerFlex
->AddGrowableCol(2, 3);
354 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
357 wxSizer
*sizerCol2
= new wxBoxSizer(wxVERTICAL
);
358 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Growable middle row and column:")), 0, wxCENTER
| wxTOP
, 20);
359 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
360 InitFlexSizer(sizerFlex
, p
);
361 sizerFlex
->AddGrowableCol(1);
362 sizerFlex
->AddGrowableRow(1);
363 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
365 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Same with horz flex direction")), 0, wxCENTER
| wxTOP
, 20);
366 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
367 InitFlexSizer(sizerFlex
, p
);
368 sizerFlex
->AddGrowableCol(1);
369 sizerFlex
->AddGrowableRow(1);
370 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
371 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
373 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Same with grow mode == \"none\"")), 0, wxCENTER
| wxTOP
, 20);
374 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
375 InitFlexSizer(sizerFlex
, p
);
376 sizerFlex
->AddGrowableCol(1);
377 sizerFlex
->AddGrowableRow(1);
378 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
379 sizerFlex
->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_NONE
);
380 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
382 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, wxT("Same with grow mode == \"all\"")), 0, wxCENTER
| wxTOP
, 20);
383 sizerFlex
= new wxFlexGridSizer(3, 3, wxSize(5, 5));
384 InitFlexSizer(sizerFlex
, p
);
385 sizerFlex
->AddGrowableCol(1);
386 sizerFlex
->AddGrowableRow(1);
387 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
388 sizerFlex
->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_ALL
);
389 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
391 // add both columns to grid sizer
392 wxGridSizer
*sizerTop
= new wxGridSizer(2, 0, 20);
393 sizerTop
->Add(sizerCol1
, 1, wxEXPAND
);
394 sizerTop
->Add(sizerCol2
, 1, wxEXPAND
);
396 p
->SetSizer(sizerTop
);
397 sizerTop
->SetSizeHints(this);
400 // ----------------------------------------------------------------------------
402 // ----------------------------------------------------------------------------
404 MySizerDialog::MySizerDialog(wxWindow
*parent
, const wxString
&title
)
405 : wxDialog(parent
, wxID_ANY
, wxString(title
))
407 // Begin with first hierarchy: a notebook at the top and
408 // and OK button at the bottom.
410 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
412 wxNotebook
*notebook
= new wxNotebook( this, wxID_ANY
);
413 topsizer
->Add( notebook
, 1, wxGROW
);
415 wxButton
*button
= new wxButton( this, wxID_OK
, wxT("OK") );
416 topsizer
->Add( button
, 0, wxALIGN_RIGHT
| wxALL
, 10 );
418 // First page: one big text ctrl
419 wxTextCtrl
*multi
= new wxTextCtrl( notebook
, wxID_ANY
, wxT("TextCtrl."), wxDefaultPosition
, wxDefaultSize
, wxTE_MULTILINE
);
420 notebook
->AddPage( multi
, wxT("Page One") );
422 // Second page: a text ctrl and a button
423 wxPanel
*panel
= new wxPanel( notebook
, wxID_ANY
);
424 notebook
->AddPage( panel
, wxT("Page Two") );
426 wxSizer
*panelsizer
= new wxBoxSizer( wxVERTICAL
);
428 wxTextCtrl
*text
= new wxTextCtrl( panel
, wxID_ANY
, wxT("TextLine 1."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
429 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
430 text
= new wxTextCtrl( panel
, wxID_ANY
, wxT("TextLine 2."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
431 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
432 wxButton
*button2
= new wxButton( panel
, wxID_ANY
, wxT("Hallo") );
433 panelsizer
->Add( button2
, 0, wxALIGN_RIGHT
| wxLEFT
|wxRIGHT
|wxBOTTOM
, 30 );
435 panel
->SetSizer( panelsizer
);
437 // Tell dialog to use sizer
438 SetSizerAndFit( topsizer
);
441 // ----------------------------------------------------------------------------
442 // MyGridBagSizerFrame
443 // ----------------------------------------------------------------------------
445 // some simple macros to help make the sample code below more clear
446 #define TEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, wxT(text))
447 #define MLTEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, wxT(text), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE)
448 #define POS(r, c) wxGBPosition(r,c)
449 #define SPAN(r, c) wxGBSpan(r,c)
451 const wxChar gbsDescription
[] =wxT("\
452 The wxGridBagSizer is similar to the wxFlexGridSizer except the items are explicitly positioned\n\
453 in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this\n\
454 static text is positioned at (0,0) and it spans 7 columns.");
468 BEGIN_EVENT_TABLE(MyGridBagSizerFrame
, wxFrame
)
469 EVT_BUTTON( GBS_HIDE_BTN
, MyGridBagSizerFrame::OnHideBtn
)
470 EVT_BUTTON( GBS_SHOW_BTN
, MyGridBagSizerFrame::OnShowBtn
)
471 EVT_BUTTON( GBS_MOVE_BTN1
, MyGridBagSizerFrame::OnMoveBtn
)
472 EVT_BUTTON( GBS_MOVE_BTN2
, MyGridBagSizerFrame::OnMoveBtn
)
476 MyGridBagSizerFrame::MyGridBagSizerFrame(wxFrame
* parent
)
477 : wxFrame(parent
, wxID_ANY
, "wxGridBagSizer Test Frame")
479 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
481 m_gbs
= new wxGridBagSizer();
484 m_gbs
->Add( new wxStaticText(p
, wxID_ANY
, gbsDescription
),
485 POS(0,0), SPAN(1, 7),
486 wxALIGN_CENTER
| wxALL
, 5);
488 m_gbs
->Add( TEXTCTRL("pos(1,0)"), POS(1,0) );
489 m_gbs
->Add( TEXTCTRL("pos(1,1)"), POS(1,1) );
490 m_gbs
->Add( TEXTCTRL("pos(2,0)"), POS(2,0) );
491 m_gbs
->Add( TEXTCTRL("pos(2,1)"), POS(2,1) );
492 m_gbs
->Add( MLTEXTCTRL("pos(3,2), span(1,2)\nthis row and col are growable"),
493 POS(3,2), SPAN(1,2), wxEXPAND
);
494 m_gbs
->Add( MLTEXTCTRL("pos(4,3)\nspan(3,1)"),
495 POS(4,3), SPAN(3,1), wxEXPAND
);
496 m_gbs
->Add( TEXTCTRL("pos(5,4)"), POS(5,4), wxDefaultSpan
, wxEXPAND
);
497 m_gbs
->Add( TEXTCTRL("pos(6,5)"), POS(6,5), wxDefaultSpan
, wxEXPAND
);
498 m_gbs
->Add( TEXTCTRL("pos(7,6)"), POS(7,6) );
500 //m_gbs->Add( TEXTCTRL("bad position"), POS(4,3) ); // Test for assert
501 //m_gbs->Add( TEXTCTRL("bad position"), POS(5,3) ); // Test for assert
504 m_moveBtn1
= new wxButton(p
, GBS_MOVE_BTN1
, wxT("Move this to (3,6)"));
505 m_moveBtn2
= new wxButton(p
, GBS_MOVE_BTN2
, wxT("Move this to (3,6)"));
506 m_gbs
->Add( m_moveBtn1
, POS(10,2) );
507 m_gbs
->Add( m_moveBtn2
, POS(10,3) );
509 m_hideBtn
= new wxButton(p
, GBS_HIDE_BTN
, wxT("Hide this item -->"));
510 m_gbs
->Add(m_hideBtn
, POS(12, 3));
512 m_hideTxt
= new wxTextCtrl(p
, wxID_ANY
, wxT("pos(12,4), size(150, wxDefaultCoord)"),
513 wxDefaultPosition
, wxSize(150,wxDefaultCoord
));
514 m_gbs
->Add( m_hideTxt
, POS(12,4) );
516 m_showBtn
= new wxButton(p
, GBS_SHOW_BTN
, wxT("<-- Show it again"));
517 m_gbs
->Add(m_showBtn
, POS(12, 5));
518 m_showBtn
->Disable();
520 m_gbs
->Add(10,10, POS(14,0));
522 m_gbs
->AddGrowableRow(3);
523 m_gbs
->AddGrowableCol(2);
525 p
->SetSizerAndFit(m_gbs
);
526 SetClientSize(p
->GetSize());
530 void MyGridBagSizerFrame::OnHideBtn(wxCommandEvent
&)
532 m_gbs
->Hide(m_hideTxt
);
533 m_hideBtn
->Disable();
538 void MyGridBagSizerFrame::OnShowBtn(wxCommandEvent
&)
540 m_gbs
->Show(m_hideTxt
);
542 m_showBtn
->Disable();
547 void MyGridBagSizerFrame::OnMoveBtn(wxCommandEvent
& event
)
549 wxButton
* btn
= (wxButton
*)event
.GetEventObject();
550 wxGBPosition curPos
= m_gbs
->GetItemPosition(btn
);
552 // if it's already at the "other" spot then move it back
553 if (curPos
== wxGBPosition(3,6))
555 m_gbs
->SetItemPosition(btn
, m_lastPos
);
556 btn
->SetLabel(wxT("Move this to (3,6)"));
560 if ( m_gbs
->CheckForIntersection(wxGBPosition(3,6), wxGBSpan(1,1)) )
562 wxT("wxGridBagSizer will not allow items to be in the same cell as\n\
563 another item, so this operation will fail. You will also get an assert\n\
564 when compiled in debug mode."), wxT("Warning"), wxOK
| wxICON_INFORMATION
);
566 if ( m_gbs
->SetItemPosition(btn
, wxGBPosition(3,6)) )
569 btn
->SetLabel(wxT("Move it back"));
575 // ----------------------------------------------------------------------------
576 // MySimpleSizerFrame
577 // ----------------------------------------------------------------------------
585 BEGIN_EVENT_TABLE(MySimpleSizerFrame
, wxFrame
)
586 EVT_MENU( ID_SET_SMALL
, MySimpleSizerFrame::OnSetSmallSize
)
587 EVT_MENU( ID_SET_BIG
, MySimpleSizerFrame::OnSetBigSize
)
590 MySimpleSizerFrame::MySimpleSizerFrame(wxFrame
* parent
)
591 : wxFrame(parent
, wxID_ANY
, "Simple Sizer Test Frame")
593 wxMenu
*menu
= new wxMenu
;
595 menu
->Append(ID_SET_SMALL
, wxT("Make text control small\tF4"));
596 menu
->Append(ID_SET_BIG
, wxT("Make text control big\tF5"));
598 wxMenuBar
*menu_bar
= new wxMenuBar
;
599 menu_bar
->Append(menu
, wxT("&File"));
601 SetMenuBar( menu_bar
);
603 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxHORIZONTAL
);
605 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
606 main_sizer
->Add( m_target
, 1, wxALL
, 5 );
608 main_sizer
->Add( new wxStaticText( this, wxID_ANY
, wxT("Set alternating sizes using F4 and F5") ), 0, wxALL
, 5 );
610 SetSizer( main_sizer
);
613 GetSizer()->Fit( this );
616 void MySimpleSizerFrame::OnSetSmallSize( wxCommandEvent
& WXUNUSED(event
))
618 GetSizer()->SetItemMinSize( m_target
, 40, -1 );
620 GetSizer()->Fit( this );
623 void MySimpleSizerFrame::OnSetBigSize( wxCommandEvent
& WXUNUSED(event
))
625 GetSizer()->SetItemMinSize( m_target
, 140, -1 );
627 GetSizer()->Fit( this );
631 // ----------------------------------------------------------------------------
632 // MyNestedSizerFrame
633 // ----------------------------------------------------------------------------
636 MyNestedSizerFrame::MyNestedSizerFrame(wxFrame
* parent
)
637 : wxFrame(parent
, wxID_ANY
, "Nested Sizer Test Frame")
639 wxMenu
*menu
= new wxMenu
;
641 menu
->Append(wxID_ABOUT
, wxT("Do nothing"));
643 wxMenuBar
*menu_bar
= new wxMenuBar
;
644 menu_bar
->Append(menu
, wxT("&File"));
646 SetMenuBar( menu_bar
);
648 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxVERTICAL
);
650 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
651 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
652 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
653 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
655 wxPanel
*panel
= new wxPanel( this, -1, wxDefaultPosition
, wxDefaultSize
,
656 wxTAB_TRAVERSAL
| wxSUNKEN_BORDER
);
657 main_sizer
->Add( panel
, 0, wxALIGN_CENTER
);
658 wxBoxSizer
*panel_sizer
= new wxBoxSizer( wxVERTICAL
);
659 panel
->SetSizer( panel_sizer
);
660 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
661 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
662 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
664 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
666 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
667 main_sizer
->Add( m_target
, 1, wxALL
|wxGROW
, 5 );
669 SetSizerAndFit( main_sizer
);
673 // ----------------------------------------------------------------------------
675 // ----------------------------------------------------------------------------
677 BEGIN_EVENT_TABLE(MyWrapSizerFrame
, wxFrame
)
678 EVT_MENU(wxID_ADD
, MyWrapSizerFrame::OnAddCheckbox
)
679 EVT_MENU(wxID_REMOVE
, MyWrapSizerFrame::OnRemoveCheckbox
)
682 MyWrapSizerFrame::MyWrapSizerFrame(wxFrame
* parent
)
683 : wxFrame(parent
, wxID_ANY
, "Wrap Sizer Test Frame",
684 wxDefaultPosition
, wxSize(200,-1))
686 wxMenu
*menu
= new wxMenu
;
688 menu
->Append(wxID_ADD
, "&Add a checkbox\tCtrl-+");
689 menu
->Append(wxID_REMOVE
, "&Remove a checkbox\tCtrl--");
691 wxMenuBar
*menu_bar
= new wxMenuBar
;
692 menu_bar
->Append(menu
, "&Wrap sizer");
694 SetMenuBar( menu_bar
);
696 wxBoxSizer
*root
= new wxBoxSizer( wxVERTICAL
);
698 wxStaticBoxSizer
*topSizer
= new wxStaticBoxSizer( wxVERTICAL
, this, "Wrapping check-boxes" );
699 m_checkboxParent
= topSizer
->GetStaticBox();
700 m_wrapSizer
= new wxWrapSizer(wxHORIZONTAL
);
702 // A number of checkboxes inside a wrap sizer
703 for( int i
= 0; i
< 6; i
++ )
706 topSizer
->Add( m_wrapSizer
, wxSizerFlags(1).Expand());
707 root
->Add( topSizer
, wxSizerFlags().Expand().Border());
709 // A shaped item inside a box sizer
710 wxSizer
*bottomSizer
= new wxStaticBoxSizer( wxVERTICAL
, this, "With wxSHAPED item" );
711 wxSizer
*horzBoxSizer
= new wxBoxSizer(wxHORIZONTAL
);
712 bottomSizer
->Add( horzBoxSizer
, 100, wxEXPAND
);
713 horzBoxSizer
->Add( new wxListBox(this,wxID_ANY
,wxPoint(0,0),wxSize(70,70)), 0, wxEXPAND
|wxSHAPED
);
714 horzBoxSizer
->Add( 10,10 );
715 horzBoxSizer
->Add( new wxCheckBox(this,wxID_ANY
,"A much longer option..."), 100, 0, 5 );
717 root
->Add( bottomSizer
, 1, wxEXPAND
| wxALL
, 5 );
719 // Set sizer for window
720 SetSizerAndFit( root
);
723 void MyWrapSizerFrame::DoAddCheckbox()
725 m_wrapSizer
->Add(new wxCheckBox
732 (int)m_wrapSizer
->GetItemCount() + 1
735 wxSizerFlags().Centre().Border());
738 void MyWrapSizerFrame::OnAddCheckbox(wxCommandEvent
& WXUNUSED(event
))
744 void MyWrapSizerFrame::OnRemoveCheckbox(wxCommandEvent
& WXUNUSED(event
))
746 if ( m_wrapSizer
->IsEmpty() )
748 wxLogStatus(this, "No more checkboxes to remove.");
752 delete m_wrapSizer
->GetItem(m_wrapSizer
->GetItemCount() - 1)->GetWindow();