]> git.saurik.com Git - wxWidgets.git/blame - samples/layout/layout.cpp
no real changes; just cosmetic
[wxWidgets.git] / samples / layout / layout.cpp
CommitLineData
c801d85f
KB
1/////////////////////////////////////////////////////////////////////////////
2// Name: layout.cpp
3// Purpose: Layout sample
4// Author: Julian Smart
7235f8e1 5// Modified by: Robin Dunn, Vadim Zeitlin
c801d85f
KB
6// Created: 04/01/98
7// RCS-ID: $Id$
7235f8e1
VZ
8// Copyright: (c) 1998 Julian Smart
9// 2005 Vadim Zeitlin
2f6c54eb 10// Licence: wxWindows license
c801d85f
KB
11/////////////////////////////////////////////////////////////////////////////
12
9e023db7
VZ
13// ----------------------------------------------------------------------------
14// headers
15// ----------------------------------------------------------------------------
16
c801d85f
KB
17// For compilers that support precompilation, includes "wx/wx.h".
18#include "wx/wxprec.h"
19
20#ifdef __BORLANDC__
21#pragma hdrstop
22#endif
23
24#ifndef WX_PRECOMP
25#include "wx/wx.h"
26#endif
27
c62ac5b6 28#include "wx/sizer.h"
20b35a69 29#include "wx/gbsizer.h"
61d514bb 30#include "wx/statline.h"
83edc0a5 31#include "wx/notebook.h"
7235f8e1 32#include "wx/spinctrl.h"
73d1f52b 33#include "wx/wrapsizer.h"
c62ac5b6 34
c801d85f
KB
35#include "layout.h"
36
9e023db7
VZ
37// ----------------------------------------------------------------------------
38// MyApp
39// ----------------------------------------------------------------------------
c801d85f
KB
40
41IMPLEMENT_APP(MyApp)
42
83edc0a5 43bool MyApp::OnInit()
c801d85f 44{
45e6e6f8
VZ
45 if ( !wxApp::OnInit() )
46 return false;
47
c801d85f 48 // Create the main frame window
9e023db7
VZ
49 MyFrame *frame = new MyFrame;
50
9230b621 51 frame->Show(true);
9e023db7 52
9230b621 53 return true;
9e023db7
VZ
54}
55
56// ----------------------------------------------------------------------------
57// MyFrame
58// ----------------------------------------------------------------------------
c801d85f 59
9e023db7
VZ
60BEGIN_EVENT_TABLE(MyFrame, wxFrame)
61 EVT_MENU(LAYOUT_ABOUT, MyFrame::OnAbout)
62 EVT_MENU(LAYOUT_QUIT, MyFrame::OnQuit)
c801d85f 63
7235f8e1 64 EVT_MENU(LAYOUT_TEST_PROPORTIONS, MyFrame::TestProportions)
9e023db7
VZ
65 EVT_MENU(LAYOUT_TEST_SIZER, MyFrame::TestFlexSizers)
66 EVT_MENU(LAYOUT_TEST_NB_SIZER, MyFrame::TestNotebookSizers)
925e9792 67 EVT_MENU(LAYOUT_TEST_GB_SIZER, MyFrame::TestGridBagSizer)
92c0c172 68 EVT_MENU(LAYOUT_TEST_SET_MINIMAL, MyFrame::TestSetMinimal)
a1a3bffc 69 EVT_MENU(LAYOUT_TEST_NESTED, MyFrame::TestNested)
15f7c305 70 EVT_MENU(LAYOUT_TEST_WRAP, MyFrame::TestWrap)
9e023db7 71END_EVENT_TABLE()
c801d85f 72
9e023db7
VZ
73// Define my frame constructor
74MyFrame::MyFrame()
be5a51fb 75 : wxFrame(NULL, wxID_ANY, _T("wxWidgets Layout Demo"),
e2512c23 76 wxPoint(30,30), wxDefaultSize,
9e023db7
VZ
77 wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE)
78{
c801d85f
KB
79 // Make a menubar
80 wxMenu *file_menu = new wxMenu;
81
7235f8e1
VZ
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 &notebook sizers...\tF3"));
85 file_menu->Append(LAYOUT_TEST_GB_SIZER, _T("Test &gridbag sizer...\tF4"));
92c0c172 86 file_menu->Append(LAYOUT_TEST_SET_MINIMAL, _T("Test Set&ItemMinSize...\tF5"));
a1a3bffc 87 file_menu->Append(LAYOUT_TEST_NESTED, _T("Test nested sizer in a wxPanel...\tF6"));
e2512c23 88 file_menu->Append(LAYOUT_TEST_WRAP, _T("Test wrap sizers...\tF7"));
c801d85f
KB
89
90 file_menu->AppendSeparator();
9e023db7 91 file_menu->Append(LAYOUT_QUIT, _T("E&xit"), _T("Quit program"));
c801d85f
KB
92
93 wxMenu *help_menu = new wxMenu;
7235f8e1 94 help_menu->Append(LAYOUT_ABOUT, _T("&About"), _T("About layout demo..."));
c801d85f 95
9e023db7 96 wxMenuBar *menu_bar = new wxMenuBar;
c801d85f 97
42ed7532
MB
98 menu_bar->Append(file_menu, _T("&File"));
99 menu_bar->Append(help_menu, _T("&Help"));
c801d85f
KB
100
101 // Associate the menu bar with the frame
9e023db7
VZ
102 SetMenuBar(menu_bar);
103
8520f137 104#if wxUSE_STATUSBAR
9e023db7 105 CreateStatusBar(2);
be5a51fb 106 SetStatusText(_T("wxWidgets layout demo"));
8520f137 107#endif // wxUSE_STATUSBAR
9e023db7 108
6bbb8a8d
WS
109 wxPanel* p = new wxPanel(this, wxID_ANY);
110
9e023db7
VZ
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.
114
115 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
116
117 // 1) top: create wxStaticText with minimum size equal to its default size
118 topsizer->Add(
bdbb07ed 119 new wxStaticText( p, wxID_ANY, _T("An explanation (wxALIGN_RIGHT).") ),
e5544e77 120 wxSizerFlags().Align(wxALIGN_RIGHT).Border(wxALL & ~wxBOTTOM, 5));
e2512c23
RR
121 topsizer->Add(
122 new wxStaticText( p, wxID_ANY, _T("An explanation (wxALIGN_LEFT).") ),
123 wxSizerFlags().Align(wxALIGN_LEFT).Border(wxALL & ~wxBOTTOM, 5));
124 topsizer->Add(
125 new wxStaticText( p, wxID_ANY, _T("An explanation (wxALIGN_CENTRE_HORIZONTAL).") ),
126 wxSizerFlags().Align(wxALIGN_CENTRE_HORIZONTAL).Border(wxALL & ~wxBOTTOM, 5));
9e023db7
VZ
127
128 // 2) top: create wxTextCtrl with minimum size (100x60)
129 topsizer->Add(
bdbb07ed 130 new wxTextCtrl( p, wxID_ANY, _T("My text (wxEXPAND)."), wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE),
e5544e77 131 wxSizerFlags(1).Expand().Border(wxALL, 5));
9e023db7
VZ
132
133 // 2.5) Gratuitous test of wxStaticBoxSizers
134 wxBoxSizer *statsizer = new wxStaticBoxSizer(
bdbb07ed 135 new wxStaticBox(p, wxID_ANY, _T("A wxStaticBoxSizer")), wxVERTICAL );
9e023db7 136 statsizer->Add(
bdbb07ed 137 new wxStaticText(p, wxID_ANY, _T("And some TEXT inside it")),
e2512c23 138 wxSizerFlags().Border(wxALL, 30));
e5544e77
VZ
139 topsizer->Add(
140 statsizer,
141 wxSizerFlags(1).Expand().Border(wxALL, 10));
9e023db7
VZ
142
143 // 2.7) And a test of wxGridSizer
144 wxGridSizer *gridsizer = new wxGridSizer(2, 5, 5);
bdbb07ed 145 gridsizer->Add(new wxStaticText(p, wxID_ANY, _T("Label")),
e5544e77 146 wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));
bdbb07ed 147 gridsizer->Add(new wxTextCtrl(p, wxID_ANY, _T("Grid sizer demo")),
e5544e77 148 wxSizerFlags(1).Align(wxGROW | wxALIGN_CENTER_VERTICAL));
bdbb07ed 149 gridsizer->Add(new wxStaticText(p, wxID_ANY, _T("Another label")),
e5544e77 150 wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));
bdbb07ed 151 gridsizer->Add(new wxTextCtrl(p, wxID_ANY, _T("More text")),
e5544e77 152 wxSizerFlags(1).Align(wxGROW | wxALIGN_CENTER_VERTICAL));
bdbb07ed 153 gridsizer->Add(new wxStaticText(p, wxID_ANY, _T("Final label")),
e5544e77 154 wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));
bdbb07ed 155 gridsizer->Add(new wxTextCtrl(p, wxID_ANY, _T("And yet more text")),
e5544e77
VZ
156 wxSizerFlags().Align(wxGROW | wxALIGN_CENTER_VERTICAL));
157 topsizer->Add(
158 gridsizer,
159 wxSizerFlags().Proportion(1).Expand().Border(wxALL, 10));
9e023db7
VZ
160
161
4aa0bd9b 162#if wxUSE_STATLINE
9e023db7
VZ
163 // 3) middle: create wxStaticLine with minimum size (3x3)
164 topsizer->Add(
bdbb07ed 165 new wxStaticLine( p, wxID_ANY, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL),
e5544e77 166 wxSizerFlags().Expand());
4aa0bd9b 167#endif // wxUSE_STATLINE
9e023db7
VZ
168
169
170 // 4) bottom: create two centred wxButtons
171 wxBoxSizer *button_box = new wxBoxSizer( wxHORIZONTAL );
172 button_box->Add(
bdbb07ed 173 new wxButton( p, wxID_ANY, _T("Two buttons in a box") ),
e5544e77 174 wxSizerFlags().Border(wxALL, 7));
9e023db7 175 button_box->Add(
bdbb07ed 176 new wxButton( p, wxID_ANY, _T("(wxCENTER)") ),
e5544e77 177 wxSizerFlags().Border(wxALL, 7));
9e023db7 178
e5544e77 179 topsizer->Add(button_box, wxSizerFlags().Center());
9e023db7 180
bdbb07ed 181 p->SetSizer( topsizer );
6bbb8a8d 182
9e023db7
VZ
183 // don't allow frame to get smaller than what the sizers tell it and also set
184 // the initial size as calculated by the sizers
185 topsizer->SetSizeHints( this );
9e023db7
VZ
186}
187
7235f8e1 188void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
9e023db7 189{
9230b621 190 Close(true);
9e023db7
VZ
191}
192
7235f8e1
VZ
193void MyFrame::TestProportions(wxCommandEvent& WXUNUSED(event))
194{
195 (new MyProportionsFrame(this))->Show();
196}
197
9e023db7
VZ
198void MyFrame::TestFlexSizers(wxCommandEvent& WXUNUSED(event) )
199{
200 MyFlexSizerFrame *newFrame = new MyFlexSizerFrame(_T("Flex Sizer Test Frame"), 50, 50);
9230b621 201 newFrame->Show(true);
9e023db7
VZ
202}
203
204void MyFrame::TestNotebookSizers(wxCommandEvent& WXUNUSED(event) )
205{
206 MySizerDialog dialog( this, _T("Notebook Sizer Test Dialog") );
207
208 dialog.ShowModal();
209}
210
92c0c172
RR
211void MyFrame::TestSetMinimal(wxCommandEvent& WXUNUSED(event) )
212{
213 MySimpleSizerFrame *newFrame = new MySimpleSizerFrame(_T("Simple Sizer Test Frame"), 50, 50);
214 newFrame->Show(true);
215}
216
a1a3bffc
RR
217void MyFrame::TestNested(wxCommandEvent& WXUNUSED(event) )
218{
219 MyNestedSizerFrame *newFrame = new MyNestedSizerFrame(_T("Nested Sizer Test Frame"), 50, 50);
220 newFrame->Show(true);
221}
222
15f7c305
RR
223void MyFrame::TestWrap(wxCommandEvent& WXUNUSED(event) )
224{
225 MyWrapSizerFrame *newFrame = new MyWrapSizerFrame(_T("Wrap Sizer Test Frame"), 50, 50);
226 newFrame->Show(true);
227}
228
c801d85f 229
9e023db7
VZ
230void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
231{
be5a51fb 232 (void)wxMessageBox(_T("wxWidgets GUI library layout demo\n"),
9e023db7
VZ
233 _T("About Layout Demo"), wxOK|wxICON_INFORMATION);
234}
235
20b35a69
RD
236void MyFrame::TestGridBagSizer(wxCommandEvent& WXUNUSED(event) )
237{
238 MyGridBagSizerFrame *newFrame = new
239 MyGridBagSizerFrame(_T("wxGridBagSizer Test Frame"), 50, 50);
9230b621 240 newFrame->Show(true);
20b35a69
RD
241}
242
7235f8e1
VZ
243// ----------------------------------------------------------------------------
244// MyProportionsFrame
245// ----------------------------------------------------------------------------
246
247MyProportionsFrame::MyProportionsFrame(wxFrame *parent)
248 : wxFrame(parent, wxID_ANY, _T("Box Sizer Proportions Demo"))
249{
250 size_t n;
251
252 // create the controls
253 wxPanel *panel = new wxPanel(this, wxID_ANY);
254 for ( n = 0; n < WXSIZEOF(m_spins); n++ )
255 {
256 m_spins[n] = new wxSpinCtrl(panel);
257 m_spins[n]->SetValue(n);
258 }
259
260 // lay them out
261 m_sizer = new wxStaticBoxSizer(wxHORIZONTAL, panel,
262 _T("Try changing elements proportions and resizing the window"));
263 for ( n = 0; n < WXSIZEOF(m_spins); n++ )
264 m_sizer->Add(m_spins[n], wxSizerFlags().Border());
265
266 // put everything together
267 panel->SetSizer(m_sizer);
268 wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
269 sizerTop->Add(panel, wxSizerFlags(1).Expand().Border());
270 UpdateProportions();
271 SetSizerAndFit(sizerTop);
272
273 // and connect the events
274 Connect(wxEVT_COMMAND_TEXT_UPDATED,
275 wxCommandEventHandler(MyProportionsFrame::OnProportionUpdated));
276 Connect(wxEVT_COMMAND_SPINCTRL_UPDATED,
277 wxSpinEventHandler(MyProportionsFrame::OnProportionChanged));
278}
279
280void MyProportionsFrame::UpdateProportions()
281{
282 for ( size_t n = 0; n < WXSIZEOF(m_spins); n++ )
283 {
284 m_sizer->GetItem(n)->SetProportion(m_spins[n]->GetValue());
285 }
286
287 m_sizer->Layout();
288}
289
290void MyProportionsFrame::OnProportionUpdated(wxCommandEvent& WXUNUSED(event))
291{
292 UpdateProportions();
293}
294
295void MyProportionsFrame::OnProportionChanged(wxSpinEvent& WXUNUSED(event))
296{
297 UpdateProportions();
298}
20b35a69 299
9e023db7
VZ
300// ----------------------------------------------------------------------------
301// MyFlexSizerFrame
302// ----------------------------------------------------------------------------
c62ac5b6 303
bdbb07ed 304void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer *sizer, wxWindow* parent)
c801d85f 305{
9e023db7
VZ
306 for ( int i = 0; i < 3; i++ )
307 {
308 for ( int j = 0; j < 3; j++ )
309 {
310 sizer->Add(new wxStaticText
311 (
bdbb07ed 312 parent,
9230b621 313 wxID_ANY,
9e023db7
VZ
314 wxString::Format(_T("(%d, %d)"), i + 1, j + 1),
315 wxDefaultPosition,
316 wxDefaultSize,
317 wxALIGN_CENTER
318 ),
319 0, wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 3);
320 }
321 }
c801d85f
KB
322}
323
15f7c305 324MyFlexSizerFrame::MyFlexSizerFrame(const wxString &title, int x, int y )
9230b621 325 : wxFrame(NULL, wxID_ANY, title, wxPoint(x, y) )
c801d85f 326{
9e023db7 327 wxFlexGridSizer *sizerFlex;
6bbb8a8d 328 wxPanel* p = new wxPanel(this, wxID_ANY);
9e023db7
VZ
329
330 // consttuct the first column
331 wxSizer *sizerCol1 = new wxBoxSizer(wxVERTICAL);
bdbb07ed 332 sizerCol1->Add(new wxStaticText(p, wxID_ANY, _T("Ungrowable:")), 0, wxCENTER | wxTOP, 20);
9e023db7 333 sizerFlex = new wxFlexGridSizer(3, 3);
bdbb07ed 334 InitFlexSizer(sizerFlex, p);
9e023db7
VZ
335 sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
336
bdbb07ed 337 sizerCol1->Add(new wxStaticText(p, wxID_ANY, _T("Growable middle column:")), 0, wxCENTER | wxTOP, 20);
9e023db7 338 sizerFlex = new wxFlexGridSizer(3, 3);
bdbb07ed 339 InitFlexSizer(sizerFlex, p);
9e023db7
VZ
340 sizerFlex->AddGrowableCol(1);
341 sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
342
bdbb07ed 343 sizerCol1->Add(new wxStaticText(p, wxID_ANY, _T("Growable middle row:")), 0, wxCENTER | wxTOP, 20);
9e023db7 344 sizerFlex = new wxFlexGridSizer(3, 3);
bdbb07ed 345 InitFlexSizer(sizerFlex, p);
9e023db7
VZ
346 sizerFlex->AddGrowableRow(1);
347 sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
348
bdbb07ed 349 sizerCol1->Add(new wxStaticText(p, wxID_ANY, _T("All growable columns:")), 0, wxCENTER | wxTOP, 20);
9e023db7 350 sizerFlex = new wxFlexGridSizer(3, 3);
bdbb07ed 351 InitFlexSizer(sizerFlex, p);
9e023db7
VZ
352 sizerFlex->AddGrowableCol(0, 1);
353 sizerFlex->AddGrowableCol(1, 2);
354 sizerFlex->AddGrowableCol(2, 3);
355 sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
356
357 // the second one
358 wxSizer *sizerCol2 = new wxBoxSizer(wxVERTICAL);
bdbb07ed 359 sizerCol2->Add(new wxStaticText(p, wxID_ANY, _T("Growable middle row and column:")), 0, wxCENTER | wxTOP, 20);
9e023db7 360 sizerFlex = new wxFlexGridSizer(3, 3);
bdbb07ed 361 InitFlexSizer(sizerFlex, p);
9e023db7
VZ
362 sizerFlex->AddGrowableCol(1);
363 sizerFlex->AddGrowableRow(1);
364 sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
365
bdbb07ed 366 sizerCol2->Add(new wxStaticText(p, wxID_ANY, _T("Same with horz flex direction")), 0, wxCENTER | wxTOP, 20);
9e023db7 367 sizerFlex = new wxFlexGridSizer(3, 3);
bdbb07ed 368 InitFlexSizer(sizerFlex, p);
9e023db7
VZ
369 sizerFlex->AddGrowableCol(1);
370 sizerFlex->AddGrowableRow(1);
371 sizerFlex->SetFlexibleDirection(wxHORIZONTAL);
372 sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
373
bdbb07ed 374 sizerCol2->Add(new wxStaticText(p, wxID_ANY, _T("Same with grow mode == \"none\"")), 0, wxCENTER | wxTOP, 20);
9e023db7 375 sizerFlex = new wxFlexGridSizer(3, 3);
bdbb07ed 376 InitFlexSizer(sizerFlex, p);
9e023db7
VZ
377 sizerFlex->AddGrowableCol(1);
378 sizerFlex->AddGrowableRow(1);
379 sizerFlex->SetFlexibleDirection(wxHORIZONTAL);
380 sizerFlex->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_NONE);
381 sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
382
bdbb07ed 383 sizerCol2->Add(new wxStaticText(p, wxID_ANY, _T("Same with grow mode == \"all\"")), 0, wxCENTER | wxTOP, 20);
9e023db7 384 sizerFlex = new wxFlexGridSizer(3, 3);
bdbb07ed 385 InitFlexSizer(sizerFlex, p);
9e023db7
VZ
386 sizerFlex->AddGrowableCol(1);
387 sizerFlex->AddGrowableRow(1);
388 sizerFlex->SetFlexibleDirection(wxHORIZONTAL);
389 sizerFlex->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_ALL);
390 sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10);
391
392 // add both columns to grid sizer
393 wxGridSizer *sizerTop = new wxGridSizer(2, 0, 20);
394 sizerTop->Add(sizerCol1, 1, wxEXPAND);
395 sizerTop->Add(sizerCol2, 1, wxEXPAND);
396
bdbb07ed 397 p->SetSizer(sizerTop);
9e023db7 398 sizerTop->SetSizeHints(this);
c801d85f
KB
399}
400
9e023db7
VZ
401// ----------------------------------------------------------------------------
402// MySizerDialog
403// ----------------------------------------------------------------------------
c801d85f 404
15f7c305 405MySizerDialog::MySizerDialog(wxWindow *parent, const wxString &title)
9230b621 406 : wxDialog(parent, wxID_ANY, wxString(title))
83edc0a5 407{
83edc0a5
RR
408 // Begin with first hierarchy: a notebook at the top and
409 // and OK button at the bottom.
410
411 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
56ac3e75 412
9230b621 413 wxNotebook *notebook = new wxNotebook( this, wxID_ANY );
adbf2d73 414 topsizer->Add( notebook, 1, wxGROW );
56ac3e75 415
9e023db7 416 wxButton *button = new wxButton( this, wxID_OK, _T("OK") );
83edc0a5
RR
417 topsizer->Add( button, 0, wxALIGN_RIGHT | wxALL, 10 );
418
419 // First page: one big text ctrl
9230b621 420 wxTextCtrl *multi = new wxTextCtrl( notebook, wxID_ANY, _T("TextCtrl."), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
42ed7532 421 notebook->AddPage( multi, _T("Page One") );
56ac3e75 422
83edc0a5 423 // Second page: a text ctrl and a button
9230b621 424 wxPanel *panel = new wxPanel( notebook, wxID_ANY );
42ed7532 425 notebook->AddPage( panel, _T("Page Two") );
56ac3e75 426
f6bcfd97 427 wxSizer *panelsizer = new wxBoxSizer( wxVERTICAL );
56ac3e75 428
6bbb8a8d 429 wxTextCtrl *text = new wxTextCtrl( panel, wxID_ANY, _T("TextLine 1."), wxDefaultPosition, wxSize(250,wxDefaultCoord) );
83edc0a5 430 panelsizer->Add( text, 0, wxGROW|wxALL, 30 );
6bbb8a8d 431 text = new wxTextCtrl( panel, wxID_ANY, _T("TextLine 2."), wxDefaultPosition, wxSize(250,wxDefaultCoord) );
83edc0a5 432 panelsizer->Add( text, 0, wxGROW|wxALL, 30 );
9230b621 433 wxButton *button2 = new wxButton( panel, wxID_ANY, _T("Hallo") );
83edc0a5 434 panelsizer->Add( button2, 0, wxALIGN_RIGHT | wxLEFT|wxRIGHT|wxBOTTOM, 30 );
56ac3e75 435
83edc0a5 436 panel->SetSizer( panelsizer );
56ac3e75 437
83edc0a5 438 // Tell dialog to use sizer
92c01615 439 SetSizerAndFit( topsizer );
c62ac5b6
RR
440}
441
20b35a69
RD
442// ----------------------------------------------------------------------------
443// MyGridBagSizerFrame
444// ----------------------------------------------------------------------------
445
446// some simple macros to help make the sample code below more clear
9230b621
VS
447#define TEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text))
448#define MLTEXTCTRL(text) new wxTextCtrl(p, wxID_ANY, _T(text), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE)
20b35a69
RD
449#define POS(r, c) wxGBPosition(r,c)
450#define SPAN(r, c) wxGBSpan(r,c)
451
fbfb8bcc 452const wxChar gbsDescription[] =_T("\
77c5e923
RD
453The wxGridBagSizer is similar to the wxFlexGridSizer except the items are explicitly positioned\n\
454in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this\n\
455static text is positioned at (0,0) and it spans 7 columns.");
20b35a69
RD
456
457
458// Some IDs
459enum {
460 GBS_HIDE_BTN = 1212,
461 GBS_SHOW_BTN,
462 GBS_MOVE_BTN1,
463 GBS_MOVE_BTN2,
925e9792 464
004f4002 465 GBS_MAX
20b35a69
RD
466};
467
468
469BEGIN_EVENT_TABLE(MyGridBagSizerFrame, wxFrame)
470 EVT_BUTTON( GBS_HIDE_BTN, MyGridBagSizerFrame::OnHideBtn)
471 EVT_BUTTON( GBS_SHOW_BTN, MyGridBagSizerFrame::OnShowBtn)
472 EVT_BUTTON( GBS_MOVE_BTN1, MyGridBagSizerFrame::OnMoveBtn)
473 EVT_BUTTON( GBS_MOVE_BTN2, MyGridBagSizerFrame::OnMoveBtn)
474END_EVENT_TABLE()
475
476
15f7c305 477MyGridBagSizerFrame::MyGridBagSizerFrame(const wxString &title, int x, int y )
9230b621 478 : wxFrame( NULL, wxID_ANY, title, wxPoint(x, y) )
20b35a69 479{
9230b621 480 wxPanel* p = new wxPanel(this, wxID_ANY);
20b35a69
RD
481 m_panel = p;
482 m_gbs = new wxGridBagSizer();
483
925e9792 484
9230b621 485 m_gbs->Add( new wxStaticText(p, wxID_ANY, gbsDescription),
77c5e923
RD
486 POS(0,0), SPAN(1, 7),
487 wxALIGN_CENTER | wxALL, 5);
925e9792 488
20b35a69
RD
489 m_gbs->Add( TEXTCTRL("pos(1,0)"), POS(1,0) );
490 m_gbs->Add( TEXTCTRL("pos(1,1)"), POS(1,1) );
491 m_gbs->Add( TEXTCTRL("pos(2,0)"), POS(2,0) );
492 m_gbs->Add( TEXTCTRL("pos(2,1)"), POS(2,1) );
493 m_gbs->Add( MLTEXTCTRL("pos(3,2), span(1,2)\nthis row and col are growable"),
494 POS(3,2), SPAN(1,2), wxEXPAND );
495 m_gbs->Add( MLTEXTCTRL("pos(4,3)\nspan(3,1)"),
496 POS(4,3), SPAN(3,1), wxEXPAND );
497 m_gbs->Add( TEXTCTRL("pos(5,4)"), POS(5,4), wxDefaultSpan, wxEXPAND );
498 m_gbs->Add( TEXTCTRL("pos(6,5)"), POS(6,5), wxDefaultSpan, wxEXPAND );
499 m_gbs->Add( TEXTCTRL("pos(7,6)"), POS(7,6) );
925e9792 500
20b35a69
RD
501 //m_gbs->Add( TEXTCTRL("bad position"), POS(4,3) ); // Test for assert
502 //m_gbs->Add( TEXTCTRL("bad position"), POS(5,3) ); // Test for assert
503
504
77c5e923
RD
505 m_moveBtn1 = new wxButton(p, GBS_MOVE_BTN1, _T("Move this to (3,6)"));
506 m_moveBtn2 = new wxButton(p, GBS_MOVE_BTN2, _T("Move this to (3,6)"));
20b35a69
RD
507 m_gbs->Add( m_moveBtn1, POS(10,2) );
508 m_gbs->Add( m_moveBtn2, POS(10,3) );
925e9792 509
77c5e923 510 m_hideBtn = new wxButton(p, GBS_HIDE_BTN, _T("Hide this item -->"));
20b35a69
RD
511 m_gbs->Add(m_hideBtn, POS(12, 3));
512
6bbb8a8d
WS
513 m_hideTxt = new wxTextCtrl(p, wxID_ANY, _T("pos(12,4), size(150, wxDefaultCoord)"),
514 wxDefaultPosition, wxSize(150,wxDefaultCoord));
20b35a69 515 m_gbs->Add( m_hideTxt, POS(12,4) );
925e9792 516
77c5e923 517 m_showBtn = new wxButton(p, GBS_SHOW_BTN, _T("<-- Show it again"));
20b35a69
RD
518 m_gbs->Add(m_showBtn, POS(12, 5));
519 m_showBtn->Disable();
520
521 m_gbs->Add(10,10, POS(14,0));
925e9792 522
20b35a69
RD
523 m_gbs->AddGrowableRow(3);
524 m_gbs->AddGrowableCol(2);
925e9792 525
20b35a69
RD
526 p->SetSizerAndFit(m_gbs);
527 SetClientSize(p->GetSize());
528}
529
925e9792 530
20b35a69
RD
531void MyGridBagSizerFrame::OnHideBtn(wxCommandEvent&)
532{
533 m_gbs->Hide(m_hideTxt);
534 m_hideBtn->Disable();
535 m_showBtn->Enable();
536 m_gbs->Layout();
537}
538
539void MyGridBagSizerFrame::OnShowBtn(wxCommandEvent&)
540{
541 m_gbs->Show(m_hideTxt);
542 m_hideBtn->Enable();
543 m_showBtn->Disable();
544 m_gbs->Layout();
545}
546
547
548void MyGridBagSizerFrame::OnMoveBtn(wxCommandEvent& event)
549{
550 wxButton* btn = (wxButton*)event.GetEventObject();
551 wxGBPosition curPos = m_gbs->GetItemPosition(btn);
552
553 // if it's already at the "other" spot then move it back
554 if (curPos == wxGBPosition(3,6))
555 {
556 m_gbs->SetItemPosition(btn, m_lastPos);
77c5e923 557 btn->SetLabel(_T("Move this to (3,6)"));
20b35a69 558 }
925e9792 559 else
20b35a69 560 {
77c5e923
RD
561 if ( m_gbs->CheckForIntersection(wxGBPosition(3,6), wxGBSpan(1,1)) )
562 wxMessageBox(
563_T("wxGridBagSizer will not allow items to be in the same cell as\n\
564another item, so this operation will fail. You will also get an assert\n\
565when compiled in debug mode."), _T("Warning"), wxOK | wxICON_INFORMATION);
925e9792 566
77c5e923
RD
567 if ( m_gbs->SetItemPosition(btn, wxGBPosition(3,6)) )
568 {
569 m_lastPos = curPos;
570 btn->SetLabel(_T("Move it back"));
571 }
20b35a69
RD
572 }
573 m_gbs->Layout();
574}
92c0c172
RR
575
576// ----------------------------------------------------------------------------
577// MySimpleSizerFrame
578// ----------------------------------------------------------------------------
579
580// Some IDs
581enum {
582 ID_SET_SMALL = 1300,
583 ID_SET_BIG
584};
585
586BEGIN_EVENT_TABLE(MySimpleSizerFrame, wxFrame)
587 EVT_MENU( ID_SET_SMALL, MySimpleSizerFrame::OnSetSmallSize)
588 EVT_MENU( ID_SET_BIG, MySimpleSizerFrame::OnSetBigSize)
589END_EVENT_TABLE()
590
15f7c305 591MySimpleSizerFrame::MySimpleSizerFrame(const wxString &title, int x, int y )
92c0c172
RR
592 : wxFrame( NULL, wxID_ANY, title, wxPoint(x, y) )
593{
594 wxMenu *menu = new wxMenu;
6bbb8a8d 595
92c0c172
RR
596 menu->Append(ID_SET_SMALL, _T("Make text control small\tF4"));
597 menu->Append(ID_SET_BIG, _T("Make text control big\tF5"));
6bbb8a8d 598
92c0c172
RR
599 wxMenuBar *menu_bar = new wxMenuBar;
600 menu_bar->Append(menu, _T("&File"));
601
602 SetMenuBar( menu_bar );
603
604 wxBoxSizer *main_sizer = new wxBoxSizer( wxHORIZONTAL );
605
6bbb8a8d 606 m_target = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80, wxDefaultCoord ) );
92c0c172 607 main_sizer->Add( m_target, 1, wxALL, 5 );
6bbb8a8d
WS
608
609 main_sizer->Add( new wxStaticText( this, wxID_ANY, wxT("Set alternating sizes using F4 and F5") ), 0, wxALL, 5 );
610
92c0c172 611 SetSizer( main_sizer);
6bbb8a8d 612
92c0c172
RR
613 Layout();
614 GetSizer()->Fit( this );
615}
616
6bbb8a8d 617void MySimpleSizerFrame::OnSetSmallSize( wxCommandEvent& WXUNUSED(event))
92c0c172
RR
618{
619 GetSizer()->SetItemMinSize( m_target, 40, -1 );
620 Layout();
621 GetSizer()->Fit( this );
622}
623
6bbb8a8d 624void MySimpleSizerFrame::OnSetBigSize( wxCommandEvent& WXUNUSED(event))
92c0c172
RR
625{
626 GetSizer()->SetItemMinSize( m_target, 140, -1 );
627 Layout();
628 GetSizer()->Fit( this );
629}
630
631
a1a3bffc
RR
632// ----------------------------------------------------------------------------
633// MyNestedSizerFrame
634// ----------------------------------------------------------------------------
635
636
15f7c305 637MyNestedSizerFrame::MyNestedSizerFrame(const wxString &title, int x, int y )
a1a3bffc
RR
638 : wxFrame( NULL, wxID_ANY, title, wxPoint(x, y) )
639{
640 wxMenu *menu = new wxMenu;
641
642 menu->Append(wxID_ABOUT, _T("Do nothing"));
643
644 wxMenuBar *menu_bar = new wxMenuBar;
645 menu_bar->Append(menu, _T("&File"));
646
647 SetMenuBar( menu_bar );
648
649 wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
650
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 );
654 main_sizer->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER );
655
656 wxPanel *panel = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize,
657 wxTAB_TRAVERSAL | wxSUNKEN_BORDER );
658 main_sizer->Add( panel, 0, wxALIGN_CENTER );
659 wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
660 panel->SetSizer( panel_sizer );
661 panel_sizer->Add( new wxStaticText( panel, -1, wxT("Hello inside") ) );
662 panel_sizer->Add( new wxStaticText( panel, -1, wxT("Hello inside") ) );
663 panel_sizer->Add( new wxStaticText( panel, -1, wxT("Hello inside") ) );
664
665 main_sizer->Add( new wxStaticText( this, -1, wxT("Hello outside") ), 0, wxALIGN_CENTER );
666
667 m_target = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80, wxDefaultCoord ) );
668 main_sizer->Add( m_target, 1, wxALL|wxGROW, 5 );
669
92c01615 670 SetSizerAndFit( main_sizer);
a1a3bffc
RR
671}
672
15f7c305
RR
673
674// ----------------------------------------------------------------------------
675// MyWrapSizerFrame
676// ----------------------------------------------------------------------------
677
678
679MyWrapSizerFrame::MyWrapSizerFrame(const wxString &title, int x, int y )
e2512c23 680 : wxFrame( NULL, wxID_ANY, title, wxPoint(x, y), wxSize(200,-1) )
15f7c305
RR
681{
682 wxMenu *menu = new wxMenu;
683
684 menu->Append(wxID_ABOUT, "Do nothing");
685
686 wxMenuBar *menu_bar = new wxMenuBar;
687 menu_bar->Append(menu, "&File");
688
689 SetMenuBar( menu_bar );
690
691 wxBoxSizer *root = new wxBoxSizer( wxVERTICAL );
692
e2512c23
RR
693#if 0
694 wxSizer *row = new wxWrapSizer;
695 int i;
696 for (i = 0; i < 4; i++)
697 row->Add( new wxButton( this, -1, "Hello" ), 0, wxALL, 10 );
698 root->Add( row, 0, wxGROW );
699
700 row = new wxWrapSizer;
701 for (i = 0; i < 4; i++)
702 row->Add( new wxButton( this, -1, "Hello" ) );
703 root->Add( row, 0, wxGROW );
704
705#else
15f7c305
RR
706 // A number of checkboxes inside a wrap sizer
707 wxSizer *ps_mid = new wxStaticBoxSizer( wxVERTICAL, this, "Wrapping check-boxes" );
708 wxSizer *ps_mid_wrap = new wxWrapSizer(wxHORIZONTAL);
709 ps_mid->Add( ps_mid_wrap, 100, wxEXPAND );
710 for( int ix=0; ix<6; ix++ )
e2512c23 711 ps_mid_wrap->Add( new wxCheckBox(this,wxID_ANY,wxString::Format("Option %d",ix+1)), 0, wxALIGN_CENTRE|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
15f7c305
RR
712 root->Add( ps_mid, 0, wxEXPAND | wxALL, 5 );
713
714 // A shaped item inside a box sizer
715 wxSizer *ps_bottom = new wxStaticBoxSizer( wxVERTICAL, this, "With wxSHAPED item" );
716 wxSizer *ps_bottom_box = new wxBoxSizer(wxHORIZONTAL);
717 ps_bottom->Add( ps_bottom_box, 100, wxEXPAND );
718 ps_bottom_box->Add( new wxListBox(this,wxID_ANY,wxPoint(0,0),wxSize(70,70)), 0, wxEXPAND|wxSHAPED );
719 ps_bottom_box->Add( 10,10 );
720 ps_bottom_box->Add( new wxCheckBox(this,wxID_ANY,"A much longer option..."), 100, 0, 5 );
721
722 root->Add( ps_bottom, 1, wxEXPAND | wxALL, 5 );
e2512c23 723#endif
15f7c305
RR
724
725 // Set sizer for window
92c01615 726 SetSizerAndFit( root );
15f7c305
RR
727}
728