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"
33 #include "wx/wrapsizer.h"
37 // ----------------------------------------------------------------------------
39 // ----------------------------------------------------------------------------
45 if ( !wxApp::OnInit() )
48 // Create the main frame window
49 MyFrame
*frame
= new MyFrame
;
56 // ----------------------------------------------------------------------------
58 // ----------------------------------------------------------------------------
60 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
61 EVT_MENU(LAYOUT_ABOUT
, MyFrame::OnAbout
)
62 EVT_MENU(LAYOUT_QUIT
, MyFrame::OnQuit
)
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
)
73 // Define my frame constructor
75 : wxFrame(NULL
, wxID_ANY
, _T("wxWidgets Layout Demo"),
76 wxDefaultPosition
, wxDefaultSize
,
77 wxDEFAULT_FRAME_STYLE
| wxNO_FULL_REPAINT_ON_RESIZE
)
80 wxMenu
*file_menu
= new wxMenu
;
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 ¬ebook 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...\tF6"));
90 file_menu
->AppendSeparator();
91 file_menu
->Append(LAYOUT_QUIT
, _T("E&xit"), _T("Quit program"));
93 wxMenu
*help_menu
= new wxMenu
;
94 help_menu
->Append(LAYOUT_ABOUT
, _T("&About"), _T("About layout demo..."));
96 wxMenuBar
*menu_bar
= new wxMenuBar
;
98 menu_bar
->Append(file_menu
, _T("&File"));
99 menu_bar
->Append(help_menu
, _T("&Help"));
101 // Associate the menu bar with the frame
102 SetMenuBar(menu_bar
);
106 SetStatusText(_T("wxWidgets layout demo"));
107 #endif // wxUSE_STATUSBAR
109 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
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.
115 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
117 // 1) top: create wxStaticText with minimum size equal to its default size
119 new wxStaticText( p
, wxID_ANY
, _T("An explanation (wxALIGN_RIGHT).") ),
120 wxSizerFlags().Align(wxALIGN_RIGHT
).Border(wxALL
& ~wxBOTTOM
, 5));
122 // 2) top: create wxTextCtrl with minimum size (100x60)
124 new wxTextCtrl( p
, wxID_ANY
, _T("My text (wxEXPAND)."), wxDefaultPosition
, wxSize(100,60), wxTE_MULTILINE
),
125 wxSizerFlags(1).Expand().Border(wxALL
, 5));
127 // 2.5) Gratuitous test of wxStaticBoxSizers
128 wxBoxSizer
*statsizer
= new wxStaticBoxSizer(
129 new wxStaticBox(p
, wxID_ANY
, _T("A wxStaticBoxSizer")), wxVERTICAL
);
131 new wxStaticText(p
, wxID_ANY
, _T("And some TEXT inside it")),
132 wxSizerFlags().Center().Border(wxALL
, 30));
135 wxSizerFlags(1).Expand().Border(wxALL
, 10));
137 // 2.7) And a test of wxGridSizer
138 wxGridSizer
*gridsizer
= new wxGridSizer(2, 5, 5);
139 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, _T("Label")),
140 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
141 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, _T("Grid sizer demo")),
142 wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
143 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, _T("Another label")),
144 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
145 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, _T("More text")),
146 wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
147 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, _T("Final label")),
148 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
149 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, _T("And yet more text")),
150 wxSizerFlags().Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
153 wxSizerFlags().Proportion(1).Expand().Border(wxALL
, 10));
157 // 3) middle: create wxStaticLine with minimum size (3x3)
159 new wxStaticLine( p
, wxID_ANY
, wxDefaultPosition
, wxSize(3,3), wxHORIZONTAL
),
160 wxSizerFlags().Expand());
161 #endif // wxUSE_STATLINE
164 // 4) bottom: create two centred wxButtons
165 wxBoxSizer
*button_box
= new wxBoxSizer( wxHORIZONTAL
);
167 new wxButton( p
, wxID_ANY
, _T("Two buttons in a box") ),
168 wxSizerFlags().Border(wxALL
, 7));
170 new wxButton( p
, wxID_ANY
, _T("(wxCENTER)") ),
171 wxSizerFlags().Border(wxALL
, 7));
173 topsizer
->Add(button_box
, wxSizerFlags().Center());
175 p
->SetSizer( topsizer
);
177 // don't allow frame to get smaller than what the sizers tell it and also set
178 // the initial size as calculated by the sizers
179 topsizer
->SetSizeHints( this );
182 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
187 void MyFrame::TestProportions(wxCommandEvent
& WXUNUSED(event
))
189 (new MyProportionsFrame(this))->Show();
192 void MyFrame::TestFlexSizers(wxCommandEvent
& WXUNUSED(event
) )
194 MyFlexSizerFrame
*newFrame
= new MyFlexSizerFrame(_T("Flex Sizer Test Frame"), 50, 50);
195 newFrame
->Show(true);
198 void MyFrame::TestNotebookSizers(wxCommandEvent
& WXUNUSED(event
) )
200 MySizerDialog
dialog( this, _T("Notebook Sizer Test Dialog") );
205 void MyFrame::TestSetMinimal(wxCommandEvent
& WXUNUSED(event
) )
207 MySimpleSizerFrame
*newFrame
= new MySimpleSizerFrame(_T("Simple Sizer Test Frame"), 50, 50);
208 newFrame
->Show(true);
211 void MyFrame::TestNested(wxCommandEvent
& WXUNUSED(event
) )
213 MyNestedSizerFrame
*newFrame
= new MyNestedSizerFrame(_T("Nested Sizer Test Frame"), 50, 50);
214 newFrame
->Show(true);
217 void MyFrame::TestWrap(wxCommandEvent
& WXUNUSED(event
) )
219 MyWrapSizerFrame
*newFrame
= new MyWrapSizerFrame(_T("Wrap Sizer Test Frame"), 50, 50);
220 newFrame
->Show(true);
224 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
) )
226 (void)wxMessageBox(_T("wxWidgets GUI library layout demo\n"),
227 _T("About Layout Demo"), wxOK
|wxICON_INFORMATION
);
230 void MyFrame::TestGridBagSizer(wxCommandEvent
& WXUNUSED(event
) )
232 MyGridBagSizerFrame
*newFrame
= new
233 MyGridBagSizerFrame(_T("wxGridBagSizer Test Frame"), 50, 50);
234 newFrame
->Show(true);
237 // ----------------------------------------------------------------------------
238 // MyProportionsFrame
239 // ----------------------------------------------------------------------------
241 MyProportionsFrame::MyProportionsFrame(wxFrame
*parent
)
242 : wxFrame(parent
, wxID_ANY
, _T("Box Sizer Proportions Demo"))
246 // create the controls
247 wxPanel
*panel
= new wxPanel(this, wxID_ANY
);
248 for ( n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
250 m_spins
[n
] = new wxSpinCtrl(panel
);
251 m_spins
[n
]->SetValue(n
);
255 m_sizer
= new wxStaticBoxSizer(wxHORIZONTAL
, panel
,
256 _T("Try changing elements proportions and resizing the window"));
257 for ( n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
258 m_sizer
->Add(m_spins
[n
], wxSizerFlags().Border());
260 // put everything together
261 panel
->SetSizer(m_sizer
);
262 wxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
263 sizerTop
->Add(panel
, wxSizerFlags(1).Expand().Border());
265 SetSizerAndFit(sizerTop
);
267 // and connect the events
268 Connect(wxEVT_COMMAND_TEXT_UPDATED
,
269 wxCommandEventHandler(MyProportionsFrame::OnProportionUpdated
));
270 Connect(wxEVT_COMMAND_SPINCTRL_UPDATED
,
271 wxSpinEventHandler(MyProportionsFrame::OnProportionChanged
));
274 void MyProportionsFrame::UpdateProportions()
276 for ( size_t n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
278 m_sizer
->GetItem(n
)->SetProportion(m_spins
[n
]->GetValue());
284 void MyProportionsFrame::OnProportionUpdated(wxCommandEvent
& WXUNUSED(event
))
289 void MyProportionsFrame::OnProportionChanged(wxSpinEvent
& WXUNUSED(event
))
294 // ----------------------------------------------------------------------------
296 // ----------------------------------------------------------------------------
298 void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer
*sizer
, wxWindow
* parent
)
300 for ( int i
= 0; i
< 3; i
++ )
302 for ( int j
= 0; j
< 3; j
++ )
304 sizer
->Add(new wxStaticText
308 wxString::Format(_T("(%d, %d)"), i
+ 1, j
+ 1),
313 0, wxEXPAND
| wxALIGN_CENTER_VERTICAL
| wxALL
, 3);
318 MyFlexSizerFrame::MyFlexSizerFrame(const wxString
&title
, int x
, int y
)
319 : wxFrame(NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
321 wxFlexGridSizer
*sizerFlex
;
322 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
324 // consttuct the first column
325 wxSizer
*sizerCol1
= new wxBoxSizer(wxVERTICAL
);
326 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("Ungrowable:")), 0, wxCENTER
| wxTOP
, 20);
327 sizerFlex
= new wxFlexGridSizer(3, 3);
328 InitFlexSizer(sizerFlex
, p
);
329 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
331 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("Growable middle column:")), 0, wxCENTER
| wxTOP
, 20);
332 sizerFlex
= new wxFlexGridSizer(3, 3);
333 InitFlexSizer(sizerFlex
, p
);
334 sizerFlex
->AddGrowableCol(1);
335 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
337 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("Growable middle row:")), 0, wxCENTER
| wxTOP
, 20);
338 sizerFlex
= new wxFlexGridSizer(3, 3);
339 InitFlexSizer(sizerFlex
, p
);
340 sizerFlex
->AddGrowableRow(1);
341 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
343 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("All growable columns:")), 0, wxCENTER
| wxTOP
, 20);
344 sizerFlex
= new wxFlexGridSizer(3, 3);
345 InitFlexSizer(sizerFlex
, p
);
346 sizerFlex
->AddGrowableCol(0, 1);
347 sizerFlex
->AddGrowableCol(1, 2);
348 sizerFlex
->AddGrowableCol(2, 3);
349 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
352 wxSizer
*sizerCol2
= new wxBoxSizer(wxVERTICAL
);
353 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Growable middle row and column:")), 0, wxCENTER
| wxTOP
, 20);
354 sizerFlex
= new wxFlexGridSizer(3, 3);
355 InitFlexSizer(sizerFlex
, p
);
356 sizerFlex
->AddGrowableCol(1);
357 sizerFlex
->AddGrowableRow(1);
358 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
360 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Same with horz flex direction")), 0, wxCENTER
| wxTOP
, 20);
361 sizerFlex
= new wxFlexGridSizer(3, 3);
362 InitFlexSizer(sizerFlex
, p
);
363 sizerFlex
->AddGrowableCol(1);
364 sizerFlex
->AddGrowableRow(1);
365 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
366 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
368 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Same with grow mode == \"none\"")), 0, wxCENTER
| wxTOP
, 20);
369 sizerFlex
= new wxFlexGridSizer(3, 3);
370 InitFlexSizer(sizerFlex
, p
);
371 sizerFlex
->AddGrowableCol(1);
372 sizerFlex
->AddGrowableRow(1);
373 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
374 sizerFlex
->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_NONE
);
375 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
377 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Same with grow mode == \"all\"")), 0, wxCENTER
| wxTOP
, 20);
378 sizerFlex
= new wxFlexGridSizer(3, 3);
379 InitFlexSizer(sizerFlex
, p
);
380 sizerFlex
->AddGrowableCol(1);
381 sizerFlex
->AddGrowableRow(1);
382 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
383 sizerFlex
->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_ALL
);
384 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
386 // add both columns to grid sizer
387 wxGridSizer
*sizerTop
= new wxGridSizer(2, 0, 20);
388 sizerTop
->Add(sizerCol1
, 1, wxEXPAND
);
389 sizerTop
->Add(sizerCol2
, 1, wxEXPAND
);
391 p
->SetSizer(sizerTop
);
392 sizerTop
->SetSizeHints(this);
395 // ----------------------------------------------------------------------------
397 // ----------------------------------------------------------------------------
399 MySizerDialog::MySizerDialog(wxWindow
*parent
, const wxString
&title
)
400 : wxDialog(parent
, wxID_ANY
, wxString(title
))
402 // Begin with first hierarchy: a notebook at the top and
403 // and OK button at the bottom.
405 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
407 wxNotebook
*notebook
= new wxNotebook( this, wxID_ANY
);
408 topsizer
->Add( notebook
, 1, wxGROW
);
410 wxButton
*button
= new wxButton( this, wxID_OK
, _T("OK") );
411 topsizer
->Add( button
, 0, wxALIGN_RIGHT
| wxALL
, 10 );
413 // First page: one big text ctrl
414 wxTextCtrl
*multi
= new wxTextCtrl( notebook
, wxID_ANY
, _T("TextCtrl."), wxDefaultPosition
, wxDefaultSize
, wxTE_MULTILINE
);
415 notebook
->AddPage( multi
, _T("Page One") );
417 // Second page: a text ctrl and a button
418 wxPanel
*panel
= new wxPanel( notebook
, wxID_ANY
);
419 notebook
->AddPage( panel
, _T("Page Two") );
421 wxSizer
*panelsizer
= new wxBoxSizer( wxVERTICAL
);
423 wxTextCtrl
*text
= new wxTextCtrl( panel
, wxID_ANY
, _T("TextLine 1."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
424 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
425 text
= new wxTextCtrl( panel
, wxID_ANY
, _T("TextLine 2."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
426 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
427 wxButton
*button2
= new wxButton( panel
, wxID_ANY
, _T("Hallo") );
428 panelsizer
->Add( button2
, 0, wxALIGN_RIGHT
| wxLEFT
|wxRIGHT
|wxBOTTOM
, 30 );
430 panel
->SetSizer( panelsizer
);
432 // Tell dialog to use sizer
433 SetSizerAndFit( topsizer
);
436 // ----------------------------------------------------------------------------
437 // MyGridBagSizerFrame
438 // ----------------------------------------------------------------------------
440 // some simple macros to help make the sample code below more clear
441 #define TEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text))
442 #define MLTEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE)
443 #define POS(r, c) wxGBPosition(r,c)
444 #define SPAN(r, c) wxGBSpan(r,c)
446 const wxChar gbsDescription
[] =_T("\
447 The wxGridBagSizer is similar to the wxFlexGridSizer except the items are explicitly positioned\n\
448 in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this\n\
449 static text is positioned at (0,0) and it spans 7 columns.");
463 BEGIN_EVENT_TABLE(MyGridBagSizerFrame
, wxFrame
)
464 EVT_BUTTON( GBS_HIDE_BTN
, MyGridBagSizerFrame::OnHideBtn
)
465 EVT_BUTTON( GBS_SHOW_BTN
, MyGridBagSizerFrame::OnShowBtn
)
466 EVT_BUTTON( GBS_MOVE_BTN1
, MyGridBagSizerFrame::OnMoveBtn
)
467 EVT_BUTTON( GBS_MOVE_BTN2
, MyGridBagSizerFrame::OnMoveBtn
)
471 MyGridBagSizerFrame::MyGridBagSizerFrame(const wxString
&title
, int x
, int y
)
472 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
474 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
476 m_gbs
= new wxGridBagSizer();
479 m_gbs
->Add( new wxStaticText(p
, wxID_ANY
, gbsDescription
),
480 POS(0,0), SPAN(1, 7),
481 wxALIGN_CENTER
| wxALL
, 5);
483 m_gbs
->Add( TEXTCTRL("pos(1,0)"), POS(1,0) );
484 m_gbs
->Add( TEXTCTRL("pos(1,1)"), POS(1,1) );
485 m_gbs
->Add( TEXTCTRL("pos(2,0)"), POS(2,0) );
486 m_gbs
->Add( TEXTCTRL("pos(2,1)"), POS(2,1) );
487 m_gbs
->Add( MLTEXTCTRL("pos(3,2), span(1,2)\nthis row and col are growable"),
488 POS(3,2), SPAN(1,2), wxEXPAND
);
489 m_gbs
->Add( MLTEXTCTRL("pos(4,3)\nspan(3,1)"),
490 POS(4,3), SPAN(3,1), wxEXPAND
);
491 m_gbs
->Add( TEXTCTRL("pos(5,4)"), POS(5,4), wxDefaultSpan
, wxEXPAND
);
492 m_gbs
->Add( TEXTCTRL("pos(6,5)"), POS(6,5), wxDefaultSpan
, wxEXPAND
);
493 m_gbs
->Add( TEXTCTRL("pos(7,6)"), POS(7,6) );
495 //m_gbs->Add( TEXTCTRL("bad position"), POS(4,3) ); // Test for assert
496 //m_gbs->Add( TEXTCTRL("bad position"), POS(5,3) ); // Test for assert
499 m_moveBtn1
= new wxButton(p
, GBS_MOVE_BTN1
, _T("Move this to (3,6)"));
500 m_moveBtn2
= new wxButton(p
, GBS_MOVE_BTN2
, _T("Move this to (3,6)"));
501 m_gbs
->Add( m_moveBtn1
, POS(10,2) );
502 m_gbs
->Add( m_moveBtn2
, POS(10,3) );
504 m_hideBtn
= new wxButton(p
, GBS_HIDE_BTN
, _T("Hide this item -->"));
505 m_gbs
->Add(m_hideBtn
, POS(12, 3));
507 m_hideTxt
= new wxTextCtrl(p
, wxID_ANY
, _T("pos(12,4), size(150, wxDefaultCoord)"),
508 wxDefaultPosition
, wxSize(150,wxDefaultCoord
));
509 m_gbs
->Add( m_hideTxt
, POS(12,4) );
511 m_showBtn
= new wxButton(p
, GBS_SHOW_BTN
, _T("<-- Show it again"));
512 m_gbs
->Add(m_showBtn
, POS(12, 5));
513 m_showBtn
->Disable();
515 m_gbs
->Add(10,10, POS(14,0));
517 m_gbs
->AddGrowableRow(3);
518 m_gbs
->AddGrowableCol(2);
520 p
->SetSizerAndFit(m_gbs
);
521 SetClientSize(p
->GetSize());
525 void MyGridBagSizerFrame::OnHideBtn(wxCommandEvent
&)
527 m_gbs
->Hide(m_hideTxt
);
528 m_hideBtn
->Disable();
533 void MyGridBagSizerFrame::OnShowBtn(wxCommandEvent
&)
535 m_gbs
->Show(m_hideTxt
);
537 m_showBtn
->Disable();
542 void MyGridBagSizerFrame::OnMoveBtn(wxCommandEvent
& event
)
544 wxButton
* btn
= (wxButton
*)event
.GetEventObject();
545 wxGBPosition curPos
= m_gbs
->GetItemPosition(btn
);
547 // if it's already at the "other" spot then move it back
548 if (curPos
== wxGBPosition(3,6))
550 m_gbs
->SetItemPosition(btn
, m_lastPos
);
551 btn
->SetLabel(_T("Move this to (3,6)"));
555 if ( m_gbs
->CheckForIntersection(wxGBPosition(3,6), wxGBSpan(1,1)) )
557 _T("wxGridBagSizer will not allow items to be in the same cell as\n\
558 another item, so this operation will fail. You will also get an assert\n\
559 when compiled in debug mode."), _T("Warning"), wxOK
| wxICON_INFORMATION
);
561 if ( m_gbs
->SetItemPosition(btn
, wxGBPosition(3,6)) )
564 btn
->SetLabel(_T("Move it back"));
570 // ----------------------------------------------------------------------------
571 // MySimpleSizerFrame
572 // ----------------------------------------------------------------------------
580 BEGIN_EVENT_TABLE(MySimpleSizerFrame
, wxFrame
)
581 EVT_MENU( ID_SET_SMALL
, MySimpleSizerFrame::OnSetSmallSize
)
582 EVT_MENU( ID_SET_BIG
, MySimpleSizerFrame::OnSetBigSize
)
585 MySimpleSizerFrame::MySimpleSizerFrame(const wxString
&title
, int x
, int y
)
586 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
588 wxMenu
*menu
= new wxMenu
;
590 menu
->Append(ID_SET_SMALL
, _T("Make text control small\tF4"));
591 menu
->Append(ID_SET_BIG
, _T("Make text control big\tF5"));
593 wxMenuBar
*menu_bar
= new wxMenuBar
;
594 menu_bar
->Append(menu
, _T("&File"));
596 SetMenuBar( menu_bar
);
598 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxHORIZONTAL
);
600 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
601 main_sizer
->Add( m_target
, 1, wxALL
, 5 );
603 main_sizer
->Add( new wxStaticText( this, wxID_ANY
, wxT("Set alternating sizes using F4 and F5") ), 0, wxALL
, 5 );
605 SetSizer( main_sizer
);
608 GetSizer()->Fit( this );
611 void MySimpleSizerFrame::OnSetSmallSize( wxCommandEvent
& WXUNUSED(event
))
613 GetSizer()->SetItemMinSize( m_target
, 40, -1 );
615 GetSizer()->Fit( this );
618 void MySimpleSizerFrame::OnSetBigSize( wxCommandEvent
& WXUNUSED(event
))
620 GetSizer()->SetItemMinSize( m_target
, 140, -1 );
622 GetSizer()->Fit( this );
626 // ----------------------------------------------------------------------------
627 // MyNestedSizerFrame
628 // ----------------------------------------------------------------------------
631 MyNestedSizerFrame::MyNestedSizerFrame(const wxString
&title
, int x
, int y
)
632 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
634 wxMenu
*menu
= new wxMenu
;
636 menu
->Append(wxID_ABOUT
, _T("Do nothing"));
638 wxMenuBar
*menu_bar
= new wxMenuBar
;
639 menu_bar
->Append(menu
, _T("&File"));
641 SetMenuBar( menu_bar
);
643 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxVERTICAL
);
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
);
648 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
650 wxPanel
*panel
= new wxPanel( this, -1, wxDefaultPosition
, wxDefaultSize
,
651 wxTAB_TRAVERSAL
| wxSUNKEN_BORDER
);
652 main_sizer
->Add( panel
, 0, wxALIGN_CENTER
);
653 wxBoxSizer
*panel_sizer
= new wxBoxSizer( wxVERTICAL
);
654 panel
->SetSizer( panel_sizer
);
655 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
656 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
657 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
659 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
661 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
662 main_sizer
->Add( m_target
, 1, wxALL
|wxGROW
, 5 );
664 SetSizerAndFit( main_sizer
);
668 // ----------------------------------------------------------------------------
670 // ----------------------------------------------------------------------------
673 MyWrapSizerFrame::MyWrapSizerFrame(const wxString
&title
, int x
, int y
)
674 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
676 wxMenu
*menu
= new wxMenu
;
678 menu
->Append(wxID_ABOUT
, "Do nothing");
680 wxMenuBar
*menu_bar
= new wxMenuBar
;
681 menu_bar
->Append(menu
, "&File");
683 SetMenuBar( menu_bar
);
685 wxBoxSizer
*root
= new wxBoxSizer( wxVERTICAL
);
687 // A number of checkboxes inside a wrap sizer
688 wxSizer
*ps_mid
= new wxStaticBoxSizer( wxVERTICAL
, this, "Wrapping check-boxes" );
689 wxSizer
*ps_mid_wrap
= new wxWrapSizer(wxHORIZONTAL
);
690 ps_mid
->Add( ps_mid_wrap
, 100, wxEXPAND
);
691 for( int ix
=0; ix
<6; ix
++ )
692 ps_mid_wrap
->Add( new wxCheckBox(this,wxID_ANY
,wxString::Format("Option %d",ix
+1)), 0, wxALIGN_CENTRE
|wxALIGN_CENTER_VERTICAL
, 5 );
693 root
->Add( ps_mid
, 0, wxEXPAND
| wxALL
, 5 );
695 // A shaped item inside a box sizer
696 wxSizer
*ps_bottom
= new wxStaticBoxSizer( wxVERTICAL
, this, "With wxSHAPED item" );
697 wxSizer
*ps_bottom_box
= new wxBoxSizer(wxHORIZONTAL
);
698 ps_bottom
->Add( ps_bottom_box
, 100, wxEXPAND
);
699 ps_bottom_box
->Add( new wxListBox(this,wxID_ANY
,wxPoint(0,0),wxSize(70,70)), 0, wxEXPAND
|wxSHAPED
);
700 ps_bottom_box
->Add( 10,10 );
701 ps_bottom_box
->Add( new wxCheckBox(this,wxID_ANY
,"A much longer option..."), 100, 0, 5 );
703 root
->Add( ps_bottom
, 1, wxEXPAND
| wxALL
, 5 );
705 // Set sizer for window
706 SetSizerAndFit( root
);