1/////////////////////////////////////////////////////////////////////////////
2// Program:     wxWidgets Widgets Sample
3// Name:        notebook.cpp
4// Purpose:     Part of the widgets sample showing book controls
5// Author:      Vadim Zeitlin, Wlodzimierz ABX Skiba
6// Created:     06.04.01
7// Id:          $Id: notebook.cpp 51519 2008-02-03 13:48:11Z VZ $
8// Copyright:   (c) 2001 Vadim Zeitlin, 2006 Wlodzimierz Skiba
9// License:     wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// for compilers that support precompilation, includes "wx/wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24    #pragma hdrstop
25#endif
26
27#if wxUSE_BOOKCTRL
28
29// for all others, include the necessary headers
30#ifndef WX_PRECOMP
31    #include "wx/app.h"
32    #include "wx/log.h"
33
34    #include "wx/button.h"
35    #include "wx/checkbox.h"
36    #include "wx/combobox.h"
37    #include "wx/radiobox.h"
38    #include "wx/statbox.h"
39    #include "wx/textctrl.h"
40
41    #include "wx/dynarray.h"
42#endif
43
44#include "wx/sizer.h"
45#include "wx/bookctrl.h"
46#include "wx/artprov.h"
47#include "wx/imaglist.h"
48
49#include "widgets.h"
50
51// ----------------------------------------------------------------------------
52// constants
53// ----------------------------------------------------------------------------
54
55// control ids
56enum
57{
58    BookPage_Reset = wxID_HIGHEST,
59    BookPage_SelectPage,
60    BookPage_AddPage,
61    BookPage_InsertPage,
62    BookPage_RemovePage,
63    BookPage_DeleteAll,
64    BookPage_InsertText,
65    BookPage_RemoveText,
66    BookPage_SelectText,
67    BookPage_NumPagesText,
68    BookPage_CurSelectText,
69    BookPage_Book
70};
71
72// book orientations
73enum Orient
74{
75    Orient_Top,
76    Orient_Bottom,
77    Orient_Left,
78    Orient_Right,
79    Orient_Max
80};
81
82// ----------------------------------------------------------------------------
83// BookWidgetsPage
84// ----------------------------------------------------------------------------
85
86class BookWidgetsPage : public WidgetsPage
87{
88public:
89    BookWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist, const char* icon[]);
90    virtual ~BookWidgetsPage();
91
92    virtual wxControl *GetWidget() const { return m_book; }
93    virtual void RecreateWidget() { RecreateBook(); }
94
95    // lazy creation of the content
96    virtual void CreateContent();
97
98protected:
99    // event handlers
100    void OnButtonReset(wxCommandEvent& event);
101    void OnButtonDeleteAll(wxCommandEvent& event);
102    void OnButtonSelectPage(wxCommandEvent& event);
103    void OnButtonAddPage(wxCommandEvent& event);
104    void OnButtonInsertPage(wxCommandEvent& event);
105    void OnButtonRemovePage(wxCommandEvent& event);
106
107    void OnCheckOrRadioBox(wxCommandEvent& event);
108
109    void OnUpdateUINumPagesText(wxUpdateUIEvent& event);
110    void OnUpdateUICurSelectText(wxUpdateUIEvent& event);
111
112    void OnUpdateUISelectButton(wxUpdateUIEvent& event);
113    void OnUpdateUIInsertButton(wxUpdateUIEvent& event);
114    void OnUpdateUIRemoveButton(wxUpdateUIEvent& event);
115
116    void OnUpdateUIResetButton(wxUpdateUIEvent& event);
117
118    // reset book parameters
119    void Reset();
120
121    // (re)create book
122    void RecreateBook();
123    virtual wxBookCtrlBase *CreateBook(long flags) = 0;
124
125#if USE_ICONS_IN_BOOK
126    // create or destroy the image list
127    void CreateImageList();
128#endif // USE_ICONS_IN_BOOK
129
130    // create a new page
131    wxWindow *CreateNewPage();
132
133    // get the image index for the new page
134    int GetIconIndex() const;
135
136    // get the numeric value of text ctrl
137    int GetTextValue(wxTextCtrl *text) const;
138
139    // is the value in range?
140    bool IsValidValue(int val) const
141        { return (val >= 0) && (val < (int) m_book->GetPageCount()); }
142
143    // the controls
144    // ------------
145
146    // the check/radio boxes for styles
147    wxCheckBox *m_chkImages;
148    wxRadioBox *m_radioOrient;
149
150    // the text controls containing input for various commands
151    wxTextCtrl *m_textInsert,
152               *m_textRemove,
153               *m_textSelect;
154
155    // the book itself and the sizer it is in
156    wxBookCtrlBase *m_book;
157    wxSizer *m_sizerBook;
158
159#if USE_ICONS_IN_BOOK
160    // the image list for our book
161    wxImageList *m_imageList;
162#endif // USE_ICONS_IN_BOOK
163
164private:
165    DECLARE_EVENT_TABLE()
166};
167
168// ----------------------------------------------------------------------------
169// event tables
170// ----------------------------------------------------------------------------
171
172BEGIN_EVENT_TABLE(BookWidgetsPage, WidgetsPage)
173    EVT_BUTTON(BookPage_Reset, BookWidgetsPage::OnButtonReset)
174    EVT_BUTTON(BookPage_SelectPage, BookWidgetsPage::OnButtonSelectPage)
175    EVT_BUTTON(BookPage_AddPage, BookWidgetsPage::OnButtonAddPage)
176    EVT_BUTTON(BookPage_InsertPage, BookWidgetsPage::OnButtonInsertPage)
177    EVT_BUTTON(BookPage_RemovePage, BookWidgetsPage::OnButtonRemovePage)
178    EVT_BUTTON(BookPage_DeleteAll, BookWidgetsPage::OnButtonDeleteAll)
179
180    EVT_UPDATE_UI(BookPage_NumPagesText, BookWidgetsPage::OnUpdateUINumPagesText)
181    EVT_UPDATE_UI(BookPage_CurSelectText, BookWidgetsPage::OnUpdateUICurSelectText)
182
183    EVT_UPDATE_UI(BookPage_SelectPage, BookWidgetsPage::OnUpdateUISelectButton)
184    EVT_UPDATE_UI(BookPage_InsertPage, BookWidgetsPage::OnUpdateUIInsertButton)
185    EVT_UPDATE_UI(BookPage_RemovePage, BookWidgetsPage::OnUpdateUIRemoveButton)
186
187    EVT_CHECKBOX(wxID_ANY, BookWidgetsPage::OnCheckOrRadioBox)
188    EVT_RADIOBOX(wxID_ANY, BookWidgetsPage::OnCheckOrRadioBox)
189END_EVENT_TABLE()
190
191// ============================================================================
192// implementation
193// ============================================================================
194
195BookWidgetsPage::BookWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist, const char* icon[])
196                :WidgetsPage(book, imaglist, icon)
197{
198    // init everything
199    m_chkImages = NULL;
200#if USE_ICONS_IN_BOOK
201    m_imageList = NULL;
202#endif // USE_ICONS_IN_BOOK
203
204    m_book = NULL;
205    m_radioOrient = NULL;
206    m_sizerBook = (wxSizer *)NULL;
207}
208
209void BookWidgetsPage::CreateContent()
210{
211    wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
212
213    // left pane
214    wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style"));
215
216    // must be in sync with Orient enum
217    wxArrayString orientations;
218    orientations.Add(_T("&top"));
219    orientations.Add(_T("&bottom"));
220    orientations.Add(_T("&left"));
221    orientations.Add(_T("&right"));
222
223    wxASSERT_MSG( orientations.GetCount() == Orient_Max,
224                  _T("forgot to update something") );
225
226    m_chkImages = new wxCheckBox(this, wxID_ANY, _T("Show &images"));
227    m_radioOrient = new wxRadioBox(this, wxID_ANY, _T("&Tab orientation"),
228                                   wxDefaultPosition, wxDefaultSize,
229                                   orientations, 1, wxRA_SPECIFY_COLS);
230
231    wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
232
233    sizerLeft->Add(m_chkImages, 0, wxALL, 5);
234    sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
235    sizerLeft->Add(m_radioOrient, 0, wxALL, 5);
236
237    wxButton *btn = new wxButton(this, BookPage_Reset, _T("&Reset"));
238    sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
239
240    // middle pane
241    wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, _T("&Contents"));
242    wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
243
244    wxTextCtrl *text;
245    wxSizer *sizerRow = CreateSizerWithTextAndLabel(_T("Number of pages: "),
246                                                    BookPage_NumPagesText,
247                                                    &text);
248    text->SetEditable(false);
249    sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
250
251    sizerRow = CreateSizerWithTextAndLabel(_T("Current selection: "),
252                                           BookPage_CurSelectText,
253                                           &text);
254    text->SetEditable(false);
255    sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
256
257    sizerRow = CreateSizerWithTextAndButton(BookPage_SelectPage,
258                                            _T("&Select page"),
259                                            BookPage_SelectText,
260                                            &m_textSelect);
261    sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
262
263    btn = new wxButton(this, BookPage_AddPage, _T("&Add page"));
264    sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
265
266    sizerRow = CreateSizerWithTextAndButton(BookPage_InsertPage,
267                                            _T("&Insert page at"),
268                                            BookPage_InsertText,
269                                            &m_textInsert);
270    sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
271
272    sizerRow = CreateSizerWithTextAndButton(BookPage_RemovePage,
273                                            _T("&Remove page"),
274                                            BookPage_RemoveText,
275                                            &m_textRemove);
276    sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
277
278    btn = new wxButton(this, BookPage_DeleteAll, _T("&Delete All"));
279    sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
280
281    // right pane
282    m_sizerBook = new wxBoxSizer(wxHORIZONTAL);
283
284    // the 3 panes compose the window
285    sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
286    sizerTop->Add(sizerMiddle, 0, wxGROW | wxALL, 10);
287    sizerTop->Add(m_sizerBook, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
288
289    RecreateBook();
290
291    // final initializations
292    Reset();
293#if USE_ICONS_IN_BOOK
294    CreateImageList();
295#endif // USE_ICONS_IN_BOOK
296
297    SetSizer(sizerTop);
298}
299
300BookWidgetsPage::~BookWidgetsPage()
301{
302#if USE_ICONS_IN_BOOK
303    delete m_imageList;
304#endif // USE_ICONS_IN_BOOK
305}
306
307// ----------------------------------------------------------------------------
308// operations
309// ----------------------------------------------------------------------------
310
311void BookWidgetsPage::Reset()
312{
313    m_chkImages->SetValue(true);
314    m_radioOrient->SetSelection(Orient_Top);
315}
316
317#if USE_ICONS_IN_BOOK
318void BookWidgetsPage::CreateImageList()
319{
320    if ( m_chkImages->GetValue() )
321    {
322        if ( !m_imageList )
323        {
324            // create a dummy image list with a few icons
325            m_imageList = new wxImageList(32, 32);
326            wxSize size(32, 32);
327            m_imageList->Add(wxArtProvider::GetIcon(wxART_INFORMATION, wxART_OTHER, size));
328            m_imageList->Add(wxArtProvider::GetIcon(wxART_QUESTION, wxART_OTHER, size));
329            m_imageList->Add(wxArtProvider::GetIcon(wxART_WARNING, wxART_OTHER, size));
330            m_imageList->Add(wxArtProvider::GetIcon(wxART_ERROR, wxART_OTHER, size));
331        }
332
333        if ( m_book )
334            m_book->SetImageList(m_imageList);
335    }
336    else // no images
337    {
338        if ( m_imageList )
339        {
340            delete m_imageList;
341            m_imageList = NULL;
342        }
343    }
344
345    // because of the bug in wxMSW we can't use SetImageList(NULL) - although
346    // it would be logical if this removed the image list from book, under
347    // MSW it crashes instead - FIXME
348}
349#endif // USE_ICONS_IN_BOOK
350
351void BookWidgetsPage::RecreateBook()
352{
353    // do not recreate anything in case page content was not prepared yet
354    if(!m_radioOrient)
355        return;
356
357    int flags = ms_defaultFlags;
358
359    switch ( m_radioOrient->GetSelection() )
360    {
361        default:
362            wxFAIL_MSG( _T("unknown orientation") );
363            // fall through
364
365        case Orient_Top:
366            flags |= wxBK_TOP;
367            break;
368
369        case Orient_Bottom:
370            flags |= wxBK_BOTTOM;
371            break;
372
373        case Orient_Left:
374            flags |= wxBK_LEFT;
375            break;
376
377        case Orient_Right:
378            flags |= wxBK_RIGHT;
379            break;
380    }
381
382    wxBookCtrlBase *oldBook = m_book;
383
384    m_book = CreateBook(flags);
385
386#if USE_ICONS_IN_BOOK
387    CreateImageList();
388#endif // USE_ICONS_IN_BOOK
389
390    if ( oldBook )
391    {
392        const int sel = oldBook->GetSelection();
393
394        const int count = oldBook->GetPageCount();
395
396        // recreate the pages
397        for ( int n = 0; n < count; n++ )
398        {
399            m_book->AddPage(CreateNewPage(),
400                            oldBook->GetPageText(n),
401                            false,
402                            m_chkImages->GetValue() ?
403                            GetIconIndex() : -1);
404        }
405
406        m_sizerBook->Detach( oldBook );
407        delete oldBook;
408
409        // restore selection
410        if ( sel != -1 )
411        {
412            m_book->SetSelection(sel);
413        }
414    }
415
416    m_sizerBook->Add(m_book, 1, wxGROW | wxALL, 5);
417    m_sizerBook->SetMinSize(150, 0);
418    m_sizerBook->Layout();
419}
420
421// ----------------------------------------------------------------------------
422// helpers
423// ----------------------------------------------------------------------------
424
425int BookWidgetsPage::GetTextValue(wxTextCtrl *text) const
426{
427    long pos = -1;
428
429    if ( !text || !text->GetValue().ToLong(&pos) )
430        pos = -1;
431
432    return (int)pos;
433}
434
435int BookWidgetsPage::GetIconIndex() const
436{
437#if USE_ICONS_IN_BOOK
438    if ( m_imageList )
439    {
440       int nImages = m_imageList->GetImageCount();
441       if ( nImages > 0 )
442       {
443           return m_book->GetPageCount() % nImages;
444       }
445    }
446#endif // USE_ICONS_IN_BOOK
447
448    return -1;
449}
450
451wxWindow *BookWidgetsPage::CreateNewPage()
452{
453    return new wxTextCtrl(m_book, wxID_ANY, _T("I'm a book page"));
454}
455
456// ----------------------------------------------------------------------------
457// event handlers
458// ----------------------------------------------------------------------------
459
460void BookWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
461{
462    Reset();
463
464    RecreateBook();
465}
466
467void BookWidgetsPage::OnButtonDeleteAll(wxCommandEvent& WXUNUSED(event))
468{
469    m_book->DeleteAllPages();
470}
471
472void BookWidgetsPage::OnButtonSelectPage(wxCommandEvent& WXUNUSED(event))
473{
474    int pos = GetTextValue(m_textSelect);
475    wxCHECK_RET( IsValidValue(pos), _T("button should be disabled") );
476
477    m_book->SetSelection(pos);
478}
479
480void BookWidgetsPage::OnButtonAddPage(wxCommandEvent& WXUNUSED(event))
481{
482    m_book->AddPage(CreateNewPage(), _T("Added page"), false,
483                    GetIconIndex());
484}
485
486void BookWidgetsPage::OnButtonInsertPage(wxCommandEvent& WXUNUSED(event))
487{
488    int pos = GetTextValue(m_textInsert);
489    wxCHECK_RET( IsValidValue(pos), _T("button should be disabled") );
490
491    m_book->InsertPage(pos, CreateNewPage(), _T("Inserted page"), false,
492                       GetIconIndex());
493}
494
495void BookWidgetsPage::OnButtonRemovePage(wxCommandEvent& WXUNUSED(event))
496{
497    int pos = GetTextValue(m_textRemove);
498    wxCHECK_RET( IsValidValue(pos), _T("button should be disabled") );
499
500    m_book->DeletePage(pos);
501}
502
503void BookWidgetsPage::OnUpdateUISelectButton(wxUpdateUIEvent& event)
504{
505    event.Enable( IsValidValue(GetTextValue(m_textSelect)) );
506}
507
508void BookWidgetsPage::OnUpdateUIInsertButton(wxUpdateUIEvent& event)
509{
510    event.Enable( IsValidValue(GetTextValue(m_textInsert)) );
511}
512
513void BookWidgetsPage::OnUpdateUIRemoveButton(wxUpdateUIEvent& event)
514{
515    event.Enable( IsValidValue(GetTextValue(m_textRemove)) );
516}
517
518void BookWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
519{
520    if(m_chkImages && m_radioOrient)
521        event.Enable( !m_chkImages->GetValue() ||
522                      m_radioOrient->GetSelection() != wxBK_TOP );
523}
524
525void BookWidgetsPage::OnUpdateUINumPagesText(wxUpdateUIEvent& event)
526{
527    if(m_book)
528        event.SetText( wxString::Format(_T("%u"), unsigned(m_book->GetPageCount())) );
529}
530
531void BookWidgetsPage::OnUpdateUICurSelectText(wxUpdateUIEvent& event)
532{
533    if(m_book)
534        event.SetText( wxString::Format(_T("%d"), m_book->GetSelection()) );
535}
536
537void BookWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
538{
539    RecreateBook();
540}
541
542#if wxUSE_NOTEBOOK
543
544#include "icons/notebook.xpm"
545#include "wx/notebook.h"
546
547// ----------------------------------------------------------------------------
548// NotebookWidgetsPage
549// ----------------------------------------------------------------------------
550
551class NotebookWidgetsPage : public BookWidgetsPage
552{
553public:
554    NotebookWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist)
555        : BookWidgetsPage(book, imaglist, notebook_xpm)
556    {
557        RecreateBook();
558    }
559    virtual ~NotebookWidgetsPage() {}
560
561protected:
562
563    // event handlers
564    void OnPageChanging(wxNotebookEvent& event);
565    void OnPageChanged(wxNotebookEvent& event);
566
567    // (re)create book
568    virtual wxBookCtrlBase *CreateBook(long flags)
569    {
570        return new wxNotebook(this, BookPage_Book,
571                              wxDefaultPosition, wxDefaultSize,
572                              flags);
573    }
574
575private:
576    DECLARE_EVENT_TABLE()
577    DECLARE_WIDGETS_PAGE(NotebookWidgetsPage)
578};
579
580// ----------------------------------------------------------------------------
581// event table
582// ----------------------------------------------------------------------------
583
584BEGIN_EVENT_TABLE(NotebookWidgetsPage, BookWidgetsPage)
585    EVT_NOTEBOOK_PAGE_CHANGING(wxID_ANY, NotebookWidgetsPage::OnPageChanging)
586    EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, NotebookWidgetsPage::OnPageChanged)
587END_EVENT_TABLE()
588
589#if defined(__WXUNIVERSAL__)
590    #define FAMILY_CTRLS UNIVERSAL_CTRLS
591#elif defined(__WXMOTIF__)
592    #define FAMILY_CTRLS GENERIC_CTRLS
593#else
594    #define FAMILY_CTRLS NATIVE_CTRLS
595#endif
596
597IMPLEMENT_WIDGETS_PAGE(NotebookWidgetsPage, _T("Notebook"),
598                       FAMILY_CTRLS | BOOK_CTRLS
599                       );
600
601void NotebookWidgetsPage::OnPageChanging(wxNotebookEvent& event)
602{
603    wxLogMessage(_T("Notebook page changing from %d to %d (currently %d)."),
604                 event.GetOldSelection(),
605                 event.GetSelection(),
606                 m_book->GetSelection());
607
608    event.Skip();
609}
610
611void NotebookWidgetsPage::OnPageChanged(wxNotebookEvent& event)
612{
613    wxLogMessage(_T("Notebook page changed from %d to %d (currently %d)."),
614                 event.GetOldSelection(),
615                 event.GetSelection(),
616                 m_book->GetSelection());
617
618    event.Skip();
619}
620
621#endif // wxUSE_NOTEBOOK
622
623#if wxUSE_LISTBOOK
624
625#include "icons/listbook.xpm"
626#include "wx/listbook.h"
627
628// ----------------------------------------------------------------------------
629// ListbookWidgetsPage
630// ----------------------------------------------------------------------------
631
632class ListbookWidgetsPage : public BookWidgetsPage
633{
634public:
635    ListbookWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist)
636        : BookWidgetsPage(book, imaglist, listbook_xpm)
637    {
638        RecreateBook();
639    }
640    virtual ~ListbookWidgetsPage() {}
641
642protected:
643
644    // event handlers
645    void OnPageChanging(wxListbookEvent& event);
646    void OnPageChanged(wxListbookEvent& event);
647
648    // (re)create book
649    virtual wxBookCtrlBase *CreateBook(long flags)
650    {
651        return new wxListbook(this, BookPage_Book,
652                              wxDefaultPosition, wxDefaultSize,
653                              flags);
654    }
655
656private:
657    DECLARE_EVENT_TABLE()
658    DECLARE_WIDGETS_PAGE(ListbookWidgetsPage)
659};
660
661// ----------------------------------------------------------------------------
662// event table
663// ----------------------------------------------------------------------------
664
665BEGIN_EVENT_TABLE(ListbookWidgetsPage, BookWidgetsPage)
666    EVT_LISTBOOK_PAGE_CHANGING(wxID_ANY, ListbookWidgetsPage::OnPageChanging)
667    EVT_LISTBOOK_PAGE_CHANGED(wxID_ANY, ListbookWidgetsPage::OnPageChanged)
668END_EVENT_TABLE()
669
670IMPLEMENT_WIDGETS_PAGE(ListbookWidgetsPage, _T("Listbook"),
671                       GENERIC_CTRLS | BOOK_CTRLS
672                       );
673
674void ListbookWidgetsPage::OnPageChanging(wxListbookEvent& event)
675{
676    wxLogMessage(_T("Listbook page changing from %d to %d (currently %d)."),
677                 event.GetOldSelection(),
678                 event.GetSelection(),
679                 m_book->GetSelection());
680
681    event.Skip();
682}
683
684void ListbookWidgetsPage::OnPageChanged(wxListbookEvent& event)
685{
686    wxLogMessage(_T("Listbook page changed from %d to %d (currently %d)."),
687                 event.GetOldSelection(),
688                 event.GetSelection(),
689                 m_book->GetSelection());
690
691    event.Skip();
692}
693
694#endif // wxUSE_LISTBOOK
695
696#if wxUSE_CHOICEBOOK
697
698#include "icons/choicebk.xpm"
699#include "wx/choicebk.h"
700
701// ----------------------------------------------------------------------------
702// ChoicebookWidgetsPage
703// ----------------------------------------------------------------------------
704
705class ChoicebookWidgetsPage : public BookWidgetsPage
706{
707public:
708    ChoicebookWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist)
709        : BookWidgetsPage(book, imaglist, choicebk_xpm)
710    {
711        RecreateBook();
712    }
713    virtual ~ChoicebookWidgetsPage() {}
714
715protected:
716
717    // event handlers
718    void OnPageChanging(wxChoicebookEvent& event);
719    void OnPageChanged(wxChoicebookEvent& event);
720
721    // (re)create book
722    virtual wxBookCtrlBase *CreateBook(long flags)
723    {
724        return new wxChoicebook(this, BookPage_Book,
725                                wxDefaultPosition, wxDefaultSize,
726                                flags);
727    }
728
729private:
730    DECLARE_EVENT_TABLE()
731    DECLARE_WIDGETS_PAGE(ChoicebookWidgetsPage)
732};
733
734// ----------------------------------------------------------------------------
735// event table
736// ----------------------------------------------------------------------------
737
738BEGIN_EVENT_TABLE(ChoicebookWidgetsPage, BookWidgetsPage)
739    EVT_CHOICEBOOK_PAGE_CHANGING(wxID_ANY, ChoicebookWidgetsPage::OnPageChanging)
740    EVT_CHOICEBOOK_PAGE_CHANGED(wxID_ANY, ChoicebookWidgetsPage::OnPageChanged)
741END_EVENT_TABLE()
742
743IMPLEMENT_WIDGETS_PAGE(ChoicebookWidgetsPage, _T("Choicebook"),
744                       GENERIC_CTRLS | BOOK_CTRLS
745                       );
746
747void ChoicebookWidgetsPage::OnPageChanging(wxChoicebookEvent& event)
748{
749    wxLogMessage(_T("Choicebook page changing from %d to %d (currently %d)."),
750                 event.GetOldSelection(),
751                 event.GetSelection(),
752                 m_book->GetSelection());
753
754    event.Skip();
755}
756
757void ChoicebookWidgetsPage::OnPageChanged(wxChoicebookEvent& event)
758{
759    wxLogMessage(_T("Choicebook page changed from %d to %d (currently %d)."),
760                 event.GetOldSelection(),
761                 event.GetSelection(),
762                 m_book->GetSelection());
763
764    event.Skip();
765}
766
767#endif // wxUSE_CHOICEBOOK
768
769#endif // wxUSE_BOOKCTRL
770