home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 May / Chip_2002-05_cd1.bin / chplus / cpp / 5 / Komponety.exe / ccalendr.cpp < prev    next >
C/C++ Source or Header  |  1998-02-09  |  7KB  |  317 lines

  1. //---------------------------------------------------------------------------
  2. // Borland C++Builder
  3. // Copyright (c) 1987, 1998 Borland International Inc.  All Rights Reserved.
  4. //---------------------------------------------------------------------------
  5. #pragma hdrstop
  6. #include  "ccalendr.h"
  7. #include "samp.h"
  8. #pragma resource "*.res"  
  9. #pragma package(smart_init)
  10.  
  11. namespace Ccalendr{
  12. void __fastcall PACKAGE Register()
  13. {
  14.   TComponentClass classes[1] = {__classid(TCCalendar)};
  15.   RegisterComponents(LoadStr(Tab_101), classes, 0);
  16. }
  17. } //namespace
  18.  
  19. __fastcall TCCalendar::TCCalendar(TComponent *AOwner) :
  20.   TCustomGrid(AOwner)
  21. {
  22.   FUseCurrentDate = true;
  23.   FixedCols       = 0;
  24.   FixedRows       = 1;
  25.   ColCount        = 7;
  26.   RowCount        = 7;
  27.   StartOfWeek     = 1;
  28.   ScrollBars      = ssNone;
  29.   FDate           = Date();
  30.   (Options >> goRangeSelect) << goDrawFocusSelected;
  31.   UpdateCalendar();
  32. }
  33.  
  34. void __fastcall TCCalendar::Change()
  35. {
  36.   if(FOnChange)
  37.     FOnChange(this);
  38. }
  39.  
  40. void __fastcall TCCalendar::Click()
  41. {
  42.   AnsiString  TheCellText;
  43.  
  44.   TheCellText = CellText[Col][Row];
  45.   if(!TheCellText.IsEmpty())
  46.     Day = TheCellText.ToInt();
  47. }
  48.  
  49.  
  50. /* Don't have any leap year code available.  Seemed like a straigthforward
  51.    translation, but should be checked.
  52. */
  53. bool __fastcall TCCalendar::IsLeapYear(int AYear)
  54. {
  55.   return  ((AYear %   4) == 0) &&
  56.          (((AYear % 100) != 0) ||
  57.           ((AYear % 400) == 0));
  58. };
  59.  
  60.  
  61. int __fastcall TCCalendar::DaysPerMonth(int AYear, int AMonth)
  62. {
  63.   int result;
  64.   const int DaysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  65.  
  66.   result = DaysInMonth[AMonth-1];
  67.   if ((AMonth == 2) && IsLeapYear(AYear))
  68.     ++result; // leap-year Feb is special
  69.  
  70.   return result;
  71. };
  72.  
  73. int __fastcall TCCalendar::DaysThisMonth()
  74. {
  75.   return DaysPerMonth(Year, Month);
  76. };
  77.  
  78.  
  79. void __fastcall TCCalendar::DrawCell(int ACol, int ARow, const TRect &ARect,
  80.   TGridDrawState /*AState*/)
  81. {
  82.   const AnsiString  TheText = CellText[ACol][ARow];
  83.   Canvas->TextRect(
  84.     ARect,
  85.     ARect.Left + (ARect.Right - ARect.Left - Canvas->TextWidth(TheText)) / 2,
  86.     ARect.Top + (ARect.Bottom - ARect.Top - Canvas->TextHeight(TheText)) / 2,
  87.     TheText);
  88. };
  89.  
  90.  
  91. AnsiString __fastcall TCCalendar::GetCellText(int ACol, int ARow)
  92. {
  93.   int DayNum;
  94.   AnsiString  result;
  95.  
  96.   if (!ARow)
  97.     // day names at tops of columns
  98.     //
  99.     result = ShortDayNames[(StartOfWeek + ACol) % 7];
  100.   else
  101.   {
  102.     DayNum = FMonthOffset + ACol + (ARow - 1) * 7;
  103.     if ((DayNum < 1) || (DayNum > DaysThisMonth()))
  104.       result = "";
  105.     else
  106.       result = IntToStr(DayNum);
  107.   }
  108.  
  109.   return result;
  110. };
  111.  
  112. bool __fastcall TCCalendar::SelectCell(int ACol, int ARow)
  113. {
  114.   bool  result;
  115.  
  116.   if ((!FUpdating && FReadOnly) || !CellText[ACol][ARow].c_str())
  117.     result = false;
  118.   else
  119.    result = TCustomGrid::SelectCell(ACol, ARow);
  120.  
  121.   return result;
  122. };
  123.  
  124. void __fastcall TCCalendar::SeTCCalendarDate(TDateTime Value)
  125. {
  126.   FDate = Value;
  127.   UpdateCalendar();
  128.   Change();
  129. };
  130.  
  131. bool __fastcall TCCalendar::StoreCalendarDate()
  132. {
  133.   return !FUseCurrentDate;
  134. };
  135.  
  136. int __fastcall  TCCalendar::GetDateElement(int Index)
  137. {
  138.   Word  AYear, AMonth, ADay;
  139.   int result;
  140.  
  141.   DecodeDate(FDate, AYear, AMonth, ADay);
  142.   switch(Index)
  143.   {
  144.     case 1:
  145.       result = AYear;break;
  146.  
  147.     case 2:
  148.       result = AMonth;break;
  149.  
  150.     case 3:
  151.       result = ADay;break;
  152.  
  153.     default:
  154.       result = -1;
  155.   };
  156.  
  157.   return result;
  158. };
  159.  
  160. #pragma warn -sig
  161. void __fastcall TCCalendar::SetDateElement(int Index, int Value)
  162. {
  163.   Word  AYear, AMonth, ADay;
  164.   bool  Update  = false;
  165.  
  166.   if (Value > 0)
  167.   {
  168.     DecodeDate(FDate, AYear, AMonth, ADay);
  169.     switch(Index)
  170.     {
  171.       case 1:
  172.         if (AYear != Value)
  173.         {
  174.           AYear   = Value;
  175.           Update  = true;
  176.         }
  177.         break;
  178.  
  179.       case 2:
  180.         if ((Value <= 12) && (Value != AMonth))
  181.         {
  182.           AMonth  = Value;
  183.           Update  = true;
  184.         }
  185.         break;
  186.  
  187.       case 3:
  188.         if ((Value <= DaysThisMonth()) && (Value != ADay))
  189.         {
  190.           ADay    = Value;
  191.           Update  = true;
  192.         }
  193.         break;
  194.     }
  195.     if (Update)
  196.     {
  197.       FDate = EncodeDate(AYear, AMonth, ADay);
  198.       FUseCurrentDate = false;
  199.       UpdateCalendar();
  200.       Change();
  201.     }
  202.   };
  203. };
  204.  
  205. void __fastcall TCCalendar::SetStartOfWeek(TDayOfWeek Value)
  206. {
  207.   if( (Value > 7) || (Value < 1) )
  208.   {
  209.       FStartOfWeek=1; // bad value sets to 1 (Sunday)
  210.   }
  211.   else
  212.   {
  213.       if (Value != FStartOfWeek)
  214.       {
  215.         FStartOfWeek = Value;
  216.         UpdateCalendar();
  217.       }
  218.   }
  219. };
  220.  
  221. void __fastcall TCCalendar::SetUseCurrentDate(bool Value)
  222. {
  223.   if (Value != FUseCurrentDate)
  224.   {
  225.     FUseCurrentDate = Value;
  226.     if (Value)
  227.     {
  228.       FDate = Date(); // use the current date, then
  229.       UpdateCalendar();
  230.     };
  231.   };
  232. };
  233.  
  234. // Given a value of 1 or -1, moves to Next or Prev month accordingly.
  235. //
  236. void __fastcall TCCalendar::ChangeMonth(int Delta)
  237. {
  238.   Word  AYear, AMonth, ADay;
  239.   TDateTime NewDate;
  240.   int CurDay;
  241.  
  242.   DecodeDate(FDate, AYear, AMonth, ADay);
  243.   CurDay = ADay;
  244.   if (Delta > 0)
  245.     ADay = DaysPerMonth(AYear, AMonth);
  246.   else
  247.     ADay = 1;
  248.  
  249.   NewDate = EncodeDate(AYear, AMonth, ADay);
  250.   NewDate = NewDate + Delta;
  251.   DecodeDate(NewDate, AYear, AMonth, ADay);
  252.   if (DaysPerMonth(AYear, AMonth) > CurDay)
  253.     ADay = CurDay;
  254.   else
  255.     ADay = DaysPerMonth(AYear, AMonth);
  256.  
  257.   CalendarDate = EncodeDate(AYear, AMonth, ADay);
  258. };
  259. #pragma warn .sig
  260.  
  261. void __fastcall TCCalendar::PrevMonth()
  262. {
  263.   ChangeMonth(-1);
  264. }
  265.  
  266. void __fastcall TCCalendar::NextMonth()
  267. {
  268.   ChangeMonth(1);
  269. }
  270.  
  271. void __fastcall TCCalendar::NextYear()
  272. {
  273.   if (IsLeapYear(Year) && (Month == 2) && (Day == 29))
  274.     Day = 28;
  275.   ++Year;
  276. }
  277.  
  278. void __fastcall TCCalendar::PrevYear()
  279. {
  280.   if (IsLeapYear(Year) && (Month == 2) && (Day == 29))
  281.     Day = 28;
  282.   --Year;
  283. }
  284.  
  285. void __fastcall TCCalendar::UpdateCalendar()
  286. {
  287.   Word  AYear, AMonth, ADay;
  288.   TDateTime FirstDate;
  289.  
  290.   FUpdating = True;
  291.   DecodeDate(FDate, AYear, AMonth, ADay);
  292.   FirstDate = EncodeDate(AYear, AMonth, 1);
  293.  
  294.   // Day of week for 1st of month.
  295.   //
  296.   FMonthOffset = 2 - ((DayOfWeek(FirstDate) - StartOfWeek + 7) % 7);
  297.   if (FMonthOffset == 2)
  298.     FMonthOffset = -5;
  299.  
  300.   MoveColRow((ADay - FMonthOffset) % 7,
  301.              (ADay - FMonthOffset) / 7 + 1,
  302.              False, False);
  303.     Invalidate();
  304.  
  305.   FUpdating = False;
  306. };
  307.  
  308. void __fastcall TCCalendar::WMSize(TWMSize &Message)
  309. {
  310.   int GridLines;
  311.  
  312.   GridLines = 6 * GridLineWidth;
  313.   DefaultColWidth   = (Message.Width - GridLines) / 7;
  314.   DefaultRowHeight  = (Message.Height - GridLines) / 7;
  315. }
  316.  
  317.