1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        samples/notebook/notebook.cpp 
   3 // Purpose:     a sample demonstrating notebook usage 
   4 // Author:      Julian Smart 
   5 // Modified by: Dimitri Schoolwerth 
   8 // Copyright:   (c) 1998-2002 wxWidgets team 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  23 #include "wx/imaglist.h" 
  24 #include "wx/artprov.h" 
  25 #include "wx/cshelp.h" 
  29 #if !defined(__WXMSW__) && !defined(__WXPM__) 
  30     #include "../sample.xpm" 
  33 //----------------------------------------------------------------------------- 
  35 //----------------------------------------------------------------------------- 
  41     if ( !wxApp::OnInit() ) 
  45     wxHelpProvider::Set( new wxSimpleHelpProvider 
); 
  48     // Create the main window 
  49     MyFrame 
*frame 
= new MyFrame(); 
  52     // Problem with generic wxNotebook implementation whereby it doesn't size 
  53     // properly unless you set the size again 
  54 #if defined(__WXMOTIF__) 
  56     frame
->GetSize(& width
, & height
); 
  57     frame
->SetSize(wxDefaultCoord
, wxDefaultCoord
, width
, height
); 
  66 //----------------------------------------------------------------------------- 
  68 //----------------------------------------------------------------------------- 
  70 wxPanel 
*CreateUserCreatedPage(wxBookCtrlBase 
*parent
) 
  72     wxPanel 
*panel 
= new wxPanel(parent
); 
  75     panel
->SetHelpText( wxT( "Panel with a Button" ) ); 
  78     (void) new wxButton( panel
, wxID_ANY
, wxT("Button"), 
  79                          wxPoint(10, 10), wxDefaultSize 
); 
  84 wxPanel 
*CreateRadioButtonsPage(wxBookCtrlBase 
*parent
) 
  86     wxPanel 
*panel 
= new wxPanel(parent
); 
  89     panel
->SetHelpText( wxT( "Panel with some Radio Buttons" ) ); 
  93       { wxT("Fox"), wxT("Hare"), wxT("Rabbit"), 
  94         wxT("Sabre-toothed tiger"), wxT("T Rex") }; 
  96     wxRadioBox 
*radiobox1 
= new wxRadioBox(panel
, wxID_ANY
, wxT("Choose one"), 
  97         wxDefaultPosition
, wxDefaultSize
, 5, animals
, 2, wxRA_SPECIFY_ROWS
); 
  99     wxString computers
[] =  
 100       { wxT("Amiga"), wxT("Commodore 64"), wxT("PET"), 
 103     wxRadioBox 
*radiobox2 
= new wxRadioBox(panel
, wxID_ANY
, 
 104         wxT("Choose your favourite"), wxDefaultPosition
, wxDefaultSize
, 
 105         4, computers
, 0, wxRA_SPECIFY_COLS
); 
 107     wxBoxSizer 
*sizerPanel 
= new wxBoxSizer(wxVERTICAL
); 
 108     sizerPanel
->Add(radiobox1
, 2, wxEXPAND
); 
 109     sizerPanel
->Add(radiobox2
, 1, wxEXPAND
); 
 110     panel
->SetSizer(sizerPanel
); 
 115 wxPanel 
*CreateVetoPage(wxBookCtrlBase 
*parent
) 
 117     wxPanel 
*panel 
= new wxPanel(parent
); 
 120     panel
->SetHelpText( wxT( "An empty panel" ) ); 
 123     (void) new wxStaticText( panel
, wxID_ANY
, 
 124                              wxT("This page intentionally left blank"),  
 130 wxPanel 
*CreateBigButtonPage(wxBookCtrlBase 
*parent
) 
 132     wxPanel 
*panel 
= new wxPanel(parent
); 
 135     panel
->SetHelpText( wxT( "Panel with a maximized button" ) ); 
 138     wxButton 
*buttonBig 
= new wxButton(panel
, wxID_ANY
, wxT("Maximized button")); 
 140     wxBoxSizer 
*sizerPanel 
= new wxBoxSizer(wxVERTICAL
); 
 141     sizerPanel
->Add(buttonBig
, 1, wxEXPAND
); 
 142     panel
->SetSizer(sizerPanel
); 
 147 wxPanel 
*CreateInsertPage(wxBookCtrlBase 
*parent
) 
 149     wxPanel 
*panel 
= new wxPanel(parent
); 
 152     panel
->SetHelpText( wxT( "Maroon panel" ) ); 
 155     panel
->SetBackgroundColour( wxColour( wxT("MAROON") ) ); 
 156     (void) new wxStaticText( panel
, wxID_ANY
, 
 157                              wxT("This page has been inserted, not added."),  
 163 int GetIconIndex(wxBookCtrlBase
* bookCtrl
) 
 165     if (bookCtrl 
&& bookCtrl
->GetImageList()) 
 167        int nImages 
= bookCtrl
->GetImageList()->GetImageCount(); 
 170            return bookCtrl
->GetPageCount() % nImages
; 
 177 void CreateInitialPages(wxBookCtrlBase 
*parent
) 
 179     // Create and add some panels to the notebook 
 181     wxPanel 
*panel 
= CreateRadioButtonsPage(parent
); 
 182     parent
->AddPage( panel
, RADIOBUTTONS_PAGE_NAME
, false, GetIconIndex(parent
) ); 
 184     panel 
= CreateVetoPage(parent
); 
 185     parent
->AddPage( panel
, VETO_PAGE_NAME
, false, GetIconIndex(parent
) ); 
 187     panel 
= CreateBigButtonPage(parent
); 
 188     parent
->AddPage( panel
, MAXIMIZED_BUTTON_PAGE_NAME
, false, GetIconIndex(parent
) ); 
 190     panel 
= CreateInsertPage(parent
); 
 191     parent
->InsertPage( 0, panel
, I_WAS_INSERTED_PAGE_NAME
, false, GetIconIndex(parent
) ); 
 193     parent
->SetSelection(1); 
 196 wxPanel 
*CreatePage(wxBookCtrlBase 
*parent
, const wxString
&pageName
) 
 198     if ( pageName
.Contains(INSERTED_PAGE_NAME
) || 
 199             pageName
.Contains(ADDED_PAGE_NAME
) || 
 200                 pageName
.Contains(ADDED_SUB_PAGE_NAME
) || 
 201                     pageName
.Contains(ADDED_PAGE_NAME_BEFORE
) ) 
 202         return CreateUserCreatedPage(parent
); 
 204     if ( pageName 
== I_WAS_INSERTED_PAGE_NAME 
) 
 205         return CreateInsertPage(parent
); 
 207     if ( pageName 
== VETO_PAGE_NAME 
) 
 208         return CreateVetoPage(parent
); 
 210     if ( pageName 
== RADIOBUTTONS_PAGE_NAME 
) 
 211         return CreateRadioButtonsPage(parent
); 
 213     if ( pageName 
== MAXIMIZED_BUTTON_PAGE_NAME 
) 
 214         return CreateBigButtonPage(parent
); 
 216     wxFAIL_MSG( wxT("unknown page name") ); 
 222 //----------------------------------------------------------------------------- 
 224 //----------------------------------------------------------------------------- 
 226 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
) 
 228     EVT_MENU_RANGE(ID_BOOK_NOTEBOOK
, ID_BOOK_MAX
, MyFrame::OnType
) 
 229     EVT_MENU_RANGE(ID_ORIENT_DEFAULT
, ID_ORIENT_MAX
, MyFrame::OnOrient
) 
 230     EVT_MENU(ID_SHOW_IMAGES
, MyFrame::OnShowImages
) 
 231     EVT_MENU(ID_MULTI
, MyFrame::OnMulti
) 
 232     EVT_MENU(wxID_EXIT
, MyFrame::OnExit
) 
 235     EVT_MENU(ID_ADD_PAGE
, MyFrame::OnAddPage
) 
 236     EVT_MENU(ID_ADD_PAGE_NO_SELECT
, MyFrame::OnAddPageNoSelect
) 
 237     EVT_MENU(ID_INSERT_PAGE
, MyFrame::OnInsertPage
) 
 238     EVT_MENU(ID_DELETE_CUR_PAGE
, MyFrame::OnDeleteCurPage
) 
 239     EVT_MENU(ID_DELETE_LAST_PAGE
, MyFrame::OnDeleteLastPage
) 
 240     EVT_MENU(ID_NEXT_PAGE
, MyFrame::OnNextPage
) 
 241     EVT_MENU(ID_GO_HOME
, MyFrame::OnGoHome
) 
 244     EVT_MENU(ID_CONTEXT_HELP
, MyFrame::OnContextHelp
) 
 246     EVT_MENU(ID_HITTEST
, MyFrame::OnHitTest
) 
 250     EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY
, MyFrame::OnNotebook
) 
 251     EVT_NOTEBOOK_PAGE_CHANGING(wxID_ANY
, MyFrame::OnNotebook
) 
 254     EVT_LISTBOOK_PAGE_CHANGED(wxID_ANY
, MyFrame::OnListbook
) 
 255     EVT_LISTBOOK_PAGE_CHANGING(wxID_ANY
, MyFrame::OnListbook
) 
 258     EVT_CHOICEBOOK_PAGE_CHANGED(wxID_ANY
, MyFrame::OnChoicebook
) 
 259     EVT_CHOICEBOOK_PAGE_CHANGING(wxID_ANY
, MyFrame::OnChoicebook
) 
 262     EVT_TREEBOOK_PAGE_CHANGED(wxID_ANY
, MyFrame::OnTreebook
) 
 263     EVT_TREEBOOK_PAGE_CHANGING(wxID_ANY
, MyFrame::OnTreebook
) 
 265     EVT_MENU(ID_ADD_SUB_PAGE
, MyFrame::OnAddSubPage
) 
 266     EVT_MENU(ID_ADD_PAGE_BEFORE
, MyFrame::OnAddPageBefore
) 
 267     EVT_UPDATE_UI_RANGE(ID_ADD_PAGE_BEFORE
, ID_ADD_SUB_PAGE
, 
 268                             MyFrame::OnUpdateTreeMenu
) 
 271     EVT_TOOLBOOK_PAGE_CHANGED(wxID_ANY
, MyFrame::OnToolbook
) 
 272     EVT_TOOLBOOK_PAGE_CHANGING(wxID_ANY
, MyFrame::OnToolbook
) 
 275     // Update title in idle time 
 276     EVT_IDLE(MyFrame::OnIdle
) 
 280     : wxFrame(NULL
, wxID_ANY
, wxString(wxT("wxWidgets book controls sample"))) 
 283     SetExtraStyle(wxFRAME_EX_CONTEXTHELP
); 
 287     m_type 
= Type_Notebook
; 
 288 #elif wxUSE_CHOICEBOOK 
 289     m_type 
= Type_Choicebook
; 
 291     m_type 
= Type_Listbook
; 
 293     m_type 
= Type_Treebook
; 
 295     #error "Don't use Notebook sample without any book enabled in wxWidgets build!" 
 298     m_orient 
= ID_ORIENT_DEFAULT
; 
 299     m_chkShowImages 
= true; 
 302     SetIcon(wxICON(sample
)); 
 304     // menu of the sample 
 305     wxMenu 
*menuType 
= new wxMenu
; 
 307     menuType
->AppendRadioItem(ID_BOOK_NOTEBOOK
,   wxT("&Notebook\tCtrl-1")); 
 310     menuType
->AppendRadioItem(ID_BOOK_LISTBOOK
,   wxT("&Listbook\tCtrl-2")); 
 313     menuType
->AppendRadioItem(ID_BOOK_CHOICEBOOK
, wxT("&Choicebook\tCtrl-3")); 
 316     menuType
->AppendRadioItem(ID_BOOK_TREEBOOK
,   wxT("&Treebook\tCtrl-4")); 
 319     menuType
->AppendRadioItem(ID_BOOK_TOOLBOOK
,   wxT("T&oolbook\tCtrl-5")); 
 322     menuType
->Check(ID_BOOK_NOTEBOOK 
+ m_type
, true); 
 324     wxMenu 
*menuOrient 
= new wxMenu
; 
 325     menuOrient
->AppendRadioItem(ID_ORIENT_DEFAULT
, wxT("&Default\tAlt-0")); 
 326     menuOrient
->AppendRadioItem(ID_ORIENT_TOP
,     wxT("&Top\tAlt-1")); 
 327     menuOrient
->AppendRadioItem(ID_ORIENT_BOTTOM
,  wxT("&Bottom\tAlt-2")); 
 328     menuOrient
->AppendRadioItem(ID_ORIENT_LEFT
,    wxT("&Left\tAlt-3")); 
 329     menuOrient
->AppendRadioItem(ID_ORIENT_RIGHT
,   wxT("&Right\tAlt-4")); 
 331     wxMenu 
*menuPageOperations 
= new wxMenu
; 
 332     menuPageOperations
->Append(ID_ADD_PAGE
, wxT("&Add page\tAlt-A")); 
 333     menuPageOperations
->Append(ID_ADD_PAGE_NO_SELECT
, wxT("&Add page (don't select)\tAlt-B")); 
 334     menuPageOperations
->Append(ID_INSERT_PAGE
, wxT("&Insert page\tAlt-I")); 
 335     menuPageOperations
->Append(ID_DELETE_CUR_PAGE
, wxT("&Delete current page\tAlt-D")); 
 336     menuPageOperations
->Append(ID_DELETE_LAST_PAGE
, wxT("D&elete last page\tAlt-L")); 
 337     menuPageOperations
->Append(ID_NEXT_PAGE
, wxT("&Next page\tAlt-N")); 
 339     menuPageOperations
->AppendSeparator(); 
 340     menuPageOperations
->Append(ID_ADD_PAGE_BEFORE
, wxT("Insert page &before\tAlt-B")); 
 341     menuPageOperations
->Append(ID_ADD_SUB_PAGE
, wxT("Add s&ub page\tAlt-U")); 
 343     menuPageOperations
->AppendSeparator(); 
 344     menuPageOperations
->Append(ID_GO_HOME
, wxT("Go to the first page\tCtrl-F")); 
 346     wxMenu 
*menuOperations 
= new wxMenu
; 
 348     menuOperations
->Append(ID_CONTEXT_HELP
, wxT("&Context help\tCtrl-F1")); 
 350     menuOperations
->Append(ID_HITTEST
, wxT("&Hit test\tCtrl-H")); 
 352     wxMenu 
*menuFile 
= new wxMenu
; 
 353     menuFile
->Append(wxID_ANY
, wxT("&Type"), menuType
, wxT("Type of control")); 
 354     menuFile
->Append(wxID_ANY
, wxT("&Orientation"), menuOrient
, wxT("Orientation of control")); 
 355     menuFile
->AppendCheckItem(ID_SHOW_IMAGES
, wxT("&Show images\tAlt-S")); 
 356     menuFile
->AppendCheckItem(ID_MULTI
, wxT("&Multiple lines\tAlt-M")); 
 357     menuFile
->AppendSeparator(); 
 358     menuFile
->Append(wxID_EXIT
, wxT("E&xit"), wxT("Quits the application")); 
 359     menuFile
->Check(ID_SHOW_IMAGES
, m_chkShowImages
); 
 360     menuFile
->Check(ID_MULTI
, m_multi
); 
 362     wxMenuBar 
*menuBar 
= new wxMenuBar
; 
 363     menuBar
->Append(menuFile
, wxT("&File")); 
 364     menuBar
->Append(menuPageOperations
, wxT("&Pages")); 
 365     menuBar
->Append(menuOperations
, wxT("&Operations")); 
 372     // create a dummy image list with a few icons 
 373     const wxSize 
imageSize(32, 32); 
 375     m_imageList 
= new wxImageList(imageSize
.GetWidth(), imageSize
.GetHeight()); 
 377         Add(wxArtProvider::GetIcon(wxART_INFORMATION
, wxART_OTHER
, imageSize
)); 
 379         Add(wxArtProvider::GetIcon(wxART_QUESTION
, wxART_OTHER
, imageSize
)); 
 381         Add(wxArtProvider::GetIcon(wxART_WARNING
, wxART_OTHER
, imageSize
)); 
 383         Add(wxArtProvider::GetIcon(wxART_ERROR
, wxART_OTHER
, imageSize
)); 
 385     m_panel 
= new wxPanel(this); 
 388     m_text 
= new wxTextCtrl(m_panel
, wxID_ANY
, wxEmptyString
, 
 389                             wxDefaultPosition
, wxDefaultSize
, 
 390                             wxTE_MULTILINE 
| wxTE_READONLY
); 
 392     m_logTargetOld 
= wxLog::SetActiveTarget( new wxLogTextCtrl(m_text
) ); 
 396     m_sizerFrame 
= new wxBoxSizer(wxVERTICAL
); 
 399     m_sizerFrame
->Add(m_text
, 1, wxEXPAND
); 
 404     m_panel
->SetSizer(m_sizerFrame
); 
 407     wxBoxSizer 
*sizer 
= new wxBoxSizer(wxVERTICAL
); 
 408     sizer
->Add(m_panel
, wxSizerFlags(1).Expand()); 
 409     SetSizerAndFit(sizer
); 
 415     delete wxLog::SetActiveTarget(m_logTargetOld
); 
 421 // DISPATCH_ON_TYPE() macro is an ugly way to write the "same" code for 
 422 // different wxBookCtrlBase-derived classes without duplicating code and 
 423 // without using templates, it expands into "before <xxx> after" where "xxx" 
 424 // part is control class-specific 
 426     #define CASE_NOTEBOOK(x) case Type_Notebook: x; break; 
 428     #define CASE_NOTEBOOK(x) 
 432     #define CASE_LISTBOOK(x) case Type_Listbook: x; break; 
 434     #define CASE_LISTBOOK(x) 
 438     #define CASE_CHOICEBOOK(x) case Type_Choicebook: x; break; 
 440     #define CASE_CHOICEBOOK(x) 
 444     #define CASE_TREEBOOK(x) case Type_Treebook: x; break; 
 446     #define CASE_TREEBOOK(x) 
 450     #define CASE_TOOLBOOK(x) case Type_Toolbook: x; break; 
 452     #define CASE_TOOLBOOK(x) 
 455 #define DISPATCH_ON_TYPE(before, nb, lb, cb, tb, toolb, after)                \ 
 458         CASE_NOTEBOOK(before nb after)                                        \ 
 459         CASE_LISTBOOK(before lb after)                                        \ 
 460         CASE_CHOICEBOOK(before cb after)                                      \ 
 461         CASE_TREEBOOK(before tb after)                                        \ 
 462         CASE_TOOLBOOK(before toolb after)                                     \ 
 465             wxFAIL_MSG( wxT("unknown book control type") );                    \ 
 468 int MyFrame::TranslateBookFlag(int nb
, int lb
, int chb
, int tbk
, int toolbk
) const 
 472     DISPATCH_ON_TYPE(flag 
=, nb
,  lb
,  chb
,  tbk
, toolbk
, + 0); 
 477 void MyFrame::RecreateBook() 
 486         case ID_ORIENT_BOTTOM
: 
 494         case ID_ORIENT_RIGHT
: 
 499             flags 
= wxBK_DEFAULT
; 
 502     if ( m_multi 
&& m_type 
== Type_Notebook 
) 
 503         flags 
|= wxNB_MULTILINE
; 
 505     wxBookCtrlBase 
*oldBook 
= m_bookCtrl
; 
 509     DISPATCH_ON_TYPE(m_bookCtrl 
= new, 
 515                      (m_panel
, wxID_ANY
, wxDefaultPosition
, wxDefaultSize
, flags
)); 
 522     if ( m_chkShowImages 
) 
 524         m_bookCtrl
->SetImageList(m_imageList
); 
 530         // we only need the old treebook if we're recreating another treebook 
 531         wxTreebook 
*tbkOld 
= m_type 
== Type_Treebook
 
 532                                 ? wxDynamicCast(oldBook
, wxTreebook
) 
 534 #endif // wxUSE_TREEBOOK 
 536         const int count 
= oldBook
->GetPageCount(); 
 537         for ( int n 
= 0; n 
< count
; n
++ ) 
 539             const int image 
= GetIconIndex(m_bookCtrl
); 
 540             const wxString str 
= oldBook
->GetPageText(n
); 
 542             wxWindow 
*page 
= CreatePage(m_bookCtrl
, str
); 
 544             // treebook complication: need to account for possible parent page 
 548                 const int parent 
= tbkOld
->GetPageParent(n
); 
 549                 if ( parent 
!= wxNOT_FOUND 
) 
 551                     wxStaticCast(m_bookCtrl
, wxTreebook
)-> 
 552                         InsertSubPage(parent
, page
, str
, false, image
); 
 554                     // skip adding it again below 
 558 #endif // wxUSE_TREEBOOK 
 560             m_bookCtrl
->AddPage(page
, str
, false, image
); 
 563         const int sel 
= oldBook
->GetSelection(); 
 564         if ( sel 
!= wxNOT_FOUND 
) 
 565             m_bookCtrl
->SetSelection(sel
); 
 568         m_sizerFrame
->Detach(oldBook
); 
 573         CreateInitialPages(m_bookCtrl
); 
 576     m_sizerFrame
->Insert(0, m_bookCtrl
, wxSizerFlags(5).Expand().Border()); 
 578     m_sizerFrame
->Show(m_bookCtrl
); 
 579     m_sizerFrame
->Layout(); 
 582 void MyFrame::AddFlagStrIfFlagPresent(wxString 
& flagStr
, long flags
, long flag
,  
 583                                       const wxChar 
* flagName
) const 
 585     if( (flags 
& flag
) == flag 
) 
 587         if( !flagStr
.empty() ) 
 588             flagStr 
+= wxT(" | "); 
 593 wxPanel 
*MyFrame::CreateNewPage() const 
 595     wxPanel 
*panel 
= new wxPanel(m_bookCtrl
, wxID_ANY 
); 
 598     panel
->SetHelpText( wxT( "Panel with \"First\" and \"Second\" buttons" ) ); 
 601     (void) new wxButton(panel
, wxID_ANY
, wxT("First button"), wxPoint(10, 30)); 
 602     (void) new wxButton(panel
, wxID_ANY
, wxT("Second button"), wxPoint(150, 30)); 
 608 //----------------------------------------------------------------------------- 
 609 // MyFrame - event handlers 
 610 //----------------------------------------------------------------------------- 
 614 void MyFrame::OnContextHelp(wxCommandEvent
& WXUNUSED(event
)) 
 616     // launches local event loop 
 617     wxContextHelp 
ch( this ); 
 622 void MyFrame::OnHitTest(wxCommandEvent
& WXUNUSED(event
)) 
 624     wxBookCtrlBase 
* book 
= GetCurrentBook(); 
 625     const wxPoint pt 
= ::wxGetMousePosition(); 
 628     int pagePos 
= book
->HitTest( book
->ScreenToClient(pt
), &flags 
); 
 632     AddFlagStrIfFlagPresent( flagsStr
, flags
, wxBK_HITTEST_NOWHERE
, wxT("wxBK_HITTEST_NOWHERE") ); 
 633     AddFlagStrIfFlagPresent( flagsStr
, flags
, wxBK_HITTEST_ONICON
,  wxT("wxBK_HITTEST_ONICON") ); 
 634     AddFlagStrIfFlagPresent( flagsStr
, flags
, wxBK_HITTEST_ONLABEL
, wxT("wxBK_HITTEST_ONLABEL") ); 
 635     AddFlagStrIfFlagPresent( flagsStr
, flags
, wxBK_HITTEST_ONPAGE
,  wxT("wxBK_HITTEST_ONPAGE") ); 
 637     wxLogMessage(wxT("HitTest at (%d,%d): %d: %s"), 
 644 void MyFrame::OnType(wxCommandEvent
& event
) 
 646     m_type 
= static_cast<BookType
>(event
.GetId() - ID_BOOK_NOTEBOOK
); 
 649         m_sizerFrame
->Hide(m_bookCtrl
); 
 656 void MyFrame::OnUpdateTreeMenu(wxUpdateUIEvent
& event
) 
 658     event
.Enable(m_type 
== Type_Treebook
); 
 661 #endif // wxUSE_TREEBOOK 
 663 void MyFrame::OnOrient(wxCommandEvent
& event
) 
 665     m_orient 
= event
.GetId(); 
 667     m_sizerFrame
->Layout(); 
 670 void MyFrame::OnShowImages(wxCommandEvent
& event
) 
 672     m_chkShowImages 
= event
.IsChecked(); 
 674     m_sizerFrame
->Layout(); 
 677 void MyFrame::OnMulti(wxCommandEvent
& event
) 
 679     m_multi 
= event
.IsChecked(); 
 681     m_sizerFrame
->Layout(); 
 682     wxLogMessage(wxT("Multiline setting works only in wxNotebook.")); 
 685 void MyFrame::OnExit(wxCommandEvent
& WXUNUSED(event
)) 
 690 void MyFrame::OnAddPage(wxCommandEvent
& WXUNUSED(event
)) 
 692     wxBookCtrlBase 
*currBook 
= GetCurrentBook(); 
 696         static unsigned s_pageAdded 
= 0; 
 697         currBook
->AddPage(CreateNewPage(), 
 700                             ADDED_PAGE_NAME 
wxT("%u"), 
 704                           GetIconIndex(currBook
)); 
 708 void MyFrame::OnAddPageNoSelect(wxCommandEvent
& WXUNUSED(event
)) 
 710     wxBookCtrlBase 
*currBook 
= GetCurrentBook(); 
 714         static unsigned s_pageAdded 
= 0; 
 715         currBook
->AddPage(CreateNewPage(), 
 718                             ADDED_PAGE_NAME 
wxT("%u"), 
 722                           GetIconIndex(currBook
)); 
 727 void MyFrame::OnAddSubPage(wxCommandEvent
& WXUNUSED(event
)) 
 729     wxTreebook 
*currBook 
= wxDynamicCast(GetCurrentBook(), wxTreebook
); 
 732         const int selPos 
= currBook
->GetSelection(); 
 733         if ( selPos 
== wxNOT_FOUND 
) 
 735             wxLogError(wxT("Select the parent page first!")); 
 739         static unsigned s_subPageAdded 
= 0; 
 740         currBook
->InsertSubPage
 
 746                      ADDED_SUB_PAGE_NAME 
wxT("%u"), 
 750                     GetIconIndex(currBook
) 
 755 void MyFrame::OnAddPageBefore(wxCommandEvent
& WXUNUSED(event
)) 
 757     wxBookCtrlBase 
*currBook 
= GetCurrentBook(); 
 760         const int selPos 
= currBook
->GetSelection(); 
 761         if ( selPos 
== wxNOT_FOUND 
) 
 763             wxLogError(wxT("Select the parent page first!")); 
 767         static unsigned s_subPageAdded 
= 0; 
 768         currBook
->InsertPage(selPos
, 
 772                                 ADDED_PAGE_NAME_BEFORE 
wxT("%u"), 
 776                              GetIconIndex(currBook
)); 
 779 #endif // wxUSE_TREEBOOK 
 781 void MyFrame::OnInsertPage(wxCommandEvent
& WXUNUSED(event
)) 
 783     static unsigned s_pageIns 
= 0; 
 785     wxBookCtrlBase 
*currBook 
= GetCurrentBook(); 
 789         wxPanel 
*panel 
= CreateUserCreatedPage( currBook 
); 
 791         currBook
->InsertPage( 0, panel
, 
 792             wxString::Format(INSERTED_PAGE_NAME 
wxT("%u"), ++s_pageIns
), false, 
 793             GetIconIndex(currBook
) ); 
 795         currBook
->SetSelection(0); 
 799 void MyFrame::OnDeleteCurPage(wxCommandEvent
& WXUNUSED(event
)) 
 801     wxBookCtrlBase 
*currBook 
= GetCurrentBook(); 
 805         int sel 
= currBook
->GetSelection(); 
 807         if (sel 
!= wxNOT_FOUND
) 
 809             currBook
->DeletePage(sel
); 
 814 void MyFrame::OnDeleteLastPage(wxCommandEvent
& WXUNUSED(event
)) 
 816     wxBookCtrlBase 
*currBook 
= GetCurrentBook(); 
 820         int page 
= currBook
->GetPageCount(); 
 824             currBook
->DeletePage(page 
- 1); 
 829 void MyFrame::OnNextPage(wxCommandEvent
& WXUNUSED(event
)) 
 831     wxBookCtrlBase 
*currBook 
= GetCurrentBook(); 
 835         currBook
->AdvanceSelection(); 
 839 void MyFrame::OnGoHome(wxCommandEvent
& WXUNUSED(event
)) 
 841     wxBookCtrlBase 
*currBook 
= GetCurrentBook(); 
 845         // ChangeSelection shouldn't send any events, SetSelection() should 
 846         currBook
->ChangeSelection(0); 
 847         //currBook->SetSelection(0); 
 851 void MyFrame::OnIdle( wxIdleEvent
& WXUNUSED(event
) ) 
 853     static int s_nPages 
= wxNOT_FOUND
; 
 854     static int s_nSel 
= wxNOT_FOUND
; 
 855     static wxBookCtrlBase 
*s_currBook 
= NULL
; 
 857     wxBookCtrlBase 
*currBook 
= GetCurrentBook(); 
 859     int nPages 
= currBook 
? currBook
->GetPageCount() : 0; 
 860     int nSel 
= currBook 
? currBook
->GetSelection() : wxNOT_FOUND
; 
 862     if ( nPages 
!= s_nPages 
|| nSel 
!= s_nSel 
|| s_currBook 
!= currBook 
) 
 866         s_currBook 
= currBook
; 
 869         if ( nSel 
== wxNOT_FOUND 
) 
 870             selection 
<< wxT("not found"); 
 875         title
.Printf(wxT("Notebook and friends (%d pages, selection: %s)"), nPages
, selection
.c_str()); 
 881 void MyFrame::OnBookCtrl(wxBookCtrlBaseEvent
& event
) 
 883     static const struct EventInfo
 
 885         wxEventType typeChanged
, 
 892             wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
, 
 893             wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING
, 
 896 #endif // wxUSE_NOTEBOOK 
 899             wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED
, 
 900             wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING
, 
 903 #endif // wxUSE_LISTBOOK 
 906             wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED
, 
 907             wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING
, 
 910 #endif // wxUSE_CHOICEBOOK 
 913             wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED
, 
 914             wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING
, 
 917 #endif // wxUSE_TREEBOOK 
 920             wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED
, 
 921             wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING
, 
 924 #endif // wxUSE_TOOLBOOK 
 931     const wxEventType eventType 
= event
.GetEventType(); 
 932     for ( size_t n 
= 0; n 
< WXSIZEOF(events
); n
++ ) 
 934         const EventInfo
& ei 
= events
[n
]; 
 935         if ( eventType 
== ei
.typeChanged 
) 
 937             nameEvent 
= wxT("Changed"); 
 939         else if ( eventType 
== ei
.typeChanging 
) 
 941             const int idx 
= event
.GetOldSelection(); 
 943             // NB: can't use wxStaticCast here as wxBookCtrlBase is not in 
 945             const wxBookCtrlBase 
* const 
 946                 book 
= static_cast<wxBookCtrlBase 
*>(event
.GetEventObject()); 
 947             if ( idx 
!= wxNOT_FOUND 
&& 
 948                     book 
&& book
->GetPageText(idx
) == VETO_PAGE_NAME 
) 
 952                       wxT("Are you sure you want to leave this page?\n") 
 953                       wxT("(This demonstrates veto-ing)"), 
 954                       wxT("Notebook sample"), 
 955                       wxICON_QUESTION 
| wxYES_NO
, 
 960                     veto 
= wxT(" (vetoed)"); 
 964             nameEvent 
= wxT("Changing"); 
 966         else // skip end of the loop 
 971         nameControl 
= ei
.name
; 
 975     static int s_num 
= 0; 
 977     wxLogMessage(wxT("Event #%d: %s: %s (%d) new sel %d, old %d%s"), 
 982                  event
.GetSelection(), 
 983                  event
.GetOldSelection(), 
 987     m_text
->SetInsertionPointEnd();