]> git.saurik.com Git - wxWidgets.git/blame - samples/notebook/notebook.cpp
1.
[wxWidgets.git] / samples / notebook / notebook.cpp
CommitLineData
0b4d4194 1/////////////////////////////////////////////////////////////////////////////
c1dfe277
JS
2// Name: samples/notebook/notebook.cpp
3// Purpose: a sample demonstrating notebook usage
0b4d4194 4// Author: Julian Smart
c1dfe277 5// Modified by: Dimitri Schoolwerth
0b4d4194
JS
6// Created: 26/10/98
7// RCS-ID: $Id$
c1dfe277
JS
8// Copyright: (c) 1998-2002 wxWindows team
9// License: wxWindows license
0b4d4194
JS
10/////////////////////////////////////////////////////////////////////////////
11
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
15#ifdef __BORLANDC__
d22699b5 16 #pragma hdrstop
0b4d4194
JS
17#endif
18
19#ifndef WX_PRECOMP
d22699b5 20 #include "wx/wx.h"
0b4d4194
JS
21#endif
22
c1dfe277
JS
23#include "wx/imaglist.h"
24#include "wx/artprov.h"
b2f757f9 25#include "notebook.h"
0b4d4194 26
0b4d4194
JS
27IMPLEMENT_APP(MyApp)
28
477350ce 29bool MyApp::OnInit()
0b4d4194 30{
c1dfe277
JS
31 // Create the main window
32 MyFrame *frame = new MyFrame( wxT("Notebook sample") );
33
34 // Problem with generic wxNotebook implementation whereby it doesn't size
35 // properly unless you set the size again
37d403aa 36#if defined(__WIN16__) || defined(__WXMOTIF__)
c1dfe277
JS
37 int width, height;
38 frame->GetSize(& width, & height);
39 frame->SetSize(-1, -1, width, height);
5dcf05ae
JS
40#endif
41
c1dfe277
JS
42 frame->Show();
43
44 return TRUE;
0b4d4194
JS
45}
46
c1dfe277
JS
47MyNotebook::MyNotebook(wxWindow *parent, wxWindowID id,
48 const wxPoint& pos, const wxSize& size, long style)
49 : wxNotebook(parent, id, pos, size, style)
0b4d4194 50{
c1dfe277 51 // Empty
0b4d4194
JS
52}
53
76645ab3 54wxPanel *MyNotebook::CreatePage(const wxString&pageName)
c1dfe277 55{
76645ab3
VZ
56 if
57 (
58 pageName.Contains(INSERTED_PAGE_NAME)
59 || pageName.Contains(ADDED_PAGE_NAME)
60 )
61 {
62 return CreateUserCreatedPage();
63 }
d22699b5 64
76645ab3
VZ
65 if (pageName == I_WAS_INSERTED_PAGE_NAME)
66 {
67 return CreateInsertPage();
68 }
c1dfe277 69
76645ab3
VZ
70 if (pageName == VETO_PAGE_NAME)
71 {
72 return CreateVetoPage();
73 }
c1dfe277 74
76645ab3
VZ
75 if (pageName == RADIOBUTTONS_PAGE_NAME)
76 {
77 return CreateRadioButtonsPage();
78 }
c1dfe277 79
c1dfe277 80
76645ab3
VZ
81 if (pageName == MAXIMIZED_BUTTON_PAGE_NAME)
82 {
83 return CreateBigButtonPage();
84 }
c1dfe277 85
76645ab3 86 wxFAIL;
c1dfe277 87
76645ab3
VZ
88 return (wxPanel *) NULL;
89}
90
91wxPanel *MyNotebook::CreateUserCreatedPage()
92{
93 wxPanel *panel = new wxPanel(this);
94
95 (void) new wxButton( panel, -1, wxT("Button"),
96 wxPoint(10, 10), wxSize(-1, -1) );
97
98 return panel;
99}
100
101wxPanel *MyNotebook::CreateRadioButtonsPage()
102{
103 wxPanel *panel = new wxPanel(this);
c1dfe277
JS
104
105 wxString animals[] = { wxT("Fox"), wxT("Hare"), wxT("Rabbit"),
106 wxT("Sabre-toothed tiger"), wxT("T Rex") };
76645ab3 107
c1dfe277
JS
108 wxRadioBox *radiobox1 = new wxRadioBox(panel, -1, wxT("Choose one"),
109 wxDefaultPosition, wxDefaultSize, 5, animals, 2, wxRA_SPECIFY_ROWS);
110
111 wxString computers[] = { wxT("Amiga"), wxT("Commodore 64"), wxT("PET"),
112 wxT("Another") };
76645ab3 113
c1dfe277
JS
114 wxRadioBox *radiobox2 = new wxRadioBox(panel, -1,
115 wxT("Choose your favourite"), wxDefaultPosition, wxDefaultSize,
116 4, computers, 0, wxRA_SPECIFY_COLS);
0b4d4194 117
76645ab3 118 wxBoxSizer *sizerPanel = new wxBoxSizer(wxVERTICAL);
c1dfe277
JS
119 sizerPanel->Add(radiobox1, 2, wxEXPAND);
120 sizerPanel->Add(radiobox2, 1, wxEXPAND);
121 panel->SetSizer(sizerPanel);
122
76645ab3
VZ
123 return panel;
124}
c1dfe277 125
76645ab3
VZ
126wxPanel *MyNotebook::CreateVetoPage()
127{
128 wxPanel *panel = new wxPanel(this);
c1dfe277 129
c1dfe277
JS
130 (void) new wxStaticText( panel, -1,
131 wxT("This page intentionally left blank"), wxPoint(10, 10) );
c1dfe277 132
76645ab3
VZ
133 return panel;
134}
135
136wxPanel *MyNotebook::CreateBigButtonPage()
137{
138 wxPanel *panel = new wxPanel(this);
c1dfe277 139
76645ab3 140 wxButton *buttonBig = new wxButton( panel, -1, wxT("Maximized button"),
c1dfe277
JS
141 wxPoint(0, 0), wxSize(480, 360) );
142
76645ab3 143 wxBoxSizer *sizerPanel = new wxBoxSizer(wxVERTICAL);
c1dfe277
JS
144 sizerPanel->Add(buttonBig, 1, wxEXPAND);
145 panel->SetSizer(sizerPanel);
146
76645ab3
VZ
147 return panel;
148}
149
c1dfe277 150
76645ab3
VZ
151wxPanel *MyNotebook::CreateInsertPage()
152{
153 wxPanel *panel = new wxPanel(this);
c1dfe277 154
c1dfe277
JS
155 panel->SetBackgroundColour( wxColour( wxT("MAROON") ) );
156 (void) new wxStaticText( panel, -1,
157 wxT("This page has been inserted, not added."), wxPoint(10, 10) );
c1dfe277 158
76645ab3
VZ
159 return panel;
160}
161
162void MyNotebook::CreateInitialPages()
163{
76645ab3
VZ
164 // Create and add some panels to the notebook
165
dacaa6f1 166 wxPanel *panel = CreateRadioButtonsPage();
76645ab3
VZ
167 AddPage( panel, RADIOBUTTONS_PAGE_NAME, FALSE, GetIconIndex() );
168
169 panel = CreateVetoPage();
170 AddPage( panel, VETO_PAGE_NAME, FALSE, GetIconIndex() );
c1dfe277 171
76645ab3
VZ
172 panel = CreateBigButtonPage();
173 AddPage( panel, MAXIMIZED_BUTTON_PAGE_NAME, FALSE, GetIconIndex() );
c1dfe277 174
76645ab3
VZ
175 panel = CreateInsertPage();
176 InsertPage( 0, panel, I_WAS_INSERTED_PAGE_NAME, FALSE, GetIconIndex() );
177
178
179 SetSelection(1);
c1dfe277
JS
180}
181
182int MyNotebook::GetIconIndex() const
0b4d4194 183{
c1dfe277
JS
184 if (m_imageList)
185 {
186 int nImages = m_imageList->GetImageCount();
187 if (nImages > 0)
188 {
189 return GetPageCount() % nImages;
190 }
191 }
192
193 return -1;
0b4d4194
JS
194}
195
c1dfe277
JS
196MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,
197 long style)
198 : wxFrame((wxWindow *) NULL, -1, title, pos, size, style)
0b4d4194 199{
c1dfe277
JS
200 m_panel = (wxPanel *) NULL;
201 m_notebook = (MyNotebook *) NULL;
76645ab3
VZ
202
203 // create a dummy image list with a few icons
204 wxSize imageSize(32, 32);
205
206 m_imageList
207 = new wxImageList( imageSize.GetWidth(), imageSize.GetHeight() );
208
209 m_imageList->Add
210 (
211 wxArtProvider::GetIcon(wxART_INFORMATION, wxART_OTHER, imageSize)
212 );
213
214 m_imageList->Add
215 (
216 wxArtProvider::GetIcon(wxART_QUESTION, wxART_OTHER, imageSize)
217 );
218
219 m_imageList->Add
220 (
221 wxArtProvider::GetIcon(wxART_WARNING, wxART_OTHER, imageSize)
222 );
223
224 m_imageList->Add
225 (
226 wxArtProvider::GetIcon(wxART_ERROR, wxART_OTHER, imageSize)
227 );
c1dfe277
JS
228
229 m_panel = new wxPanel(this, -1, wxDefaultPosition, wxDefaultSize,
c02e5a31 230 wxTAB_TRAVERSAL | wxCLIP_CHILDREN | wxNO_BORDER | wxNO_FULL_REPAINT_ON_RESIZE);
c1dfe277
JS
231
232 // Create remaining controls
233
234 // must be in sync with Orient enum
235 wxString strOrientations[] =
236 {
237 wxT("&Top"),
238 wxT("&Bottom"),
239 wxT("&Left"),
240 wxT("&Right"),
241 };
242
243 wxASSERT_MSG( WXSIZEOF(strOrientations) == ORIENT_MAX,
76645ab3 244 wxT("Forgot to update something") );
c1dfe277
JS
245
246 m_radioOrient = new wxRadioBox
247 (
248 m_panel, ID_RADIO_ORIENT,
249 wxT("&Tab orientation"),
250 wxDefaultPosition, wxDefaultSize,
251 WXSIZEOF(strOrientations), strOrientations,
252 1, wxRA_SPECIFY_COLS
253 );
254
255 m_chkShowImages = new wxCheckBox( m_panel, ID_CHK_SHOWIMAGES,
256 wxT("&Show images") );
257
258 m_btnAddPage = new wxButton( m_panel, ID_BTN_ADD_PAGE, wxT("&Add page") );
259
260 m_btnInsertPage = new wxButton( m_panel, ID_BTN_INSERT_PAGE,
261 wxT("&Insert page") );
262
3957448a
VZ
263 m_btnDeleteCurPage = new wxButton( m_panel, ID_BTN_DELETE_CUR_PAGE,
264 wxT("&Delete current page") );
265
266 m_btnDeleteLastPage = new wxButton( m_panel, ID_BTN_DELETE_LAST_PAGE,
267 wxT("Delete las&t page") );
c1dfe277
JS
268
269 m_btnNextPage = new wxButton( m_panel, ID_BTN_NEXT_PAGE,
270 wxT("&Next page") );
271
272 m_btnExit = new wxButton( m_panel, wxID_OK, wxT("&Exit") );
273 m_btnExit->SetDefault();
274
c1dfe277
JS
275 m_text = new wxTextCtrl(m_panel, -1, wxEmptyString,
276 wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY);
277
278 m_logTargetOld = wxLog::SetActiveTarget( new wxLogTextCtrl(m_text) );
279
c1dfe277
JS
280 // Set sizers
281 m_sizerFrame = new wxBoxSizer(wxVERTICAL);
282
283 m_sizerTop = new wxBoxSizer(wxHORIZONTAL);
284
285 wxBoxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL);
286 {
287 sizerLeft->Add(m_radioOrient, 0, wxEXPAND);
288 sizerLeft->Add(m_chkShowImages, 0, wxEXPAND | wxTOP, 4);
289
290 sizerLeft->Add(0, 0, 1); // Spacer
291
292 sizerLeft->Add(m_btnAddPage, 0, wxEXPAND | (wxTOP | wxBOTTOM), 4);
293 sizerLeft->Add(m_btnInsertPage, 0, wxEXPAND | (wxTOP | wxBOTTOM), 4);
3957448a
VZ
294 sizerLeft->Add(m_btnDeleteCurPage, 0, wxEXPAND | (wxTOP | wxBOTTOM), 4);
295 sizerLeft->Add(m_btnDeleteLastPage, 0, wxEXPAND | (wxTOP | wxBOTTOM), 4);
c1dfe277
JS
296 sizerLeft->Add(m_btnNextPage, 0, wxEXPAND | (wxTOP | wxBOTTOM), 4);
297
298 sizerLeft->Add(0, 0, 1); // Spacer
299
300 sizerLeft->Add(m_btnExit, 0, wxEXPAND);
301 }
302
303 m_sizerTop->Add(sizerLeft, 0, wxEXPAND | wxALL, 4);
304
305
306 m_sizerFrame->Add(m_sizerTop, 1, wxEXPAND);
307 m_sizerFrame->Add(m_text, 0, wxEXPAND);
308
309 ReInitNotebook();
53071032 310 m_notebook->CreateInitialPages();
c1dfe277
JS
311
312 m_panel->SetSizer(m_sizerFrame);
313
314 m_panel->SetAutoLayout(TRUE);
315
316 m_sizerFrame->Fit(this);
317
318 Centre(wxBOTH);
319
0b4d4194
JS
320}
321
c1dfe277 322MyFrame::~MyFrame()
0b4d4194 323{
c1dfe277 324 delete wxLog::SetActiveTarget(m_logTargetOld);
76645ab3
VZ
325
326 if (m_imageList)
327 {
328 delete m_imageList;
329 m_imageList = (wxImageList *) NULL;
330 }
331
0b4d4194
JS
332}
333
c1dfe277 334void MyFrame::ReInitNotebook()
0b4d4194 335{
c1dfe277 336 int flags;
0b4d4194 337
c1dfe277
JS
338 switch ( m_radioOrient->GetSelection() )
339 {
340 default:
341 wxFAIL_MSG( wxT("unknown notebook orientation") );
342 // fall through
0b4d4194 343
c1dfe277
JS
344 case ORIENT_TOP:
345 flags = wxNB_TOP;
346 break;
0b4d4194 347
c1dfe277
JS
348 case ORIENT_BOTTOM:
349 flags = wxNB_BOTTOM;
350 break;
0b4d4194 351
c1dfe277
JS
352 case ORIENT_LEFT:
353 flags = wxNB_LEFT;
354 break;
0b4d4194 355
c1dfe277
JS
356 case ORIENT_RIGHT:
357 flags = wxNB_RIGHT;
358 break;
359 }
360
361 MyNotebook *notebook = m_notebook;
362
c1dfe277
JS
363 m_notebook = new MyNotebook(m_panel, ID_NOTEBOOK,
364 wxDefaultPosition, wxDefaultSize,
c02e5a31 365 flags|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE);
c1dfe277 366
76645ab3
VZ
367 if ( m_chkShowImages->IsChecked() )
368 {
369 m_notebook->SetImageList(m_imageList);
370 }
c1dfe277 371
76645ab3 372 if (notebook)
c1dfe277
JS
373 {
374 int sel = notebook->GetSelection();
375
376 int count = notebook->GetPageCount();
76645ab3 377 for (int n = 0; n < count; n++)
c1dfe277 378 {
76645ab3 379 wxString str = notebook->GetPageText(n);
c1dfe277 380
4e62c3fd 381 wxWindow *page = m_notebook->CreatePage(str);
76645ab3 382 m_notebook->AddPage(page, str, FALSE, m_notebook->GetIconIndex() );
c1dfe277
JS
383 }
384
385 if (m_sizerNotebook)
386 {
387 m_sizerTop->Remove(m_sizerNotebook);
388 }
389
390 delete notebook;
391
392 // restore selection
76645ab3 393 if (sel != -1)
c1dfe277
JS
394 {
395 m_notebook->SetSelection(sel);
396 }
76645ab3 397
c1dfe277
JS
398 }
399
76645ab3 400
4e62c3fd 401 m_sizerNotebook = new wxBookCtrlSizer(m_notebook);
c1dfe277
JS
402 m_sizerTop->Add(m_sizerNotebook, 1, wxEXPAND | wxALL, 4);
403 m_sizerTop->Layout();
404}
405
0b4d4194 406BEGIN_EVENT_TABLE(MyFrame, wxFrame)
c1dfe277
JS
407 EVT_RADIOBOX(ID_RADIO_ORIENT, MyFrame::OnCheckOrRadioBox)
408 EVT_CHECKBOX(ID_CHK_SHOWIMAGES, MyFrame::OnCheckOrRadioBox)
409
410 EVT_BUTTON(ID_BTN_ADD_PAGE, MyFrame::OnButtonAddPage)
411 EVT_BUTTON(ID_BTN_INSERT_PAGE, MyFrame::OnButtonInsertPage)
3957448a
VZ
412 EVT_BUTTON(ID_BTN_DELETE_CUR_PAGE, MyFrame::OnButtonDeleteCurPage)
413 EVT_BUTTON(ID_BTN_DELETE_LAST_PAGE, MyFrame::OnButtonDeleteLastPage)
c1dfe277
JS
414 EVT_BUTTON(ID_BTN_NEXT_PAGE, MyFrame::OnButtonNextPage)
415 EVT_BUTTON(wxID_OK, MyFrame::OnButtonExit)
416
3957448a
VZ
417 EVT_UPDATE_UI(ID_BTN_DELETE_CUR_PAGE, MyFrame::OnUpdateUIBtnDeleteCurPage)
418 EVT_UPDATE_UI(ID_BTN_DELETE_LAST_PAGE, MyFrame::OnUpdateUIBtnDeleteLastPage)
419
c1dfe277
JS
420 EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, MyFrame::OnNotebook)
421 EVT_NOTEBOOK_PAGE_CHANGING(ID_NOTEBOOK, MyFrame::OnNotebook)
422
96d37807 423 EVT_IDLE(MyFrame::OnIdle)
0b4d4194
JS
424END_EVENT_TABLE()
425
c02e5a31 426void MyFrame::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
0b4d4194 427{
c1dfe277 428 ReInitNotebook();
0b4d4194
JS
429}
430
c1dfe277 431void MyFrame::OnButtonAddPage( wxCommandEvent& WXUNUSED(event) )
326f9654 432{
53071032 433 static unsigned s_pageAdded = 0;
477350ce
VZ
434
435 wxPanel *panel = new wxPanel( m_notebook, -1 );
85b43fbf 436 (void) new wxButton( panel, -1, wxT("First button"),
c1dfe277 437 wxPoint(10, 10), wxSize(-1, -1) );
2b5f62a0
VZ
438 (void) new wxButton( panel, -1, wxT("Second button"),
439 wxPoint(50, 100), wxSize(-1, -1) );
477350ce 440
76645ab3 441 m_notebook->AddPage(panel, wxString::Format(ADDED_PAGE_NAME wxT("%u"),
2b5f62a0 442 ++s_pageAdded), TRUE, m_notebook->GetIconIndex() );
477350ce
VZ
443}
444
c1dfe277 445void MyFrame::OnButtonInsertPage( wxCommandEvent& WXUNUSED(event) )
477350ce 446{
53071032 447 static unsigned s_pageIns = 0;
477350ce 448
76645ab3 449 wxPanel *panel = m_notebook->CreateUserCreatedPage();
c1dfe277
JS
450
451 m_notebook->InsertPage( 0, panel,
76645ab3 452 wxString::Format(INSERTED_PAGE_NAME wxT("%u"), ++s_pageIns), FALSE,
c1dfe277 453 m_notebook->GetIconIndex() );
477350ce 454
477350ce 455 m_notebook->SetSelection(0);
326f9654
RR
456}
457
3957448a
VZ
458void MyFrame::OnButtonDeleteLastPage( wxCommandEvent& WXUNUSED(event) )
459{
460 int page = m_notebook->GetPageCount();
461
462 if ( page != 0 )
463 {
464 m_notebook->DeletePage(page - 1);
465 }
466}
467
468void MyFrame::OnButtonDeleteCurPage( wxCommandEvent& WXUNUSED(event) )
29f538ce 469{
c1dfe277 470 int sel = m_notebook->GetSelection();
f6bcfd97 471
c1dfe277 472 if (sel != -1)
f6bcfd97 473 {
c1dfe277 474 m_notebook->DeletePage(sel);
f6bcfd97 475 }
29f538ce
RR
476}
477
c1dfe277 478void MyFrame::OnButtonNextPage( wxCommandEvent& WXUNUSED(event) )
33d0e17c
RR
479{
480 m_notebook->AdvanceSelection();
481}
482
c1dfe277 483void MyFrame::OnButtonExit( wxCommandEvent& WXUNUSED(event) )
0b4d4194 484{
c1dfe277 485 Close();
0b4d4194
JS
486}
487
c1dfe277 488void MyFrame::OnNotebook(wxNotebookEvent& event)
0b4d4194 489{
c1dfe277 490 wxString str = wxT("Unknown notebook event");
d22699b5 491
c1dfe277 492 wxEventType eventType = event.GetEventType();
0b4d4194 493
c1dfe277
JS
494 if (eventType == wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
495 {
496 str = wxT("Notebook changed");
497 }
498 else if (eventType == wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
499 {
500 int idx = event.GetOldSelection();
501 if ( idx != -1 && m_notebook->GetPageText(idx) == VETO_PAGE_NAME )
502 {
503 if
504 (
505 wxMessageBox(
506 wxT("Are you sure you want to leave this notebook page?\n")
507 wxT("(This demonstrates veto-ing)"),
508 wxT("Notebook sample"),
509 wxICON_QUESTION | wxYES_NO, this) != wxYES )
510 {
511 event.Veto();
512
513 return;
514 }
515
516 }
517
518 str = wxT("Notebook changing");
519 }
0b4d4194 520
c1dfe277 521 static int s_numNotebookEvents = 0;
0b4d4194 522
c1dfe277 523 wxLogMessage(wxT("Notebook event #%d: %s (%d)"),
44e1a03f 524 s_numNotebookEvents++, str.c_str(), eventType);
0b4d4194 525
c1dfe277 526 m_text->SetInsertionPointEnd();
0b4d4194 527
c1dfe277 528 event.Skip();
0b4d4194
JS
529}
530
c1dfe277 531void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
96d37807
VZ
532{
533 static int s_nPages = -1;
534 static int s_nSel = -1;
535
536 int nPages = m_notebook->GetPageCount();
537 int nSel = m_notebook->GetSelection();
538 if ( nPages != s_nPages || nSel != s_nSel )
539 {
540 s_nPages = nPages;
541 s_nSel = nSel;
542
543 wxString title;
c1dfe277 544 title.Printf(wxT("Notebook (%d pages, selection: %d)"), nPages, nSel);
96d37807
VZ
545
546 SetTitle(title);
547 }
548}
3957448a
VZ
549
550void MyFrame::OnUpdateUIBtnDeleteCurPage(wxUpdateUIEvent& event)
551{
552 event.Enable( m_notebook->GetSelection() != -1 );
553}
554
555void MyFrame::OnUpdateUIBtnDeleteLastPage(wxUpdateUIEvent& event)
556{
557 event.Enable( m_notebook->GetPageCount() != 0 );
558}