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
)
71 // Define my frame constructor
73 : wxFrame(NULL
, wxID_ANY
, _T("wxWidgets Layout Demo"),
74 wxDefaultPosition
, wxDefaultSize
,
75 wxDEFAULT_FRAME_STYLE
| wxNO_FULL_REPAINT_ON_RESIZE
)
78 wxMenu
*file_menu
= new wxMenu
;
80 file_menu
->Append(LAYOUT_TEST_PROPORTIONS
, _T("&Proportions demo...\tF1"));
81 file_menu
->Append(LAYOUT_TEST_SIZER
, _T("Test wx&FlexSizer...\tF2"));
82 file_menu
->Append(LAYOUT_TEST_NB_SIZER
, _T("Test ¬ebook sizers...\tF3"));
83 file_menu
->Append(LAYOUT_TEST_GB_SIZER
, _T("Test &gridbag sizer...\tF4"));
84 file_menu
->Append(LAYOUT_TEST_SET_MINIMAL
, _T("Test Set&ItemMinSize...\tF5"));
85 file_menu
->Append(LAYOUT_TEST_NESTED
, _T("Test nested sizer in a wxPanel...\tF6"));
87 file_menu
->AppendSeparator();
88 file_menu
->Append(LAYOUT_QUIT
, _T("E&xit"), _T("Quit program"));
90 wxMenu
*help_menu
= new wxMenu
;
91 help_menu
->Append(LAYOUT_ABOUT
, _T("&About"), _T("About layout demo..."));
93 wxMenuBar
*menu_bar
= new wxMenuBar
;
95 menu_bar
->Append(file_menu
, _T("&File"));
96 menu_bar
->Append(help_menu
, _T("&Help"));
98 // Associate the menu bar with the frame
103 SetStatusText(_T("wxWidgets layout demo"));
104 #endif // wxUSE_STATUSBAR
106 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
108 // we want to get a dialog that is stretchable because it
109 // has a text ctrl in the middle. at the bottom, we have
110 // two buttons which.
112 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
114 // 1) top: create wxStaticText with minimum size equal to its default size
116 new wxStaticText( p
, wxID_ANY
, _T("An explanation (wxALIGN_RIGHT).") ),
117 wxSizerFlags().Align(wxALIGN_RIGHT
).Border(wxALL
& ~wxBOTTOM
, 5));
119 // 2) top: create wxTextCtrl with minimum size (100x60)
121 new wxTextCtrl( p
, wxID_ANY
, _T("My text (wxEXPAND)."), wxDefaultPosition
, wxSize(100,60), wxTE_MULTILINE
),
122 wxSizerFlags(1).Expand().Border(wxALL
, 5));
124 // 2.5) Gratuitous test of wxStaticBoxSizers
125 wxBoxSizer
*statsizer
= new wxStaticBoxSizer(
126 new wxStaticBox(p
, wxID_ANY
, _T("A wxStaticBoxSizer")), wxVERTICAL
);
128 new wxStaticText(p
, wxID_ANY
, _T("And some TEXT inside it")),
129 wxSizerFlags().Center().Border(wxALL
, 30));
132 wxSizerFlags(1).Expand().Border(wxALL
, 10));
134 // 2.7) And a test of wxGridSizer
135 wxGridSizer
*gridsizer
= new wxGridSizer(2, 5, 5);
136 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, _T("Label")),
137 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
138 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, _T("Grid sizer demo")),
139 wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
140 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, _T("Another label")),
141 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
142 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, _T("More text")),
143 wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
144 gridsizer
->Add(new wxStaticText(p
, wxID_ANY
, _T("Final label")),
145 wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
));
146 gridsizer
->Add(new wxTextCtrl(p
, wxID_ANY
, _T("And yet more text")),
147 wxSizerFlags().Align(wxGROW
| wxALIGN_CENTER_VERTICAL
));
150 wxSizerFlags().Proportion(1).Expand().Border(wxALL
, 10));
154 // 3) middle: create wxStaticLine with minimum size (3x3)
156 new wxStaticLine( p
, wxID_ANY
, wxDefaultPosition
, wxSize(3,3), wxHORIZONTAL
),
157 wxSizerFlags().Expand());
158 #endif // wxUSE_STATLINE
161 // 4) bottom: create two centred wxButtons
162 wxBoxSizer
*button_box
= new wxBoxSizer( wxHORIZONTAL
);
164 new wxButton( p
, wxID_ANY
, _T("Two buttons in a box") ),
165 wxSizerFlags().Border(wxALL
, 7));
167 new wxButton( p
, wxID_ANY
, _T("(wxCENTER)") ),
168 wxSizerFlags().Border(wxALL
, 7));
170 topsizer
->Add(button_box
, wxSizerFlags().Center());
172 p
->SetSizer( topsizer
);
174 // don't allow frame to get smaller than what the sizers tell it and also set
175 // the initial size as calculated by the sizers
176 topsizer
->SetSizeHints( this );
179 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
184 void MyFrame::TestProportions(wxCommandEvent
& WXUNUSED(event
))
186 (new MyProportionsFrame(this))->Show();
189 void MyFrame::TestFlexSizers(wxCommandEvent
& WXUNUSED(event
) )
191 MyFlexSizerFrame
*newFrame
= new MyFlexSizerFrame(_T("Flex Sizer Test Frame"), 50, 50);
192 newFrame
->Show(true);
195 void MyFrame::TestNotebookSizers(wxCommandEvent
& WXUNUSED(event
) )
197 MySizerDialog
dialog( this, _T("Notebook Sizer Test Dialog") );
202 void MyFrame::TestSetMinimal(wxCommandEvent
& WXUNUSED(event
) )
204 MySimpleSizerFrame
*newFrame
= new MySimpleSizerFrame(_T("Simple Sizer Test Frame"), 50, 50);
205 newFrame
->Show(true);
208 void MyFrame::TestNested(wxCommandEvent
& WXUNUSED(event
) )
210 MyNestedSizerFrame
*newFrame
= new MyNestedSizerFrame(_T("Nested Sizer Test Frame"), 50, 50);
211 newFrame
->Show(true);
215 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
) )
217 (void)wxMessageBox(_T("wxWidgets GUI library layout demo\n"),
218 _T("About Layout Demo"), wxOK
|wxICON_INFORMATION
);
221 void MyFrame::TestGridBagSizer(wxCommandEvent
& WXUNUSED(event
) )
223 MyGridBagSizerFrame
*newFrame
= new
224 MyGridBagSizerFrame(_T("wxGridBagSizer Test Frame"), 50, 50);
225 newFrame
->Show(true);
228 // ----------------------------------------------------------------------------
229 // MyProportionsFrame
230 // ----------------------------------------------------------------------------
232 MyProportionsFrame::MyProportionsFrame(wxFrame
*parent
)
233 : wxFrame(parent
, wxID_ANY
, _T("Box Sizer Proportions Demo"))
237 // create the controls
238 wxPanel
*panel
= new wxPanel(this, wxID_ANY
);
239 for ( n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
241 m_spins
[n
] = new wxSpinCtrl(panel
);
242 m_spins
[n
]->SetValue(n
);
246 m_sizer
= new wxStaticBoxSizer(wxHORIZONTAL
, panel
,
247 _T("Try changing elements proportions and resizing the window"));
248 for ( n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
249 m_sizer
->Add(m_spins
[n
], wxSizerFlags().Border());
251 // put everything together
252 panel
->SetSizer(m_sizer
);
253 wxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
254 sizerTop
->Add(panel
, wxSizerFlags(1).Expand().Border());
256 SetSizerAndFit(sizerTop
);
258 // and connect the events
259 Connect(wxEVT_COMMAND_TEXT_UPDATED
,
260 wxCommandEventHandler(MyProportionsFrame::OnProportionUpdated
));
261 Connect(wxEVT_COMMAND_SPINCTRL_UPDATED
,
262 wxSpinEventHandler(MyProportionsFrame::OnProportionChanged
));
265 void MyProportionsFrame::UpdateProportions()
267 for ( size_t n
= 0; n
< WXSIZEOF(m_spins
); n
++ )
269 m_sizer
->GetItem(n
)->SetProportion(m_spins
[n
]->GetValue());
275 void MyProportionsFrame::OnProportionUpdated(wxCommandEvent
& WXUNUSED(event
))
280 void MyProportionsFrame::OnProportionChanged(wxSpinEvent
& WXUNUSED(event
))
285 // ----------------------------------------------------------------------------
287 // ----------------------------------------------------------------------------
289 void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer
*sizer
, wxWindow
* parent
)
291 for ( int i
= 0; i
< 3; i
++ )
293 for ( int j
= 0; j
< 3; j
++ )
295 sizer
->Add(new wxStaticText
299 wxString::Format(_T("(%d, %d)"), i
+ 1, j
+ 1),
304 0, wxEXPAND
| wxALIGN_CENTER_VERTICAL
| wxALL
, 3);
309 MyFlexSizerFrame::MyFlexSizerFrame(const wxChar
*title
, int x
, int y
)
310 : wxFrame(NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
312 wxFlexGridSizer
*sizerFlex
;
313 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
315 // consttuct the first column
316 wxSizer
*sizerCol1
= new wxBoxSizer(wxVERTICAL
);
317 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("Ungrowable:")), 0, wxCENTER
| wxTOP
, 20);
318 sizerFlex
= new wxFlexGridSizer(3, 3);
319 InitFlexSizer(sizerFlex
, p
);
320 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
322 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("Growable middle column:")), 0, wxCENTER
| wxTOP
, 20);
323 sizerFlex
= new wxFlexGridSizer(3, 3);
324 InitFlexSizer(sizerFlex
, p
);
325 sizerFlex
->AddGrowableCol(1);
326 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
328 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("Growable middle row:")), 0, wxCENTER
| wxTOP
, 20);
329 sizerFlex
= new wxFlexGridSizer(3, 3);
330 InitFlexSizer(sizerFlex
, p
);
331 sizerFlex
->AddGrowableRow(1);
332 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
334 sizerCol1
->Add(new wxStaticText(p
, wxID_ANY
, _T("All growable columns:")), 0, wxCENTER
| wxTOP
, 20);
335 sizerFlex
= new wxFlexGridSizer(3, 3);
336 InitFlexSizer(sizerFlex
, p
);
337 sizerFlex
->AddGrowableCol(0, 1);
338 sizerFlex
->AddGrowableCol(1, 2);
339 sizerFlex
->AddGrowableCol(2, 3);
340 sizerCol1
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
343 wxSizer
*sizerCol2
= new wxBoxSizer(wxVERTICAL
);
344 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Growable middle row and column:")), 0, wxCENTER
| wxTOP
, 20);
345 sizerFlex
= new wxFlexGridSizer(3, 3);
346 InitFlexSizer(sizerFlex
, p
);
347 sizerFlex
->AddGrowableCol(1);
348 sizerFlex
->AddGrowableRow(1);
349 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
351 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Same with horz flex direction")), 0, wxCENTER
| wxTOP
, 20);
352 sizerFlex
= new wxFlexGridSizer(3, 3);
353 InitFlexSizer(sizerFlex
, p
);
354 sizerFlex
->AddGrowableCol(1);
355 sizerFlex
->AddGrowableRow(1);
356 sizerFlex
->SetFlexibleDirection(wxHORIZONTAL
);
357 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
359 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Same with grow mode == \"none\"")), 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 sizerFlex
->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_NONE
);
366 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
368 sizerCol2
->Add(new wxStaticText(p
, wxID_ANY
, _T("Same with grow mode == \"all\"")), 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_ALL
);
375 sizerCol2
->Add(sizerFlex
, 1, wxALL
| wxEXPAND
, 10);
377 // add both columns to grid sizer
378 wxGridSizer
*sizerTop
= new wxGridSizer(2, 0, 20);
379 sizerTop
->Add(sizerCol1
, 1, wxEXPAND
);
380 sizerTop
->Add(sizerCol2
, 1, wxEXPAND
);
382 p
->SetSizer(sizerTop
);
383 sizerTop
->SetSizeHints(this);
386 // ----------------------------------------------------------------------------
388 // ----------------------------------------------------------------------------
390 MySizerDialog::MySizerDialog(wxWindow
*parent
, const wxChar
*title
)
391 : wxDialog(parent
, wxID_ANY
, wxString(title
))
393 // Begin with first hierarchy: a notebook at the top and
394 // and OK button at the bottom.
396 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
398 wxNotebook
*notebook
= new wxNotebook( this, wxID_ANY
);
399 topsizer
->Add( notebook
, 1, wxGROW
);
401 wxButton
*button
= new wxButton( this, wxID_OK
, _T("OK") );
402 topsizer
->Add( button
, 0, wxALIGN_RIGHT
| wxALL
, 10 );
404 // First page: one big text ctrl
405 wxTextCtrl
*multi
= new wxTextCtrl( notebook
, wxID_ANY
, _T("TextCtrl."), wxDefaultPosition
, wxDefaultSize
, wxTE_MULTILINE
);
406 notebook
->AddPage( multi
, _T("Page One") );
408 // Second page: a text ctrl and a button
409 wxPanel
*panel
= new wxPanel( notebook
, wxID_ANY
);
410 notebook
->AddPage( panel
, _T("Page Two") );
412 wxSizer
*panelsizer
= new wxBoxSizer( wxVERTICAL
);
414 wxTextCtrl
*text
= new wxTextCtrl( panel
, wxID_ANY
, _T("TextLine 1."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
415 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
416 text
= new wxTextCtrl( panel
, wxID_ANY
, _T("TextLine 2."), wxDefaultPosition
, wxSize(250,wxDefaultCoord
) );
417 panelsizer
->Add( text
, 0, wxGROW
|wxALL
, 30 );
418 wxButton
*button2
= new wxButton( panel
, wxID_ANY
, _T("Hallo") );
419 panelsizer
->Add( button2
, 0, wxALIGN_RIGHT
| wxLEFT
|wxRIGHT
|wxBOTTOM
, 30 );
421 panel
->SetAutoLayout( true );
422 panel
->SetSizer( panelsizer
);
424 // Tell dialog to use sizer
425 SetSizer( topsizer
);
426 topsizer
->SetSizeHints( this );
429 // ----------------------------------------------------------------------------
430 // MyGridBagSizerFrame
431 // ----------------------------------------------------------------------------
433 // some simple macros to help make the sample code below more clear
434 #define TEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text))
435 #define MLTEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE)
436 #define POS(r, c) wxGBPosition(r,c)
437 #define SPAN(r, c) wxGBSpan(r,c)
439 const wxChar gbsDescription
[] =_T("\
440 The wxGridBagSizer is similar to the wxFlexGridSizer except the items are explicitly positioned\n\
441 in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this\n\
442 static text is positioned at (0,0) and it spans 7 columns.");
456 BEGIN_EVENT_TABLE(MyGridBagSizerFrame
, wxFrame
)
457 EVT_BUTTON( GBS_HIDE_BTN
, MyGridBagSizerFrame::OnHideBtn
)
458 EVT_BUTTON( GBS_SHOW_BTN
, MyGridBagSizerFrame::OnShowBtn
)
459 EVT_BUTTON( GBS_MOVE_BTN1
, MyGridBagSizerFrame::OnMoveBtn
)
460 EVT_BUTTON( GBS_MOVE_BTN2
, MyGridBagSizerFrame::OnMoveBtn
)
464 MyGridBagSizerFrame::MyGridBagSizerFrame(const wxChar
*title
, int x
, int y
)
465 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
467 wxPanel
* p
= new wxPanel(this, wxID_ANY
);
469 m_gbs
= new wxGridBagSizer();
472 m_gbs
->Add( new wxStaticText(p
, wxID_ANY
, gbsDescription
),
473 POS(0,0), SPAN(1, 7),
474 wxALIGN_CENTER
| wxALL
, 5);
476 m_gbs
->Add( TEXTCTRL("pos(1,0)"), POS(1,0) );
477 m_gbs
->Add( TEXTCTRL("pos(1,1)"), POS(1,1) );
478 m_gbs
->Add( TEXTCTRL("pos(2,0)"), POS(2,0) );
479 m_gbs
->Add( TEXTCTRL("pos(2,1)"), POS(2,1) );
480 m_gbs
->Add( MLTEXTCTRL("pos(3,2), span(1,2)\nthis row and col are growable"),
481 POS(3,2), SPAN(1,2), wxEXPAND
);
482 m_gbs
->Add( MLTEXTCTRL("pos(4,3)\nspan(3,1)"),
483 POS(4,3), SPAN(3,1), wxEXPAND
);
484 m_gbs
->Add( TEXTCTRL("pos(5,4)"), POS(5,4), wxDefaultSpan
, wxEXPAND
);
485 m_gbs
->Add( TEXTCTRL("pos(6,5)"), POS(6,5), wxDefaultSpan
, wxEXPAND
);
486 m_gbs
->Add( TEXTCTRL("pos(7,6)"), POS(7,6) );
488 //m_gbs->Add( TEXTCTRL("bad position"), POS(4,3) ); // Test for assert
489 //m_gbs->Add( TEXTCTRL("bad position"), POS(5,3) ); // Test for assert
492 m_moveBtn1
= new wxButton(p
, GBS_MOVE_BTN1
, _T("Move this to (3,6)"));
493 m_moveBtn2
= new wxButton(p
, GBS_MOVE_BTN2
, _T("Move this to (3,6)"));
494 m_gbs
->Add( m_moveBtn1
, POS(10,2) );
495 m_gbs
->Add( m_moveBtn2
, POS(10,3) );
497 m_hideBtn
= new wxButton(p
, GBS_HIDE_BTN
, _T("Hide this item -->"));
498 m_gbs
->Add(m_hideBtn
, POS(12, 3));
500 m_hideTxt
= new wxTextCtrl(p
, wxID_ANY
, _T("pos(12,4), size(150, wxDefaultCoord)"),
501 wxDefaultPosition
, wxSize(150,wxDefaultCoord
));
502 m_gbs
->Add( m_hideTxt
, POS(12,4) );
504 m_showBtn
= new wxButton(p
, GBS_SHOW_BTN
, _T("<-- Show it again"));
505 m_gbs
->Add(m_showBtn
, POS(12, 5));
506 m_showBtn
->Disable();
508 m_gbs
->Add(10,10, POS(14,0));
510 m_gbs
->AddGrowableRow(3);
511 m_gbs
->AddGrowableCol(2);
513 p
->SetSizerAndFit(m_gbs
);
514 SetClientSize(p
->GetSize());
518 void MyGridBagSizerFrame::OnHideBtn(wxCommandEvent
&)
520 m_gbs
->Hide(m_hideTxt
);
521 m_hideBtn
->Disable();
526 void MyGridBagSizerFrame::OnShowBtn(wxCommandEvent
&)
528 m_gbs
->Show(m_hideTxt
);
530 m_showBtn
->Disable();
535 void MyGridBagSizerFrame::OnMoveBtn(wxCommandEvent
& event
)
537 wxButton
* btn
= (wxButton
*)event
.GetEventObject();
538 wxGBPosition curPos
= m_gbs
->GetItemPosition(btn
);
540 // if it's already at the "other" spot then move it back
541 if (curPos
== wxGBPosition(3,6))
543 m_gbs
->SetItemPosition(btn
, m_lastPos
);
544 btn
->SetLabel(_T("Move this to (3,6)"));
548 if ( m_gbs
->CheckForIntersection(wxGBPosition(3,6), wxGBSpan(1,1)) )
550 _T("wxGridBagSizer will not allow items to be in the same cell as\n\
551 another item, so this operation will fail. You will also get an assert\n\
552 when compiled in debug mode."), _T("Warning"), wxOK
| wxICON_INFORMATION
);
554 if ( m_gbs
->SetItemPosition(btn
, wxGBPosition(3,6)) )
557 btn
->SetLabel(_T("Move it back"));
563 // ----------------------------------------------------------------------------
564 // MySimpleSizerFrame
565 // ----------------------------------------------------------------------------
573 BEGIN_EVENT_TABLE(MySimpleSizerFrame
, wxFrame
)
574 EVT_MENU( ID_SET_SMALL
, MySimpleSizerFrame::OnSetSmallSize
)
575 EVT_MENU( ID_SET_BIG
, MySimpleSizerFrame::OnSetBigSize
)
578 MySimpleSizerFrame::MySimpleSizerFrame(const wxChar
*title
, int x
, int y
)
579 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
581 wxMenu
*menu
= new wxMenu
;
583 menu
->Append(ID_SET_SMALL
, _T("Make text control small\tF4"));
584 menu
->Append(ID_SET_BIG
, _T("Make text control big\tF5"));
586 wxMenuBar
*menu_bar
= new wxMenuBar
;
587 menu_bar
->Append(menu
, _T("&File"));
589 SetMenuBar( menu_bar
);
591 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxHORIZONTAL
);
593 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
594 main_sizer
->Add( m_target
, 1, wxALL
, 5 );
596 main_sizer
->Add( new wxStaticText( this, wxID_ANY
, wxT("Set alternating sizes using F4 and F5") ), 0, wxALL
, 5 );
598 SetSizer( main_sizer
);
601 GetSizer()->Fit( this );
604 void MySimpleSizerFrame::OnSetSmallSize( wxCommandEvent
& WXUNUSED(event
))
606 GetSizer()->SetItemMinSize( m_target
, 40, -1 );
608 GetSizer()->Fit( this );
611 void MySimpleSizerFrame::OnSetBigSize( wxCommandEvent
& WXUNUSED(event
))
613 GetSizer()->SetItemMinSize( m_target
, 140, -1 );
615 GetSizer()->Fit( this );
619 // ----------------------------------------------------------------------------
620 // MyNestedSizerFrame
621 // ----------------------------------------------------------------------------
624 MyNestedSizerFrame::MyNestedSizerFrame(const wxChar
*title
, int x
, int y
)
625 : wxFrame( NULL
, wxID_ANY
, title
, wxPoint(x
, y
) )
627 wxMenu
*menu
= new wxMenu
;
629 menu
->Append(wxID_ABOUT
, _T("Do nothing"));
631 wxMenuBar
*menu_bar
= new wxMenuBar
;
632 menu_bar
->Append(menu
, _T("&File"));
634 SetMenuBar( menu_bar
);
636 wxBoxSizer
*main_sizer
= new wxBoxSizer( wxVERTICAL
);
638 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
639 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
640 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
641 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
643 wxPanel
*panel
= new wxPanel( this, -1, wxDefaultPosition
, wxDefaultSize
,
644 wxTAB_TRAVERSAL
| wxSUNKEN_BORDER
);
645 main_sizer
->Add( panel
, 0, wxALIGN_CENTER
);
646 wxBoxSizer
*panel_sizer
= new wxBoxSizer( wxVERTICAL
);
647 panel
->SetSizer( panel_sizer
);
648 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
649 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
650 panel_sizer
->Add( new wxStaticText( panel
, -1, wxT("Hello inside") ) );
652 main_sizer
->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER
);
654 m_target
= new wxTextCtrl( this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
, wxSize( 80, wxDefaultCoord
) );
655 main_sizer
->Add( m_target
, 1, wxALL
|wxGROW
, 5 );
657 SetSizer( main_sizer
);
660 GetSizer()->Fit( this );
661 GetSizer()->SetSizeHints( this );