X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e01ea38b49e8f3a433fdb7304791c219bd2c7368..d8eff331e23435d9d8d6483a40f6fd9997a13f87:/samples/validate/validate.cpp?ds=sidebyside diff --git a/samples/validate/validate.cpp b/samples/validate/validate.cpp index d4e2642508..dc03e879b7 100644 --- a/samples/validate/validate.cpp +++ b/samples/validate/validate.cpp @@ -46,7 +46,7 @@ wxString g_listbox_choices[] = {wxT("one"), wxT("two"), wxT("three")}; wxString g_combobox_choices[] = - {wxT("yes"), wxT("no"), wxT("maybe")}; + {wxT("yes"), wxT("no (doesn't validate)"), wxT("maybe (doesn't validate)")}; wxString g_radiobox_choices[] = {wxT("green"), wxT("yellow"), wxT("red")}; @@ -59,13 +59,68 @@ MyData::MyData() { // This string will be passed to an alpha-only validator, which // will complain because spaces aren't alpha. Note that validation - // is performed only when 'OK' is pressed. It would be nice to - // enhance this so that validation would occur when the text - // control loses focus. + // is performed only when 'OK' is pressed. m_string = wxT("Spaces are invalid here"); + m_string2 = "Valid text"; m_listbox_choices.Add(0); } +// ---------------------------------------------------------------------------- +// MyComboBoxValidator +// ---------------------------------------------------------------------------- + +bool MyComboBoxValidator::Validate(wxWindow *WXUNUSED(parent)) +{ + wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxComboBox))); + + wxComboBox* cb = (wxComboBox*)GetWindow(); + if (cb->GetValue() == g_combobox_choices[1] || + cb->GetValue() == g_combobox_choices[2]) + { + // we accept any string != g_combobox_choices[1|2] ! + + wxLogError("Invalid combo box text!"); + return false; + } + + if (m_var) + *m_var = cb->GetValue(); + + return true; +} + +bool MyComboBoxValidator::TransferToWindow() +{ + wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxComboBox))); + + if ( m_var ) + { + wxComboBox* cb = (wxComboBox*)GetWindow(); + if ( !cb ) + return false; + + cb->SetValue(*m_var); + } + + return true; +} + +bool MyComboBoxValidator::TransferFromWindow() +{ + wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxComboBox))); + + if ( m_var ) + { + wxComboBox* cb = (wxComboBox*)GetWindow(); + if ( !cb ) + return false; + + *m_var = cb->GetValue(); + } + + return true; +} + // ---------------------------------------------------------------------------- // MyApp // ---------------------------------------------------------------------------- @@ -103,22 +158,22 @@ MyFrame::MyFrame(wxFrame *frame, const wxString&title, int x, int y, int w, int // Create a listbox to display the validated data. m_listbox = new wxListBox(this, wxID_ANY); - m_listbox->Append(wxString(_T("Try 'File|Test' to see how validators work."))); + m_listbox->Append(wxString(wxT("Try 'File|Test' to see how validators work."))); wxMenu *file_menu = new wxMenu; - file_menu->Append(VALIDATE_TEST_DIALOG, wxT("&Test"), wxT("Demonstrate validators")); + file_menu->Append(VALIDATE_TEST_DIALOG, wxT("&Test dialog..."), wxT("Demonstrate validators")); file_menu->AppendCheckItem(VALIDATE_TOGGLE_BELL, wxT("&Bell on error"), wxT("Toggle bell on error")); file_menu->AppendSeparator(); file_menu->Append(wxID_EXIT, wxT("E&xit")); wxMenuBar *menu_bar = new wxMenuBar; - menu_bar->Append(file_menu, wxT("File")); + menu_bar->Append(file_menu, wxT("&File")); SetMenuBar(menu_bar); // All validators share a common (static) flag that controls // whether they beep on error. Here we turn it off: - wxValidator::SetBellOnError(m_silent); + wxValidator::SuppressBellOnError(m_silent); file_menu->Check(VALIDATE_TOGGLE_BELL, !wxValidator::IsSilent()); #if wxUSE_STATUSBAR @@ -147,24 +202,26 @@ void MyFrame::OnTestDialog(wxCommandEvent& WXUNUSED(event)) // automatically transferred to the variables we specified // when we created the validators. m_listbox->Clear(); - m_listbox->Append(wxString(_T("string: ")) + g_data.m_string); + m_listbox->Append(wxString(wxT("string: ")) + g_data.m_string); + m_listbox->Append(wxString(wxT("string #2: ")) + g_data.m_string2); + for(unsigned int i = 0; i < g_data.m_listbox_choices.GetCount(); ++i) { int j = g_data.m_listbox_choices[i]; - m_listbox->Append(wxString(_T("listbox choice(s): ")) + g_listbox_choices[j]); + m_listbox->Append(wxString(wxT("listbox choice(s): ")) + g_listbox_choices[j]); } - wxString checkbox_state(g_data.m_checkbox_state ? _T("checked") : _T("unchecked")); - m_listbox->Append(wxString(_T("checkbox: ")) + checkbox_state); - m_listbox->Append(wxString(_T("combobox: ")) + g_data.m_combobox_choice); - m_listbox->Append(wxString(_T("radiobox: ")) + g_radiobox_choices[g_data.m_radiobox_choice]); + wxString checkbox_state(g_data.m_checkbox_state ? wxT("checked") : wxT("unchecked")); + m_listbox->Append(wxString(wxT("checkbox: ")) + checkbox_state); + m_listbox->Append(wxString(wxT("combobox: ")) + g_data.m_combobox_choice); + m_listbox->Append(wxString(wxT("radiobox: ")) + g_radiobox_choices[g_data.m_radiobox_choice]); } } void MyFrame::OnToggleBell(wxCommandEvent& event) { m_silent = !m_silent; - wxValidator::SetBellOnError(m_silent); + wxValidator::SuppressBellOnError(m_silent); event.Skip(); } @@ -179,7 +236,7 @@ MyDialog::MyDialog( wxWindow *parent, const wxString& title, // setup the flex grid sizer // ------------------------- - wxFlexGridSizer *flexgridsizer = new wxFlexGridSizer(2, 2, 5, 5); + wxFlexGridSizer *flexgridsizer = new wxFlexGridSizer(3, 2, 5, 5); // Create and add controls to sizers. Note that a member variable // of g_data is bound to each control upon construction. There is @@ -188,34 +245,52 @@ MyDialog::MyDialog( wxWindow *parent, const wxString& title, // Pointers to some of these controls are saved in member variables // so that we can use them elsewhere, like this one. - text = new wxTextCtrl(this, VALIDATE_TEXT, wxEmptyString, - wxPoint(10, 10), wxSize(120, wxDefaultCoord), 0, - wxTextValidator(wxFILTER_ALPHA, &g_data.m_string)); - flexgridsizer->Add(text); + m_text = new wxTextCtrl(this, VALIDATE_TEXT, wxEmptyString, + wxDefaultPosition, wxDefaultSize, 0, + wxTextValidator(wxFILTER_ALPHA, &g_data.m_string)); + m_text->SetToolTip("uses wxTextValidator with wxFILTER_ALPHA"); + flexgridsizer->Add(m_text, 1, wxGROW); + + + // Now set a wxTextValidator with an explicit list of characters NOT allowed: + wxTextValidator textVal(wxFILTER_EMPTY|wxFILTER_EXCLUDE_LIST, &g_data.m_string2); + textVal.SetCharExcludes("bcwyz"); + wxTextCtrl* txt2 = + new wxTextCtrl(this, VALIDATE_TEXT2, wxEmptyString, + wxDefaultPosition, wxDefaultSize, 0, textVal); + txt2->SetToolTip("uses wxTextValidator with wxFILTER_EMPTY|wxFILTER_EXCLUDE_LIST (to exclude 'bcwyz')"); + flexgridsizer->Add(txt2, 1, wxGROW); + + flexgridsizer->Add(new wxListBox((wxWindow*)this, VALIDATE_LIST, + wxDefaultPosition, wxDefaultSize, + 3, g_listbox_choices, wxLB_MULTIPLE, + wxGenericValidator(&g_data.m_listbox_choices)), + 1, wxGROW); + + m_combobox = new wxComboBox(this, VALIDATE_COMBO, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + 3, g_combobox_choices, 0L, + MyComboBoxValidator(&g_data.m_combobox_choice)); + m_combobox->SetToolTip("uses a custom validator (MyComboBoxValidator)"); + flexgridsizer->Add(m_combobox, 1, wxALIGN_CENTER); // This wxCheckBox* doesn't need to be assigned to any pointer // because we don't use it elsewhere--it can be anonymous. // We don't need any such pointer to query its state, which // can be gotten directly from g_data. flexgridsizer->Add(new wxCheckBox(this, VALIDATE_CHECK, wxT("Sample checkbox"), - wxPoint(130, 10), wxSize(120, wxDefaultCoord), 0, - wxGenericValidator(&g_data.m_checkbox_state))); - - flexgridsizer->Add(new wxListBox((wxWindow*)this, VALIDATE_LIST, - wxPoint(10, 30), wxSize(120, wxDefaultCoord), - 3, g_listbox_choices, wxLB_MULTIPLE, - wxGenericValidator(&g_data.m_listbox_choices))); + wxDefaultPosition, wxDefaultSize, 0, + wxGenericValidator(&g_data.m_checkbox_state)), + 1, wxALIGN_CENTER|wxALL, 15); - combobox = new wxComboBox((wxWindow*)this, VALIDATE_COMBO, wxEmptyString, - wxPoint(130, 30), wxSize(120, wxDefaultCoord), - 3, g_combobox_choices, 0L, - wxGenericValidator(&g_data.m_combobox_choice)); - flexgridsizer->Add(combobox); + flexgridsizer->AddGrowableCol(0); + flexgridsizer->AddGrowableCol(1); + flexgridsizer->AddGrowableRow(1); // setup the button sizer // ---------------------- - + wxStdDialogButtonSizer *btn = new wxStdDialogButtonSizer(); btn->AddButton(new wxButton(this, wxID_OK)); btn->AddButton(new wxButton(this, wxID_CANCEL)); @@ -224,30 +299,35 @@ MyDialog::MyDialog( wxWindow *parent, const wxString& title, // setup the main sizer // -------------------- - + wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); mainsizer->Add(flexgridsizer, 1, wxGROW | wxALL, 10); mainsizer->Add(new wxRadioBox((wxWindow*)this, VALIDATE_RADIO, wxT("Pick a color"), - wxPoint(10, 100), wxDefaultSize, + wxDefaultPosition, wxDefaultSize, 3, g_radiobox_choices, 1, wxRA_SPECIFY_ROWS, wxGenericValidator(&g_data.m_radiobox_choice)), - 0, wxGROW | wxALL, 10); + 0, wxGROW | wxLEFT|wxBOTTOM|wxRIGHT, 10); mainsizer->Add(btn, 0, wxGROW | wxALL, 10); SetSizer(mainsizer); mainsizer->SetSizeHints(this); + + // make the dialog a bit bigger than its minimal size: + SetSize(GetBestSize()*1.5); } bool MyDialog::TransferDataToWindow() { bool r = wxDialog::TransferDataToWindow(); + // These function calls have to be made here, after the // dialog has been created. - text->SetFocus(); - combobox->SetSelection(0); + m_text->SetFocus(); + m_combobox->SetSelection(0); + return r; }