home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / actlib11 / tvtools / calendar.cpp < prev    next >
C/C++ Source or Header  |  1993-01-14  |  6KB  |  257 lines

  1. #define Uses_TEvent
  2. #define Uses_TStreamableClass
  3. #define Uses_TView
  4. #define Uses_TCalendar
  5. #include "tvtools.h"
  6. __link( RView )
  7. __link( RWindow )
  8.  
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <ctype.h>
  12. #include <strstrea.h>
  13. #include <iomanip.h>
  14. #include <dos.h>
  15.  
  16.  
  17.  
  18. static char *monthNames[] = {
  19.     "",
  20.     "January",  "February", "March",    "April",    "May",      "June",
  21.     "July",     "August",   "September","October",  "November", "December"
  22. };
  23.  
  24.  
  25. static unsigned char daysInMonth[] = {
  26.     0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  27. };
  28.  
  29.  
  30. //
  31. // TCalendarView functions
  32. //
  33.  
  34. const char * const TCalendarView::name = "TCalendarView";
  35.  
  36.  
  37. void TCalendarView::write( opstream& os )
  38. {
  39.     TView::write( os );
  40.     os << days << month << year << curDay << curMonth << curYear;
  41. }
  42.  
  43.  
  44. void *TCalendarView::read( ipstream& is )
  45. {
  46.     TView::read( is );
  47.     is >> days >> month >> year >> curDay >> curMonth >> curYear;
  48.     return this;
  49. }
  50.  
  51.  
  52. TStreamable *TCalendarView::build()
  53. {
  54.     return new TCalendarView( streamableInit );
  55. }
  56.  
  57.  
  58. TStreamableClass RCalendarView( TCalendarView::name,
  59.                                 TCalendarView::build,
  60.                                 __DELTA(TCalendarView)
  61.                               );
  62.  
  63.  
  64. TCalendarView::TCalendarView(TRect& r) : TView( r )
  65. {
  66.     struct date d;
  67.  
  68.     options |= ofSelectable;
  69.     eventMask |= evMouseAuto;
  70.  
  71.     getdate( &d );
  72.     year = curYear = d.da_year;
  73.     month = curMonth = d.da_mon;
  74.     curDay = d.da_day;
  75.  
  76.     drawView();
  77. }
  78.  
  79.  
  80. unsigned dayOfWeek(unsigned day, unsigned month, unsigned year)
  81. {
  82.     int century, yr, dw;
  83.  
  84.     if(month < 3)
  85.         {
  86.         month += 10;
  87.         --year;
  88.         }
  89.     else
  90.         month -= 2;
  91.  
  92.     century = year / 100;
  93.     yr = year % 100;
  94.     dw = (((26 * (int)month - 2) / 10) + (int)day + yr + (yr / 4) + (century / 4) - 
  95.                 (2 * century)) % 7;
  96.  
  97.     if(dw < 0)
  98.         dw += 7;
  99.  
  100.     return((unsigned)dw);
  101. }
  102.  
  103.  
  104. void TCalendarView::draw()
  105. {
  106.     char str[23];
  107.     char current = 1 - dayOfWeek(1, month, year);
  108.     char days = daysInMonth[month] + ((year % 4 == 0 && month == 2) ? 1 : 0);
  109.     char color, boldColor;
  110.     int  i, j;
  111.     TDrawBuffer buf;
  112.  
  113.     color = getColor(6);
  114.     boldColor = getColor(7);
  115.  
  116.     buf.moveChar(0, ' ', color, 22);
  117.  
  118.     ostrstream( str, sizeof str)
  119.       << setw(9) << monthNames[month] << " " << setw(4) << year
  120.       << " " << (char) 30 << "  " << (char) 31 << " " << ends;
  121.  
  122.     buf.moveStr(0, str, color);
  123.     writeLine(0, 0, 22, 1, buf);
  124.  
  125.     buf.moveChar(0, ' ', color, 22);
  126.     buf.moveStr(0, "Su Mo Tu We Th Fr Sa", color);
  127.     writeLine(0, 1, 22, 1, buf);
  128.  
  129.     for(i = 1; i <= 6; i++)
  130.         {
  131.         buf.moveChar(0, ' ', color, 22);
  132.         for(j = 0; j <= 6; j++)
  133.             {
  134.             if(current < 1 || current > days)
  135.                 buf.moveStr(j*3, "   ", color);
  136.             else
  137.                 {
  138.                 ostrstream( str, sizeof str )
  139.                   << setw(2) << (int) current << ends;
  140.                 if(year == curYear && month == curMonth && current == curDay)
  141.                     buf.moveStr(j*3, str, boldColor);
  142.                 else
  143.                     buf.moveStr(j*3, str, color);
  144.                 }
  145.             current++;
  146.             }
  147.         writeLine(0, i+1, 22, 1, buf);
  148.         }
  149. }
  150.  
  151.  
  152. void TCalendarView::handleEvent(TEvent& event)
  153. {
  154.     TPoint point;
  155.  
  156.     TView::handleEvent(event);
  157.     if (state && sfSelected)
  158.         {
  159.         if ( (event.what & evMouse) && (evMouseDown || evMouseAuto) )
  160.             {
  161.             point = makeLocal(event.mouse.where);
  162.             if (point.x == 15 && point.y == 0)
  163.                 {
  164.                 ++month;
  165.                 if (month > 12)
  166.                     {
  167.                     ++year;
  168.                     month = 1;
  169.                     }
  170.                 drawView();
  171.                 }
  172.             else if (point.x == 18 && point.y == 0)
  173.                 {
  174.                 --month;
  175.                 if (month < 1)
  176.                     {
  177.                     --year;
  178.                     month = 12;
  179.                     }
  180.                 drawView();
  181.                 }
  182.             }
  183.         else if (event.what == evKeyboard)
  184.             {
  185.             if ( (loByte(event.keyDown.keyCode) == '+') ||
  186.               event.keyDown.keyCode == kbDown)
  187.                 {
  188.                 ++month;
  189.                 if (month > 12)
  190.                     {
  191.                     ++year;
  192.                     month = 1;
  193.                     }
  194.                 }
  195.             else if ( (loByte(event.keyDown.keyCode) == '-') ||
  196.               event.keyDown.keyCode == kbUp)
  197.                 {
  198.                 --month;
  199.                 if (month < 1)
  200.                     {
  201.                     --year;
  202.                     month = 12;
  203.                     }
  204.                 }
  205.             drawView();
  206.             }
  207.         }
  208. }
  209.  
  210.  
  211. //
  212. // TCalendar functions
  213. //
  214.  
  215. const char * const TCalendar::name = "TCalendar";
  216.  
  217.  
  218. void TCalendar::write( opstream& os )
  219. {
  220.     TWindow::write( os );
  221. }
  222.  
  223.  
  224. void *TCalendar::read( ipstream& is )
  225. {
  226.     TWindow::read( is );
  227.     return this;
  228. }
  229.  
  230.  
  231. TStreamable *TCalendar::build()
  232. {
  233.     return new TCalendar( streamableInit );
  234. }
  235.  
  236.  
  237. TStreamableClass RCalendar( TCalendar::name,
  238.                                   TCalendar::build,
  239.                                   __DELTA(TCalendar)
  240.                                 );
  241.  
  242.  
  243. TCalendar::TCalendar() :
  244.     TWindow( TRect(1, 1, 23, 11), "Calendar", wnNoNumber ),
  245.     TWindowInit( &TCalendar::initFrame )
  246. {
  247.     TRect r(getExtent());
  248.  
  249.     flags &= ~(wfZoom | wfGrow);
  250.     growMode = 0;
  251.  
  252.     palette = wpCyanWindow;
  253.  
  254.     r.grow(-1, -1);
  255.     insert( new TCalendarView( r ));
  256. }
  257.