]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/widgets/widgets.cpp
gravity for splitter window (patch 1046105)
[wxWidgets.git] / samples / widgets / widgets.cpp
index 59ee9950f08af02830dfc70069a3820a38825cf9..62f9724543694332f9e6ac8f10efd38479ade846 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
-// Program:     wxWindows Widgets Sample
+// Program:     wxWidgets Widgets Sample
 // Name:        widgets.cpp
-// Purpose:     Sample showing most of the simple wxWindows widgets
+// Purpose:     Sample showing most of the simple wxWidgets widgets
 // Author:      Vadim Zeitlin
 // Created:     27.03.01
 // Id:          $Id$
@@ -28,8 +28,9 @@
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/log.h"
-    #include "wx/panel.h"
     #include "wx/frame.h"
+    #include "wx/menu.h"
+
     #include "wx/button.h"
     #include "wx/checkbox.h"
     #include "wx/listbox.h"
@@ -38,8 +39,9 @@
     #include "wx/textctrl.h"
 #endif
 
-#include "wx/notebook.h"
+#include "wx/bookctrl.h"
 #include "wx/sizer.h"
+#include "wx/colordlg.h"
 
 #include "widgets.h"
 
@@ -51,7 +53,9 @@
 enum
 {
     Widgets_ClearLog = 100,
-    Widgets_Quit
+    Widgets_Quit,
+    Widgets_SetFgColour,
+    Widgets_SetBgColour
 };
 
 // ----------------------------------------------------------------------------
@@ -81,32 +85,47 @@ public:
 
 protected:
     // event handlers
+#if wxUSE_LOG
     void OnButtonClearLog(wxCommandEvent& event);
-    void OnButtonQuit(wxCommandEvent& event);
+#endif // wxUSE_LOG
+    void OnExit(wxCommandEvent& event);
+#if wxUSE_MENUS
+    void OnSetFgCol(wxCommandEvent& event);
+    void OnSetBgCol(wxCommandEvent& event);
+#endif // wxUSE_MENUS
 
-    // initialize the notebook: add all pages to it
-    void InitNotebook();
+    // initialize the book: add all pages to it
+    void InitBook();
 
 private:
     // the panel containing everything
     wxPanel *m_panel;
 
+#if wxUSE_LOG
     // the listbox for logging messages
     wxListBox *m_lboxLog;
 
     // the log target we use to redirect messages to the listbox
     wxLog *m_logTarget;
+#endif // wxUSE_LOG
 
-    // the notebook containing the test pages
-    wxNotebook *m_notebook;
+    // the book containing the test pages
+    wxBookCtrl *m_book;
 
     // and the image list for it
     wxImageList *m_imaglist;
 
-    // any class wishing to process wxWindows events must use this macro
+#if wxUSE_MENUS
+    // last chosen fg/bg colours
+    wxColour m_colFg,
+             m_colBg;
+#endif // wxUSE_MENUS
+
+    // any class wishing to process wxWidgets events must use this macro
     DECLARE_EVENT_TABLE()
 };
 
+#if wxUSE_LOG
 // A log target which just redirects the messages to a listbox
 class LboxLogger : public wxLog
 {
@@ -143,7 +162,7 @@ private:
         }
     }
 
-    virtual void DoLogString(const wxChar *szString, time_t t)
+    virtual void DoLogString(const wxChar *szString, time_t WXUNUSED(t))
     {
         wxString msg;
         TimeStamp(&msg);
@@ -163,9 +182,10 @@ private:
     // the old log target
     wxLog *m_logOld;
 };
+#endif // wxUSE_LOG
 
 // array of pages
-WX_DEFINE_ARRAY(WidgetsPage *, ArrayWidgetsPage);
+WX_DEFINE_ARRAY_PTR(WidgetsPage *, ArrayWidgetsPage);
 
 // ----------------------------------------------------------------------------
 // misc macros
@@ -178,8 +198,14 @@ IMPLEMENT_APP(WidgetsApp)
 // ----------------------------------------------------------------------------
 
 BEGIN_EVENT_TABLE(WidgetsFrame, wxFrame)
+#if wxUSE_LOG
     EVT_BUTTON(Widgets_ClearLog, WidgetsFrame::OnButtonClearLog)
-    EVT_BUTTON(Widgets_Quit, WidgetsFrame::OnButtonQuit)
+#endif // wxUSE_LOG
+    EVT_BUTTON(Widgets_Quit, WidgetsFrame::OnExit)
+
+    EVT_MENU(wxID_EXIT, WidgetsFrame::OnExit)
+    EVT_MENU(Widgets_SetFgColour, WidgetsFrame::OnSetFgCol)
+    EVT_MENU(Widgets_SetBgColour, WidgetsFrame::OnSetBgCol)
 END_EVENT_TABLE()
 
 // ============================================================================
@@ -193,7 +219,7 @@ END_EVENT_TABLE()
 bool WidgetsApp::OnInit()
 {
     if ( !wxApp::OnInit() )
-        return FALSE;
+        return false;
 
     // the reason for having these ifdef's is that I often run two copies of
     // this sample side by side and it is useful to see which one is which
@@ -206,8 +232,12 @@ bool WidgetsApp::OnInit()
     title += _T("wxMSW");
 #elif defined(__WXGTK__)
     title += _T("wxGTK");
+#elif defined(__WXMAC__)
+    title += _T("wxMAC");
+#elif defined(__WXMOTIF__)
+    title += _T("wxMOTIF");
 #else
-    title += _T("wxWindows");
+    title += _T("wxWidgets");
 #endif
 
     wxFrame *frame = new WidgetsFrame(title + _T(" widgets demo"));
@@ -215,8 +245,9 @@ bool WidgetsApp::OnInit()
 
     //wxLog::AddTraceMask(_T("listbox"));
     //wxLog::AddTraceMask(_T("scrollbar"));
+    //wxLog::AddTraceMask(_T("focus"));
 
-    return TRUE;
+    return true;
 }
 
 // ----------------------------------------------------------------------------
@@ -224,72 +255,102 @@ bool WidgetsApp::OnInit()
 // ----------------------------------------------------------------------------
 
 WidgetsFrame::WidgetsFrame(const wxString& title)
-            : wxFrame(NULL, -1, title, wxPoint(0, 50))
+            : wxFrame(NULL, wxID_ANY, title,
+                      wxPoint(0, 50), wxDefaultSize,
+                      wxDEFAULT_FRAME_STYLE |
+                      wxNO_FULL_REPAINT_ON_RESIZE |
+                      wxCLIP_CHILDREN |
+                      wxTAB_TRAVERSAL)
 {
     // init everything
+#if wxUSE_LOG
     m_lboxLog = (wxListBox *)NULL;
     m_logTarget = (wxLog *)NULL;
-    m_notebook = (wxNotebook *)NULL;
+#endif // wxUSE_LOG
+    m_book = (wxBookCtrl *)NULL;
     m_imaglist = (wxImageList *)NULL;
 
+#if wxUSE_MENUS
+    // create the menubar
+    wxMenuBar *mbar = new wxMenuBar;
+    wxMenu *menuWidget = new wxMenu;
+    menuWidget->Append(Widgets_SetFgColour, _T("Set &foreground...\tCtrl-F"));
+    menuWidget->Append(Widgets_SetBgColour, _T("Set &background...\tCtrl-B"));
+    menuWidget->AppendSeparator();
+    menuWidget->Append(wxID_EXIT, _T("&Quit\tCtrl-Q"));
+    mbar->Append(menuWidget, _T("&Widget"));
+    SetMenuBar(mbar);
+#endif // wxUSE_MENUS
+
     // create controls
-    m_panel = new wxPanel(this, -1);
+    m_panel = new wxPanel(this, wxID_ANY,
+        wxDefaultPosition, wxDefaultSize, wxCLIP_CHILDREN);
 
     wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
 
-    // we have 2 panes: notebook which pages demonstrating the controls in the
+    // we have 2 panes: book which pages demonstrating the controls in the
     // upper one and the log window with some buttons in the lower
 
-    m_notebook = new wxNotebook(m_panel, -1);
-    InitNotebook();
-    wxSizer *sizerUp = new wxNotebookSizer(m_notebook);
+    m_book = new wxBookCtrl(m_panel, wxID_ANY, wxDefaultPosition,
+        wxDefaultSize, wxNO_FULL_REPAINT_ON_RESIZE|wxCLIP_CHILDREN|wxBC_DEFAULT);
+    InitBook();
 
     // the lower one only has the log listbox and a button to clear it
-    wxSizer *sizerDown = new wxStaticBoxSizer
-                             (
-                               new wxStaticBox(m_panel, -1, _T("&Log window")),
-                               wxVERTICAL
-                             );
-    m_lboxLog = new wxListBox(m_panel, -1);
+#if wxUSE_LOG
+    wxSizer *sizerDown = new wxStaticBoxSizer(
+        new wxStaticBox( m_panel, wxID_ANY, _T("&Log window") ),
+        wxVERTICAL);
+
+    m_lboxLog = new wxListBox(m_panel, wxID_ANY);
     sizerDown->Add(m_lboxLog, 1, wxGROW | wxALL, 5);
+    sizerDown->SetMinSize(100, 150);
+#else
+    wxSizer *sizerDown = new wxBoxSizer(wxVERTICAL);
+#endif // wxUSE_LOG
+
     wxBoxSizer *sizerBtns = new wxBoxSizer(wxHORIZONTAL);
-    wxButton *btn = new wxButton(m_panel, Widgets_ClearLog, _T("Clear &log"));
+    wxButton *btn;
+#if wxUSE_LOG
+    btn = new wxButton(m_panel, Widgets_ClearLog, _T("Clear &log"));
     sizerBtns->Add(btn);
     sizerBtns->Add(10, 0); // spacer
+#endif // wxUSE_LOG
     btn = new wxButton(m_panel, Widgets_Quit, _T("E&xit"));
     sizerBtns->Add(btn);
     sizerDown->Add(sizerBtns, 0, wxALL | wxALIGN_RIGHT, 5);
 
     // put everything together
-    sizerTop->Add(sizerUp, 1, wxGROW | (wxALL & ~(wxTOP | wxBOTTOM)), 10);
+    sizerTop->Add(m_book, 1, wxGROW | (wxALL & ~(wxTOP | wxBOTTOM)), 10);
     sizerTop->Add(0, 5, 0, wxGROW); // spacer in between
     sizerTop->Add(sizerDown, 0,  wxGROW | (wxALL & ~wxTOP), 10);
 
-    m_panel->SetAutoLayout(TRUE);
     m_panel->SetSizer(sizerTop);
 
     sizerTop->Fit(this);
     sizerTop->SetSizeHints(this);
 
+#if wxUSE_LOG && !defined(__WXCOCOA__)
+    // wxCocoa's listbox is too flakey to use for logging right now
     // now that everything is created we can redirect the log messages to the
     // listbox
     m_logTarget = new LboxLogger(m_lboxLog, wxLog::GetActiveTarget());
     wxLog::SetActiveTarget(m_logTarget);
+#endif
 }
 
-void WidgetsFrame::InitNotebook()
+void WidgetsFrame::InitBook()
 {
     m_imaglist = new wxImageList(32, 32);
 
     ArrayWidgetsPage pages;
     wxArrayString labels;
 
-    // we need to first create all pages and only then add them to the notebook
+    // we need to first create all pages and only then add them to the book
     // as we need the image list first
     WidgetsPageInfo *info = WidgetsPage::ms_widgetPages;
     while ( info )
     {
-        WidgetsPage *page = (*info->GetCtor())(m_notebook, m_imaglist);
+        WidgetsPage *page = (*info->GetCtor())(m_book, m_imaglist);
         pages.Add(page);
 
         labels.Add(info->GetLabel());
@@ -297,24 +358,26 @@ void WidgetsFrame::InitNotebook()
         info = info->GetNext();
     }
 
-    m_notebook->SetImageList(m_imaglist);
+    m_book->SetImageList(m_imaglist);
 
     // now do add them
     size_t count = pages.GetCount();
     for ( size_t n = 0; n < count; n++ )
     {
-        m_notebook->AddPage(
-                            pages[n],
-                            labels[n],
-                            FALSE, // don't select
-                            n // image id
-                           );
+        m_book->AddPage(
+                        pages[n],
+                        labels[n],
+                        false, // don't select
+                        n // image id
+                       );
     }
 }
 
 WidgetsFrame::~WidgetsFrame()
 {
+#if wxUSE_LOG
     delete m_logTarget;
+#endif // wxUSE_LOG
     delete m_imaglist;
 }
 
@@ -322,15 +385,47 @@ WidgetsFrame::~WidgetsFrame()
 // WidgetsFrame event handlers
 // ----------------------------------------------------------------------------
 
-void WidgetsFrame::OnButtonQuit(wxCommandEvent& WXUNUSED(event))
+void WidgetsFrame::OnExit(wxCommandEvent& WXUNUSED(event))
 {
     Close();
 }
 
-void WidgetsFrame::OnButtonClearLog(wxCommandEvent& event)
+#if wxUSE_LOG
+void WidgetsFrame::OnButtonClearLog(wxCommandEvent& WXUNUSED(event))
 {
     m_lboxLog->Clear();
 }
+#endif // wxUSE_LOG
+
+#if wxUSE_MENUS
+
+void WidgetsFrame::OnSetFgCol(wxCommandEvent& WXUNUSED(event))
+{
+    wxColour col = wxGetColourFromUser(this, m_colFg);
+    if ( !col.Ok() )
+        return;
+
+    m_colFg = col;
+
+    WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
+    page->GetWidget()->SetForegroundColour(m_colFg);
+    page->GetWidget()->Refresh();
+}
+
+void WidgetsFrame::OnSetBgCol(wxCommandEvent& WXUNUSED(event))
+{
+    wxColour col = wxGetColourFromUser(this, m_colBg);
+    if ( !col.Ok() )
+        return;
+
+    m_colBg = col;
+
+    WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
+    page->GetWidget()->SetBackgroundColour(m_colBg);
+    page->GetWidget()->Refresh();
+}
+
+#endif // wxUSE_MENUS
 
 // ----------------------------------------------------------------------------
 // WidgetsPageInfo
@@ -343,16 +438,66 @@ WidgetsPageInfo::WidgetsPageInfo(Constructor ctor, const wxChar *label)
 {
     m_ctor = ctor;
 
-    m_next = WidgetsPage::ms_widgetPages;
-    WidgetsPage::ms_widgetPages = this;
+    m_next = NULL;
+
+    // dummy sorting: add and immediately sort on list according to label
+
+    if(WidgetsPage::ms_widgetPages)
+    {
+        WidgetsPageInfo *node_prev = WidgetsPage::ms_widgetPages;
+        if(wxStrcmp(label,node_prev->GetLabel().c_str())<0)
+        {
+            // add as first
+            m_next = node_prev;
+            WidgetsPage::ms_widgetPages = this;
+        }
+        else
+        {
+            WidgetsPageInfo *node_next;
+            do
+            {
+                node_next = node_prev->GetNext();
+                if(node_next)
+                {
+                    // add if between two
+                    if(wxStrcmp(label,node_next->GetLabel().c_str())<0)
+                    {
+                        node_prev->SetNext(this);
+                        m_next = node_next;
+                        // force to break loop
+                        node_next = NULL;
+                    }
+                }
+                else
+                {
+                    // add as last
+                    node_prev->SetNext(this);
+                    m_next = node_next;
+                }
+                node_prev = node_next;
+            }while(node_next);
+        }
+    }
+    else
+    {
+        // add when first
+
+        WidgetsPage::ms_widgetPages = this;
+
+    }
+
 }
 
 // ----------------------------------------------------------------------------
 // WidgetsPage
 // ----------------------------------------------------------------------------
 
-WidgetsPage::WidgetsPage(wxNotebook *notebook)
-           : wxPanel(notebook, -1)
+WidgetsPage::WidgetsPage(wxBookCtrl *book)
+           : wxPanel(book, wxID_ANY,
+                     wxDefaultPosition, wxDefaultSize,
+                     wxNO_FULL_REPAINT_ON_RESIZE |
+                     wxCLIP_CHILDREN |
+                     wxTAB_TRAVERSAL)
 {
 }
 
@@ -361,7 +506,9 @@ wxSizer *WidgetsPage::CreateSizerWithText(wxControl *control,
                                           wxTextCtrl **ppText)
 {
     wxSizer *sizerRow = new wxBoxSizer(wxHORIZONTAL);
-    wxTextCtrl *text = new wxTextCtrl(this, id, _T(""));
+    wxTextCtrl *text = new wxTextCtrl(this, id, wxEmptyString,
+        wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
+
     sizerRow->Add(control, 0, wxRIGHT | wxALIGN_CENTRE_VERTICAL, 5);
     sizerRow->Add(text, 1, wxLEFT | wxALIGN_CENTRE_VERTICAL, 5);
 
@@ -376,7 +523,8 @@ wxSizer *WidgetsPage::CreateSizerWithTextAndLabel(const wxString& label,
                                                   wxWindowID id,
                                                   wxTextCtrl **ppText)
 {
-    return CreateSizerWithText(new wxStaticText(this, -1, label), id, ppText);
+    return CreateSizerWithText(new wxStaticText(this, wxID_ANY, label),
+        id, ppText);
 }
 
 // create a sizer containing a button and a text ctrl