home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / tvision / tfield / tdfield.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-25  |  8.4 KB  |  372 lines

  1. /*------------------------------------------------------------*/
  2. /* filename -       tdfield.cpp                               */
  3. /*                                                            */
  4. /* function(s)                                                */
  5. /*                  TDateField member functions                */
  6. /*------------------------------------------------------------*/
  7.  
  8. /*------------------------------------------------------------*/
  9. /*                                                            */
  10. /*    Turbo Vision Extensions -- Version 1.1.1                */
  11. /*                                                            */
  12. /*                                                            */
  13. /*    Portions Copyright (c) 1991 by Borland International    */
  14. /*    All Rights Reserved.                                    */
  15. /*                                                            */
  16. /*    TV Extensions are Copyright (c) 1992 by Michael Bonner  */
  17. /*    These extensions may be freely used by any programmer   */
  18. /*    including royalty free inclusion in any commercial      */
  19. /*    application, but any commercial rights to the source    */
  20. /*    code or object files of the Extensions are reserved.    */
  21. /*                                                            */
  22. /*------------------------------------------------------------*/
  23.  
  24. #define Uses_ipstream
  25. #define Uses_MsgBox
  26. #define Uses_opstream
  27. #define Uses_TDate
  28. #define Uses_TDateField
  29. #define Uses_TDeskTop
  30. #define Uses_TDialog
  31. #define Uses_TDrawBuffer
  32. #define Uses_TEvent
  33. #define Uses_TField
  34. #define Uses_TKeys
  35. #define Uses_TRect
  36. #define Uses_TView
  37.  
  38. #include <tv.h>
  39. #include "tfield.h"
  40.  
  41. #if !defined( __CTYPE_H )
  42. #include <ctype.h>
  43. #endif  // __CTYPE_H
  44.  
  45. #if !defined( __STRING_H )
  46. #include <String.h>
  47. #endif  // __STRING_H
  48.  
  49. #if !defined( __DOS_H )
  50. #include <Dos.h>
  51. #endif  // __DOS_H
  52.  
  53. #if !defined( __MEM_H )
  54. #include <Mem.h>
  55. #endif  // __MEM_H
  56.  
  57. #if !defined( __STDLIB_H )
  58. #include <Stdlib.h>
  59. #endif // __STDLIB_H
  60.  
  61. #if !defined( __STRSTREAM_H )
  62. #include <Strstream.h>
  63. #endif // __STRSTREAM_H
  64.  
  65. const char * const near TDateField::name = "TDateField";
  66.  
  67. TDateField::TDateField( const TRect& bounds, int aMaxLen ) :
  68.     TField(bounds, aMaxLen),
  69.     value ((long) 0),
  70.     maxValue ((long) 0),
  71.     minValue ((long) 0)
  72.     {
  73.     fieldType = TDateFieldType;
  74.     }
  75.  
  76. void TDateField::convertData( void )
  77. {
  78.     char buffer[40];
  79.     char *tempStr;
  80.     strncpy( buffer, data, maxLen < 40 ? maxLen : 40 );
  81.     if ( value.setDate( buffer ) ) {
  82.         tempStr = value.formatDate(-1);
  83.         if (tempStr)
  84.             {
  85.             strncpy( buffer, tempStr, 40 );
  86.             delete tempStr; // free the memory
  87.             strnset( data, '\0', maxLen );
  88.             strncpy( data, buffer, maxLen );
  89.             data[maxLen] = EOS;
  90.             drawView();
  91.             dataChanged = False;
  92.             };
  93.         // else error message here
  94.     };
  95. }
  96.  
  97. ushort TDateField::dataSize()
  98. {
  99.     return sizeof(long);
  100. }
  101.  
  102. ushort TDateField::filterCharCode( ushort charCode) //Virtual
  103. {
  104.     char buffer[40];
  105.     char *tempStr;
  106.  
  107.     ushort retChar;
  108.  
  109.     Boolean test;
  110.  
  111.     retChar = charCode;
  112.  
  113.     if (charCode == '+')
  114.         if (    (selStart == 0) &&
  115.                 (selEnd == strlen(data)) )
  116.             {
  117.             if ((tfOptions & tfValidateMax) != 0 )
  118.                 if ( value < maxValue )
  119.                     test = True;
  120.                 else
  121.                     test = False;
  122.             else
  123.                 test = True;
  124.  
  125.             if (test)
  126.                 {
  127.                 if (dataChanged)
  128.                     convertData();
  129.                 value++;
  130.                 tempStr = value.formatDate(-1);
  131.                 if (tempStr)
  132.                     {
  133.                     strncpy( buffer, tempStr , 40 );
  134.                     delete tempStr;
  135.                     strnset( data, '\0', maxLen );
  136.                     strncpy( data, buffer, maxLen );
  137.                     data[maxLen] = EOS;
  138.                     drawView();
  139.                     };
  140.                 // else error message here
  141.                 }
  142.             else
  143.                 if ((tfOptions & tfBeepError) != 0)
  144.                     beep();
  145.             retChar = 1;
  146.             };
  147.  
  148.     if (charCode == '-')
  149.         if (    (selStart == 0) &&
  150.                 (selEnd == strlen(data)) )
  151.             {
  152.             if ((tfOptions & tfValidateMin) != 0 )
  153.                 if ( value > minValue )
  154.                     test = True;
  155.                 else
  156.                     test = False;
  157.             else
  158.                 test = True;
  159.  
  160.             if (test)
  161.                 {
  162.                 if (dataChanged)
  163.                     convertData();
  164.                 value--;
  165.                 tempStr = value.formatDate(-1);
  166.                 if (tempStr)
  167.                     {
  168.                     strncpy( buffer, tempStr, 40 );
  169.                     delete tempStr;
  170.                     strnset( data, '\0', maxLen );
  171.                     strncpy( data, buffer, maxLen );
  172.                     data[maxLen] = EOS;
  173.                     drawView();
  174.                     };
  175.                 // else error message here
  176.                 }
  177.             else
  178.                 if ((tfOptions & tfBeepError) != 0)
  179.                     beep();
  180.             retChar = 1;
  181.             };
  182.  
  183.     return retChar;
  184. }
  185.  
  186. void TDateField::getData( void *rec )
  187. {
  188.     convertData();
  189.     long tempvalue = value.julDate();
  190.     memcpy( rec, &tempvalue, sizeof(tempvalue) );
  191. }
  192.  
  193. Boolean TDateField::isValid( ushort command )
  194. {
  195.     Boolean status = True;
  196.     char buf[160];
  197.     char *tempStr;
  198.  
  199.     switch (command) {
  200.         case cmArriving:
  201.             status = True;
  202.             break;
  203.  
  204.         case cmLeaving:
  205.             tempStr = value.formatDate(-1);
  206.             if (tempStr)
  207.                 {
  208.                 if ( strcmp( tempStr, "invalid date") == 0)
  209.                     {
  210.                     if (data[0] != '\0')
  211.                         {
  212.                         status = False;
  213.                         if ((tfOptions & tfBeepError) != 0)
  214.                             beep();
  215.                         ostrstream os( buf, sizeof( buf ) );
  216.                         os << '"' << data << '"' << " is not a valid date!" << ends;
  217.                         messageBox(    buf, mfWarning | mfOKButton);
  218.                         };
  219.                     }
  220.                 else
  221.                     {
  222.                     if (     ((tfOptions & tfValidateMax) != 0 ) &&
  223.                             ( value > maxValue ) )
  224.                         {
  225.                         status = False;
  226.                         if ((tfOptions & tfBeepError) != 0)
  227.                             beep();
  228.                         ostrstream os( buf, sizeof( buf ) );
  229.                         os << "The date must be before "
  230.                             << (TDate)(maxValue + 1) << "!" << ends;
  231.                         messageBox(    buf, mfWarning | mfOKButton);
  232.                         }
  233.                     else
  234.                         {
  235.                         if (     ((tfOptions & tfValidateMin) != 0 ) &&
  236.                                 ( value < minValue ) )
  237.                             {
  238.                             status = False;
  239.                             if ((tfOptions & tfBeepError) != 0)
  240.                                 beep();
  241.                             ostrstream os( buf, sizeof( buf ) );
  242.                             os << "The date must be after "
  243.                                 << (TDate)(minValue - 1) << "!" << ends;
  244.                             messageBox(    buf, mfWarning | mfOKButton);
  245.                             };
  246.                         };
  247.                     };
  248.                 delete tempStr;
  249.                 };
  250.             //else error message here
  251.             break;
  252.     };
  253.  
  254.     return status;
  255. }
  256.  
  257. ushort TDateField::processKeyCode( ushort keyCode ) //Virtual
  258.     {
  259.     ushort retKeyCode = keyCode;     // return a 1 to selectAll( true ) the field in the handleEvent routine
  260.  
  261.     char buffer[40];
  262.     char *tempStr;
  263.  
  264.     if ( keyCode == kbPgDn )
  265.         if (    (selStart == 0) &&
  266.                 (selEnd == strlen(data)) )
  267.             {
  268.             if (dataChanged)
  269.                 convertData();
  270.             value.incrMonth();
  271.             if (     ((tfOptions & tfValidateMax) != 0 ) &&
  272.                     ( value > maxValue ) )
  273.                 {
  274.                 value.decrMonth();
  275.                 if ((tfOptions & tfBeepError) != 0)
  276.                     beep();
  277.                 };
  278.             retKeyCode = 1;
  279.             tempStr = value.formatDate(-1);
  280.             if (tempStr)
  281.                 {
  282.                 strncpy( buffer, tempStr, 40 );
  283.                 delete tempStr;
  284.                 strnset( data, '\0', maxLen );
  285.                 strncpy( data, buffer, maxLen );
  286.                 data[maxLen] = EOS;
  287.                 drawView();
  288.                 };
  289.             //else error message here
  290.             };
  291.  
  292.     if ( keyCode == kbPgUp )
  293.         if (    (selStart == 0) &&
  294.                 (selEnd == strlen(data)) )
  295.             {
  296.             if (dataChanged)
  297.                 convertData();
  298.             value.decrMonth();
  299.             if (     ((tfOptions & tfValidateMin) != 0 ) &&
  300.                     ( value < minValue ) )
  301.                 {
  302.                 value.incrMonth();
  303.                 if ((tfOptions & tfBeepError) != 0)
  304.                     beep();
  305.                 };
  306.             retKeyCode = 1;
  307.             tempStr = value.formatDate(-1);
  308.             if (tempStr)
  309.                 {
  310.                 strncpy( buffer, tempStr, 40 );
  311.                 delete tempStr;
  312.                 strnset( data, '\0', maxLen );
  313.                 strncpy( data, buffer, maxLen );
  314.                 data[maxLen] = EOS;
  315.                 drawView();
  316.                 };
  317.             //else error message here
  318.             };
  319.  
  320.     return retKeyCode;
  321.     }
  322.  
  323.  
  324. void TDateField::setData( void *rec )
  325. {
  326.     long tempvalue;
  327.     memcpy( &tempvalue, rec, sizeof(tempvalue) );
  328.     setJulian(tempvalue);
  329.     selectAll( True );
  330. }
  331.  
  332. void TDateField::setJulian( long julDate )
  333. {
  334.     value = julDate;
  335.     if (julDate != 0)
  336.         {
  337.         char *tempStr = value.formatDate(-1);
  338.         if (tempStr)
  339.             {
  340.             strncpy( data, tempStr, maxLen);
  341.             delete tempStr;
  342.             };
  343.         //else error message here
  344.         }
  345.     else
  346.         data[0] = '\0';
  347.     data[maxLen] = EOS;
  348. }
  349.  
  350. void TDateField::setMax( TDate newMax )
  351. {
  352.     maxValue = newMax;
  353.     setTFOptions( tfValidateMax, True );
  354.  
  355.     if (minValue > maxValue)
  356.         minValue = maxValue;
  357. }
  358.  
  359. void TDateField::setMin( TDate newMin )
  360. {
  361.     minValue = newMin;
  362.     setTFOptions( tfValidateMin, True );
  363.  
  364.     if (maxValue < minValue)
  365.         maxValue = minValue;
  366. }
  367.  
  368. void TDateField::setParadox( long pxDate )
  369. {
  370.     setJulian( pxDate + 1721424L );
  371. }
  372.