| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530 |
- /////////////////////////////////////////////////////////////////////////////
- // Program: wxWidgets Widgets Sample
- // Name: radiobox.cpp
- // Purpose: Part of the widgets sample showing wxRadioBox
- // Author: Vadim Zeitlin
- // Created: 15.04.01
- // Copyright: (c) 2001 Vadim Zeitlin
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- // ============================================================================
- // declarations
- // ============================================================================
- // ----------------------------------------------------------------------------
- // headers
- // ----------------------------------------------------------------------------
- // for compilers that support precompilation, includes "wx/wx.h".
- #include "wx/wxprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- #if wxUSE_RADIOBOX
- // for all others, include the necessary headers
- #ifndef WX_PRECOMP
- #include "wx/log.h"
- #include "wx/bitmap.h"
- #include "wx/button.h"
- #include "wx/checkbox.h"
- #include "wx/radiobox.h"
- #include "wx/statbox.h"
- #include "wx/textctrl.h"
- #endif
- #include "wx/sizer.h"
- #include "widgets.h"
- #include "icons/radiobox.xpm"
- // ----------------------------------------------------------------------------
- // constants
- // ----------------------------------------------------------------------------
- // control ids
- enum
- {
- RadioPage_Reset = wxID_HIGHEST,
- RadioPage_Update,
- RadioPage_Selection,
- RadioPage_Label,
- RadioPage_LabelBtn,
- RadioPage_EnableItem,
- RadioPage_ShowItem,
- RadioPage_Radio
- };
- // layout direction radiobox selections
- enum
- {
- RadioDir_Default,
- RadioDir_LtoR,
- RadioDir_TtoB
- };
- // default values for the number of radiobox items
- static const unsigned int DEFAULT_NUM_ENTRIES = 12;
- static const unsigned int DEFAULT_MAJOR_DIM = 3;
- // this item is enabled/disabled shown/hidden by the test checkboxes
- static const int TEST_BUTTON = 1;
- // ----------------------------------------------------------------------------
- // RadioWidgetsPage
- // ----------------------------------------------------------------------------
- class RadioWidgetsPage : public WidgetsPage
- {
- public:
- RadioWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
- virtual ~RadioWidgetsPage(){};
- virtual wxControl *GetWidget() const { return m_radio; }
- virtual void RecreateWidget() { CreateRadio(); }
- // lazy creation of the content
- virtual void CreateContent();
- protected:
- // event handlers
- void OnCheckOrRadioBox(wxCommandEvent& event);
- void OnRadioBox(wxCommandEvent& event);
- void OnButtonReset(wxCommandEvent& event);
- void OnButtonRecreate(wxCommandEvent& event);
- void OnButtonSelection(wxCommandEvent& event);
- void OnButtonSetLabel(wxCommandEvent& event);
- void OnEnableItem(wxCommandEvent& event);
- void OnShowItem(wxCommandEvent& event);
- void OnUpdateUIReset(wxUpdateUIEvent& event);
- void OnUpdateUIUpdate(wxUpdateUIEvent& event);
- void OnUpdateUISelection(wxUpdateUIEvent& event);
- void OnUpdateUIEnableItem(wxUpdateUIEvent& event);
- void OnUpdateUIShowItem(wxUpdateUIEvent& event);
- // reset the wxRadioBox parameters
- void Reset();
- // (re)create the wxRadioBox
- void CreateRadio();
- // the controls
- // ------------
- // the check/radio boxes for styles
- wxCheckBox *m_chkSpecifyRows;
- wxCheckBox *m_chkEnableItem;
- wxCheckBox *m_chkShowItem;
- wxRadioBox *m_radioDir;
- // the gauge itself and the sizer it is in
- wxRadioBox *m_radio;
- wxSizer *m_sizerRadio;
- // the text entries for command parameters
- wxTextCtrl *m_textNumBtns,
- *m_textMajorDim,
- *m_textCurSel,
- *m_textSel,
- *m_textLabel,
- *m_textLabelBtns;
- private:
- wxDECLARE_EVENT_TABLE();
- DECLARE_WIDGETS_PAGE(RadioWidgetsPage)
- };
- // ----------------------------------------------------------------------------
- // event tables
- // ----------------------------------------------------------------------------
- wxBEGIN_EVENT_TABLE(RadioWidgetsPage, WidgetsPage)
- EVT_BUTTON(RadioPage_Reset, RadioWidgetsPage::OnButtonReset)
- EVT_BUTTON(RadioPage_Update, RadioWidgetsPage::OnButtonRecreate)
- EVT_BUTTON(RadioPage_LabelBtn, RadioWidgetsPage::OnButtonRecreate)
- EVT_BUTTON(RadioPage_Selection, RadioWidgetsPage::OnButtonSelection)
- EVT_BUTTON(RadioPage_Label, RadioWidgetsPage::OnButtonSetLabel)
- EVT_UPDATE_UI(RadioPage_Update, RadioWidgetsPage::OnUpdateUIUpdate)
- EVT_UPDATE_UI(RadioPage_Selection, RadioWidgetsPage::OnUpdateUISelection)
- EVT_RADIOBOX(RadioPage_Radio, RadioWidgetsPage::OnRadioBox)
- EVT_CHECKBOX(RadioPage_EnableItem, RadioWidgetsPage::OnEnableItem)
- EVT_CHECKBOX(RadioPage_ShowItem, RadioWidgetsPage::OnShowItem)
- EVT_UPDATE_UI(RadioPage_EnableItem, RadioWidgetsPage::OnUpdateUIEnableItem)
- EVT_UPDATE_UI(RadioPage_ShowItem, RadioWidgetsPage::OnUpdateUIShowItem)
- EVT_CHECKBOX(wxID_ANY, RadioWidgetsPage::OnCheckOrRadioBox)
- EVT_RADIOBOX(wxID_ANY, RadioWidgetsPage::OnCheckOrRadioBox)
- wxEND_EVENT_TABLE()
- // ============================================================================
- // implementation
- // ============================================================================
- #if defined(__WXUNIVERSAL__)
- #define FAMILY_CTRLS UNIVERSAL_CTRLS
- #else
- #define FAMILY_CTRLS NATIVE_CTRLS
- #endif
- IMPLEMENT_WIDGETS_PAGE(RadioWidgetsPage, wxT("Radio"),
- FAMILY_CTRLS | WITH_ITEMS_CTRLS
- );
- RadioWidgetsPage::RadioWidgetsPage(WidgetsBookCtrl *book,
- wxImageList *imaglist)
- : WidgetsPage(book, imaglist, radio_xpm)
- {
- // init everything
- m_chkSpecifyRows = (wxCheckBox *)NULL;
- m_chkEnableItem = (wxCheckBox *)NULL;
- m_chkShowItem = (wxCheckBox *)NULL;
- m_textNumBtns =
- m_textLabelBtns =
- m_textLabel = (wxTextCtrl *)NULL;
- m_radio =
- m_radioDir = (wxRadioBox *)NULL;
- m_sizerRadio = (wxSizer *)NULL;
- }
- void RadioWidgetsPage::CreateContent()
- {
- wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
- // left pane
- wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("&Set style"));
- wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
- m_chkSpecifyRows = CreateCheckBoxAndAddToSizer
- (
- sizerLeft,
- "Major specifies &rows count"
- );
- static const wxString layoutDir[] =
- {
- wxT("default"),
- wxT("left to right"),
- wxT("top to bottom")
- };
- m_radioDir = new wxRadioBox(this, wxID_ANY, wxT("Numbering:"),
- wxDefaultPosition, wxDefaultSize,
- WXSIZEOF(layoutDir), layoutDir,
- 1, wxRA_SPECIFY_COLS);
- sizerLeft->Add(m_radioDir, 0, wxGROW | wxALL, 5);
- // if it's not defined, we can't change the radiobox direction
- #ifndef wxRA_LEFTTORIGHT
- m_radioDir->Disable();
- #endif // wxRA_LEFTTORIGHT
- wxSizer *sizerRow;
- sizerRow = CreateSizerWithTextAndLabel(wxT("&Major dimension:"),
- wxID_ANY,
- &m_textMajorDim);
- sizerLeft->Add(sizerRow, 0, wxGROW | wxALL, 5);
- sizerRow = CreateSizerWithTextAndLabel(wxT("&Number of buttons:"),
- wxID_ANY,
- &m_textNumBtns);
- sizerLeft->Add(sizerRow, 0, wxGROW | wxALL, 5);
- wxButton *btn;
- btn = new wxButton(this, RadioPage_Update, wxT("&Update"));
- sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 5);
- sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
- btn = new wxButton(this, RadioPage_Reset, wxT("&Reset"));
- sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
- // middle pane
- wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, wxT("&Change parameters"));
- wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
- sizerRow = CreateSizerWithTextAndLabel(wxT("Current selection:"),
- wxID_ANY,
- &m_textCurSel);
- sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5);
- sizerRow = CreateSizerWithTextAndButton(RadioPage_Selection,
- wxT("&Change selection:"),
- wxID_ANY,
- &m_textSel);
- sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5);
- sizerRow = CreateSizerWithTextAndButton(RadioPage_Label,
- wxT("&Label for box:"),
- wxID_ANY,
- &m_textLabel);
- sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5);
- sizerRow = CreateSizerWithTextAndButton(RadioPage_LabelBtn,
- wxT("&Label for buttons:"),
- wxID_ANY,
- &m_textLabelBtns);
- sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5);
- m_chkEnableItem = CreateCheckBoxAndAddToSizer(sizerMiddle,
- wxT("Disable &2nd item"),
- RadioPage_EnableItem);
- m_chkShowItem = CreateCheckBoxAndAddToSizer(sizerMiddle,
- wxT("Hide 2nd &item"),
- RadioPage_ShowItem);
- // right pane
- wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL);
- sizerRight->SetMinSize(150, 0);
- m_sizerRadio = sizerRight; // save it to modify it later
- Reset();
- CreateRadio();
- // 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, 0, wxGROW | (wxALL & ~wxRIGHT), 10);
- // final initializations
- SetSizer(sizerTop);
- }
- // ----------------------------------------------------------------------------
- // operations
- // ----------------------------------------------------------------------------
- void RadioWidgetsPage::Reset()
- {
- m_textMajorDim->SetValue(wxString::Format(wxT("%u"), DEFAULT_MAJOR_DIM));
- m_textNumBtns->SetValue(wxString::Format(wxT("%u"), DEFAULT_NUM_ENTRIES));
- m_textLabel->SetValue(wxT("I'm a radiobox"));
- m_textLabelBtns->SetValue(wxT("item"));
- m_chkSpecifyRows->SetValue(false);
- m_chkEnableItem->SetValue(true);
- m_chkShowItem->SetValue(true);
- m_radioDir->SetSelection(RadioDir_Default);
- }
- void RadioWidgetsPage::CreateRadio()
- {
- int sel;
- if ( m_radio )
- {
- sel = m_radio->GetSelection();
- m_sizerRadio->Detach( m_radio );
- delete m_radio;
- }
- else // first time creation, no old selection to preserve
- {
- sel = -1;
- }
- unsigned long count;
- if ( !m_textNumBtns->GetValue().ToULong(&count) )
- {
- wxLogWarning(wxT("Should have a valid number for number of items."));
- // fall back to default
- count = DEFAULT_NUM_ENTRIES;
- }
- unsigned long majorDim;
- if ( !m_textMajorDim->GetValue().ToULong(&majorDim) )
- {
- wxLogWarning(wxT("Should have a valid major dimension number."));
- // fall back to default
- majorDim = DEFAULT_MAJOR_DIM;
- }
- wxString *items = new wxString[count];
- wxString labelBtn = m_textLabelBtns->GetValue();
- for ( size_t n = 0; n < count; n++ )
- {
- items[n] = wxString::Format(wxT("%s %lu"),
- labelBtn.c_str(), (unsigned long)n + 1);
- }
- int flags = m_chkSpecifyRows->GetValue() ? wxRA_SPECIFY_ROWS
- : wxRA_SPECIFY_COLS;
- flags |= ms_defaultFlags;
- #ifdef wxRA_LEFTTORIGHT
- switch ( m_radioDir->GetSelection() )
- {
- default:
- wxFAIL_MSG( wxT("unexpected wxRadioBox layout direction") );
- // fall through
- case RadioDir_Default:
- break;
- case RadioDir_LtoR:
- flags |= wxRA_LEFTTORIGHT;
- break;
- case RadioDir_TtoB:
- flags |= wxRA_TOPTOBOTTOM;
- break;
- }
- #endif // wxRA_LEFTTORIGHT
- m_radio = new wxRadioBox(this, RadioPage_Radio,
- m_textLabel->GetValue(),
- wxDefaultPosition, wxDefaultSize,
- count, items,
- majorDim,
- flags);
- delete [] items;
- if ( sel >= 0 && (size_t)sel < count )
- {
- m_radio->SetSelection(sel);
- }
- m_sizerRadio->Add(m_radio, 1, wxGROW);
- m_sizerRadio->Layout();
- m_chkEnableItem->SetValue(true);
- m_chkEnableItem->SetValue(true);
- }
- // ----------------------------------------------------------------------------
- // event handlers
- // ----------------------------------------------------------------------------
- void RadioWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
- {
- Reset();
- CreateRadio();
- }
- void RadioWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
- {
- CreateRadio();
- }
- void RadioWidgetsPage::OnRadioBox(wxCommandEvent& event)
- {
- int sel = m_radio->GetSelection();
- int event_sel = event.GetSelection();
- wxUnusedVar(event_sel);
- wxLogMessage(wxT("Radiobox selection changed, now %d"), sel);
- wxASSERT_MSG( sel == event_sel,
- wxT("selection should be the same in event and radiobox") );
- m_textCurSel->SetValue(wxString::Format(wxT("%d"), sel));
- }
- void RadioWidgetsPage::OnButtonRecreate(wxCommandEvent& WXUNUSED(event))
- {
- CreateRadio();
- }
- void RadioWidgetsPage::OnButtonSetLabel(wxCommandEvent& WXUNUSED(event))
- {
- m_radio->wxControl::SetLabel(m_textLabel->GetValue());
- }
- void RadioWidgetsPage::OnButtonSelection(wxCommandEvent& WXUNUSED(event))
- {
- unsigned long sel;
- if ( !m_textSel->GetValue().ToULong(&sel) ||
- (sel >= (size_t)m_radio->GetCount()) )
- {
- wxLogWarning(wxT("Invalid number specified as new selection."));
- }
- else
- {
- m_radio->SetSelection(sel);
- }
- }
- void RadioWidgetsPage::OnEnableItem(wxCommandEvent& event)
- {
- m_radio->Enable(TEST_BUTTON, event.IsChecked());
- }
- void RadioWidgetsPage::OnShowItem(wxCommandEvent& event)
- {
- m_radio->Show(TEST_BUTTON, event.IsChecked());
- }
- void RadioWidgetsPage::OnUpdateUIUpdate(wxUpdateUIEvent& event)
- {
- unsigned long n;
- event.Enable( m_textNumBtns->GetValue().ToULong(&n) &&
- m_textMajorDim->GetValue().ToULong(&n) );
- }
- void RadioWidgetsPage::OnUpdateUISelection(wxUpdateUIEvent& event)
- {
- unsigned long n;
- event.Enable( m_textSel->GetValue().ToULong(&n) &&
- (n < (size_t)m_radio->GetCount()) );
- }
- void RadioWidgetsPage::OnUpdateUIReset(wxUpdateUIEvent& event)
- {
- // only enable it if something is not set to default
- bool enable = m_chkSpecifyRows->GetValue();
- if ( !enable )
- {
- unsigned long numEntries;
- enable = !m_textNumBtns->GetValue().ToULong(&numEntries) ||
- numEntries != DEFAULT_NUM_ENTRIES;
- if ( !enable )
- {
- unsigned long majorDim;
- enable = !m_textMajorDim->GetValue().ToULong(&majorDim) ||
- majorDim != DEFAULT_MAJOR_DIM;
- }
- }
- event.Enable(enable);
- }
- void RadioWidgetsPage::OnUpdateUIEnableItem(wxUpdateUIEvent& event)
- {
- event.SetText(m_radio->IsItemEnabled(TEST_BUTTON) ? wxT("Disable &2nd item")
- : wxT("Enable &2nd item"));
- }
- void RadioWidgetsPage::OnUpdateUIShowItem(wxUpdateUIEvent& event)
- {
- event.SetText(m_radio->IsItemShown(TEST_BUTTON) ? wxT("Hide 2nd &item")
- : wxT("Show 2nd &item"));
- }
- #endif // wxUSE_RADIOBOX
|