home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c082_122 / 2.ddi / TVDEMOS.ZIP / CALENDAR.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-10  |  6.4 KB  |  270 lines

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