Added wxTreebook:
[wxWidgets.git] / samples / notebook / notebook.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/notebook/notebook.cpp
3 // Purpose: a sample demonstrating notebook usage
4 // Author: Julian Smart
5 // Modified by: Dimitri Schoolwerth
6 // Created: 26/10/98
7 // RCS-ID: $Id$
8 // Copyright: (c) 1998-2002 wxWidgets team
9 // License: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "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 #include "wx/imaglist.h"
24 #include "wx/artprov.h"
25 #include "notebook.h"
26
27 #if !defined(__WXMSW__) && !defined(__WXPM__)
28 #include "../sample.xpm"
29 #endif
30
31 IMPLEMENT_APP(MyApp)
32
33 bool MyApp::OnInit()
34 {
35 // Create the main window
36 MyFrame *frame = new MyFrame();
37
38 // Problem with generic wxNotebook implementation whereby it doesn't size
39 // properly unless you set the size again
40 #if defined(__WXMOTIF__)
41 int width, height;
42 frame->GetSize(& width, & height);
43 frame->SetSize(wxDefaultCoord, wxDefaultCoord, width, height);
44 #endif
45
46 frame->Show();
47
48 return true;
49 }
50
51 wxPanel *CreateUserCreatedPage(wxBookCtrlBase *parent)
52 {
53 wxPanel *panel = new wxPanel(parent);
54
55 (void) new wxButton( panel, wxID_ANY, wxT("Button"),
56 wxPoint(10, 10), wxDefaultSize );
57
58 return panel;
59 }
60
61 wxPanel *CreateRadioButtonsPage(wxBookCtrlBase *parent)
62 {
63 wxPanel *panel = new wxPanel(parent);
64
65 wxString animals[] = { wxT("Fox"), wxT("Hare"), wxT("Rabbit"),
66 wxT("Sabre-toothed tiger"), wxT("T Rex") };
67
68 wxRadioBox *radiobox1 = new wxRadioBox(panel, wxID_ANY, wxT("Choose one"),
69 wxDefaultPosition, wxDefaultSize, 5, animals, 2, wxRA_SPECIFY_ROWS);
70
71 wxString computers[] = { wxT("Amiga"), wxT("Commodore 64"), wxT("PET"),
72 wxT("Another") };
73
74 wxRadioBox *radiobox2 = new wxRadioBox(panel, wxID_ANY,
75 wxT("Choose your favourite"), wxDefaultPosition, wxDefaultSize,
76 4, computers, 0, wxRA_SPECIFY_COLS);
77
78 wxBoxSizer *sizerPanel = new wxBoxSizer(wxVERTICAL);
79 sizerPanel->Add(radiobox1, 2, wxEXPAND);
80 sizerPanel->Add(radiobox2, 1, wxEXPAND);
81 panel->SetSizer(sizerPanel);
82
83 return panel;
84 }
85
86 wxPanel *CreateVetoPage(wxBookCtrlBase *parent)
87 {
88 wxPanel *panel = new wxPanel(parent);
89
90 (void) new wxStaticText( panel, wxID_ANY,
91 wxT("This page intentionally left blank"), wxPoint(10, 10) );
92
93 return panel;
94 }
95
96 wxPanel *CreateBigButtonPage(wxBookCtrlBase *parent)
97 {
98 wxPanel *panel = new wxPanel(parent);
99
100 wxButton *buttonBig = new wxButton(panel, wxID_ANY, wxT("Maximized button"));
101
102 wxBoxSizer *sizerPanel = new wxBoxSizer(wxVERTICAL);
103 sizerPanel->Add(buttonBig, 1, wxEXPAND);
104 panel->SetSizer(sizerPanel);
105
106 return panel;
107 }
108
109
110 wxPanel *CreateInsertPage(wxBookCtrlBase *parent)
111 {
112 wxPanel *panel = new wxPanel(parent);
113
114 panel->SetBackgroundColour( wxColour( wxT("MAROON") ) );
115 (void) new wxStaticText( panel, wxID_ANY,
116 wxT("This page has been inserted, not added."), wxPoint(10, 10) );
117
118 return panel;
119 }
120
121 int GetIconIndex(wxBookCtrlBase* bookCtrl)
122 {
123 if (bookCtrl && bookCtrl->GetImageList())
124 {
125 int nImages = bookCtrl->GetImageList()->GetImageCount();
126 if (nImages > 0)
127 {
128 return bookCtrl->GetPageCount() % nImages;
129 }
130 }
131
132 return -1;
133 }
134
135 void CreateInitialPages(wxBookCtrlBase *parent)
136 {
137 // Create and add some panels to the notebook
138
139 wxPanel *panel = CreateRadioButtonsPage(parent);
140 parent->AddPage( panel, RADIOBUTTONS_PAGE_NAME, false, GetIconIndex(parent) );
141
142 panel = CreateVetoPage(parent);
143 parent->AddPage( panel, VETO_PAGE_NAME, false, GetIconIndex(parent) );
144
145 panel = CreateBigButtonPage(parent);
146 parent->AddPage( panel, MAXIMIZED_BUTTON_PAGE_NAME, false, GetIconIndex(parent) );
147
148 panel = CreateInsertPage(parent);
149 parent->InsertPage( 0, panel, I_WAS_INSERTED_PAGE_NAME, false, GetIconIndex(parent) );
150
151 parent->SetSelection(1);
152 }
153
154 wxPanel *CreatePage(wxBookCtrlBase *parent, const wxString&pageName)
155 {
156 if ( pageName.Contains(INSERTED_PAGE_NAME) ||
157 pageName.Contains(ADDED_PAGE_NAME) ||
158 pageName.Contains(ADDED_SUB_PAGE_NAME) ||
159 pageName.Contains(ADDED_PAGE_NAME_BEFORE) )
160 return CreateUserCreatedPage(parent);
161
162 if ( pageName == I_WAS_INSERTED_PAGE_NAME )
163 return CreateInsertPage(parent);
164
165 if ( pageName == VETO_PAGE_NAME )
166 return CreateVetoPage(parent);
167
168 if ( pageName == RADIOBUTTONS_PAGE_NAME )
169 return CreateRadioButtonsPage(parent);
170
171 if ( pageName == MAXIMIZED_BUTTON_PAGE_NAME )
172 return CreateBigButtonPage(parent);
173
174 wxFAIL_MSG( _T("unknown page name") );
175
176 return NULL;
177 }
178
179 MyFrame::MyFrame()
180 : wxFrame(NULL, wxID_ANY, wxString(wxT("wxWidgets book controls sample")))
181 {
182 #if wxUSE_NOTEBOOK
183 m_type = Type_Notebook;
184 #elif wxUSE_CHOICEBOOK
185 m_type = Type_Choicebook;
186 #elif wxUSE_LISTBOOK
187 m_type = Type_Listbook;
188 #elif wxUSE_TREEBOOK
189 m_type = Type_Treebook;
190 #elif
191 #error "Don't use Notebook sample without any book enabled in wxWidgets build!"
192 #endif
193
194 m_orient = ID_ORIENT_DEFAULT;
195 m_chkShowImages = true;
196 m_multi = false;
197
198 SetIcon(wxICON(sample));
199
200 // menu of the sample
201 wxMenu *menuType = new wxMenu;
202 #if wxUSE_NOTEBOOK
203 menuType->AppendRadioItem(ID_BOOK_NOTEBOOK, wxT("&Notebook\tCtrl-1"));
204 #endif
205 #if wxUSE_LISTBOOK
206 menuType->AppendRadioItem(ID_BOOK_LISTBOOK, wxT("&Listbook\tCtrl-2"));
207 #endif
208 #if wxUSE_CHOICEBOOK
209 menuType->AppendRadioItem(ID_BOOK_CHOICEBOOK, wxT("&Choicebook\tCtrl-3"));
210 #endif
211 #if wxUSE_TREEBOOK
212 menuType->AppendRadioItem(ID_BOOK_TREEBOOK, wxT("&Treebook\tCtrl-4"));
213 #endif
214
215 menuType->Check(ID_BOOK_NOTEBOOK + m_type, true);
216
217 wxMenu *menuOrient = new wxMenu;
218 menuOrient->AppendRadioItem(ID_ORIENT_DEFAULT, wxT("&Default\tCtrl-5"));
219 menuOrient->AppendRadioItem(ID_ORIENT_TOP, wxT("&Top\tCtrl-6"));
220 menuOrient->AppendRadioItem(ID_ORIENT_BOTTOM, wxT("&Bottom\tCtrl-7"));
221 menuOrient->AppendRadioItem(ID_ORIENT_LEFT, wxT("&Left\tCtrl-8"));
222 menuOrient->AppendRadioItem(ID_ORIENT_RIGHT, wxT("&Right\tCtrl-9"));
223
224 wxMenu *menuOperations = new wxMenu;
225 menuOperations->Append(ID_ADD_PAGE, wxT("&Add page\tAlt-A"));
226 menuOperations->Append(ID_INSERT_PAGE, wxT("&Insert page\tAlt-I"));
227 menuOperations->Append(ID_DELETE_CUR_PAGE, wxT("&Delete current page\tAlt-D"));
228 menuOperations->Append(ID_DELETE_LAST_PAGE, wxT("D&elete last page\tAlt-L"));
229 menuOperations->Append(ID_NEXT_PAGE, wxT("&Next page\tAlt-N"));
230 #if wxUSE_TREEBOOK
231 menuOperations->AppendSeparator();
232 menuOperations->Append(ID_ADD_PAGE_BEFORE, wxT("Insert page &before\tAlt-B"));
233 menuOperations->Append(ID_ADD_SUB_PAGE, wxT("Add s&ub page\tAlt-U"));
234 #endif
235
236 wxMenu *menuFile = new wxMenu;
237 menuFile->Append(wxID_ANY, wxT("&Type"), menuType, wxT("Type of control"));
238 menuFile->Append(wxID_ANY, wxT("&Orientation"), menuOrient, wxT("Orientation of control"));
239 menuFile->AppendCheckItem(ID_SHOW_IMAGES, wxT("&Show images\tAlt-S"));
240 menuFile->AppendCheckItem(ID_MULTI, wxT("&Multiple lines\tAlt-M"));
241 menuFile->AppendSeparator();
242 menuFile->Append(wxID_EXIT, wxT("E&xit"), wxT("Quits the application"));
243 menuFile->Check(ID_SHOW_IMAGES, m_chkShowImages);
244 menuFile->Check(ID_MULTI, m_multi);
245
246 wxMenuBar *menuBar = new wxMenuBar;
247 menuBar->Append(menuFile, wxT("&File"));
248 menuBar->Append(menuOperations, wxT("&Operations"));
249 SetMenuBar(menuBar);
250
251 // books creation
252 m_panel = NULL;
253 m_bookCtrl = NULL;
254
255 // create a dummy image list with a few icons
256 const wxSize imageSize(32, 32);
257
258 m_imageList = new wxImageList(imageSize.GetWidth(), imageSize.GetHeight());
259 m_imageList->
260 Add(wxArtProvider::GetIcon(wxART_INFORMATION, wxART_OTHER, imageSize));
261 m_imageList->
262 Add(wxArtProvider::GetIcon(wxART_QUESTION, wxART_OTHER, imageSize));
263 m_imageList->
264 Add(wxArtProvider::GetIcon(wxART_WARNING, wxART_OTHER, imageSize));
265 m_imageList->
266 Add(wxArtProvider::GetIcon(wxART_ERROR, wxART_OTHER, imageSize));
267
268 m_panel = new wxPanel(this);
269
270 #if USE_LOG
271 m_text = new wxTextCtrl(m_panel, wxID_ANY, wxEmptyString,
272 wxDefaultPosition, wxDefaultSize,
273 wxTE_MULTILINE | wxTE_READONLY);
274
275 m_logTargetOld = wxLog::SetActiveTarget( new wxLogTextCtrl(m_text) );
276 #endif // USE_LOG
277
278 // Set sizers
279 m_sizerFrame = new wxBoxSizer(wxVERTICAL);
280
281 #if USE_LOG
282 m_sizerFrame->Add(m_text, 1, wxEXPAND);
283 #endif // USE_LOG
284
285 RecreateBook();
286
287 m_panel->SetSizer(m_sizerFrame);
288
289 m_sizerFrame->Fit(this);
290 m_sizerFrame->SetSizeHints(this);
291
292 Centre(wxBOTH);
293 }
294
295 MyFrame::~MyFrame()
296 {
297 #if USE_LOG
298 delete wxLog::SetActiveTarget(m_logTargetOld);
299 #endif // USE_LOG
300
301 delete m_imageList;
302 }
303
304 // DISPATCH_ON_TYPE() macro is an ugly way to write the "same" code for
305 // different wxBookCtrlBase-derived classes without duplicating code and
306 // without using templates, it expands into "before <xxx> after" where "xxx"
307 // part is control class-specific
308 #if wxUSE_NOTEBOOK
309 #define CASE_NOTEBOOK(x) case Type_Notebook: x; break;
310 #else
311 #define CASE_NOTEBOOK(x)
312 #endif
313
314 #if wxUSE_CHOICEBOOK
315 #define CASE_CHOICEBOOK(x) case Type_Choicebook: x; break;
316 #else
317 #define CASE_CHOICEBOOK(x)
318 #endif
319
320 #if wxUSE_LISTBOOK
321 #define CASE_LISTBOOK(x) case Type_Listbook: x; break;
322 #else
323 #define CASE_LISTBOOK(x)
324 #endif
325
326 #if wxUSE_TREEBOOK
327 #define CASE_TREEBOOK(x) case Type_Treebook: x; break;
328 #else
329 #define CASE_TREEBOOK(x)
330 #endif
331
332 #define DISPATCH_ON_TYPE(before, nb, lb, cb, tb, after) \
333 switch ( m_type ) \
334 { \
335 CASE_NOTEBOOK(before nb after) \
336 CASE_CHOICEBOOK(before cb after) \
337 CASE_LISTBOOK(before lb after) \
338 CASE_TREEBOOK(before tb after) \
339 \
340 default: \
341 wxFAIL_MSG( _T("unknown book control type") ); \
342 }
343
344 int MyFrame::TranslateBookFlag(int nb, int lb, int chb, int tbk) const
345 {
346 int flag = 0;
347
348 DISPATCH_ON_TYPE(flag =, nb, lb, chb, tbk, + 0);
349
350 return flag;
351 }
352
353 void MyFrame::RecreateBook()
354 {
355 #define SELECT_FLAG(flag) \
356 TranslateBookFlag(wxNB_##flag, wxCHB_##flag, wxLB_##flag, wxTBK_##flag)
357
358 int flags;
359 switch ( m_orient )
360 {
361 case ID_ORIENT_TOP:
362 flags = SELECT_FLAG(TOP);
363 break;
364
365 case ID_ORIENT_BOTTOM:
366 flags = SELECT_FLAG(BOTTOM);
367 break;
368
369 case ID_ORIENT_LEFT:
370 flags = SELECT_FLAG(LEFT);
371 break;
372
373 case ID_ORIENT_RIGHT:
374 flags = SELECT_FLAG(RIGHT);
375 break;
376
377 default:
378 flags = SELECT_FLAG(DEFAULT);
379 }
380
381 #undef SELECT_FLAG
382
383 if ( m_multi && m_type == Type_Notebook )
384 flags |= wxNB_MULTILINE;
385 flags |= wxDOUBLE_BORDER;
386
387 wxBookCtrlBase *oldBook = m_bookCtrl;
388
389 m_bookCtrl = NULL;
390
391 DISPATCH_ON_TYPE(m_bookCtrl = new,
392 wxNotebook,
393 wxChoicebook,
394 wxListbook,
395 wxTreebook,
396 (m_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, flags));
397
398 if ( !m_bookCtrl )
399 return;
400
401 m_bookCtrl->Hide();
402
403 if ( m_chkShowImages )
404 {
405 m_bookCtrl->SetImageList(m_imageList);
406 }
407
408 if ( oldBook )
409 {
410 #if wxUSE_TREEBOOK
411 // we only need the old treebook if we're recreating another treebook
412 wxTreebook *tbkOld = m_type == Type_Treebook
413 ? wxDynamicCast(oldBook, wxTreebook)
414 : NULL;
415 #endif // wxUSE_TREEBOOK
416
417 const int count = oldBook->GetPageCount();
418 for ( int n = 0; n < count; n++ )
419 {
420 const int image = GetIconIndex(m_bookCtrl);
421 const wxString str = oldBook->GetPageText(n);
422
423 wxWindow *page = CreatePage(m_bookCtrl, str);
424
425 // treebook complication: need to account for possible parent page
426 #if wxUSE_TREEBOOK
427 if ( tbkOld )
428 {
429 const int parent = tbkOld->GetPageParent(n);
430 if ( parent != wxNOT_FOUND )
431 {
432 wxStaticCast(m_bookCtrl, wxTreebook)->
433 AddSubPage(parent, page, str, false, image);
434
435 // skip adding it again below
436 continue;
437 }
438 }
439 #endif // wxUSE_TREEBOOK
440
441 m_bookCtrl->AddPage(page, str, false, image);
442 }
443
444 const int sel = oldBook->GetSelection();
445 if ( sel != wxNOT_FOUND )
446 m_bookCtrl->SetSelection(sel);
447
448
449 m_sizerFrame->Detach(oldBook);
450 delete oldBook;
451 }
452 else // no old book
453 {
454 CreateInitialPages(m_bookCtrl);
455 }
456
457 m_sizerFrame->Insert(0, m_bookCtrl, wxSizerFlags(5).Expand().Border());
458
459 m_sizerFrame->Show(m_bookCtrl);
460 m_sizerFrame->Layout();
461 }
462
463 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
464 // File menu
465 EVT_MENU_RANGE(ID_BOOK_NOTEBOOK, ID_BOOK_MAX, MyFrame::OnType)
466 EVT_MENU_RANGE(ID_ORIENT_DEFAULT, ID_ORIENT_MAX, MyFrame::OnOrient)
467 EVT_MENU(ID_SHOW_IMAGES, MyFrame::OnShowImages)
468 EVT_MENU(ID_MULTI, MyFrame::OnMulti)
469 EVT_MENU(wxID_EXIT, MyFrame::OnExit)
470
471 // Operations menu
472 EVT_MENU(ID_ADD_PAGE, MyFrame::OnAddPage)
473 EVT_MENU(ID_INSERT_PAGE, MyFrame::OnInsertPage)
474 EVT_MENU(ID_DELETE_CUR_PAGE, MyFrame::OnDeleteCurPage)
475 EVT_MENU(ID_DELETE_LAST_PAGE, MyFrame::OnDeleteLastPage)
476 EVT_MENU(ID_NEXT_PAGE, MyFrame::OnNextPage)
477 EVT_MENU(ID_ADD_SUB_PAGE, MyFrame::OnAddSubPage)
478 EVT_MENU(ID_ADD_PAGE_BEFORE, MyFrame::OnAddPageBefore)
479
480 // Book controls
481 #if wxUSE_NOTEBOOK
482 EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, MyFrame::OnNotebook)
483 EVT_NOTEBOOK_PAGE_CHANGING(wxID_ANY, MyFrame::OnNotebook)
484 #endif
485 #if wxUSE_LISTBOOK
486 EVT_LISTBOOK_PAGE_CHANGED(wxID_ANY, MyFrame::OnListbook)
487 EVT_LISTBOOK_PAGE_CHANGING(wxID_ANY, MyFrame::OnListbook)
488 #endif
489 #if wxUSE_CHOICEBOOK
490 EVT_CHOICEBOOK_PAGE_CHANGED(wxID_ANY, MyFrame::OnChoicebook)
491 EVT_CHOICEBOOK_PAGE_CHANGING(wxID_ANY, MyFrame::OnChoicebook)
492 #endif
493 #if wxUSE_CHOICEBOOK
494 EVT_TREEBOOK_PAGE_CHANGED(wxID_ANY, MyFrame::OnTreebook)
495 EVT_TREEBOOK_PAGE_CHANGING(wxID_ANY, MyFrame::OnTreebook)
496 #endif
497
498 // Update title in idle time
499 EVT_IDLE(MyFrame::OnIdle)
500
501 #if wxUSE_TREEBOOK
502 EVT_UPDATE_UI_RANGE(ID_ADD_PAGE_BEFORE, ID_ADD_SUB_PAGE,
503 MyFrame::OnUpdateTreeMenu)
504 #endif // wxUSE_TREEBOOK
505 END_EVENT_TABLE()
506
507 void MyFrame::OnType(wxCommandEvent& event)
508 {
509 m_type = wx_static_cast(BookType, event.GetId() - ID_BOOK_NOTEBOOK);
510
511 if ( m_bookCtrl )
512 m_sizerFrame->Hide(m_bookCtrl);
513
514 RecreateBook();
515 }
516
517 #if wxUSE_TREEBOOK
518
519 void MyFrame::OnUpdateTreeMenu(wxUpdateUIEvent& event)
520 {
521 event.Enable(m_type == Type_Treebook);
522 }
523
524 #endif // wxUSE_TREEBOOK
525
526
527 void MyFrame::OnOrient(wxCommandEvent& event)
528 {
529 m_orient = event.GetId();
530 RecreateBook();
531 m_sizerFrame->Layout();
532 }
533
534 void MyFrame::OnShowImages(wxCommandEvent& event)
535 {
536 m_chkShowImages = event.IsChecked();
537 RecreateBook();
538 m_sizerFrame->Layout();
539 }
540
541 void MyFrame::OnMulti(wxCommandEvent& event)
542 {
543 m_multi = event.IsChecked();
544 RecreateBook();
545 m_sizerFrame->Layout();
546 wxLogMessage(_T("Multiline setting works only in wxNotebook."));
547 }
548
549 void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event))
550 {
551 Close();
552 }
553
554 wxPanel *MyFrame::CreateNewPage() const
555 {
556 wxPanel *panel = new wxPanel(m_bookCtrl, wxID_ANY );
557 (void) new wxButton(panel, wxID_ANY, wxT("First button"), wxPoint(10, 10));
558 (void) new wxButton(panel, wxID_ANY, wxT("Second button"), wxPoint(50, 100));
559
560 return panel;
561 }
562
563 void MyFrame::OnAddPage(wxCommandEvent& WXUNUSED(event))
564 {
565 wxBookCtrlBase *currBook = GetCurrentBook();
566
567 if ( currBook )
568 {
569 static unsigned s_pageAdded = 0;
570 currBook->AddPage(CreateNewPage(),
571 wxString::Format
572 (
573 ADDED_PAGE_NAME wxT("%u"),
574 ++s_pageAdded
575 ),
576 true,
577 GetIconIndex(currBook));
578 }
579 }
580
581 #if wxUSE_TREEBOOK
582 void MyFrame::OnAddSubPage(wxCommandEvent& WXUNUSED(event))
583 {
584 wxTreebook *currBook = wxDynamicCast(GetCurrentBook(), wxTreebook);
585 if ( currBook )
586 {
587 const int selPos = currBook->GetSelection();
588 if ( selPos == wxNOT_FOUND )
589 {
590 wxLogError(_T("Select the parent page first!"));
591 return;
592 }
593
594 static unsigned s_subPageAdded = 0;
595 currBook->AddSubPage(selPos,
596 CreateNewPage(),
597 wxString::Format
598 (
599 ADDED_SUB_PAGE_NAME wxT("%u"),
600 ++s_subPageAdded
601 ),
602 true,
603 GetIconIndex(currBook));
604 }
605 }
606
607 void MyFrame::OnAddPageBefore(wxCommandEvent& WXUNUSED(event))
608 {
609 wxBookCtrlBase *currBook = GetCurrentBook();
610 if ( currBook )
611 {
612 const int selPos = currBook->GetSelection();
613 if ( selPos == wxNOT_FOUND )
614 {
615 wxLogError(_T("Select the parent page first!"));
616 return;
617 }
618
619 static unsigned s_subPageAdded = 0;
620 currBook->InsertPage(selPos,
621 CreateNewPage(),
622 wxString::Format
623 (
624 ADDED_PAGE_NAME_BEFORE wxT("%u"),
625 ++s_subPageAdded
626 ),
627 true,
628 GetIconIndex(currBook));
629 }
630 }
631 #endif // wxUSE_TREEBOOK
632
633 void MyFrame::OnInsertPage(wxCommandEvent& WXUNUSED(event))
634 {
635 static unsigned s_pageIns = 0;
636
637 wxBookCtrlBase *currBook = GetCurrentBook();
638
639 if ( currBook )
640 {
641 wxPanel *panel = CreateUserCreatedPage( currBook );
642
643 currBook->InsertPage( 0, panel,
644 wxString::Format(INSERTED_PAGE_NAME wxT("%u"), ++s_pageIns), false,
645 GetIconIndex(currBook) );
646
647 currBook->SetSelection(0);
648 }
649 }
650
651 void MyFrame::OnDeleteCurPage(wxCommandEvent& WXUNUSED(event))
652 {
653 wxBookCtrlBase *currBook = GetCurrentBook();
654
655 if ( currBook )
656 {
657 int sel = currBook->GetSelection();
658
659 if (sel != wxNOT_FOUND)
660 {
661 currBook->DeletePage(sel);
662 }
663 }
664 }
665
666 void MyFrame::OnDeleteLastPage(wxCommandEvent& WXUNUSED(event))
667 {
668 wxBookCtrlBase *currBook = GetCurrentBook();
669
670 if ( currBook )
671 {
672 int page = currBook->GetPageCount();
673
674 if ( page != 0 )
675 {
676 currBook->DeletePage(page - 1);
677 }
678 }
679 }
680
681 void MyFrame::OnNextPage(wxCommandEvent& WXUNUSED(event))
682 {
683 wxBookCtrlBase *currBook = GetCurrentBook();
684
685 if ( currBook )
686 {
687 currBook->AdvanceSelection();
688 }
689 }
690
691 void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
692 {
693 static int s_nPages = wxNOT_FOUND;
694 static int s_nSel = wxNOT_FOUND;
695 static wxBookCtrlBase *s_currBook = NULL;
696
697 wxBookCtrlBase *currBook = GetCurrentBook();
698
699 int nPages = currBook ? currBook->GetPageCount() : 0;
700 int nSel = currBook ? currBook->GetSelection() : wxNOT_FOUND;
701
702 if ( nPages != s_nPages || nSel != s_nSel || s_currBook != currBook )
703 {
704 s_nPages = nPages;
705 s_nSel = nSel;
706 s_currBook = currBook;
707
708 wxString selection;
709 if ( nSel == wxNOT_FOUND )
710 selection << wxT("not found");
711 else
712 selection << nSel;
713
714 wxString title;
715 title.Printf(wxT("Notebook and friends (%d pages, selection: %s)"), nPages, selection.c_str());
716
717 SetTitle(title);
718 }
719 }
720
721 void MyFrame::OnBookCtrl(wxBookCtrlBaseEvent& event)
722 {
723 static const struct EventInfo
724 {
725 wxEventType typeChanged,
726 typeChanging;
727 const wxChar *name;
728 } events[] =
729 {
730 #if wxUSE_NOTEBOOK
731 {
732 wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
733 wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
734 _T("wxNotebook")
735 },
736 #endif // wxUSE_NOTEBOOK
737 #if wxUSE_CHOICEBOOK
738 {
739 wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED,
740 wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING,
741 _T("wxChoicebook")
742 },
743 #endif // wxUSE_CHOICEBOOK
744 #if wxUSE_LISTBOOK
745 {
746 wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED,
747 wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING,
748 _T("wxListbook")
749 },
750 #endif // wxUSE_LISTBOOK
751 #if wxUSE_TREEBOOK
752 {
753 wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED,
754 wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING,
755 _T("wxTreebook")
756 },
757 #endif // wxUSE_TREEBOOK
758 };
759
760
761 wxString nameEvent,
762 nameControl,
763 veto;
764 const wxEventType eventType = event.GetEventType();
765 for ( size_t n = 0; n < WXSIZEOF(events); n++ )
766 {
767 const EventInfo& ei = events[n];
768 if ( eventType == ei.typeChanged )
769 {
770 nameEvent = wxT("Changed");
771 }
772 else if ( eventType == ei.typeChanging )
773 {
774 const int idx = event.GetOldSelection();
775 const wxBookCtrlBase * const
776 book = wxStaticCast(event.GetEventObject(), wxBookCtrlBase);
777 if ( idx != wxNOT_FOUND &&
778 book && book->GetPageText(idx) == VETO_PAGE_NAME )
779 {
780 if ( wxMessageBox
781 (
782 wxT("Are you sure you want to leave this page?\n")
783 wxT("(This demonstrates veto-ing)"),
784 wxT("Notebook sample"),
785 wxICON_QUESTION | wxYES_NO,
786 this
787 ) != wxYES )
788 {
789 event.Veto();
790 veto = _T(" (vetoed)");
791 }
792 }
793
794 nameEvent = wxT("Changing");
795 }
796 else // skip end of the loop
797 {
798 continue;
799 }
800
801 nameControl = ei.name;
802 break;
803 }
804
805 static int s_num = 0;
806
807 wxLogMessage(wxT("Event #%d: %s: %s (%d) new sel %d, old %d%s"),
808 ++s_num,
809 nameControl.c_str(),
810 nameEvent.c_str(),
811 eventType,
812 event.GetSelection(),
813 event.GetOldSelection(),
814 veto.c_str());
815
816 #if USE_LOG
817 m_text->SetInsertionPointEnd();
818 #endif
819 }
820