Re-add support for multiple text validator styles but

1) catch some invalid configurations in SetStyle()
2) document the order of the checks in wxTextValidator
3) implement wxFILTER_EMPTY
4) rename wxFILTER_SIMPLE_NUMBER => wxFILTER_DIGITS



git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58637 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Francesco Montorsi
2009-02-03 21:21:47 +00:00
parent 77cc73a78e
commit 58fa61dbad
4 changed files with 112 additions and 121 deletions

View File

@@ -43,8 +43,9 @@ static bool wxIsNumeric(const wxString& val)
{
// Allow for "," (French) as well as "." -- in future we should
// use wxSystemSettings or other to do better localisation
if ((!wxIsdigit(*i)) && (*i != wxT('.')) && (*i != wxT(',')) && (*i != wxT('e')) &&
(*i != wxT('E')) && (*i != wxT('+')) && (*i != wxT('-')))
if ((!wxIsdigit(*i)) &&
(*i != wxS('.')) && (*i != wxS(',')) && (*i != wxS('e')) &&
(*i != wxS('E')) && (*i != wxS('+')) && (*i != wxS('-')))
return false;
}
return true;
@@ -59,24 +60,10 @@ BEGIN_EVENT_TABLE(wxTextValidator, wxValidator)
EVT_CHAR(wxTextValidator::OnChar)
END_EVENT_TABLE()
#if WXWIN_COMPATIBILITY_2_8
wxTextValidator::wxTextValidator(long style, wxString *val)
{
m_validatorStyle = (wxTextValidatorStyle)style;
m_stringValue = val;
}
void wxTextValidator::SetStyle(long style)
{
SetStyle((wxTextValidatorStyle)style);
}
#endif
wxTextValidator::wxTextValidator(wxTextValidatorStyle style, wxString *val)
{
m_validatorStyle = style;
m_stringValue = val;
SetStyle(style);
}
wxTextValidator::wxTextValidator(const wxTextValidator& val)
@@ -85,6 +72,30 @@ wxTextValidator::wxTextValidator(const wxTextValidator& val)
Copy(val);
}
void wxTextValidator::SetStyle(long style)
{
m_validatorStyle = style;
#ifdef __WXDEBUG__
int check;
check = (int)HasFlag(wxFILTER_ALPHA) + (int)HasFlag(wxFILTER_ALPHANUMERIC) +
(int)HasFlag(wxFILTER_DIGITS) + (int)HasFlag(wxFILTER_NUMERIC);
wxASSERT_MSG(check <= 1,
"It makes sense to use only one of the wxFILTER_ALPHA/wxFILTER_ALPHANUMERIC/"
"wxFILTER_SIMPLE_NUMBER/wxFILTER_NUMERIC styles");
wxASSERT_MSG(((int)HasFlag(wxFILTER_INCLUDE_LIST) + (int)HasFlag(wxFILTER_INCLUDE_CHAR_LIST) <= 1) &&
((int)HasFlag(wxFILTER_EXCLUDE_LIST) + (int)HasFlag(wxFILTER_EXCLUDE_CHAR_LIST) <= 1),
"Using both wxFILTER_[IN|EX]CLUDE_LIST _and_ wxFILTER_[IN|EX]CLUDE_CHAR_LIST "
"doesn't work since wxTextValidator internally uses the same array for both");
check = (int)HasFlag(wxFILTER_INCLUDE_LIST) + (int)HasFlag(wxFILTER_INCLUDE_CHAR_LIST) +
(int)HasFlag(wxFILTER_EXCLUDE_LIST) + (int)HasFlag(wxFILTER_EXCLUDE_CHAR_LIST);
wxASSERT_MSG(check <= 1,
"Using both an include/exclude list may lead to unexpected results");
#endif
}
bool wxTextValidator::Copy(const wxTextValidator& val)
{
wxValidator::Copy(val);
@@ -135,18 +146,23 @@ bool wxTextValidator::Validate(wxWindow *parent)
wxString val(text->GetValue());
// NB: this format string should always contain exactly one '%s'
wxString errormsg;
if (!IsValid(val, &errormsg))
if ( HasFlag(wxFILTER_EMPTY) && val.empty() )
{
wxASSERT(!errormsg.empty());
m_validatorWindow->SetFocus();
errormsg = _("The empty string is not allowed.");
}
else if ( !(errormsg = IsValid(val)).empty() )
{
// NB: this format string should always contain exactly one '%s'
wxString buf;
buf.Printf(errormsg, val.c_str());
errormsg = buf;
}
wxMessageBox(buf, _("Validation conflict"),
if ( !errormsg.empty() )
{
m_validatorWindow->SetFocus();
wxMessageBox(errormsg, _("Validation conflict"),
wxOK | wxICON_EXCLAMATION, parent);
return false;
@@ -185,68 +201,30 @@ bool wxTextValidator::TransferFromWindow()
return true;
}
bool wxTextValidator::IsValid(const wxString& val, wxString* pErr) const
wxString wxTextValidator::IsValid(const wxString& val) const
{
wxString errormsg;
switch (m_validatorStyle)
{
case wxFILTER_NONE:
// nothing to do...
break;
// wxFILTER_EMPTY is checked for in wxTextValidator::Validate
case wxFILTER_INCLUDE_LIST:
if ( m_includes.Index(val) == wxNOT_FOUND )
errormsg = _("'%s' is invalid");
break;
if ( HasFlag(wxFILTER_ASCII) && !val.IsAscii() )
return _("'%s' should only contain ASCII characters.");
if ( HasFlag(wxFILTER_ALPHA) && !wxStringCheck<wxIsalpha>(val) )
return _("'%s' should only contain alphabetic characters.");
if ( HasFlag(wxFILTER_ALPHANUMERIC) && !wxStringCheck<wxIsalnum>(val) )
return _("'%s' should only contain alphabetic or numeric characters.");
if ( HasFlag(wxFILTER_DIGITS) && !wxStringCheck<wxIsdigit>(val) )
return _("'%s' should only contain digits.");
if ( HasFlag(wxFILTER_NUMERIC) && !wxIsNumeric(val) )
return _("'%s' should be numeric.");
if ( HasFlag(wxFILTER_INCLUDE_LIST) && m_includes.Index(val) == wxNOT_FOUND )
return _("'%s' is invalid");
if ( HasFlag(wxFILTER_INCLUDE_CHAR_LIST) && !ContainsOnlyIncludedCharacters(val) )
return _("'%s' is invalid");
if ( HasFlag(wxFILTER_EXCLUDE_LIST) && m_excludes.Index(val) != wxNOT_FOUND )
return _("'%s' is invalid");
if ( HasFlag(wxFILTER_EXCLUDE_CHAR_LIST) && ContainsExcludedCharacters(val) )
return _("'%s' is invalid");
case wxFILTER_EXCLUDE_LIST:
if ( m_excludes.Index(val) != wxNOT_FOUND )
errormsg = _("'%s' is invalid");
break;
case wxFILTER_ASCII:
if ( !val.IsAscii() )
errormsg = _("'%s' should only contain ASCII characters.");
break;
case wxFILTER_ALPHA:
if ( !wxStringCheck<wxIsalpha>(val) )
errormsg = _("'%s' should only contain alphabetic characters.");
break;
case wxFILTER_ALPHANUMERIC:
if ( !wxStringCheck<wxIsalnum>(val) )
errormsg = _("'%s' should only contain alphabetic or numeric characters.");
break;
case wxFILTER_SIMPLE_NUMBER:
if ( !wxStringCheck<wxIsdigit>(val) )
errormsg = _("'%s' should be numeric.");
break;
case wxFILTER_NUMERIC:
if ( !wxIsNumeric(val) )
errormsg = _("'%s' should be numeric.");
break;
case wxFILTER_INCLUDE_CHAR_LIST:
if ( !ContainsOnlyIncludedCharacters(val) )
errormsg = _("'%s' is invalid");
break;
case wxFILTER_EXCLUDE_CHAR_LIST:
if ( ContainsExcludedCharacters(val) )
errormsg = _("'%s' is invalid");
break;
default:
wxFAIL_MSG("invalid text validator style");
}
if (pErr)
*pErr = errormsg;
return errormsg.empty();
return wxEmptyString;
}
bool wxTextValidator::ContainsOnlyIncludedCharacters(const wxString& val) const
@@ -309,7 +287,7 @@ void wxTextValidator::OnChar(wxKeyEvent& event)
}
wxString str((wxUniChar)keyCode, 1);
if (!IsValid(str, NULL))
if (!IsValid(str).empty())
{
if ( !wxValidator::IsSilent() )
wxBell();