]> git.saurik.com Git - wxWidgets.git/blame_incremental - samples/layout/layout.cpp
fixed typo in wxString::swap() which was completely broken
[wxWidgets.git] / samples / layout / layout.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: layout.cpp
3// Purpose: Layout sample
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart and Markus Holzem
9// Licence: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12// For compilers that support precompilation, includes "wx/wx.h".
13#include "wx/wxprec.h"
14
15#ifdef __BORLANDC__
16#pragma hdrstop
17#endif
18
19#ifndef WX_PRECOMP
20#include "wx/wx.h"
21#endif
22
23#if !wxUSE_CONSTRAINTS
24#error You must set wxUSE_CONSTRAINTS to 1 in setup.h!
25#endif
26
27#include <ctype.h>
28
29#include "wx/sizer.h"
30#include "wx/statline.h"
31#include "wx/notebook.h"
32
33#include "layout.h"
34
35// Declare two frames
36MyFrame *frame = (MyFrame *) NULL;
37wxMenuBar *menu_bar = (wxMenuBar *) NULL;
38
39IMPLEMENT_APP(MyApp)
40
41MyApp::MyApp()
42{
43}
44
45bool MyApp::OnInit()
46{
47 // Create the main frame window
48 frame = new MyFrame((MyFrame *) NULL, (char *) "wxWindows Layout Demo", 0, 0, 550, 500);
49
50 frame->SetAutoLayout(TRUE);
51
52 // Give it a status line
53 frame->CreateStatusBar(2);
54
55 // Make a menubar
56 wxMenu *file_menu = new wxMenu;
57
58 file_menu->Append(LAYOUT_LOAD_FILE, "&Load file", "Load a text file");
59 file_menu->Append(LAYOUT_TEST_SIZER, "&Test sizers", "Test sizer");
60 file_menu->Append(LAYOUT_TEST_NB, "&Test notebook sizers", "Test notebook sizer");
61
62 file_menu->AppendSeparator();
63 file_menu->Append(LAYOUT_QUIT, "E&xit", "Quit program");
64
65 wxMenu *help_menu = new wxMenu;
66 help_menu->Append(LAYOUT_ABOUT, "&About", "About layout demo");
67
68 menu_bar = new wxMenuBar;
69
70 menu_bar->Append(file_menu, "&File");
71 menu_bar->Append(help_menu, "&Help");
72
73 // Associate the menu bar with the frame
74 frame->SetMenuBar(menu_bar);
75
76 // Make a panel
77 frame->panel = new wxPanel(frame, 0, 0, 1000, 500, wxTAB_TRAVERSAL);
78 frame->panel->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
79// frame->panel->SetAutoLayout(TRUE);
80
81 // Create some panel items
82 wxButton *btn1 = new wxButton(frame->panel, -1, "A button (1)") ;
83
84 wxLayoutConstraints *b1 = new wxLayoutConstraints;
85 b1->centreX.SameAs (frame->panel, wxCentreX);
86 b1->top.SameAs (frame->panel, wxTop, 5);
87 b1->width.PercentOf (frame->panel, wxWidth, 80);
88 b1->height.PercentOf (frame->panel, wxHeight, 10);
89 btn1->SetConstraints(b1);
90
91 wxListBox *list = new wxListBox(frame->panel, -1,
92 wxPoint(-1, -1), wxSize(200, 100));
93 list->Append("Apple");
94 list->Append("Pear");
95 list->Append("Orange");
96 list->Append("Banana");
97 list->Append("Fruit");
98
99 wxLayoutConstraints *b2 = new wxLayoutConstraints;
100 b2->top.Below (btn1, 5);
101 b2->left.SameAs (frame->panel, wxLeft, 5);
102 b2->width.PercentOf (frame->panel, wxWidth, 40);
103 b2->bottom.SameAs (frame->panel, wxBottom, 5);
104 list->SetConstraints(b2);
105
106 wxTextCtrl *mtext = new wxTextCtrl(frame->panel, -1, "Some text",
107 wxPoint(-1, -1), wxSize(150, 100));
108
109 wxLayoutConstraints *b3 = new wxLayoutConstraints;
110 b3->top.Below (btn1, 5);
111 b3->left.RightOf (list, 5);
112 b3->right.SameAs (frame->panel, wxRight, 5);
113 b3->bottom.SameAs (frame->panel, wxBottom, 5);
114 mtext->SetConstraints(b3);
115
116 frame->canvas = new MyWindow(frame, 0, 0, 400, 400, wxRETAINED);
117
118 // Give it scrollbars: the virtual canvas is 20 * 50 = 1000 pixels in each direction
119// canvas->SetScrollbars(20, 20, 50, 50, 4, 4);
120
121 // Make a text window
122 frame->text_window = new MyTextWindow(frame, 0, 250, 400, 250);
123
124 // Set constraints for panel subwindow
125 wxLayoutConstraints *c1 = new wxLayoutConstraints;
126
127 c1->left.SameAs (frame, wxLeft);
128 c1->top.SameAs (frame, wxTop);
129 c1->right.PercentOf (frame, wxWidth, 50);
130 c1->height.PercentOf (frame, wxHeight, 50);
131
132 frame->panel->SetConstraints(c1);
133
134 // Set constraints for canvas subwindow
135 wxLayoutConstraints *c2 = new wxLayoutConstraints;
136
137 c2->left.SameAs (frame->panel, wxRight);
138 c2->top.SameAs (frame, wxTop);
139 c2->right.SameAs (frame, wxRight);
140 c2->height.PercentOf (frame, wxHeight, 50);
141
142 frame->canvas->SetConstraints(c2);
143
144 // Set constraints for text subwindow
145 wxLayoutConstraints *c3 = new wxLayoutConstraints;
146 c3->left.SameAs (frame, wxLeft);
147 c3->top.Below (frame->panel);
148 c3->right.SameAs (frame, wxRight);
149 c3->bottom.SameAs (frame, wxBottom);
150
151 frame->text_window->SetConstraints(c3);
152
153 frame->Show(TRUE);
154
155 frame->SetStatusText("wxWindows layout demo");
156
157 SetTopWindow(frame);
158 return TRUE;
159}
160
161//-----------------------------------------------------------------
162// MyFrame
163//-----------------------------------------------------------------
164
165// Define my frame constructor
166MyFrame::MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h):
167 wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
168{
169 panel = (wxPanel *) NULL;
170 text_window = (MyTextWindow *) NULL;
171 canvas = (MyWindow *) NULL;
172}
173
174BEGIN_EVENT_TABLE(MyFrame, wxFrame)
175 EVT_MENU(LAYOUT_LOAD_FILE, MyFrame::LoadFile)
176 EVT_MENU(LAYOUT_QUIT, MyFrame::Quit)
177 EVT_MENU(LAYOUT_TEST_SIZER, MyFrame::TestSizers)
178 EVT_MENU(LAYOUT_TEST_NB, MyFrame::TestNotebookSizers)
179 EVT_MENU(LAYOUT_ABOUT, MyFrame::About)
180 EVT_SIZE(MyFrame::OnSize)
181END_EVENT_TABLE()
182
183void MyFrame::LoadFile(wxCommandEvent& WXUNUSED(event) )
184{
185 wxString s = wxFileSelector( _T("Load text file"), (const wxChar *) NULL,
186 (const wxChar *) NULL, (const wxChar *) NULL, _T("*.txt") );
187 if (s != "")
188 {
189#ifdef __WXMSW__
190 frame->text_window->LoadFile(s);
191#endif
192 }
193}
194
195void MyFrame::Quit(wxCommandEvent& WXUNUSED(event) )
196{
197 this->Close(TRUE);
198}
199
200void MyFrame::TestSizers(wxCommandEvent& WXUNUSED(event) )
201{
202 MySizerFrame *newFrame = new MySizerFrame((MyFrame *) NULL, "Sizer Test Frame", 50, 50 );
203 newFrame->Show(TRUE);
204}
205
206void MyFrame::TestNotebookSizers(wxCommandEvent& WXUNUSED(event) )
207{
208 wxDialog dialog( this, -1, wxString("Notebook Sizer Test Dialog") );
209
210 // Begin with first hierarchy: a notebook at the top and
211 // and OK button at the bottom.
212
213 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
214
215 wxNotebook *notebook = new wxNotebook( &dialog, -1 );
216 wxNotebookSizer *nbs = new wxNotebookSizer( notebook );
217 topsizer->Add( nbs, 1, wxGROW );
218
219 wxButton *button = new wxButton( &dialog, wxID_OK, "OK" );
220 topsizer->Add( button, 0, wxALIGN_RIGHT | wxALL, 10 );
221
222 // First page: one big text ctrl
223 wxTextCtrl *multi = new wxTextCtrl( notebook, -1, "TextCtrl.", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
224 notebook->AddPage( multi, "Page One" );
225
226 // Second page: a text ctrl and a button
227 wxPanel *panel = new wxPanel( notebook, -1 );
228 notebook->AddPage( panel, "Page Two" );
229
230 wxSizer *panelsizer = new wxBoxSizer( wxVERTICAL );
231
232 wxTextCtrl *text = new wxTextCtrl( panel, -1, "TextLine 1.", wxDefaultPosition, wxSize(250,-1) );
233 panelsizer->Add( text, 0, wxGROW|wxALL, 30 );
234 text = new wxTextCtrl( panel, -1, "TextLine 2.", wxDefaultPosition, wxSize(250,-1) );
235 panelsizer->Add( text, 0, wxGROW|wxALL, 30 );
236 wxButton *button2 = new wxButton( panel, -1, "Hallo" );
237 panelsizer->Add( button2, 0, wxALIGN_RIGHT | wxLEFT|wxRIGHT|wxBOTTOM, 30 );
238
239 panel->SetAutoLayout( TRUE );
240 panel->SetSizer( panelsizer );
241
242 // Tell dialog to use sizer
243
244 dialog.SetAutoLayout( TRUE );
245 dialog.SetSizer( topsizer );
246 topsizer->Fit( &dialog );
247 topsizer->SetSizeHints( &dialog );
248
249 dialog.ShowModal();
250}
251
252
253void MyFrame::About(wxCommandEvent& WXUNUSED(event) )
254{
255 (void)wxMessageBox("wxWindows GUI library layout demo\n",
256 "About Layout Demo", wxOK|wxCENTRE);
257}
258
259// Size the subwindows when the frame is resized
260void MyFrame::OnSize(wxSizeEvent& WXUNUSED(event) )
261{
262 Layout();
263}
264
265void MyFrame::Draw(wxDC& dc, bool WXUNUSED(draw_bitmaps) )
266{
267 dc.SetPen(* wxGREEN_PEN);
268 dc.DrawLine(0, 0, 200, 200);
269 dc.DrawLine(200, 0, 0, 200);
270
271 dc.SetBrush(* wxCYAN_BRUSH);
272 dc.SetPen(* wxRED_PEN);
273
274 dc.DrawRectangle(100, 100, 100, 50);
275 dc.DrawRoundedRectangle(150, 150, 100, 50, 20);
276
277 dc.DrawEllipse(250, 250, 100, 50);
278#if wxUSE_SPLINES
279 dc.DrawSpline(50, 200, 50, 100, 200, 10);
280#endif // wxUSE_SPLINES
281 dc.DrawLine(50, 230, 200, 230);
282
283 dc.SetPen(* wxBLACK_PEN);
284 dc.DrawArc(50, 300, 100, 250, 100, 300 );
285}
286
287//-----------------------------------------------------------------
288// MyWindow
289//-----------------------------------------------------------------
290
291BEGIN_EVENT_TABLE(MyWindow, wxWindow)
292 EVT_PAINT(MyWindow::OnPaint)
293END_EVENT_TABLE()
294
295// Define a constructor for my canvas
296MyWindow::MyWindow(wxFrame *frame, int x, int y, int w, int h, long style):
297 wxWindow(frame, -1, wxPoint(x, y), wxSize(w, h), style)
298{
299}
300
301MyWindow::~MyWindow()
302{
303}
304
305// Define the repainting behaviour
306void MyWindow::OnPaint(wxPaintEvent& WXUNUSED(event) )
307{
308 wxPaintDC dc(this);
309 frame->Draw(dc,TRUE);
310}
311
312//-----------------------------------------------------------------
313// MySizerFrame
314//-----------------------------------------------------------------
315
316MySizerFrame::MySizerFrame(wxFrame *frame, char *title, int x, int y ):
317 wxFrame(frame, -1, title, wxPoint(x, y) )
318{
319 // we want to get a dialog that is stretchable because it
320 // has a text ctrl in the middle. at the bottom, we have
321 // two buttons which.
322
323 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
324
325 // 1) top: create wxStaticText with minimum size equal to its default size
326 topsizer->Add(
327 new wxStaticText( this, -1, "An explanation (wxALIGN_RIGHT)." ),
328 0, // make vertically unstretchable
329 wxALIGN_RIGHT | // right align text
330 wxTOP | wxLEFT | wxRIGHT, // make border all around except wxBOTTOM
331 5 ); // set border width to 5
332
333 // 2) top: create wxTextCtrl with minimum size (100x60)
334 topsizer->Add(
335 new wxTextCtrl( this, -1, "My text (wxEXPAND).", wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE),
336 1, // make vertically stretchable
337 wxEXPAND | // make horizontally stretchable
338 wxALL, // and make border all around
339 5 ); // set border width to 5
340
341 // 2.5) Gratuitous test of wxStaticBoxSizers
342 wxBoxSizer *statsizer = new wxStaticBoxSizer(
343 new wxStaticBox(this, -1, "A wxStaticBoxSizer"),
344 wxVERTICAL );
345 statsizer->Add(
346 new wxStaticText(this, -1, "And some TEXT inside it"),
347 0,
348 wxCENTER |
349 wxALL,
350 30);
351 topsizer->Add(statsizer, 1, wxEXPAND | wxALL, 10);
352
353 // 2.7) And a test of wxGridSizer
354 wxGridSizer *gridsizer = new wxGridSizer(2, 5, 5);
355 gridsizer->Add(new wxStaticText(this, -1, "Label"), 0,
356 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
357 gridsizer->Add(new wxTextCtrl(this, -1, "Grid sizer demo"), 1,
358 wxGROW | wxALIGN_CENTER_VERTICAL);
359 gridsizer->Add(new wxStaticText(this, -1, "Another label"), 0,
360 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
361 gridsizer->Add(new wxTextCtrl(this, -1, "More text"), 1,
362 wxGROW | wxALIGN_CENTER_VERTICAL);
363 gridsizer->Add(new wxStaticText(this, -1, "Final label"), 0,
364 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
365 gridsizer->Add(new wxTextCtrl(this, -1, "And yet more text"), 1,
366 wxGROW | wxALIGN_CENTER_VERTICAL);
367 topsizer->Add(gridsizer, 1, wxGROW | wxALL, 10);
368
369
370 // 3) middle: create wxStaticLine with minimum size (3x3)
371 topsizer->Add(
372 new wxStaticLine( this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL),
373 0, // make vertically unstretchable
374 wxEXPAND | // make horizontally stretchable
375 wxALL, // and make border all around
376 5 ); // set border width to 5
377
378
379 // 4) bottom: create two centred wxButtons
380 wxBoxSizer *button_box = new wxBoxSizer( wxHORIZONTAL );
381 button_box->Add(
382 new wxButton( this, -1, "Two buttons in a box" ),
383 0, // make horizontally unstretchable
384 wxALL, // make border all around
385 7 ); // set border width to 7
386 button_box->Add(
387 new wxButton( this, -1, "(wxCENTER)" ),
388 0, // make horizontally unstretchable
389 wxALL, // make border all around
390 7 ); // set border width to 7
391
392 topsizer->Add(
393 button_box,
394 0, // make vertically unstretchable
395 wxCENTER ); // no border and centre horizontally
396
397 SetAutoLayout( TRUE );
398
399 // set frame to minimum size
400 topsizer->Fit( this );
401
402 // don't allow frame to get smaller than what the sizers tell ye
403 topsizer->SetSizeHints( this );
404
405 SetSizer( topsizer );
406}
407
408
409