X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7b235dce88ca7e3fc0182c5b8ce088f1281c3321..7499628f59651e5ea4c01303ec631193dbe7ed96:/src/common/valtext.cpp diff --git a/src/common/valtext.cpp b/src/common/valtext.cpp index 202e8195fa..d150671737 100644 --- a/src/common/valtext.cpp +++ b/src/common/valtext.cpp @@ -2,7 +2,7 @@ // Name: src/common/valtext.cpp // Purpose: wxTextValidator // Author: Julian Smart -// Modified by: +// Modified by: Francesco Montorsi // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart @@ -33,28 +33,74 @@ #include #include -#ifdef __SALFORDC__ - #include -#endif +// ---------------------------------------------------------------------------- +// global helpers +// ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxTextValidator, wxValidator) +static bool wxIsAlpha(const wxString& val) +{ + int i; + for ( i = 0; i < (int)val.length(); i++) + { + if (!wxIsalpha(val[i])) + return false; + } + return true; +} +static bool wxIsAlphaNumeric(const wxString& val) +{ + int i; + for ( i = 0; i < (int)val.length(); i++) + { + if (!wxIsalnum(val[i])) + return false; + } + return true; +} + +static bool wxIsNumeric(const wxString& val) +{ + int i; + for ( i = 0; i < (int)val.length(); i++) + { + // Allow for "," (French) as well as "." -- in future we should + // use wxSystemSettings or other to do better localisation + if ((!wxIsdigit(val[i])) && (val[i] != wxT('.')) && (val[i] != wxT(',')) && (val[i] != wxT('e')) && + (val[i] != wxT('E')) && (val[i] != wxT('+')) && (val[i] != wxT('-'))) + return false; + } + return true; +} + + +// ---------------------------------------------------------------------------- +// wxTextValidator +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxTextValidator, wxValidator) BEGIN_EVENT_TABLE(wxTextValidator, wxValidator) EVT_CHAR(wxTextValidator::OnChar) END_EVENT_TABLE() -static bool wxIsNumeric(const wxString& val); +#if WXWIN_COMPATIBILITY_2_8 wxTextValidator::wxTextValidator(long style, wxString *val) { - m_validatorStyle = style; + m_validatorStyle = (wxTextValidatorStyle)style; m_stringValue = val; -/* - m_refData = new wxVTextRefData; +} + +void wxTextValidator::SetStyle(long style) +{ + SetStyle((wxTextValidatorStyle)style); +} +#endif - M_VTEXTDATA->m_validatorStyle = style; - M_VTEXTDATA->m_stringValue = val; -*/ +wxTextValidator::wxTextValidator(wxTextValidatorStyle style, wxString *val) +{ + m_validatorStyle = style; + m_stringValue = val; } wxTextValidator::wxTextValidator(const wxTextValidator& val) @@ -85,15 +131,12 @@ wxTextEntry *wxTextValidator::GetTextEntry() } #endif - // FIXME: in wxMotif wxComboBox doesn't derive from wxTextCtrl yet -#ifndef __WXMOTIF__ #if wxUSE_COMBOBOX if (m_validatorWindow->IsKindOf(CLASSINFO(wxComboBox))) { return (wxComboBox*)m_validatorWindow; } #endif -#endif // !__WXMOTIF__ wxFAIL_MSG( _T("wxTextValidator can only be used with wxTextCtrl or wxComboBox") @@ -102,28 +145,6 @@ wxTextEntry *wxTextValidator::GetTextEntry() return NULL; } -static bool wxIsAlpha(const wxString& val) -{ - int i; - for ( i = 0; i < (int)val.length(); i++) - { - if (!wxIsalpha(val[i])) - return false; - } - return true; -} - -static bool wxIsAlphaNumeric(const wxString& val) -{ - int i; - for ( i = 0; i < (int)val.length(); i++) - { - if (!wxIsalnum(val[i])) - return false; - } - return true; -} - // Called when the value in the window must be validated. // This function can pop up an error message. bool wxTextValidator::Validate(wxWindow *parent) @@ -138,62 +159,11 @@ bool wxTextValidator::Validate(wxWindow *parent) wxString val(text->GetValue()); - bool ok = true; - - // NB: this format string should contian exactly one '%s' + // NB: this format string should always contain exactly one '%s' wxString errormsg; - - bool includes = (m_validatorStyle & wxFILTER_INCLUDE_LIST) != 0; - if ( includes || (m_validatorStyle & wxFILTER_EXCLUDE_LIST) ) - { - // if includes, it's only ok to have the members of the list, - // otherwise it's only ok to have non-members - ok = includes == (m_includes.Index(val) != wxNOT_FOUND); - if ( !ok ) - { - errormsg = _("'%s' is invalid"); - } - } - else if ( (m_validatorStyle & wxFILTER_ASCII) && !val.IsAscii() ) + if (!IsValid(val, &errormsg)) { - ok = false; - - errormsg = _("'%s' should only contain ASCII characters."); - } - else if ( (m_validatorStyle & wxFILTER_ALPHA) && !wxIsAlpha(val) ) - { - ok = false; - - errormsg = _("'%s' should only contain alphabetic characters."); - } - else if ( (m_validatorStyle & wxFILTER_ALPHANUMERIC) && !wxIsAlphaNumeric(val)) - { - ok = false; - - errormsg = _("'%s' should only contain alphabetic or numeric characters."); - } - else if ( (m_validatorStyle & wxFILTER_NUMERIC) && !wxIsNumeric(val)) - { - ok = false; - - errormsg = _("'%s' should be numeric."); - } - else if ( (m_validatorStyle & wxFILTER_INCLUDE_CHAR_LIST) && !IsInCharIncludes(val)) - { - //it's only ok to have the members of the list - errormsg = _("'%s' is invalid"); - ok = false; - } - else if ( (m_validatorStyle & wxFILTER_EXCLUDE_CHAR_LIST) && !IsNotInCharExcludes(val)) - { - // it's only ok to have non-members of the list - errormsg = _("'%s' is invalid"); - ok = false; - } - - if ( !ok ) - { - wxASSERT_MSG( !errormsg.empty(), _T("you forgot to set errormsg") ); + wxASSERT(!errormsg.empty()); m_validatorWindow->SetFocus(); @@ -202,13 +172,15 @@ bool wxTextValidator::Validate(wxWindow *parent) wxMessageBox(buf, _("Validation conflict"), wxOK | wxICON_EXCLAMATION, parent); + + return false; } - return ok; + return true; } // Called to transfer data to the window -bool wxTextValidator::TransferToWindow(void) +bool wxTextValidator::TransferToWindow() { if ( m_stringValue ) { @@ -223,7 +195,7 @@ bool wxTextValidator::TransferToWindow(void) } // Called to transfer data to the window -bool wxTextValidator::TransferFromWindow(void) +bool wxTextValidator::TransferFromWindow() { if ( m_stringValue ) { @@ -237,75 +209,115 @@ bool wxTextValidator::TransferFromWindow(void) return true; } -bool wxTextValidator::IsInCharIncludes(const wxString& val) +bool wxTextValidator::IsValid(const wxString& val, wxString* pErr) const { - size_t i; - for ( i = 0; i < val.length(); i++) + wxString errormsg; + switch (m_validatorStyle) { + case wxFILTER_NONE: + // nothing to do... + break; + + case wxFILTER_INCLUDE_LIST: + if ( m_includes.Index(val) == wxNOT_FOUND ) + errormsg = _("'%s' is invalid"); + break; + + 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 ( !wxIsAlpha(val) ) + errormsg = _("'%s' should only contain alphabetic characters."); + break; + + case wxFILTER_ALPHANUMERIC: + if ( !wxIsAlphaNumeric(val) ) + errormsg = _("'%s' should only contain alphabetic or numeric characters."); + break; + + case wxFILTER_NUMERIC: + if ( !wxIsNumeric(val) ) + errormsg = _("'%s' should be numeric."); + break; + + case wxFILTER_INCLUDE_CHAR_LIST: + if ( !IsInCharIncludes(val) ) + errormsg = _("'%s' is invalid"); + break; + + case wxFILTER_EXCLUDE_CHAR_LIST: + if ( !IsNotInCharExcludes(val) ) + errormsg = _("'%s' is invalid"); + break; + + default: + wxFAIL_MSG("invalid text validator style"); + } + + if (pErr) + *pErr = errormsg; + + return errormsg.empty(); +} + +bool wxTextValidator::IsInCharIncludes(const wxString& val) const +{ + for (size_t i = 0; i < val.length(); i++) if (m_includes.Index((wxString) val[i]) == wxNOT_FOUND) + // one character of 'val' is NOT present in m_includes... return false; - } + + // all characters of 'val' are present in m_includes return true; } -bool wxTextValidator::IsNotInCharExcludes(const wxString& val) +bool wxTextValidator::IsNotInCharExcludes(const wxString& val) const { - size_t i; - for ( i = 0; i < val.length(); i++) - { - if (m_excludes.Index((wxString) val[i]) != wxNOT_FOUND) + for (size_t i = 0; i < val.length(); i++) + if (m_excludes.Index((wxString) val[i]) != wxNOT_FOUND) + // one character of 'val' is present in m_excludes... return false; - } + + // all characters of 'val' are NOT present in m_excludes return true; } void wxTextValidator::OnChar(wxKeyEvent& event) { -/* - if ( !M_VTEXTDATA ) + if (!m_validatorWindow) + { + event.Skip(); return; -*/ + } - if ( m_validatorWindow ) + int keyCode = event.GetKeyCode(); + + // we don't filter special keys and delete + if (keyCode < WXK_SPACE || keyCode == WXK_DELETE || keyCode >= WXK_START) { - int keyCode = event.GetKeyCode(); - - // we don't filter special keys and Delete - if ( - !(keyCode < WXK_SPACE || keyCode == WXK_DELETE || keyCode > WXK_START) && - ( - ((m_validatorStyle & wxFILTER_INCLUDE_CHAR_LIST) && !IsInCharIncludes(wxString((wxChar) keyCode, 1))) || - ((m_validatorStyle & wxFILTER_EXCLUDE_CHAR_LIST) && !IsNotInCharExcludes(wxString((wxChar) keyCode, 1))) || - ((m_validatorStyle & wxFILTER_ASCII) && !isascii(keyCode)) || - ((m_validatorStyle & wxFILTER_ALPHA) && !wxIsalpha(keyCode)) || - ((m_validatorStyle & wxFILTER_ALPHANUMERIC) && !wxIsalnum(keyCode)) || - ((m_validatorStyle & wxFILTER_NUMERIC) && !wxIsdigit(keyCode) - && keyCode != wxT('.') && keyCode != wxT(',') && keyCode != wxT('-') && keyCode != wxT('+') && keyCode != wxT('e') && keyCode != wxT('E')) - ) - ) - { - if ( !wxValidator::IsSilent() ) - wxBell(); - - // eat message - return; - } + event.Skip(); + return; } - event.Skip(); -} - -static bool wxIsNumeric(const wxString& val) -{ - int i; - for ( i = 0; i < (int)val.length(); i++) + wxString str((wxUniChar)keyCode, 1); + if (!IsValid(str, NULL)) { - // Allow for "," (French) as well as "." -- in future we should - // use wxSystemSettings or other to do better localisation - if ((!wxIsdigit(val[i])) && (val[i] != wxT('.')) && (val[i] != wxT(',')) && (val[i] != wxT('e')) && (val[i] != wxT('E')) && (val[i] != wxT('+')) && (val[i] != wxT('-'))) - return false; + if ( !wxValidator::IsSilent() ) + wxBell(); + + // eat message + return; } - return true; + else + event.Skip(); }