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
->SetAutoLayout( true );
430 panel
->SetSizer( panelsizer
);
432 // Tell dialog to use sizer
433 SetSizer( topsizer
);
434 topsizer
->SetSizeHints( this );
437 // ----------------------------------------------------------------------------
438 // MyGridBagSizerFrame
439 // ----------------------------------------------------------------------------
441 // some simple macros to help make the sample code below more clear
442 #define TEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text))
443 #define MLTEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE)
444 #define POS(r, c) wxGBPosition(r,c)
445 #define SPAN(r, c) wxGBSpan(r,c)
447 const wxChar gbsDescription
[] =_T("\
448 The wxGridBagSizer is similar to the wxFlexGridSizer except the items are explicitly positioned\n\
449 in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this\n\
450 static text is positioned at (0,0) and it spans 7 columns.");
464 BEGIN_EVENT_TABLE(MyGridBagSizerFrame
, wxFrame
)
465 EVT_BUTTON( GBS_HIDE_BTN
, MyGridBagSizerFrame::OnHideBtn
)
466 EVT_BUTTON( GBS_SHOW_BTN
, MyGridBagSizerFrame::OnShowBtn
)
467 EVT_BUTTON( GBS_MOVE_BTN1
, MyGridBagSizerFrame::OnMoveBtn
)
468 EVT_BUTTON( GBS_MOVE_BTN2
, MyGridBagSizerFrame::OnMoveBtn
)
472 MyGridBagSizerFrame::MyGridBagSizerFrame(const wxString
&title
, int x
, int y
)
473 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
475 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
477 m_gbs
= new wxGridBagSizer();
480 m_gbs
->Add( new wxStaticText(p
, wxID_ANY
, gbsDescription
),
481 POS(0,0), SPAN(1, 7),
482 wxALIGN_CENTER
| wxALL
, 5);
484 m_gbs
->Add( TEXTCTRL("pos(1,0)"), POS(1,0) );
485 m_gbs
->Add( TEXTCTRL("pos(1,1)"), POS(1,1) );
486 m_gbs
->Add( TEXTCTRL("pos(2,0)"), POS(2,0) );
487 m_gbs
->Add( TEXTCTRL("pos(2,1)"), POS(2,1) );
488 m_gbs
->Add( MLTEXTCTRL("pos(3,2), span(1,2)\nthis row and col are growable"),
489 POS(3,2), SPAN(1,2), wxEXPAND
);
490 m_gbs
->Add( MLTEXTCTRL("pos(4,3)\nspan(3,1)"),
491 POS(4,3), SPAN(3,1), wxEXPAND
);
492 m_gbs
->Add( TEXTCTRL("pos(5,4)"), POS(5,4), wxDefaultSpan
, wxEXPAND
);
493 m_gbs
->Add( TEXTCTRL("pos(6,5)"), POS(6,5), wxDefaultSpan
, wxEXPAND
);
494 m_gbs
->Add( TEXTCTRL("pos(7,6)"), POS(7,6) );
496 //m_gbs->Add( TEXTCTRL("bad position"), POS(4,3) ); // Test for assert
497 //m_gbs->Add( TEXTCTRL("bad position"), POS(5,3) ); // Test for assert
500 m_moveBtn1
= new wxButton(p
, GBS_MOVE_BTN1
, _T("Move this to (3,6)"));
501 m_moveBtn2
= new wxButton(p
, GBS_MOVE_BTN2
, _T("Move this to (3,6)"));
502 m_gbs
->Add( m_moveBtn1
, POS(10,2) );
503 m_gbs
->Add( m_moveBtn2
, POS(10,3) );
505 m_hideBtn
= new wxButton(p
, GBS_HIDE_BTN
, _T("Hide this item -->"));
506 m_gbs
->Add(m_hideBtn
, POS(12, 3));
508 m_hideTxt
= new wxTextCtrl(p
, wxID_ANY
, _T("pos(12,4), size(150, wxDefaultCoord)"),
509 wxDefaultPosition
, wxSize(150,wxDefaultCoord
));
510 m_gbs
->Add( m_hideTxt
, POS(12,4) );
512 m_showBtn
= new wxButton(p
, GBS_SHOW_BTN
, _T("<-- Show it again"));
513 m_gbs
->Add(m_showBtn
, POS(12, 5));
514 m_showBtn
->Disable();
516 m_gbs
->Add(10,10, POS(14,0));
518 m_gbs
->AddGrowableRow(3);
519 m_gbs
->AddGrowableCol(2);
521 p
->SetSizerAndFit(m_gbs
);
522 SetClientSize(p
->GetSize());
526 void MyGridBagSizerFrame::OnHideBtn(wxCommandEvent
&)
528 m_gbs
->Hide(m_hideTxt
);
529 m_hideBtn
->Disable();
534 void MyGridBagSizerFrame::OnShowBtn(wxCommandEvent
&)
536 m_gbs
->Show(m_hideTxt
);
538 m_showBtn
->Disable();
543 void MyGridBagSizerFrame::OnMoveBtn(wxCommandEvent
& event
)
545 wxButton
* btn
= (wxButton
*)event
.GetEventObject();
546 wxGBPosition curPos
= m_gbs
->GetItemPosition(btn
);
548 // if it's already at the "other" spot then move it back
549 if (curPos
== wxGBPosition(3,6))
551 m_gbs
->SetItemPosition(btn
, m_lastPos
);
552 btn
->SetLabel(_T("Move this to (3,6)"));
556 if ( m_gbs
->CheckForIntersection(wxGBPosition(3,6), wxGBSpan(1,1)) )
558 _T("wxGridBagSizer will not allow items to be in the same cell as\n\
559 another item, so this operation will fail. You will also get an assert\n\
560 when compiled in debug mode."), _T("Warning"), wxOK
| wxICON_INFORMATION
);
562 if ( m_gbs
->SetItemPosition(btn
, wxGBPosition(3,6)) )
565 btn
->SetLabel(_T("Move it back"));
571 // ----------------------------------------------------------------------------
572 // MySimpleSizerFrame
573 // ----------------------------------------------------------------------------
581 BEGIN_EVENT_TABLE(MySimpleSizerFrame
, wxFrame
)
582 EVT_MENU( ID_SET_SMALL
, MySimpleSizerFrame::OnSetSmallSize
)
583 EVT_MENU( ID_SET_BIG
, MySimpleSizerFrame::OnSetBigSize
)
586 MySimpleSizerFrame::MySimpleSizerFrame(const wxString
&title
, int x
, int y
)
587 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
589 wxMenu
*menu
= new wxMenu
;
591 menu
->Append(ID_SET_SMALL
, _T("Make text control small\tF4"));
592 menu
->Append(ID_SET_BIG
, _T("Make text control big\tF5"));
594 wxMenuBar
*menu_bar
= new wxMenuBar
;
595 menu_bar
->Append(menu
, _T("&File"));
597 SetMenuBar( menu_bar
);
599 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxHORIZONTAL
);
601 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
602 main_sizer
->Add( m_target
, 1, wxALL
, 5 );
604 main_sizer
->Add( new wxStaticText( this, wxID_ANY
, wxT("Set alternating sizes using F4 and F5") ), 0, wxALL
, 5 );
606 SetSizer( main_sizer
);
609 GetSizer()->Fit( this );
612 void MySimpleSizerFrame::OnSetSmallSize( wxCommandEvent
& WXUNUSED(event
))
614 GetSizer()->SetItemMinSize( m_target
, 40, -1 );
616 GetSizer()->Fit( this );
619 void MySimpleSizerFrame::OnSetBigSize( wxCommandEvent
& WXUNUSED(event
))
621 GetSizer()->SetItemMinSize( m_target
, 140, -1 );
623 GetSizer()->Fit( this );
627 // ----------------------------------------------------------------------------
628 // MyNestedSizerFrame
629 // ----------------------------------------------------------------------------
632 MyNestedSizerFrame::MyNestedSizerFrame(const wxString
&title
, int x
, int y
)
633 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
635 wxMenu
*menu
= new wxMenu
;
637 menu
->Append(wxID_ABOUT
, _T("Do nothing"));
639 wxMenuBar
*menu_bar
= new wxMenuBar
;
640 menu_bar
->Append(menu
, _T("&File"));
642 SetMenuBar( menu_bar
);
644 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxVERTICAL
);
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
);
649 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
651 wxPanel
*panel
= new wxPanel( this, -1, wxDefaultPosition
, wxDefaultSize
,
652 wxTAB_TRAVERSAL
| wxSUNKEN_BORDER
);
653 main_sizer
->Add( panel
, 0, wxALIGN_CENTER
);
654 wxBoxSizer
*panel_sizer
= new wxBoxSizer( wxVERTICAL
);
655 panel
->SetSizer( panel_sizer
);
656 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
657 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
658 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
660 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
662 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
663 main_sizer
->Add( m_target
, 1, wxALL
|wxGROW
, 5 );
665 SetSizer( main_sizer
);
668 GetSizer()->Fit( this );
669 GetSizer()->SetSizeHints( this );
673 // ----------------------------------------------------------------------------
675 // ----------------------------------------------------------------------------
678 MyWrapSizerFrame::MyWrapSizerFrame(const wxString
&title
, int x
, int y
)
679 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
681 wxMenu
*menu
= new wxMenu
;
683 menu
->Append(wxID_ABOUT
, "Do nothing");
685 wxMenuBar
*menu_bar
= new wxMenuBar
;
686 menu_bar
->Append(menu
, "&File");
688 SetMenuBar( menu_bar
);
690 wxBoxSizer
*root
= new wxBoxSizer( wxVERTICAL
);
692 // A number of checkboxes inside a wrap sizer
693 wxSizer
*ps_mid
= new wxStaticBoxSizer( wxVERTICAL
, this, "Wrapping check-boxes" );
694 wxSizer
*ps_mid_wrap
= new wxWrapSizer(wxHORIZONTAL
);
695 ps_mid
->Add( ps_mid_wrap
, 100, wxEXPAND
);
696 for( int ix
=0; ix
<6; ix
++ )
697 ps_mid_wrap
->Add( new wxCheckBox(this,wxID_ANY
,wxString::Format("Option %d",ix
+1)), 0, wxALIGN_CENTRE
|wxALIGN_CENTER_VERTICAL
, 5 );
698 root
->Add( ps_mid
, 0, wxEXPAND
| wxALL
, 5 );
700 // A shaped item inside a box sizer
701 wxSizer
*ps_bottom
= new wxStaticBoxSizer( wxVERTICAL
, this, "With wxSHAPED item" );
702 wxSizer
*ps_bottom_box
= new wxBoxSizer(wxHORIZONTAL
);
703 ps_bottom
->Add( ps_bottom_box
, 100, wxEXPAND
);
704 ps_bottom_box
->Add( new wxListBox(this,wxID_ANY
,wxPoint(0,0),wxSize(70,70)), 0, wxEXPAND
|wxSHAPED
);
705 ps_bottom_box
->Add( 10,10 );
706 ps_bottom_box
->Add( new wxCheckBox(this,wxID_ANY
,"A much longer option..."), 100, 0, 5 );
708 root
->Add( ps_bottom
, 1, wxEXPAND
| wxALL
, 5 );
710 // Set sizer for window
713 root
->SetSizeHints( this );