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 license
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"
36 // ----------------------------------------------------------------------------
38 // ----------------------------------------------------------------------------
44 if ( !wxApp::OnInit() )
47 // Create the main frame window
48 MyFrame
*frame
= new MyFrame
;
55 // ----------------------------------------------------------------------------
57 // ----------------------------------------------------------------------------
59 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
60 EVT_MENU(LAYOUT_ABOUT
, MyFrame::OnAbout
)
61 EVT_MENU(LAYOUT_QUIT
, MyFrame::OnQuit
)
63 EVT_MENU(LAYOUT_TEST_PROPORTIONS
, MyFrame::TestProportions
)
64 EVT_MENU(LAYOUT_TEST_SIZER
, MyFrame::TestFlexSizers
)
65 EVT_MENU(LAYOUT_TEST_NB_SIZER
, MyFrame::TestNotebookSizers
)
66 EVT_MENU(LAYOUT_TEST_GB_SIZER
, MyFrame::TestGridBagSizer
)
67 EVT_MENU(LAYOUT_TEST_SET_MINIMAL
, MyFrame::TestSetMinimal
)
68 EVT_MENU(LAYOUT_TEST_NESTED
, MyFrame::TestNested
)
69 EVT_MENU(LAYOUT_TEST_WRAP
, MyFrame::TestWrap
)
72 // Define my frame constructor
74 : wxFrame(NULL
, wxID_ANY
, _T("wxWidgets Layout Demo"),
75 wxDefaultPosition
, wxDefaultSize
,
76 wxDEFAULT_FRAME_STYLE
| wxNO_FULL_REPAINT_ON_RESIZE
)
79 wxMenu
*file_menu
= new wxMenu
;
81 file_menu
->Append(LAYOUT_TEST_PROPORTIONS
, _T("&Proportions demo...\tF1"));
82 file_menu
->Append(LAYOUT_TEST_SIZER
, _T("Test wx&FlexSizer...\tF2"));
83 file_menu
->Append(LAYOUT_TEST_NB_SIZER
, _T("Test ¬ebook sizers...\tF3"));
84 file_menu
->Append(LAYOUT_TEST_GB_SIZER
, _T("Test &gridbag sizer...\tF4"));
85 file_menu
->Append(LAYOUT_TEST_SET_MINIMAL
, _T("Test Set&ItemMinSize...\tF5"));
86 file_menu
->Append(LAYOUT_TEST_NESTED
, _T("Test nested sizer in a wxPanel...\tF6"));
87 file_menu
->Append(LAYOUT_TEST_WRAP
, _T("Test wrap sizers...\tF6"));
89 file_menu
->AppendSeparator();
90 file_menu
->Append(LAYOUT_QUIT
, _T("E&xit"), _T("Quit program"));
92 wxMenu
*help_menu
= new wxMenu
;
93 help_menu
->Append(LAYOUT_ABOUT
, _T("&About"), _T("About layout demo..."));
95 wxMenuBar
*menu_bar
= new wxMenuBar
;
97 menu_bar
->Append(file_menu
, _T("&File"));
98 menu_bar
->Append(help_menu
, _T("&Help"));
100 // Associate the menu bar with the frame
101 SetMenuBar(menu_bar
);
105 SetStatusText(_T("wxWidgets layout demo"));
106 #endif // wxUSE_STATUSBAR
108 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
110 // we want to get a dialog that is stretchable because it
111 // has a text ctrl in the middle. at the bottom, we have
112 // two buttons which.
114 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
116 // 1) top: create wxStaticText with minimum size equal to its default size
118 new wxStaticText( p
, wxID_ANY
, _T("An explanation (wxALIGN_RIGHT).") ),
119 wxSizerFlags().Align(wxALIGN_RIGHT
).Border(wxALL
& ~wxBOTTOM
, 5));
121 // 2) top: create wxTextCtrl with minimum size (100x60)
123 new wxTextCtrl( p
, wxID_ANY
, _T("My text (wxEXPAND)."), wxDefaultPosition
, wxSize(100,60), wxTE_MULTILINE
),
124 wxSizerFlags(1).Expand().Border(wxALL
, 5));
126 // 2.5) Gratuitous test of wxStaticBoxSizers
127 wxBoxSizer
*statsizer
= new wxStaticBoxSizer(
128 new wxStaticBox(p
, wxID_ANY
, _T("A wxStaticBoxSizer")), wxVERTICAL
);
130 new wxStaticText(p
, wxID_ANY
, _T("And some TEXT inside it")),
131 wxSizerFlags().Center().Border(wxALL
, 30));
134 wxSizerFlags(1).Expand().Border(wxALL
, 10));
136 // 2.7) And a test of wxGridSizer
137 wxGridSizer
*gridsizer
= new wxGridSizer(2, 5, 5);
138 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, _T("Label")),
139 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
140 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, _T("Grid sizer demo")),
141 wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
142 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, _T("Another label")),
143 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
144 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, _T("More text")),
145 wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
146 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, _T("Final label")),
147 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
148 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, _T("And yet more text")),
149 wxSizerFlags().Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
152 wxSizerFlags().Proportion(1).Expand().Border(wxALL
, 10));
156 // 3) middle: create wxStaticLine with minimum size (3x3)
158 new wxStaticLine( p
, wxID_ANY
, wxDefaultPosition
, wxSize(3,3), wxHORIZONTAL
),
159 wxSizerFlags().Expand());
160 #endif // wxUSE_STATLINE
163 // 4) bottom: create two centred wxButtons
164 wxBoxSizer
*button_box
= new wxBoxSizer( wxHORIZONTAL
);
166 new wxButton( p
, wxID_ANY
, _T("Two buttons in a box") ),
167 wxSizerFlags().Border(wxALL
, 7));
169 new wxButton( p
, wxID_ANY
, _T("(wxCENTER)") ),
170 wxSizerFlags().Border(wxALL
, 7));
172 topsizer
->Add(button_box
, wxSizerFlags().Center());
174 p
->SetSizer( topsizer
);
176 // don't allow frame to get smaller than what the sizers tell it and also set
177 // the initial size as calculated by the sizers
178 topsizer
->SetSizeHints( this );
181 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
186 void MyFrame::TestProportions(wxCommandEvent
& WXUNUSED(event
))
188 (new MyProportionsFrame(this))->Show();
191 void MyFrame::TestFlexSizers(wxCommandEvent
& WXUNUSED(event
) )
193 MyFlexSizerFrame
*newFrame
= new MyFlexSizerFrame(_T("Flex Sizer Test Frame"), 50, 50);
194 newFrame
->Show(true);
197 void MyFrame::TestNotebookSizers(wxCommandEvent
& WXUNUSED(event
) )
199 MySizerDialog
dialog( this, _T("Notebook Sizer Test Dialog") );
204 void MyFrame::TestSetMinimal(wxCommandEvent
& WXUNUSED(event
) )
206 MySimpleSizerFrame
*newFrame
= new MySimpleSizerFrame(_T("Simple Sizer Test Frame"), 50, 50);
207 newFrame
->Show(true);
210 void MyFrame::TestNested(wxCommandEvent
& WXUNUSED(event
) )
212 MyNestedSizerFrame
*newFrame
= new MyNestedSizerFrame(_T("Nested Sizer Test Frame"), 50, 50);
213 newFrame
->Show(true);
216 void MyFrame::TestWrap(wxCommandEvent
& WXUNUSED(event
) )
218 MyWrapSizerFrame
*newFrame
= new MyWrapSizerFrame(_T("Wrap Sizer Test Frame"), 50, 50);
219 newFrame
->Show(true);
223 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
) )
225 (void)wxMessageBox(_T("wxWidgets GUI library layout demo\n"),
226 _T("About Layout Demo"), wxOK
|wxICON_INFORMATION
);
229 void MyFrame::TestGridBagSizer(wxCommandEvent
& WXUNUSED(event
) )
231 MyGridBagSizerFrame
*newFrame
= new
232 MyGridBagSizerFrame(_T("wxGridBagSizer Test Frame"), 50, 50);
233 newFrame
->Show(true);
236 // ----------------------------------------------------------------------------
237 // MyProportionsFrame
238 // ----------------------------------------------------------------------------
240 MyProportionsFrame::MyProportionsFrame(wxFrame
*parent
)
241 : wxFrame(parent
, wxID_ANY
, _T("Box Sizer Proportions Demo"))
245 // create the controls
246 wxPanel
*panel
= new wxPanel(this, wxID_ANY
);
247 for ( n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
249 m_spins
[n
] = new wxSpinCtrl(panel
);
250 m_spins
[n
]->SetValue(n
);
254 m_sizer
= new wxStaticBoxSizer(wxHORIZONTAL
, panel
,
255 _T("Try changing elements proportions and resizing the window"));
256 for ( n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
257 m_sizer
->Add(m_spins
[n
], wxSizerFlags().Border());
259 // put everything together
260 panel
->SetSizer(m_sizer
);
261 wxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
262 sizerTop
->Add(panel
, wxSizerFlags(1).Expand().Border());
264 SetSizerAndFit(sizerTop
);
266 // and connect the events
267 Connect(wxEVT_COMMAND_TEXT_UPDATED
,
268 wxCommandEventHandler(MyProportionsFrame::OnProportionUpdated
));
269 Connect(wxEVT_COMMAND_SPINCTRL_UPDATED
,
270 wxSpinEventHandler(MyProportionsFrame::OnProportionChanged
));
273 void MyProportionsFrame::UpdateProportions()
275 for ( size_t n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
277 m_sizer
->GetItem(n
)->SetProportion(m_spins
[n
]->GetValue());
283 void MyProportionsFrame::OnProportionUpdated(wxCommandEvent
& WXUNUSED(event
))
288 void MyProportionsFrame::OnProportionChanged(wxSpinEvent
& WXUNUSED(event
))
293 // ----------------------------------------------------------------------------
295 // ----------------------------------------------------------------------------
297 void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer
*sizer
, wxWindow
* parent
)
299 for ( int i
= 0; i
< 3; i
++ )
301 for ( int j
= 0; j
< 3; j
++ )
303 sizer
->Add(new wxStaticText
307 wxString::Format(_T("(%d, %d)"), i
+ 1, j
+ 1),
312 0, wxEXPAND
| wxALIGN_CENTER_VERTICAL
| wxALL
, 3);
317 MyFlexSizerFrame::MyFlexSizerFrame(const wxString
&title
, int x
, int y
)
318 : wxFrame(NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
320 wxFlexGridSizer
*sizerFlex
;
321 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
323 // consttuct the first column
324 wxSizer
*sizerCol1
= new wxBoxSizer(wxVERTICAL
);
325 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("Ungrowable:")), 0, wxCENTER
| wxTOP
, 20);
326 sizerFlex
= new wxFlexGridSizer(3, 3);
327 InitFlexSizer(sizerFlex
, p
);
328 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
330 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("Growable middle column:")), 0, wxCENTER
| wxTOP
, 20);
331 sizerFlex
= new wxFlexGridSizer(3, 3);
332 InitFlexSizer(sizerFlex
, p
);
333 sizerFlex
->AddGrowableCol(1);
334 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
336 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("Growable middle row:")), 0, wxCENTER
| wxTOP
, 20);
337 sizerFlex
= new wxFlexGridSizer(3, 3);
338 InitFlexSizer(sizerFlex
, p
);
339 sizerFlex
->AddGrowableRow(1);
340 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
342 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("All growable columns:")), 0, wxCENTER
| wxTOP
, 20);
343 sizerFlex
= new wxFlexGridSizer(3, 3);
344 InitFlexSizer(sizerFlex
, p
);
345 sizerFlex
->AddGrowableCol(0, 1);
346 sizerFlex
->AddGrowableCol(1, 2);
347 sizerFlex
->AddGrowableCol(2, 3);
348 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
351 wxSizer
*sizerCol2
= new wxBoxSizer(wxVERTICAL
);
352 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Growable middle row and column:")), 0, wxCENTER
| wxTOP
, 20);
353 sizerFlex
= new wxFlexGridSizer(3, 3);
354 InitFlexSizer(sizerFlex
, p
);
355 sizerFlex
->AddGrowableCol(1);
356 sizerFlex
->AddGrowableRow(1);
357 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
359 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Same with horz flex direction")), 0, wxCENTER
| wxTOP
, 20);
360 sizerFlex
= new wxFlexGridSizer(3, 3);
361 InitFlexSizer(sizerFlex
, p
);
362 sizerFlex
->AddGrowableCol(1);
363 sizerFlex
->AddGrowableRow(1);
364 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
365 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
367 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Same with grow mode == \"none\"")), 0, wxCENTER
| wxTOP
, 20);
368 sizerFlex
= new wxFlexGridSizer(3, 3);
369 InitFlexSizer(sizerFlex
, p
);
370 sizerFlex
->AddGrowableCol(1);
371 sizerFlex
->AddGrowableRow(1);
372 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
373 sizerFlex
->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_NONE
);
374 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
376 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Same with grow mode == \"all\"")), 0, wxCENTER
| wxTOP
, 20);
377 sizerFlex
= new wxFlexGridSizer(3, 3);
378 InitFlexSizer(sizerFlex
, p
);
379 sizerFlex
->AddGrowableCol(1);
380 sizerFlex
->AddGrowableRow(1);
381 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
382 sizerFlex
->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_ALL
);
383 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
385 // add both columns to grid sizer
386 wxGridSizer
*sizerTop
= new wxGridSizer(2, 0, 20);
387 sizerTop
->Add(sizerCol1
, 1, wxEXPAND
);
388 sizerTop
->Add(sizerCol2
, 1, wxEXPAND
);
390 p
->SetSizer(sizerTop
);
391 sizerTop
->SetSizeHints(this);
394 // ----------------------------------------------------------------------------
396 // ----------------------------------------------------------------------------
398 MySizerDialog::MySizerDialog(wxWindow
*parent
, const wxString
&title
)
399 : wxDialog(parent
, wxID_ANY
, wxString(title
))
401 // Begin with first hierarchy: a notebook at the top and
402 // and OK button at the bottom.
404 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
406 wxNotebook
*notebook
= new wxNotebook( this, wxID_ANY
);
407 topsizer
->Add( notebook
, 1, wxGROW
);
409 wxButton
*button
= new wxButton( this, wxID_OK
, _T("OK") );
410 topsizer
->Add( button
, 0, wxALIGN_RIGHT
| wxALL
, 10 );
412 // First page: one big text ctrl
413 wxTextCtrl
*multi
= new wxTextCtrl( notebook
, wxID_ANY
, _T("TextCtrl."), wxDefaultPosition
, wxDefaultSize
, wxTE_MULTILINE
);
414 notebook
->AddPage( multi
, _T("Page One") );
416 // Second page: a text ctrl and a button
417 wxPanel
*panel
= new wxPanel( notebook
, wxID_ANY
);
418 notebook
->AddPage( panel
, _T("Page Two") );
420 wxSizer
*panelsizer
= new wxBoxSizer( wxVERTICAL
);
422 wxTextCtrl
*text
= new wxTextCtrl( panel
, wxID_ANY
, _T("TextLine 1."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
423 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
424 text
= new wxTextCtrl( panel
, wxID_ANY
, _T("TextLine 2."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
425 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
426 wxButton
*button2
= new wxButton( panel
, wxID_ANY
, _T("Hallo") );
427 panelsizer
->Add( button2
, 0, wxALIGN_RIGHT
| wxLEFT
|wxRIGHT
|wxBOTTOM
, 30 );
429 panel
->SetSizer( panelsizer
);
431 // Tell dialog to use sizer
432 SetSizerAndFit( topsizer
);
435 // ----------------------------------------------------------------------------
436 // MyGridBagSizerFrame
437 // ----------------------------------------------------------------------------
439 // some simple macros to help make the sample code below more clear
440 #define TEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text))
441 #define MLTEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE)
442 #define POS(r, c) wxGBPosition(r,c)
443 #define SPAN(r, c) wxGBSpan(r,c)
445 const wxChar gbsDescription
[] =_T("\
446 The wxGridBagSizer is similar to the wxFlexGridSizer except the items are explicitly positioned\n\
447 in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this\n\
448 static text is positioned at (0,0) and it spans 7 columns.");
462 BEGIN_EVENT_TABLE(MyGridBagSizerFrame
, wxFrame
)
463 EVT_BUTTON( GBS_HIDE_BTN
, MyGridBagSizerFrame::OnHideBtn
)
464 EVT_BUTTON( GBS_SHOW_BTN
, MyGridBagSizerFrame::OnShowBtn
)
465 EVT_BUTTON( GBS_MOVE_BTN1
, MyGridBagSizerFrame::OnMoveBtn
)
466 EVT_BUTTON( GBS_MOVE_BTN2
, MyGridBagSizerFrame::OnMoveBtn
)
470 MyGridBagSizerFrame::MyGridBagSizerFrame(const wxString
&title
, int x
, int y
)
471 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
473 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
475 m_gbs
= new wxGridBagSizer();
478 m_gbs
->Add( new wxStaticText(p
, wxID_ANY
, gbsDescription
),
479 POS(0,0), SPAN(1, 7),
480 wxALIGN_CENTER
| wxALL
, 5);
482 m_gbs
->Add( TEXTCTRL("pos(1,0)"), POS(1,0) );
483 m_gbs
->Add( TEXTCTRL("pos(1,1)"), POS(1,1) );
484 m_gbs
->Add( TEXTCTRL("pos(2,0)"), POS(2,0) );
485 m_gbs
->Add( TEXTCTRL("pos(2,1)"), POS(2,1) );
486 m_gbs
->Add( MLTEXTCTRL("pos(3,2), span(1,2)\nthis row and col are growable"),
487 POS(3,2), SPAN(1,2), wxEXPAND
);
488 m_gbs
->Add( MLTEXTCTRL("pos(4,3)\nspan(3,1)"),
489 POS(4,3), SPAN(3,1), wxEXPAND
);
490 m_gbs
->Add( TEXTCTRL("pos(5,4)"), POS(5,4), wxDefaultSpan
, wxEXPAND
);
491 m_gbs
->Add( TEXTCTRL("pos(6,5)"), POS(6,5), wxDefaultSpan
, wxEXPAND
);
492 m_gbs
->Add( TEXTCTRL("pos(7,6)"), POS(7,6) );
494 //m_gbs->Add( TEXTCTRL("bad position"), POS(4,3) ); // Test for assert
495 //m_gbs->Add( TEXTCTRL("bad position"), POS(5,3) ); // Test for assert
498 m_moveBtn1
= new wxButton(p
, GBS_MOVE_BTN1
, _T("Move this to (3,6)"));
499 m_moveBtn2
= new wxButton(p
, GBS_MOVE_BTN2
, _T("Move this to (3,6)"));
500 m_gbs
->Add( m_moveBtn1
, POS(10,2) );
501 m_gbs
->Add( m_moveBtn2
, POS(10,3) );
503 m_hideBtn
= new wxButton(p
, GBS_HIDE_BTN
, _T("Hide this item -->"));
504 m_gbs
->Add(m_hideBtn
, POS(12, 3));
506 m_hideTxt
= new wxTextCtrl(p
, wxID_ANY
, _T("pos(12,4), size(150, wxDefaultCoord)"),
507 wxDefaultPosition
, wxSize(150,wxDefaultCoord
));
508 m_gbs
->Add( m_hideTxt
, POS(12,4) );
510 m_showBtn
= new wxButton(p
, GBS_SHOW_BTN
, _T("<-- Show it again"));
511 m_gbs
->Add(m_showBtn
, POS(12, 5));
512 m_showBtn
->Disable();
514 m_gbs
->Add(10,10, POS(14,0));
516 m_gbs
->AddGrowableRow(3);
517 m_gbs
->AddGrowableCol(2);
519 p
->SetSizerAndFit(m_gbs
);
520 SetClientSize(p
->GetSize());
524 void MyGridBagSizerFrame::OnHideBtn(wxCommandEvent
&)
526 m_gbs
->Hide(m_hideTxt
);
527 m_hideBtn
->Disable();
532 void MyGridBagSizerFrame::OnShowBtn(wxCommandEvent
&)
534 m_gbs
->Show(m_hideTxt
);
536 m_showBtn
->Disable();
541 void MyGridBagSizerFrame::OnMoveBtn(wxCommandEvent
& event
)
543 wxButton
* btn
= (wxButton
*)event
.GetEventObject();
544 wxGBPosition curPos
= m_gbs
->GetItemPosition(btn
);
546 // if it's already at the "other" spot then move it back
547 if (curPos
== wxGBPosition(3,6))
549 m_gbs
->SetItemPosition(btn
, m_lastPos
);
550 btn
->SetLabel(_T("Move this to (3,6)"));
554 if ( m_gbs
->CheckForIntersection(wxGBPosition(3,6), wxGBSpan(1,1)) )
556 _T("wxGridBagSizer will not allow items to be in the same cell as\n\
557 another item, so this operation will fail. You will also get an assert\n\
558 when compiled in debug mode."), _T("Warning"), wxOK
| wxICON_INFORMATION
);
560 if ( m_gbs
->SetItemPosition(btn
, wxGBPosition(3,6)) )
563 btn
->SetLabel(_T("Move it back"));
569 // ----------------------------------------------------------------------------
570 // MySimpleSizerFrame
571 // ----------------------------------------------------------------------------
579 BEGIN_EVENT_TABLE(MySimpleSizerFrame
, wxFrame
)
580 EVT_MENU( ID_SET_SMALL
, MySimpleSizerFrame::OnSetSmallSize
)
581 EVT_MENU( ID_SET_BIG
, MySimpleSizerFrame::OnSetBigSize
)
584 MySimpleSizerFrame::MySimpleSizerFrame(const wxString
&title
, int x
, int y
)
585 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
587 wxMenu
*menu
= new wxMenu
;
589 menu
->Append(ID_SET_SMALL
, _T("Make text control small\tF4"));
590 menu
->Append(ID_SET_BIG
, _T("Make text control big\tF5"));
592 wxMenuBar
*menu_bar
= new wxMenuBar
;
593 menu_bar
->Append(menu
, _T("&File"));
595 SetMenuBar( menu_bar
);
597 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxHORIZONTAL
);
599 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
600 main_sizer
->Add( m_target
, 1, wxALL
, 5 );
602 main_sizer
->Add( new wxStaticText( this, wxID_ANY
, wxT("Set alternating sizes using F4 and F5") ), 0, wxALL
, 5 );
604 SetSizer( main_sizer
);
607 GetSizer()->Fit( this );
610 void MySimpleSizerFrame::OnSetSmallSize( wxCommandEvent
& WXUNUSED(event
))
612 GetSizer()->SetItemMinSize( m_target
, 40, -1 );
614 GetSizer()->Fit( this );
617 void MySimpleSizerFrame::OnSetBigSize( wxCommandEvent
& WXUNUSED(event
))
619 GetSizer()->SetItemMinSize( m_target
, 140, -1 );
621 GetSizer()->Fit( this );
625 // ----------------------------------------------------------------------------
626 // MyNestedSizerFrame
627 // ----------------------------------------------------------------------------
630 MyNestedSizerFrame::MyNestedSizerFrame(const wxString
&title
, int x
, int y
)
631 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
633 wxMenu
*menu
= new wxMenu
;
635 menu
->Append(wxID_ABOUT
, _T("Do nothing"));
637 wxMenuBar
*menu_bar
= new wxMenuBar
;
638 menu_bar
->Append(menu
, _T("&File"));
640 SetMenuBar( menu_bar
);
642 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxVERTICAL
);
644 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
645 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
646 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
647 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
649 wxPanel
*panel
= new wxPanel( this, -1, wxDefaultPosition
, wxDefaultSize
,
650 wxTAB_TRAVERSAL
| wxSUNKEN_BORDER
);
651 main_sizer
->Add( panel
, 0, wxALIGN_CENTER
);
652 wxBoxSizer
*panel_sizer
= new wxBoxSizer( wxVERTICAL
);
653 panel
->SetSizer( panel_sizer
);
654 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
655 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
656 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
658 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
660 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
661 main_sizer
->Add( m_target
, 1, wxALL
|wxGROW
, 5 );
663 SetSizerAndFit( main_sizer
);
667 // ----------------------------------------------------------------------------
669 // ----------------------------------------------------------------------------
672 MyWrapSizerFrame::MyWrapSizerFrame(const wxString
&title
, int x
, int y
)
673 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
675 wxMenu
*menu
= new wxMenu
;
677 menu
->Append(wxID_ABOUT
, "Do nothing");
679 wxMenuBar
*menu_bar
= new wxMenuBar
;
680 menu_bar
->Append(menu
, "&File");
682 SetMenuBar( menu_bar
);
684 wxBoxSizer
*root
= new wxBoxSizer( wxVERTICAL
);
686 // A number of checkboxes inside a wrap sizer
687 wxSizer
*ps_mid
= new wxStaticBoxSizer( wxVERTICAL
, this, "Wrapping check-boxes" );
688 wxSizer
*ps_mid_wrap
= new wxWrapSizer(wxHORIZONTAL
);
689 ps_mid
->Add( ps_mid_wrap
, 100, wxEXPAND
);
690 for( int ix
=0; ix
<6; ix
++ )
691 ps_mid_wrap
->Add( new wxCheckBox(this,wxID_ANY
,wxString::Format("Option %d",ix
+1)), 0, wxALIGN_CENTRE
|wxALIGN_CENTER_VERTICAL
, 5 );
692 root
->Add( ps_mid
, 0, wxEXPAND
| wxALL
, 5 );
694 // A shaped item inside a box sizer
695 wxSizer
*ps_bottom
= new wxStaticBoxSizer( wxVERTICAL
, this, "With wxSHAPED item" );
696 wxSizer
*ps_bottom_box
= new wxBoxSizer(wxHORIZONTAL
);
697 ps_bottom
->Add( ps_bottom_box
, 100, wxEXPAND
);
698 ps_bottom_box
->Add( new wxListBox(this,wxID_ANY
,wxPoint(0,0),wxSize(70,70)), 0, wxEXPAND
|wxSHAPED
);
699 ps_bottom_box
->Add( 10,10 );
700 ps_bottom_box
->Add( new wxCheckBox(this,wxID_ANY
,"A much longer option..."), 100, 0, 5 );
702 root
->Add( ps_bottom
, 1, wxEXPAND
| wxALL
, 5 );
704 // Set sizer for window
705 SetSizerAndFit( root
);