home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / samples / notebook / notebook.cpp < prev    next >
C/C++ Source or Header  |  2002-11-14  |  15KB  |  565 lines

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