]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/widgets/checkbox.cpp
For wxGTK2, link with X11 explicitly, since we use many X11 functions directly.
[wxWidgets.git] / samples / widgets / checkbox.cpp
index fe14ea96573f6a95912c37d65b6e2df5492703ed..fbbc43b258e65af8084e546a87b7f7d471e8a94d 100644 (file)
@@ -1,12 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
-// Program:     wxWindows Widgets Sample
+// Program:     wxWidgets Widgets Sample
 // Name:        checkbox.cpp
 // Purpose:     Part of the widgets sample showing wxCheckBox
-// Author:      Dimitri Schoolwerth
+// Author:      Dimitri Schoolwerth, Vadim Zeitlin
 // Created:     27 Sep 2003
 // Id:          $Id$
 // Copyright:   (c) 2003 wxWindows team
-// License:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
     #include "wx/bitmap.h"
     #include "wx/button.h"
     #include "wx/checkbox.h"
+    #include "wx/radiobox.h"
+    #include "wx/statbox.h"
+    #include "wx/textctrl.h"
 
     #include "wx/sizer.h"
-
 #endif
 
 #include "widgets.h"
 
 #include "icons/checkbox.xpm"
 
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// control ids
+enum
+{
+    CheckboxPage_Reset = wxID_HIGHEST,
+    CheckboxPage_ChangeLabel,
+    CheckboxPage_Check,
+    CheckboxPage_Uncheck,
+    CheckboxPage_PartCheck,
+    CheckboxPage_ChkRight,
+    CheckboxPage_Checkbox
+};
+
+enum
+{
+    CheckboxKind_2State,
+    CheckboxKind_3State,
+    CheckboxKind_3StateUser
+};
+
 // ----------------------------------------------------------------------------
 // CheckBoxWidgetsPage
 // ----------------------------------------------------------------------------
 class CheckBoxWidgetsPage : public WidgetsPage
 {
 public:
-    CheckBoxWidgetsPage(wxNotebook *notebook, wxImageList *imaglist);
-    virtual ~CheckBoxWidgetsPage();
+    CheckBoxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
+    virtual ~CheckBoxWidgetsPage(){};
+
+    virtual wxControl *GetWidget() const { return m_checkbox; }
+    virtual void RecreateWidget() { CreateCheckbox(); }
+
+    // lazy creation of the content
+    virtual void CreateContent();
 
 protected:
     // event handlers
     void OnCheckBox(wxCommandEvent& event);
 
-    void OnButton(wxCommandEvent& event);
+    void OnStyleChange(wxCommandEvent& event);
+    void OnButtonReset(wxCommandEvent& event);
+    void OnButtonChangeLabel(wxCommandEvent& event);
+
+    void OnButtonCheck(wxCommandEvent&) { m_checkbox->SetValue(true); }
+    void OnButtonUncheck(wxCommandEvent&) { m_checkbox->SetValue(false); }
+    void OnButtonPartCheck(wxCommandEvent&)
+    {
+        m_checkbox->Set3StateValue(wxCHK_UNDETERMINED);
+    }
+
+    void Is3State(wxUpdateUIEvent& event)
+    {
+        event.Enable( m_checkbox->Is3State() );
+    }
+
+
+    // reset the wxCheckBox parameters
+    void Reset();
+
+    // (re)create the wxCheckBox
+    void CreateCheckbox();
 
     // the controls
     // ------------
 
-    wxCheckBox *m_chk2States,
-               *m_chk3States,
-               *m_chk3StatesAllows3rdStateForUser;
+    // the contols to choose the checkbox style
+    wxCheckBox *m_chkRight;
+    wxRadioBox *m_radioKind;
+
+    // the checkbox itself and the sizer it is in
+    wxCheckBox *m_checkbox;
+    wxSizer *m_sizerCheckbox;
 
-    wxButton *m_button;
+    // the text entries for command parameters
+    wxTextCtrl *m_textLabel;
 
 private:
     DECLARE_EVENT_TABLE()
@@ -76,86 +133,184 @@ private:
 // ----------------------------------------------------------------------------
 
 BEGIN_EVENT_TABLE(CheckBoxWidgetsPage, WidgetsPage)
-    EVT_CHECKBOX(wxID_ANY, CheckBoxWidgetsPage::OnCheckBox)
-    EVT_BUTTON(wxID_ANY, CheckBoxWidgetsPage::OnButton)
+    EVT_CHECKBOX(CheckboxPage_Checkbox, CheckBoxWidgetsPage::OnCheckBox)
+
+    EVT_BUTTON(CheckboxPage_Reset, CheckBoxWidgetsPage::OnButtonReset)
+    EVT_BUTTON(CheckboxPage_ChangeLabel, CheckBoxWidgetsPage::OnButtonChangeLabel)
+    EVT_BUTTON(CheckboxPage_Check, CheckBoxWidgetsPage::OnButtonCheck)
+    EVT_BUTTON(CheckboxPage_Uncheck, CheckBoxWidgetsPage::OnButtonUncheck)
+    EVT_BUTTON(CheckboxPage_PartCheck, CheckBoxWidgetsPage::OnButtonPartCheck)
+
+    EVT_UPDATE_UI(CheckboxPage_PartCheck, CheckBoxWidgetsPage::Is3State)
+
+    EVT_RADIOBOX(wxID_ANY, CheckBoxWidgetsPage::OnStyleChange)
+    EVT_CHECKBOX(CheckboxPage_ChkRight, CheckBoxWidgetsPage::OnStyleChange)
 END_EVENT_TABLE()
 
 // ============================================================================
 // implementation
 // ============================================================================
 
-IMPLEMENT_WIDGETS_PAGE(CheckBoxWidgetsPage, wxT("CheckBox"));
+#if defined(__WXUNIVERSAL__)
+    #define FAMILY_CTRLS UNIVERSAL_CTRLS
+#else
+    #define FAMILY_CTRLS NATIVE_CTRLS
+#endif
+
+IMPLEMENT_WIDGETS_PAGE(CheckBoxWidgetsPage, wxT("CheckBox"), FAMILY_CTRLS );
 
-CheckBoxWidgetsPage::CheckBoxWidgetsPage(wxNotebook *notebook,
-                                       wxImageList *imaglist)
-                  : WidgetsPage(notebook)
+CheckBoxWidgetsPage::CheckBoxWidgetsPage(WidgetsBookCtrl *book,
+                                         wxImageList *imaglist)
+                  : WidgetsPage(book, imaglist, checkbox_xpm)
 {
-    imaglist->Add(wxBitmap(checkbox_xpm));
-
-    m_chk2States = new wxCheckBox( this, wxID_ANY,
-        wxT("I'm a standard 2-state checkbox") );
-    m_chk3States = new wxCheckBox( this, wxID_ANY,
-        wxT("I'm a 3-state checkbox that disallows setting the undetermined")
-        wxT(" state by the user" ),
-        wxDefaultPosition, wxDefaultSize, wxCHK_3STATE);
-    m_button = new wxButton( this, wxID_ANY, wxT("&Programmatically set this")
-        wxT(" checkbox to undetermined state") );
-
-    m_chk3StatesAllows3rdStateForUser = new wxCheckBox(this, wxID_ANY,
-        wxT("I'm a 3-state checkbox that allows setting the 3rd state by the user"),
-        wxDefaultPosition, wxDefaultSize, wxCHK_3STATE
-        | wxCHK_ALLOW_3RD_STATE_FOR_USER);
-
-    wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
-
-    sizerTop->Add(0, 0, 1, wxEXPAND);
-    sizerTop->Add(m_chk2States, 0, wxEXPAND);
-    sizerTop->Add(0, 0, 1, wxEXPAND);
-    wxSizer *sizerCheckBoxAndButton = new wxBoxSizer(wxHORIZONTAL);
-    {
-        wxSizer *szr = sizerCheckBoxAndButton;
-        szr->Add(m_chk3States, 0, wxEXPAND);
-        szr->Add(0, 0, 1, wxEXPAND);
-        szr->Add(m_button, 0, wxEXPAND);
+}
 
-        sizerTop->Add(szr, 0, wxEXPAND);
-    }
+void CheckBoxWidgetsPage::CreateContent()
+{
+    wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
+
+    // left pane
+    wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("&Set style"));
 
-    sizerTop->Add(0, 0, 1, wxEXPAND);
-    sizerTop->Add(m_chk3StatesAllows3rdStateForUser, 0, wxEXPAND);
-    sizerTop->Add(0, 0, 1, wxEXPAND);
+    wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
+
+    m_chkRight = CreateCheckBoxAndAddToSizer
+                 (
+                    sizerLeft,
+                    wxT("&Right aligned"),
+                    CheckboxPage_ChkRight
+                 );
+
+    sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
+
+    static const wxString kinds[] =
+    {
+        wxT("usual &2-state checkbox"),
+        wxT("&3rd state settable by program"),
+        wxT("&user-settable 3rd state"),
+    };
+
+    m_radioKind = new wxRadioBox(this, wxID_ANY, wxT("&Kind"),
+                                 wxDefaultPosition, wxDefaultSize,
+                                 WXSIZEOF(kinds), kinds,
+                                 1);
+    sizerLeft->Add(m_radioKind, 0, wxGROW | wxALL, 5);
+    wxButton *btn = new wxButton(this, CheckboxPage_Reset, wxT("&Reset"));
+    sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
+
+    // middle pane
+    wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, wxT("&Operations"));
+    wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
+
+    sizerMiddle->Add(CreateSizerWithTextAndButton(CheckboxPage_ChangeLabel,
+                                                     wxT("Change label"),
+                                                     wxID_ANY,
+                                                     &m_textLabel),
+                     0, wxALL | wxGROW, 5);
+    sizerMiddle->Add(new wxButton(this, CheckboxPage_Check, wxT("&Check it")),
+                     0, wxALL | wxGROW, 5);
+    sizerMiddle->Add(new wxButton(this, CheckboxPage_Uncheck, wxT("&Uncheck it")),
+                     0, wxALL | wxGROW, 5);
+    sizerMiddle->Add(new wxButton(this, CheckboxPage_PartCheck,
+                                  wxT("Put in &3rd state")),
+                     0, wxALL | wxGROW, 5);
+
+    // right pane
+    wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL);
+    m_checkbox = new wxCheckBox(this, CheckboxPage_Checkbox, wxT("&Check me!"));
+    sizerRight->Add(0, 0, 1, wxCENTRE);
+    sizerRight->Add(m_checkbox, 1, wxCENTRE);
+    sizerRight->Add(0, 0, 1, wxCENTRE);
+    sizerRight->SetMinSize(150, 0);
+    m_sizerCheckbox = sizerRight; // save it to modify it later
+
+    // the 3 panes panes compose the window
+    sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
+    sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
+    sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
+
+    // final initializations
+    Reset();
 
     SetSizer(sizerTop);
+}
 
-    sizerTop->Fit(this);
+void CheckBoxWidgetsPage::Reset()
+{
+    m_chkRight->SetValue(false);
+    m_radioKind->SetSelection(CheckboxKind_2State);
 }
 
-CheckBoxWidgetsPage::~CheckBoxWidgetsPage()
+void CheckBoxWidgetsPage::CreateCheckbox()
 {
+    wxString label = m_checkbox->GetLabel();
+
+    size_t count = m_sizerCheckbox->GetChildren().GetCount();
+    for ( size_t n = 0; n < count; n++ )
+    {
+        m_sizerCheckbox->Remove(0);
+    }
+
+    delete m_checkbox;
+
+    int flags = ms_defaultFlags;
+    if ( m_chkRight->IsChecked() )
+        flags |= wxALIGN_RIGHT;
+
+    switch ( m_radioKind->GetSelection() )
+    {
+        default:
+            wxFAIL_MSG(wxT("unexpected radiobox selection"));
+            // fall through
+
+        case CheckboxKind_2State:
+            flags |= wxCHK_2STATE;
+            break;
+
+        case CheckboxKind_3StateUser:
+            flags |= wxCHK_ALLOW_3RD_STATE_FOR_USER;
+            // fall through
+
+        case CheckboxKind_3State:
+            flags |= wxCHK_3STATE;
+            break;
+    }
+
+    m_checkbox = new wxCheckBox(this, CheckboxPage_Checkbox, label,
+                              wxDefaultPosition, wxDefaultSize,
+                              flags);
+
+    m_sizerCheckbox->Add(0, 0, 1, wxCENTRE);
+    m_sizerCheckbox->Add(m_checkbox, 1, wxCENTRE);
+    m_sizerCheckbox->Add(0, 0, 1, wxCENTRE);
+    m_sizerCheckbox->Layout();
 }
 
 // ----------------------------------------------------------------------------
 // event handlers
 // ----------------------------------------------------------------------------
 
-void CheckBoxWidgetsPage::OnCheckBox(wxCommandEvent& event)
+void CheckBoxWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
 {
-    static const wxString stateNames[] =
-    {
-        wxT("unchecked"),
-        wxT("checked"),
-        wxT("undetermined/mixed"),
-    };
-    wxCheckBoxState state = (wxCheckBoxState) event.GetInt();
+    Reset();
 
-    wxCHECK_RET( (state >= 0) && (state < WXSIZEOF(stateNames)),
-        "event.GetInt() returned an invalid wxCheckBoxState" );
+    CreateCheckbox();
+}
 
-    wxLogMessage(wxT("Checkbox now set to state: %s"),
-        stateNames[state].c_str());
+void CheckBoxWidgetsPage::OnStyleChange(wxCommandEvent& WXUNUSED(event))
+{
+    CreateCheckbox();
 }
 
-void CheckBoxWidgetsPage::OnButton(wxCommandEvent& WXUNUSED(event))
+void CheckBoxWidgetsPage::OnButtonChangeLabel(wxCommandEvent& WXUNUSED(event))
 {
-    m_chk3States->Set3StateValue(wxCHK_UNDETERMINED);
+    m_checkbox->SetLabel(m_textLabel->GetValue());
 }
+
+void CheckBoxWidgetsPage::OnCheckBox(wxCommandEvent& event)
+{
+    wxLogMessage(wxT("Test checkbox %schecked (value = %d)."),
+                 event.IsChecked() ? wxT("") : wxT("un"),
+                 (int)m_checkbox->Get3StateValue());
+}
+