X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1bf538e210f8a69ac9cc430501758a2ac2d66678..e1efca652844273c3e8d32c7e5f442b87e455ca7:/samples/widgets/checkbox.cpp diff --git a/samples/widgets/checkbox.cpp b/samples/widgets/checkbox.cpp index fe14ea9657..ae6261a898 100644 --- a/samples/widgets/checkbox.cpp +++ b/samples/widgets/checkbox.cpp @@ -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 ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -32,15 +32,40 @@ #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 // ---------------------------------------------------------------------------- @@ -48,23 +73,55 @@ 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 controls 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()); +} +