home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 035 / kwclass.zip / KVALMASK.CPP < prev    next >
C/C++ Source or Header  |  1994-04-18  |  7KB  |  277 lines

  1. #define INCL_PM
  2. #include <os2.h>
  3. #include <kvalmask.hpp>
  4. #include <kentryfd.hpp>
  5. #include <ikeyevt.hpp>
  6. #include <istrtest.hpp>
  7. #include <ctype.h>
  8.  
  9. const int KMaskValidator::right = VK_RIGHT;
  10. const int KMaskValidator::left  = VK_LEFT;
  11.  
  12. static const int alpha   = 1,
  13.                  digit   = 2,
  14.                  any     = 3,
  15.                  space   = 4,
  16.                  literal = 5;
  17.  
  18. Boolean KMaskFocusHandler::dispatchHandlerEvent(IEvent& event)
  19. {
  20.   Boolean filtered = false;
  21.   if (event.eventId() == WM_SETFOCUS)
  22.     filtered = setFocus(event);
  23.   return filtered;
  24. }
  25.  
  26. Boolean KMaskFocusHandler::setFocus(IEvent& event)
  27. {
  28.   KEntryField* field = (KEntryField*)event.window();
  29.   field->disableInsertMode();
  30.   field->postEvent(WM_CHAR, 
  31.                    IEventParameter1(KC_VIRTUALKEY, 0),
  32.                    IEventParameter2(0, VK_HOME));
  33.   return false;
  34. }
  35.  
  36. KMaskClickHandler::mouseClicked(IMouseClickEvent& event)
  37. {
  38.   return false;
  39. }
  40.  
  41. KMaskValidator::KMaskValidator(const char *pattern)
  42.   : originalMask(pattern)
  43.   , emptyMask(0, strlen(pattern))
  44.   , controlMask(0, strlen(pattern))
  45. {
  46.    fillMasks();
  47. }
  48.  
  49. IHandler &KMaskValidator::handleEventsFor(IWindow* window)
  50. {
  51.   KValidator::handleEventsFor(window);
  52.   focusHandler.handleEventsFor(window);
  53.   clickHandler.handleEventsFor(window);
  54.   return *this;
  55. }
  56.  
  57.  
  58. IString& KMaskValidator::fill(IString &strText)
  59. {
  60.   strText = emptyMask;
  61.   return strText;
  62. }
  63.  
  64. IString& KMaskValidator::strip(IString &strText)
  65. {
  66.   return strText;
  67. }
  68.  
  69. Boolean KMaskValidator::isValid(const char *text, Boolean fill) const
  70. {
  71.    IString strText(text);
  72.    if (controlMask.length() != strText.length())
  73.       return false;
  74.  
  75.    for(unsigned i=0; i<controlMask.length(); i++)
  76.    {
  77.       IString character(strText.subString(i, 1));
  78.       switch(controlMask[i])
  79.       {
  80.          case alpha:
  81.             if (!character.isAlphabetic())
  82.                return false;
  83.             break;
  84.  
  85.          case digit:
  86.             if (!character.isDigits())
  87.                return false;
  88.             break;
  89.  
  90.          case literal:
  91.             if (character != originalMask[i])
  92.                return false;
  93.             break;
  94.  
  95.          case space:
  96.             if (character != ' ')
  97.                return false;
  98.             break;
  99.  
  100.          default:
  101.             break;
  102.       }
  103.    }
  104.    return true;
  105. }
  106.  
  107.  
  108. Boolean KMaskValidator::characterKeyPress(IKeyboardEvent& event)
  109. {
  110.    Boolean filtered = false;
  111.    KEntryField* field = (KEntryField*) event.window();
  112.    selected = field->selectedRange();
  113.    unsigned pos = selected.upperBound();
  114.    IString character = event.mixedCharacter();
  115.  
  116.    if ((controlMask[pos] == alpha && character.isAlphabetic()) ||
  117.        (controlMask[pos] == digit && character.isDigits()) ||
  118.        (controlMask[pos] == any   && character.isPrintable()))
  119.    {
  120.      defaultProcedure(event);
  121.      adjustPosition(field, right);
  122.      filtered = true;
  123.    }
  124.    else
  125.    {
  126.       error();
  127.       filtered = true;
  128.    }
  129.    return filtered;
  130. }
  131.  
  132. Boolean KMaskValidator::virtualKeyPress(IKeyboardEvent& event)
  133. {
  134.    Boolean filtered = true;
  135.    KEntryField* field = (KEntryField*) event.window();
  136.    selected = field->selectedRange();
  137.    unsigned pos = selected.upperBound();
  138.    unsigned long ulKey = event.virtualKey();
  139.  
  140.    switch(ulKey)
  141.    {
  142.       case IKeyboardEvent::insert:
  143.          error();
  144.          break;
  145.  
  146.       case IKeyboardEvent::deleteKey:
  147.       {
  148.          I0String text(field->text());
  149.  
  150.          // 'delete' selected characters
  151.  
  152.          for(unsigned i=selected.lowerBound(); i<=selected.upperBound(); i++)
  153.          {
  154.            text[i] = emptyMask[i];
  155.          }
  156.          field->setText(text);
  157.  
  158.          // set cursor back to the original position
  159.          field->selectRange(IRange(selected.lowerBound(), selected.lowerBound()));
  160.          break;
  161.       }
  162.  
  163.       case IKeyboardEvent::backSpace:
  164.          field->postEvent(WM_CHAR, 
  165.                           IEventParameter1(KC_VIRTUALKEY, 0),
  166.                           IEventParameter2(0, VK_LEFT));
  167.          field->postEvent(WM_CHAR, 
  168.                           IEventParameter1(KC_VIRTUALKEY, 0),
  169.                           IEventParameter2(0, VK_DELETE));
  170.          break;
  171.          
  172.       case IKeyboardEvent::left:
  173.          defaultProcedure(event);
  174.          adjustPosition(field, left);
  175.          break;
  176.  
  177.       case IKeyboardEvent::right:
  178.          defaultProcedure(event);
  179.          adjustPosition(field, right);
  180.          break;
  181.  
  182.       case IKeyboardEvent::home:
  183.          defaultProcedure(event);
  184.          adjustPosition(field, right);
  185.          break;
  186.  
  187.       case IKeyboardEvent::end:
  188.          defaultProcedure(event);
  189.          adjustPosition(field, left);
  190.          break;
  191.  
  192.       default:
  193.          filtered = false;
  194.    }
  195.    return filtered;
  196. }
  197.  
  198. Boolean KMaskValidator::adjustPosition(KEntryField *field, 
  199.                                     int direction)
  200. {
  201.    IRange current = field->selectedRange();
  202.    unsigned pos = current.upperBound();
  203.  
  204.    // if the first character is a literal, force direction to right
  205.    if (pos == 0 && (controlMask[pos] == literal || controlMask[pos] == space))
  206.      direction = right;
  207.  
  208.    // make sure the current position isn't sitting on a literal character
  209.    if (direction == right)
  210.    {
  211.      while(pos < controlMask.length() &&
  212.            (controlMask[pos] == literal || controlMask[pos] == space))
  213.      {
  214.        IEvent event(field, WM_CHAR, 
  215.                     IEventParameter1(KC_VIRTUALKEY, 0),
  216.                     IEventParameter2(0, VK_RIGHT));
  217.        defaultProcedure(event);
  218.        pos++;
  219.      }
  220.    }
  221.    else
  222.    {
  223.      while(pos && (controlMask[pos] == literal || controlMask[pos] == space))
  224.      {
  225.        IEvent event(field, WM_CHAR, 
  226.                     IEventParameter1(KC_VIRTUALKEY, 0),
  227.                     IEventParameter2(0, VK_LEFT));
  228.        defaultProcedure(event);
  229.        pos--;
  230.      }
  231.    }
  232.  
  233.  
  234.    // return true if the current position was adjusted
  235.    if (pos != current.upperBound())
  236.      return true;
  237.    else
  238.      return false;
  239. }
  240.  
  241. void KMaskValidator::fillMasks()
  242. {
  243.    unsigned length = originalMask.length();
  244.    for(unsigned i=0; i<length; i++)
  245.    {
  246.       switch(toupper(originalMask[i]))
  247.       {
  248.          case 'X':
  249.             emptyMask[i] = ' ';
  250.             controlMask[i] = alpha;
  251.             break;
  252.  
  253.          case '9':
  254.             emptyMask[i] = ' ';
  255.             controlMask[i] = digit;
  256.             break;
  257.  
  258.          case '?':
  259.             emptyMask[i] = ' ';
  260.             controlMask[i] = any;
  261.             break;
  262.  
  263.          case ' ':
  264.             emptyMask[i] = ' ';
  265.             controlMask[i] = space;
  266.             break;
  267.  
  268.          default:
  269.             emptyMask[i] = originalMask[i];
  270.             controlMask[i] = literal;
  271.             break;
  272.       }
  273.    }
  274. }
  275.  
  276.  
  277.