home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / samples / widgets / widgets.cpp < prev    next >
C/C++ Source or Header  |  2002-09-06  |  13KB  |  409 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Program:     wxWindows Widgets Sample
  3. // Name:        widgets.cpp
  4. // Purpose:     Sample showing most of the simple wxWindows widgets
  5. // Author:      Vadim Zeitlin
  6. // Created:     27.03.01
  7. // Id:          $Id: widgets.cpp,v 1.11 2002/09/06 19:45:26 JS Exp $
  8. // Copyright:   (c) 2001 Vadim Zeitlin
  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. // for all others, include the necessary headers
  28. #ifndef WX_PRECOMP
  29.     #include "wx/app.h"
  30.     #include "wx/log.h"
  31.     #include "wx/frame.h"
  32.     #include "wx/button.h"
  33.     #include "wx/checkbox.h"
  34.     #include "wx/listbox.h"
  35.     #include "wx/statbox.h"
  36.     #include "wx/stattext.h"
  37.     #include "wx/textctrl.h"
  38. #endif
  39.  
  40. #include "wx/notebook.h"
  41. #include "wx/sizer.h"
  42.  
  43. #include "widgets.h"
  44.  
  45. // ----------------------------------------------------------------------------
  46. // constants
  47. // ----------------------------------------------------------------------------
  48.  
  49. // control ids
  50. enum
  51. {
  52.     Widgets_ClearLog = 100,
  53.     Widgets_Quit
  54. };
  55.  
  56. // ----------------------------------------------------------------------------
  57. // our classes
  58. // ----------------------------------------------------------------------------
  59.  
  60. // Define a new application type, each program should derive a class from wxApp
  61. class WidgetsApp : public wxApp
  62. {
  63. public:
  64.     // override base class virtuals
  65.     // ----------------------------
  66.  
  67.     // this one is called on application startup and is a good place for the app
  68.     // initialization (doing it here and not in the ctor allows to have an error
  69.     // return: if OnInit() returns false, the application terminates)
  70.     virtual bool OnInit();
  71. };
  72.  
  73. // Define a new frame type: this is going to be our main frame
  74. class WidgetsFrame : public wxFrame
  75. {
  76. public:
  77.     // ctor(s) and dtor
  78.     WidgetsFrame(const wxString& title);
  79.     virtual ~WidgetsFrame();
  80.  
  81. protected:
  82.     // event handlers
  83.     void OnButtonClearLog(wxCommandEvent& event);
  84.     void OnButtonQuit(wxCommandEvent& event);
  85.  
  86.     // initialize the notebook: add all pages to it
  87.     void InitNotebook();
  88.  
  89. private:
  90.     // the panel containing everything
  91.     wxPanel *m_panel;
  92.  
  93.     // the listbox for logging messages
  94.     wxListBox *m_lboxLog;
  95.  
  96.     // the log target we use to redirect messages to the listbox
  97.     wxLog *m_logTarget;
  98.  
  99.     // the notebook containing the test pages
  100.     wxNotebook *m_notebook;
  101.  
  102.     // and the image list for it
  103.     wxImageList *m_imaglist;
  104.  
  105.     // any class wishing to process wxWindows events must use this macro
  106.     DECLARE_EVENT_TABLE()
  107. };
  108.  
  109. // A log target which just redirects the messages to a listbox
  110. class LboxLogger : public wxLog
  111. {
  112. public:
  113.     LboxLogger(wxListBox *lbox, wxLog *logOld)
  114.     {
  115.         m_lbox = lbox;
  116.         //m_lbox->Disable(); -- looks ugly under MSW
  117.         m_logOld = logOld;
  118.     }
  119.  
  120.     virtual ~LboxLogger()
  121.     {
  122.         wxLog::SetActiveTarget(m_logOld);
  123.     }
  124.  
  125. private:
  126.     // implement sink functions
  127.     virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t)
  128.     {
  129.         // don't put trace messages into listbox or we can get into infinite
  130.         // recursion
  131.         if ( level == wxLOG_Trace )
  132.         {
  133.             if ( m_logOld )
  134.             {
  135.                 // cast is needed to call protected method
  136.                 ((LboxLogger *)m_logOld)->DoLog(level, szString, t);
  137.             }
  138.         }
  139.         else
  140.         {
  141.             wxLog::DoLog(level, szString, t);
  142.         }
  143.     }
  144.  
  145.     virtual void DoLogString(const wxChar *szString, time_t t)
  146.     {
  147.         wxString msg;
  148.         TimeStamp(&msg);
  149.         msg += szString;
  150.  
  151.         #ifdef __WXUNIVERSAL__
  152.             m_lbox->AppendAndEnsureVisible(msg);
  153.         #else // other ports don't have this method yet
  154.             m_lbox->Append(msg);
  155.             m_lbox->SetFirstItem(m_lbox->GetCount() - 1);
  156.         #endif
  157.     }
  158.  
  159.     // the control we use
  160.     wxListBox *m_lbox;
  161.  
  162.     // the old log target
  163.     wxLog *m_logOld;
  164. };
  165.  
  166. // array of pages
  167. WX_DEFINE_ARRAY(WidgetsPage *, ArrayWidgetsPage);
  168.  
  169. // ----------------------------------------------------------------------------
  170. // misc macros
  171. // ----------------------------------------------------------------------------
  172.  
  173. IMPLEMENT_APP(WidgetsApp)
  174.  
  175. // ----------------------------------------------------------------------------
  176. // event tables
  177. // ----------------------------------------------------------------------------
  178.  
  179. BEGIN_EVENT_TABLE(WidgetsFrame, wxFrame)
  180.     EVT_BUTTON(Widgets_ClearLog, WidgetsFrame::OnButtonClearLog)
  181.     EVT_BUTTON(Widgets_Quit, WidgetsFrame::OnButtonQuit)
  182. END_EVENT_TABLE()
  183.  
  184. // ============================================================================
  185. // implementation
  186. // ============================================================================
  187.  
  188. // ----------------------------------------------------------------------------
  189. // app class
  190. // ----------------------------------------------------------------------------
  191.  
  192. bool WidgetsApp::OnInit()
  193. {
  194.     if ( !wxApp::OnInit() )
  195.         return FALSE;
  196.  
  197.     // the reason for having these ifdef's is that I often run two copies of
  198.     // this sample side by side and it is useful to see which one is which
  199.     wxString title;
  200. #if defined(__WXUNIVERSAL__)
  201.     title = _T("wxUniv/");
  202. #endif
  203.  
  204. #if defined(__WXMSW__)
  205.     title += _T("wxMSW");
  206. #elif defined(__WXGTK__)
  207.     title += _T("wxGTK");
  208. #elif defined(__WXMAC__)
  209.     title += _T("wxMAC");
  210. #elif defined(__WXMOTIF__)
  211.     title += _T("wxMOTIF");
  212. #else
  213.     title += _T("wxWindows");
  214. #endif
  215.  
  216.     wxFrame *frame = new WidgetsFrame(title + _T(" widgets demo"));
  217.     frame->Show();
  218.  
  219.     //wxLog::AddTraceMask(_T("listbox"));
  220.     //wxLog::AddTraceMask(_T("scrollbar"));
  221.     //wxLog::AddTraceMask(_T("focus"));
  222.  
  223.     return TRUE;
  224. }
  225.  
  226. // ----------------------------------------------------------------------------
  227. // WidgetsFrame construction
  228. // ----------------------------------------------------------------------------
  229.  
  230. WidgetsFrame::WidgetsFrame(const wxString& title)
  231.             : wxFrame(NULL, -1, title, wxPoint(0, 50))
  232. {
  233.     // init everything
  234.     m_lboxLog = (wxListBox *)NULL;
  235.     m_logTarget = (wxLog *)NULL;
  236.     m_notebook = (wxNotebook *)NULL;
  237.     m_imaglist = (wxImageList *)NULL;
  238.  
  239.     // create controls
  240.     m_panel = new wxPanel(this, -1);
  241.  
  242.     wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
  243.  
  244.     // we have 2 panes: notebook which pages demonstrating the controls in the
  245.     // upper one and the log window with some buttons in the lower
  246.  
  247.     m_notebook = new wxNotebook(m_panel, -1);
  248.     InitNotebook();
  249.     wxSizer *sizerUp = new wxNotebookSizer(m_notebook);
  250.  
  251.     // the lower one only has the log listbox and a button to clear it
  252.     wxSizer *sizerDown = new wxStaticBoxSizer
  253.                              (
  254.                                new wxStaticBox(m_panel, -1, _T("&Log window")),
  255.                                wxVERTICAL
  256.                              );
  257.     m_lboxLog = new wxListBox(m_panel, -1);
  258.     sizerDown->Add(m_lboxLog, 1, wxGROW | wxALL, 5);
  259.     sizerDown->SetMinSize(100, 150);
  260.  
  261.     wxBoxSizer *sizerBtns = new wxBoxSizer(wxHORIZONTAL);
  262.     wxButton *btn = new wxButton(m_panel, Widgets_ClearLog, _T("Clear &log"));
  263.     sizerBtns->Add(btn);
  264.     sizerBtns->Add(10, 0); // spacer
  265.     btn = new wxButton(m_panel, Widgets_Quit, _T("E&xit"));
  266.     sizerBtns->Add(btn);
  267.     sizerDown->Add(sizerBtns, 0, wxALL | wxALIGN_RIGHT, 5);
  268.  
  269.     // put everything together
  270.     sizerTop->Add(sizerUp, 1, wxGROW | (wxALL & ~(wxTOP | wxBOTTOM)), 10);
  271.     sizerTop->Add(0, 5, 0, wxGROW); // spacer in between
  272.     sizerTop->Add(sizerDown, 0,  wxGROW | (wxALL & ~wxTOP), 10);
  273.  
  274.     m_panel->SetAutoLayout(TRUE);
  275.     m_panel->SetSizer(sizerTop);
  276.  
  277.     sizerTop->Fit(this);
  278.     sizerTop->SetSizeHints(this);
  279.  
  280.     // now that everything is created we can redirect the log messages to the
  281.     // listbox
  282.     m_logTarget = new LboxLogger(m_lboxLog, wxLog::GetActiveTarget());
  283.     wxLog::SetActiveTarget(m_logTarget);
  284. }
  285.  
  286. void WidgetsFrame::InitNotebook()
  287. {
  288.     m_imaglist = new wxImageList(32, 32);
  289.  
  290.     ArrayWidgetsPage pages;
  291.     wxArrayString labels;
  292.  
  293.     // we need to first create all pages and only then add them to the notebook
  294.     // as we need the image list first
  295.     WidgetsPageInfo *info = WidgetsPage::ms_widgetPages;
  296.     while ( info )
  297.     {
  298.         WidgetsPage *page = (*info->GetCtor())(m_notebook, m_imaglist);
  299.         pages.Add(page);
  300.  
  301.         labels.Add(info->GetLabel());
  302.  
  303.         info = info->GetNext();
  304.     }
  305.  
  306.     m_notebook->SetImageList(m_imaglist);
  307.  
  308.     // now do add them
  309.     size_t count = pages.GetCount();
  310.     for ( size_t n = 0; n < count; n++ )
  311.     {
  312.         m_notebook->AddPage(
  313.                             pages[n],
  314.                             labels[n],
  315.                             FALSE, // don't select
  316.                             n // image id
  317.                            );
  318.     }
  319. }
  320.  
  321. WidgetsFrame::~WidgetsFrame()
  322. {
  323.     delete m_logTarget;
  324.     delete m_imaglist;
  325. }
  326.  
  327. // ----------------------------------------------------------------------------
  328. // WidgetsFrame event handlers
  329. // ----------------------------------------------------------------------------
  330.  
  331. void WidgetsFrame::OnButtonQuit(wxCommandEvent& WXUNUSED(event))
  332. {
  333.     Close();
  334. }
  335.  
  336. void WidgetsFrame::OnButtonClearLog(wxCommandEvent& event)
  337. {
  338.     m_lboxLog->Clear();
  339. }
  340.  
  341. // ----------------------------------------------------------------------------
  342. // WidgetsPageInfo
  343. // ----------------------------------------------------------------------------
  344.  
  345. WidgetsPageInfo *WidgetsPage::ms_widgetPages = NULL;
  346.  
  347. WidgetsPageInfo::WidgetsPageInfo(Constructor ctor, const wxChar *label)
  348.                : m_label(label)
  349. {
  350.     m_ctor = ctor;
  351.  
  352.     m_next = WidgetsPage::ms_widgetPages;
  353.     WidgetsPage::ms_widgetPages = this;
  354. }
  355.  
  356. // ----------------------------------------------------------------------------
  357. // WidgetsPage
  358. // ----------------------------------------------------------------------------
  359.  
  360. WidgetsPage::WidgetsPage(wxNotebook *notebook)
  361.            : wxPanel(notebook, -1)
  362. {
  363. }
  364.  
  365. wxSizer *WidgetsPage::CreateSizerWithText(wxControl *control,
  366.                                           wxWindowID id,
  367.                                           wxTextCtrl **ppText)
  368. {
  369.     wxSizer *sizerRow = new wxBoxSizer(wxHORIZONTAL);
  370.     wxTextCtrl *text = new wxTextCtrl(this, id, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
  371.  
  372.     sizerRow->Add(control, 0, wxRIGHT | wxALIGN_CENTRE_VERTICAL, 5);
  373.     sizerRow->Add(text, 1, wxLEFT | wxALIGN_CENTRE_VERTICAL, 5);
  374.  
  375.     if ( ppText )
  376.         *ppText = text;
  377.  
  378.     return sizerRow;
  379. }
  380.  
  381. // create a sizer containing a label and a text ctrl
  382. wxSizer *WidgetsPage::CreateSizerWithTextAndLabel(const wxString& label,
  383.                                                   wxWindowID id,
  384.                                                   wxTextCtrl **ppText)
  385. {
  386.     return CreateSizerWithText(new wxStaticText(this, -1, label), id, ppText);
  387. }
  388.  
  389. // create a sizer containing a button and a text ctrl
  390. wxSizer *WidgetsPage::CreateSizerWithTextAndButton(wxWindowID idBtn,
  391.                                                    const wxString& label,
  392.                                                    wxWindowID id,
  393.                                                    wxTextCtrl **ppText)
  394. {
  395.     return CreateSizerWithText(new wxButton(this, idBtn, label), id, ppText);
  396. }
  397.  
  398. wxCheckBox *WidgetsPage::CreateCheckBoxAndAddToSizer(wxSizer *sizer,
  399.                                                      const wxString& label,
  400.                                                      wxWindowID id)
  401. {
  402.     wxCheckBox *checkbox = new wxCheckBox(this, id, label);
  403.     sizer->Add(checkbox, 0, wxLEFT | wxRIGHT, 5);
  404.     sizer->Add(0, 2, 0, wxGROW); // spacer
  405.  
  406.     return checkbox;
  407. }
  408.  
  409.