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 wxWindows team
9 // License: wxWindows license
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"
31 // Create the main window
32 MyFrame
*frame
= new MyFrame( wxT("Notebook sample") );
34 // Problem with generic wxNotebook implementation whereby it doesn't size
35 // properly unless you set the size again
36 #if defined(__WXMOTIF__)
38 frame
->GetSize(& width
, & height
);
39 frame
->SetSize(-1, -1, width
, height
);
47 MyNotebook::MyNotebook(wxWindow
*parent
, wxWindowID id
,
48 const wxPoint
& pos
, const wxSize
& size
, long style
)
49 : wxNotebook(parent
, id
, pos
, size
, style
)
54 wxPanel
*MyNotebook::CreatePage(const wxString
&pageName
)
58 pageName
.Contains(INSERTED_PAGE_NAME
)
59 || pageName
.Contains(ADDED_PAGE_NAME
)
62 return CreateUserCreatedPage();
65 if (pageName
== I_WAS_INSERTED_PAGE_NAME
)
67 return CreateInsertPage();
70 if (pageName
== VETO_PAGE_NAME
)
72 return CreateVetoPage();
75 if (pageName
== RADIOBUTTONS_PAGE_NAME
)
77 return CreateRadioButtonsPage();
81 if (pageName
== MAXIMIZED_BUTTON_PAGE_NAME
)
83 return CreateBigButtonPage();
88 return (wxPanel
*) NULL
;
91 wxPanel
*MyNotebook::CreateUserCreatedPage()
93 wxPanel
*panel
= new wxPanel(this);
95 (void) new wxButton( panel
, -1, wxT("Button"),
96 wxPoint(10, 10), wxSize(-1, -1) );
101 wxPanel
*MyNotebook::CreateRadioButtonsPage()
103 wxPanel
*panel
= new wxPanel(this);
105 wxString animals
[] = { wxT("Fox"), wxT("Hare"), wxT("Rabbit"),
106 wxT("Sabre-toothed tiger"), wxT("T Rex") };
108 wxRadioBox
*radiobox1
= new wxRadioBox(panel
, -1, wxT("Choose one"),
109 wxDefaultPosition
, wxDefaultSize
, 5, animals
, 2, wxRA_SPECIFY_ROWS
);
111 wxString computers
[] = { wxT("Amiga"), wxT("Commodore 64"), wxT("PET"),
114 wxRadioBox
*radiobox2
= new wxRadioBox(panel
, -1,
115 wxT("Choose your favourite"), wxDefaultPosition
, wxDefaultSize
,
116 4, computers
, 0, wxRA_SPECIFY_COLS
);
118 wxBoxSizer
*sizerPanel
= new wxBoxSizer(wxVERTICAL
);
119 sizerPanel
->Add(radiobox1
, 2, wxEXPAND
);
120 sizerPanel
->Add(radiobox2
, 1, wxEXPAND
);
121 panel
->SetSizer(sizerPanel
);
126 wxPanel
*MyNotebook::CreateVetoPage()
128 wxPanel
*panel
= new wxPanel(this);
130 (void) new wxStaticText( panel
, -1,
131 wxT("This page intentionally left blank"), wxPoint(10, 10) );
136 wxPanel
*MyNotebook::CreateBigButtonPage()
138 wxPanel
*panel
= new wxPanel(this);
140 wxButton
*buttonBig
= new wxButton( panel
, -1, wxT("Maximized button"),
141 wxPoint(0, 0), wxSize(480, 360) );
143 wxBoxSizer
*sizerPanel
= new wxBoxSizer(wxVERTICAL
);
144 sizerPanel
->Add(buttonBig
, 1, wxEXPAND
);
145 panel
->SetSizer(sizerPanel
);
151 wxPanel
*MyNotebook::CreateInsertPage()
153 wxPanel
*panel
= new wxPanel(this);
155 panel
->SetBackgroundColour( wxColour( wxT("MAROON") ) );
156 (void) new wxStaticText( panel
, -1,
157 wxT("This page has been inserted, not added."), wxPoint(10, 10) );
162 void MyNotebook::CreateInitialPages()
164 // Create and add some panels to the notebook
166 wxPanel
*panel
= CreateRadioButtonsPage();
167 AddPage( panel
, RADIOBUTTONS_PAGE_NAME
, FALSE
, GetIconIndex() );
169 panel
= CreateVetoPage();
170 AddPage( panel
, VETO_PAGE_NAME
, FALSE
, GetIconIndex() );
172 panel
= CreateBigButtonPage();
173 AddPage( panel
, MAXIMIZED_BUTTON_PAGE_NAME
, FALSE
, GetIconIndex() );
175 panel
= CreateInsertPage();
176 InsertPage( 0, panel
, I_WAS_INSERTED_PAGE_NAME
, FALSE
, GetIconIndex() );
182 int MyNotebook::GetIconIndex() const
186 int nImages
= m_imageList
->GetImageCount();
189 return GetPageCount() % nImages
;
196 MyFrame::MyFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
,
198 : wxFrame((wxWindow
*) NULL
, -1, title
, pos
, size
, style
)
200 m_panel
= (wxPanel
*) NULL
;
201 m_notebook
= (MyNotebook
*) NULL
;
203 // create a dummy image list with a few icons
204 wxSize
imageSize(32, 32);
207 = new wxImageList( imageSize
.GetWidth(), imageSize
.GetHeight() );
211 wxArtProvider::GetIcon(wxART_INFORMATION
, wxART_OTHER
, imageSize
)
216 wxArtProvider::GetIcon(wxART_QUESTION
, wxART_OTHER
, imageSize
)
221 wxArtProvider::GetIcon(wxART_WARNING
, wxART_OTHER
, imageSize
)
226 wxArtProvider::GetIcon(wxART_ERROR
, wxART_OTHER
, imageSize
)
229 m_panel
= new wxPanel(this, -1, wxDefaultPosition
, wxDefaultSize
,
230 wxTAB_TRAVERSAL
| wxCLIP_CHILDREN
| wxNO_BORDER
| wxNO_FULL_REPAINT_ON_RESIZE
);
232 // Create remaining controls
234 // must be in sync with Orient enum
235 wxString strOrientations
[] =
243 wxASSERT_MSG( WXSIZEOF(strOrientations
) == ORIENT_MAX
,
244 wxT("Forgot to update something") );
246 m_radioOrient
= new wxRadioBox
248 m_panel
, ID_RADIO_ORIENT
,
249 wxT("&Tab orientation"),
250 wxDefaultPosition
, wxDefaultSize
,
251 WXSIZEOF(strOrientations
), strOrientations
,
255 m_chkShowImages
= new wxCheckBox( m_panel
, ID_CHK_SHOWIMAGES
,
256 wxT("&Show images") );
257 #ifndef TEST_LISTBOOK
258 m_chkMultiLine
= new wxCheckBox( m_panel
, ID_CHK_MULTILINE
,
259 wxT("&Multiple lines") );
260 #endif // !TEST_LISTBOOK
262 m_btnAddPage
= new wxButton( m_panel
, ID_BTN_ADD_PAGE
, wxT("&Add page") );
264 m_btnInsertPage
= new wxButton( m_panel
, ID_BTN_INSERT_PAGE
,
265 wxT("&Insert page") );
267 m_btnDeleteCurPage
= new wxButton( m_panel
, ID_BTN_DELETE_CUR_PAGE
,
268 wxT("&Delete current page") );
270 m_btnDeleteLastPage
= new wxButton( m_panel
, ID_BTN_DELETE_LAST_PAGE
,
271 wxT("Delete las&t page") );
273 m_btnNextPage
= new wxButton( m_panel
, ID_BTN_NEXT_PAGE
,
276 m_btnExit
= new wxButton( m_panel
, wxID_OK
, wxT("&Exit") );
277 m_btnExit
->SetDefault();
279 m_text
= new wxTextCtrl(m_panel
, -1, wxEmptyString
,
280 wxDefaultPosition
, wxDefaultSize
, wxTE_MULTILINE
| wxTE_READONLY
);
282 m_logTargetOld
= wxLog::SetActiveTarget( new wxLogTextCtrl(m_text
) );
285 m_sizerFrame
= new wxBoxSizer(wxVERTICAL
);
287 m_sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
289 wxBoxSizer
*sizerLeft
= new wxBoxSizer(wxVERTICAL
);
290 sizerLeft
->Add(m_radioOrient
, 0, wxEXPAND
);
291 sizerLeft
->Add(m_chkShowImages
, 0, wxEXPAND
| wxTOP
, 4);
292 #ifndef TEST_LISTBOOK
293 sizerLeft
->Add(m_chkMultiLine
, 0, wxEXPAND
| wxTOP
, 4);
294 #endif // !TEST_LISTBOOK
296 sizerLeft
->Add(0, 0, 1); // Spacer
298 sizerLeft
->Add(m_btnAddPage
, 0, wxEXPAND
| (wxTOP
| wxBOTTOM
), 4);
299 sizerLeft
->Add(m_btnInsertPage
, 0, wxEXPAND
| (wxTOP
| wxBOTTOM
), 4);
300 sizerLeft
->Add(m_btnDeleteCurPage
, 0, wxEXPAND
| (wxTOP
| wxBOTTOM
), 4);
301 sizerLeft
->Add(m_btnDeleteLastPage
, 0, wxEXPAND
| (wxTOP
| wxBOTTOM
), 4);
302 sizerLeft
->Add(m_btnNextPage
, 0, wxEXPAND
| (wxTOP
| wxBOTTOM
), 4);
304 sizerLeft
->Add(0, 0, 1); // Spacer
306 sizerLeft
->Add(m_btnExit
, 0, wxEXPAND
);
308 m_sizerTop
->Add(sizerLeft
, 0, wxEXPAND
| wxALL
, 4);
311 m_sizerFrame
->Add(m_sizerTop
, 1, wxEXPAND
);
312 m_sizerFrame
->Add(m_text
, 0, wxEXPAND
);
315 m_notebook
->CreateInitialPages();
317 m_panel
->SetSizer(m_sizerFrame
);
319 m_panel
->SetAutoLayout(TRUE
);
321 m_sizerFrame
->Fit(this);
329 delete wxLog::SetActiveTarget(m_logTargetOld
);
334 m_imageList
= (wxImageList
*) NULL
;
339 void MyFrame::ReInitNotebook()
343 switch ( m_radioOrient
->GetSelection() )
346 wxFAIL_MSG( wxT("unknown notebook orientation") );
366 #ifndef TEST_LISTBOOK
367 if ( m_chkMultiLine
->IsChecked() )
368 flags
|= wxNB_MULTILINE
;
369 #endif // !TEST_LISTBOOK
371 MyNotebook
*notebook
= m_notebook
;
373 m_notebook
= new MyNotebook(m_panel
, ID_NOTEBOOK
,
374 wxDefaultPosition
, wxDefaultSize
,
377 if ( m_chkShowImages
->IsChecked() )
379 m_notebook
->SetImageList(m_imageList
);
384 int sel
= notebook
->GetSelection();
386 int count
= notebook
->GetPageCount();
387 for (int n
= 0; n
< count
; n
++)
389 wxString str
= notebook
->GetPageText(n
);
391 wxWindow
*page
= m_notebook
->CreatePage(str
);
392 m_notebook
->AddPage(page
, str
, FALSE
, m_notebook
->GetIconIndex() );
397 m_sizerTop
->Remove(m_sizerNotebook
);
405 m_notebook
->SetSelection(sel
);
411 m_sizerNotebook
= new wxBookCtrlSizer(m_notebook
);
412 m_sizerTop
->Add(m_sizerNotebook
, 1, wxEXPAND
| wxALL
, 4);
413 m_sizerTop
->Layout();
416 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
417 EVT_RADIOBOX(ID_RADIO_ORIENT
, MyFrame::OnCheckOrRadioBox
)
418 EVT_CHECKBOX(ID_CHK_SHOWIMAGES
, MyFrame::OnCheckOrRadioBox
)
419 #ifndef TEST_LISTBOOK
420 EVT_CHECKBOX(ID_CHK_MULTILINE
, MyFrame::OnCheckOrRadioBox
)
421 #endif // !TEST_LISTBOOK
423 EVT_BUTTON(ID_BTN_ADD_PAGE
, MyFrame::OnButtonAddPage
)
424 EVT_BUTTON(ID_BTN_INSERT_PAGE
, MyFrame::OnButtonInsertPage
)
425 EVT_BUTTON(ID_BTN_DELETE_CUR_PAGE
, MyFrame::OnButtonDeleteCurPage
)
426 EVT_BUTTON(ID_BTN_DELETE_LAST_PAGE
, MyFrame::OnButtonDeleteLastPage
)
427 EVT_BUTTON(ID_BTN_NEXT_PAGE
, MyFrame::OnButtonNextPage
)
428 EVT_BUTTON(wxID_OK
, MyFrame::OnButtonExit
)
430 EVT_UPDATE_UI(ID_BTN_DELETE_CUR_PAGE
, MyFrame::OnUpdateUIBtnDeleteCurPage
)
431 EVT_UPDATE_UI(ID_BTN_DELETE_LAST_PAGE
, MyFrame::OnUpdateUIBtnDeleteLastPage
)
433 EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK
, MyFrame::OnNotebook
)
434 EVT_NOTEBOOK_PAGE_CHANGING(ID_NOTEBOOK
, MyFrame::OnNotebook
)
436 EVT_IDLE(MyFrame::OnIdle
)
439 void MyFrame::OnCheckOrRadioBox(wxCommandEvent
& WXUNUSED(event
))
444 void MyFrame::OnButtonAddPage( wxCommandEvent
& WXUNUSED(event
) )
446 static unsigned s_pageAdded
= 0;
448 wxPanel
*panel
= new wxPanel( m_notebook
, -1 );
449 (void) new wxButton( panel
, -1, wxT("First button"),
450 wxPoint(10, 10), wxSize(-1, -1) );
451 (void) new wxButton( panel
, -1, wxT("Second button"),
452 wxPoint(50, 100), wxSize(-1, -1) );
454 m_notebook
->AddPage(panel
, wxString::Format(ADDED_PAGE_NAME
wxT("%u"),
455 ++s_pageAdded
), TRUE
, m_notebook
->GetIconIndex() );
458 void MyFrame::OnButtonInsertPage( wxCommandEvent
& WXUNUSED(event
) )
460 static unsigned s_pageIns
= 0;
462 wxPanel
*panel
= m_notebook
->CreateUserCreatedPage();
464 m_notebook
->InsertPage( 0, panel
,
465 wxString::Format(INSERTED_PAGE_NAME
wxT("%u"), ++s_pageIns
), FALSE
,
466 m_notebook
->GetIconIndex() );
468 m_notebook
->SetSelection(0);
471 void MyFrame::OnButtonDeleteLastPage( wxCommandEvent
& WXUNUSED(event
) )
473 int page
= m_notebook
->GetPageCount();
477 m_notebook
->DeletePage(page
- 1);
481 void MyFrame::OnButtonDeleteCurPage( wxCommandEvent
& WXUNUSED(event
) )
483 int sel
= m_notebook
->GetSelection();
487 m_notebook
->DeletePage(sel
);
491 void MyFrame::OnButtonNextPage( wxCommandEvent
& WXUNUSED(event
) )
493 m_notebook
->AdvanceSelection();
496 void MyFrame::OnButtonExit( wxCommandEvent
& WXUNUSED(event
) )
501 void MyFrame::OnNotebook(wxNotebookEvent
& event
)
503 wxString str
= wxT("Unknown notebook event");
505 wxEventType eventType
= event
.GetEventType();
507 if (eventType
== wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
)
509 str
= wxT("Notebook changed");
511 else if (eventType
== wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING
)
513 int idx
= event
.GetOldSelection();
514 if ( idx
!= -1 && m_notebook
->GetPageText(idx
) == VETO_PAGE_NAME
)
519 wxT("Are you sure you want to leave this notebook page?\n")
520 wxT("(This demonstrates veto-ing)"),
521 wxT("Notebook sample"),
522 wxICON_QUESTION
| wxYES_NO
, this) != wxYES
)
531 str
= wxT("Notebook changing");
534 static int s_numNotebookEvents
= 0;
536 wxLogMessage(wxT("Notebook event #%d: %s (%d)"),
537 s_numNotebookEvents
++, str
.c_str(), eventType
);
539 m_text
->SetInsertionPointEnd();
544 void MyFrame::OnIdle( wxIdleEvent
& WXUNUSED(event
) )
546 static int s_nPages
= -1;
547 static int s_nSel
= -1;
549 int nPages
= m_notebook
->GetPageCount();
550 int nSel
= m_notebook
->GetSelection();
551 if ( nPages
!= s_nPages
|| nSel
!= s_nSel
)
557 title
.Printf(wxT("Notebook (%d pages, selection: %d)"), nPages
, nSel
);
563 void MyFrame::OnUpdateUIBtnDeleteCurPage(wxUpdateUIEvent
& event
)
565 event
.Enable( m_notebook
->GetSelection() != -1 );
568 void MyFrame::OnUpdateUIBtnDeleteLastPage(wxUpdateUIEvent
& event
)
570 event
.Enable( m_notebook
->GetPageCount() != 0 );