home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / src / common / valtext.cpp < prev    next >
C/C++ Source or Header  |  2002-05-07  |  9KB  |  337 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        valtext.cpp
  3. // Purpose:     wxTextValidator
  4. // Author:      Julian Smart
  5. // Modified by:
  6. // Created:     04/01/98
  7. // RCS-ID:      $Id: valtext.cpp,v 1.27 2002/05/07 21:58:25 GD Exp $
  8. // Copyright:   (c) Julian Smart and Markus Holzem
  9. // Licence:     wxWindows license
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. #ifdef __GNUG__
  13. #pragma implementation "valtext.h"
  14. #endif
  15.  
  16. // For compilers that support precompilation, includes "wx.h".
  17. #include "wx/wxprec.h"
  18.  
  19. #ifdef __BORLANDC__
  20.   #pragma hdrstop
  21. #endif
  22.  
  23. #if wxUSE_VALIDATORS
  24.  
  25. #ifndef WX_PRECOMP
  26.   #include <stdio.h>
  27.   #include "wx/textctrl.h"
  28.   #include "wx/utils.h"
  29.   #include "wx/msgdlg.h"
  30.   #include "wx/intl.h"
  31. #endif
  32.  
  33. #include "wx/valtext.h"
  34.  
  35. #include <ctype.h>
  36. #include <string.h>
  37. #include <stdlib.h>
  38.  
  39. #ifdef __SALFORDC__
  40.     #include <clib.h>
  41. #endif
  42.  
  43. IMPLEMENT_DYNAMIC_CLASS(wxTextValidator, wxValidator)
  44.  
  45. BEGIN_EVENT_TABLE(wxTextValidator, wxValidator)
  46.     EVT_CHAR(wxTextValidator::OnChar)
  47. END_EVENT_TABLE()
  48.  
  49. static bool wxIsNumeric(const wxString& val);
  50.  
  51. wxTextValidator::wxTextValidator(long style, wxString *val)
  52. {
  53.     m_validatorStyle = style ;
  54.     m_stringValue = val ;
  55. /*
  56.     m_refData = new wxVTextRefData;
  57.  
  58.     M_VTEXTDATA->m_validatorStyle = style ;
  59.     M_VTEXTDATA->m_stringValue = val ;
  60. */
  61. }
  62.  
  63. wxTextValidator::wxTextValidator(const wxTextValidator& val)
  64.     : wxValidator()
  65. {
  66.     Copy(val);
  67. }
  68.  
  69. bool wxTextValidator::Copy(const wxTextValidator& val)
  70. {
  71.     wxValidator::Copy(val);
  72.  
  73.     m_validatorStyle = val.m_validatorStyle ;
  74.     m_stringValue = val.m_stringValue ;
  75.  
  76.     wxNode *node = val.m_includeList.First() ;
  77.     while ( node )
  78.     {
  79.         wxChar *s = (wxChar *)node->Data();
  80.         m_includeList.Add(s);
  81.         node = node->Next();
  82.     }
  83.     node = val.m_excludeList.First() ;
  84.     while ( node )
  85.     {
  86.         wxChar *s = (wxChar *)node->Data();
  87.         m_excludeList.Add(s);
  88.         node = node->Next();
  89.     }
  90.     return TRUE;
  91. }
  92.  
  93. wxTextValidator::~wxTextValidator()
  94. {
  95. }
  96.  
  97. static bool wxIsAlpha(const wxString& val)
  98. {
  99.     int i;
  100.     for ( i = 0; i < (int)val.Length(); i++)
  101.     {
  102.         if (!wxIsalpha(val[i]))
  103.             return FALSE;
  104.     }
  105.     return TRUE;
  106. }
  107.  
  108. static bool wxIsAlphaNumeric(const wxString& val)
  109. {
  110.     int i;
  111.     for ( i = 0; i < (int)val.Length(); i++)
  112.     {
  113.         if (!wxIsalnum(val[i]))
  114.             return FALSE;
  115.     }
  116.     return TRUE;
  117. }
  118.  
  119. // Called when the value in the window must be validated.
  120. // This function can pop up an error message.
  121. bool wxTextValidator::Validate(wxWindow *parent)
  122. {
  123.     if( !CheckValidator() )
  124.         return FALSE;
  125.  
  126.     wxTextCtrl *control = (wxTextCtrl *) m_validatorWindow ;
  127.  
  128.     // If window is disabled, simply return
  129.     if ( !control->IsEnabled() )
  130.         return TRUE;
  131.  
  132.     wxString val(control->GetValue());
  133.  
  134.     bool ok = TRUE;
  135.  
  136.     // NB: this format string should contian exactly one '%s'
  137.     wxString errormsg;
  138.  
  139.     bool includeList = (m_validatorStyle & wxFILTER_INCLUDE_LIST) != 0;
  140.     if ( includeList || (m_validatorStyle & wxFILTER_EXCLUDE_LIST) )
  141.     {
  142.         // if includeList, it's only ok to have the members of the list,
  143.         // otherwise it's only ok to have non-members
  144.         ok = includeList == m_includeList.Member(val);
  145.         if ( !ok )
  146.         {
  147.             errormsg = _("'%s' is invalid");
  148.         }
  149.     }
  150.     else if ( (m_validatorStyle & wxFILTER_ASCII) && !val.IsAscii() )
  151.     {
  152.         ok = FALSE;
  153.  
  154.         errormsg = _("'%s' should only contain ASCII characters.");
  155.     }
  156.     else if ( (m_validatorStyle & wxFILTER_ALPHA) && !wxIsAlpha(val) )
  157.     {
  158.         ok = FALSE;
  159.  
  160.         errormsg = _("'%s' should only contain alphabetic characters.");
  161.     }
  162.     else if ( (m_validatorStyle & wxFILTER_ALPHANUMERIC) && !wxIsAlphaNumeric(val))
  163.     {
  164.         ok = FALSE;
  165.  
  166.         errormsg = _("'%s' should only contain alphabetic or numeric characters.");
  167.     }
  168.     else if ( (m_validatorStyle & wxFILTER_NUMERIC) && !wxIsNumeric(val))
  169.     {
  170.         ok = FALSE;
  171.  
  172.         errormsg = _("'%s' should be numeric.");
  173.     }
  174.     else if ( (m_validatorStyle & wxFILTER_INCLUDE_CHAR_LIST) && !IsInCharIncludeList(val))
  175.     {
  176.         //it's only ok to have the members of the list
  177.         errormsg = _("'%s' is invalid");
  178.         ok = FALSE;    
  179.     }
  180.     else if ( (m_validatorStyle & wxFILTER_EXCLUDE_CHAR_LIST) && !IsNotInCharExcludeList(val))
  181.     {
  182.         // it's only ok to have non-members of the list
  183.         errormsg = _("'%s' is invalid");
  184.         ok = FALSE;    
  185.     }
  186.  
  187.     if ( !ok )
  188.     {
  189.         wxASSERT_MSG( !errormsg.empty(), _T("you forgot to set errormsg") );
  190.  
  191.         m_validatorWindow->SetFocus();
  192.  
  193.         wxString buf;
  194.         buf.Printf(errormsg, val.c_str());
  195.  
  196.         wxMessageBox(buf, _("Validation conflict"),
  197.                      wxOK | wxICON_EXCLAMATION, parent);
  198.     }
  199.  
  200.     return ok;
  201. }
  202.  
  203. // Called to transfer data to the window
  204. bool wxTextValidator::TransferToWindow(void)
  205. {
  206.     if( !CheckValidator() )
  207.         return FALSE;
  208.  
  209.     wxTextCtrl *control = (wxTextCtrl *) m_validatorWindow ;
  210.     control->SetValue(* m_stringValue) ;
  211.  
  212.     return TRUE;
  213. }
  214.  
  215. // Called to transfer data to the window
  216. bool wxTextValidator::TransferFromWindow(void)
  217. {
  218.     if( !CheckValidator() )
  219.         return FALSE;
  220.  
  221.     wxTextCtrl *control = (wxTextCtrl *) m_validatorWindow ;
  222.     * m_stringValue = control->GetValue() ;
  223.  
  224.     return TRUE;
  225. }
  226.  
  227. void wxTextValidator::SetIncludeList(const wxStringList& list)
  228. {
  229. /*
  230.     if ( !M_VTEXTDATA )
  231.         return;
  232. */
  233.  
  234.     m_includeList.Clear();
  235.     // TODO: replace with =
  236.     wxNode *node = list.First() ;
  237.     while ( node )
  238.     {
  239.         wxChar *s = (wxChar *)node->Data();
  240.         m_includeList.Add(s);
  241.         node = node->Next();
  242.     }
  243. }
  244.  
  245. void wxTextValidator::SetExcludeList(const wxStringList& list)
  246. {
  247. /*
  248.     if ( !M_VTEXTDATA )
  249.         return;
  250. */
  251.  
  252.     m_excludeList.Clear();
  253.     // TODO: replace with =
  254.     wxNode *node = list.First() ;
  255.     while ( node )
  256.     {
  257.         wxChar *s = (wxChar *)node->Data();
  258.         m_excludeList.Add(s);
  259.         node = node->Next();
  260.     }
  261. }
  262.  
  263. void wxTextValidator::OnChar(wxKeyEvent& event)
  264. {
  265. /*
  266.     if ( !M_VTEXTDATA )
  267.         return;
  268. */
  269.  
  270.     if ( m_validatorWindow )
  271.     {
  272.         int keyCode = (int)event.KeyCode();
  273.  
  274.         // we don't filter special keys and Delete
  275.         if (
  276.              !(keyCode < WXK_SPACE || keyCode == WXK_DELETE || keyCode > WXK_START) &&
  277.              (
  278.               ((m_validatorStyle & wxFILTER_INCLUDE_CHAR_LIST) && !IsInCharIncludeList(wxString((char) keyCode, 1))) ||
  279.               ((m_validatorStyle & wxFILTER_EXCLUDE_CHAR_LIST) && !IsNotInCharExcludeList(wxString((char) keyCode, 1))) ||
  280.               ((m_validatorStyle & wxFILTER_ASCII) && !isascii(keyCode)) ||
  281.               ((m_validatorStyle & wxFILTER_ALPHA) && !wxIsalpha(keyCode)) ||
  282.               ((m_validatorStyle & wxFILTER_ALPHANUMERIC) && !wxIsalnum(keyCode)) ||
  283.               ((m_validatorStyle & wxFILTER_NUMERIC) && !wxIsdigit(keyCode)
  284.                                 && keyCode != '.' && keyCode != ',' && keyCode != '-')
  285.              )
  286.            )
  287.         {
  288.             if ( !wxValidator::IsSilent() )
  289.                 wxBell();
  290.  
  291.             // eat message
  292.             return;
  293.         }
  294.     }
  295.  
  296.     event.Skip();
  297. }
  298.  
  299. static bool wxIsNumeric(const wxString& val)
  300. {
  301.     int i;
  302.     for ( i = 0; i < (int)val.Length(); i++)
  303.     {
  304.         // Allow for "," (French) as well as "." -- in future we should
  305.         // use wxSystemSettings or other to do better localisation
  306.         if ((!isdigit(val[i])) && (val[i] != '.') && (val[i] != ','))
  307.           if(!((i == 0) && (val[i] == '-')))
  308.             return FALSE;
  309.     }
  310.     return TRUE;
  311. }
  312.  
  313. bool wxTextValidator::IsInCharIncludeList(const wxString& val)
  314. {
  315.     size_t i;
  316.     for ( i = 0; i < val.Length(); i++)
  317.     {
  318.         if (!m_includeList.Member((wxString) val[i]))
  319.             return FALSE;
  320.     }
  321.     return TRUE;
  322. }
  323.  
  324. bool wxTextValidator::IsNotInCharExcludeList(const wxString& val)
  325. {
  326.     size_t i;
  327.     for ( i = 0; i < val.Length(); i++)
  328.     {
  329.        if (m_excludeList.Member((wxString) val[i]))
  330.        return FALSE;
  331.     }
  332.     return TRUE;
  333. }
  334.  
  335. #endif
  336.   // wxUSE_VALIDATORS
  337.