home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 16 / CD_ASCQ_16_0994.iso / news / 2539 / c_calend.c_ / c_calend.c
C/C++ Source or Header  |  1994-05-29  |  10KB  |  383 lines

  1. // === calend.c ===
  2.  
  3. // Calendar Add-In for the clySmic Icon Bar
  4. //   (C) 1992-1994 by clySmic Software. All Rights Reserved.
  5.  
  6. // Source for Borland C++ 4.0
  7.  
  8. #include <windows.h>
  9. #include <stdio.h>
  10. #include <dos.h>
  11. #include <string.h>
  12. #include <stdlib.h>
  13.  
  14. #include "add-in.h"
  15. #include "homedir.c"
  16.  
  17. HANDLE  hInstance;                   // DLL's instance handle
  18. BOOL ShowDOW = TRUE;
  19. struct dosdate_t Today;
  20. char IWDate[80],INIFile[80];
  21. BOOL USDateFormat,GTxInBtn;
  22.  
  23. #define CBVer "2.1"
  24.  
  25. /*-------------------------------------------------------------------*/
  26.  
  27. // LibMain
  28. #pragma argsused
  29. int WINAPI LibMain(HANDLE hLibInst, WORD wDataSeg,
  30.                        WORD cbHeapSize, LPSTR lpszCmdLine)
  31. {
  32.   hInstance = hLibInst;
  33.   return 1;
  34.  
  35. } /*LibMain*/
  36.  
  37. /*-------------------------------------------------------------------*/
  38.  
  39. // Windows Exit Procedure
  40. #pragma argsused
  41. int WINAPI WEP(int bSystemExit)
  42. {
  43.   return 1;
  44.  
  45. } /*WEP*/
  46.  
  47. /*-------------------------------------------------------------------*/
  48.  
  49. // Utility Function to center text
  50.  
  51. int CenterTx(HDC DC, char *Tx, RECT Rect)
  52.  
  53. {
  54.   int Width,WinX,StrtX;
  55.  
  56.   // Ask Windows for the total pixel length of the string & calc starting X
  57.   Width = LOWORD(GetTextExtent(DC,Tx,strlen(Tx)));
  58.  
  59.   // Get total x width of window - don"t add 1!
  60.   WinX = (Rect.right - Rect.left);
  61.  
  62.   // Calculate centered starting posn
  63.   StrtX = ((WinX - Width) / 2) + Rect.left;
  64.  
  65.   return StrtX;
  66.  
  67. } /*CenterTx*/
  68.  
  69. /*-------------------------------------------------------------------*/
  70.  
  71. VOID FormIWDate(void)
  72.  
  73. {
  74.   char *MonthName[12] =
  75.     {"January","February","March","April","May","June",
  76.      "July","August","September","October","November","December"};
  77.  
  78.   char *Days[7] =
  79.      {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
  80.  
  81.   _dos_getdate(&Today);
  82.  
  83.   if (USDateFormat)
  84.     {
  85.       // US date fmt
  86.       sprintf(IWDate,"C: %s, %s %d, %d",Days[Today.dayofweek],MonthName[Today.month],
  87.                                         Today.day,Today.year);
  88.     }
  89.   else
  90.     {
  91.       // European date fmt 
  92.       sprintf(IWDate,"C: %s, %d %s %d",Days[Today.dayofweek],Today.day,
  93.                                        MonthName[Today.month],Today.year);
  94.     }
  95. } /*FormIWDate*/
  96.  
  97. /*-------------------------------------------------------------------*/
  98.  
  99. // Perform Add-In's initialization
  100.  
  101. InitResult WINAPI AddInInit(char far *CurVer, BOOLEAN TxInBtn)
  102.  
  103. {
  104.   // Version check
  105.   if (strncmp(CurVer,CBVer,3) != 0)
  106.     return InitNotOk;
  107.  
  108.   // Point at our INI file, which is in our home dir
  109.   HomeDir(hInstance,INIFile);
  110.   strcat(INIFile,"C-CALEND.INI");
  111.  
  112.   // Flush INI file so we can edit it
  113.   WritePrivateProfileString(NULL,NULL,NULL,INIFile);
  114.  
  115.   // Get display mode
  116.   USDateFormat = GetPrivateProfileInt("Settings",
  117.                                       "USDateFormat",
  118.                                       0,
  119.                                       INIFile);
  120.  
  121.   GTxInBtn = TxInBtn;
  122.  
  123.   return InitOk;
  124. } /*AddInInit*/
  125.  
  126. /*-------------------------------------------------------------------*/
  127.  
  128. // Paint on the button (Clysbar does the background)
  129.  
  130. VOID WINAPI AddInPaint(HWND Wnd, HDC DC, BOOLEAN Pressed)
  131.  
  132. {
  133.   char *MonthName[12] =
  134.     {"JAN","FEB","MAR","APR","MAY","JUN",
  135.      "JUL","AUG","SEP","OCT","NOV","DEC"};
  136.  
  137.   char *Days[7] =
  138.      {"SUN","MON","TUE","WED","THU","FRI","SAT"};
  139.  
  140.   RECT Rect,ShadRect;
  141.   HFONT NumFont,OldFont,SmlFont;
  142.   char Tx[128];
  143.   char StrYr[5],StrDay[5];       // or 4?
  144.   int StrtX,StrtY;
  145.   HICON TheIcon;
  146.  
  147.   // If add-in is never uncovered, Wnd will be NULL
  148.   if (Wnd == NULL)
  149.     return;
  150.  
  151.   // Get full button rect
  152.   GetClientRect(Wnd,&Rect);
  153.  
  154.   // Place "C" on right side
  155.   StrtX = ((Rect.right - Rect.left) - GetSystemMetrics(SM_CXICON)) / 4 * 3;
  156.   StrtY = ((Rect.bottom - Rect.top) - GetSystemMetrics(SM_CYICON)) / 2;
  157.   if (Pressed)
  158.     {
  159.       StrtX++;
  160.       StrtY++;
  161.     }
  162.  
  163.   TheIcon = LoadIcon(hInstance,"c");
  164.   DrawIcon(DC,StrtX,StrtY,TheIcon);
  165.  
  166.   // Choke down rect to left side only
  167.   if (GTxInBtn)
  168.     Rect.right = Rect.left + GetSystemMetrics(SM_CXICON) + 12;
  169.  
  170.   // Calc location of icon 
  171.   StrtX = ((Rect.right - Rect.left) - GetSystemMetrics(SM_CXICON)) / 2;
  172.   StrtY = ((Rect.bottom - Rect.top) - GetSystemMetrics(SM_CYICON)) / 2;
  173.  
  174.   // Draw turning page if pressed
  175.   if (Pressed)
  176.     {
  177.       TheIcon = LoadIcon(hInstance,"turning");
  178.       DrawIcon(DC,StrtX+1,StrtY+1,TheIcon);
  179.  
  180.       return;
  181.     }
  182.  
  183.   // Draw "page" icon
  184.   TheIcon = LoadIcon(hInstance,"calend");
  185.   DrawIcon(DC,StrtX,StrtY,TheIcon);
  186.  
  187.   // Get date info
  188.   _dos_getdate(&Today);
  189.  
  190.   itoa(Today.day,StrDay,10);
  191.   itoa(Today.year,StrYr,10);
  192.  
  193.   // Lop off 1st two year digits
  194.   //StrYr[0] = StrYr[2];
  195.   //StrYr[1] = StrYr[3];
  196.   //StrYr[2] = NULL;
  197.  
  198.   // Create a small font for the month/day name/year
  199.   SmlFont =
  200.   CreateFont(9,             // Height
  201.              0,0,0,         // Width, left 2 right, normal orientation
  202.              400,           // Weight
  203.              0,0,0,         // Italic, underlined, or strikeout
  204.              0,             // ANSI char set
  205.              0,             // Reserved precision field
  206.              0,             // Default clipping
  207.              PROOF_QUALITY, // Quality
  208.              FF_ROMAN | VARIABLE_PITCH,
  209.              "Small Fonts");
  210.  
  211.   // Create large font for the day number
  212.   NumFont =
  213.   CreateFont(17,            // Height
  214.              0,0,0,         // Width, left 2 right, normal orientation
  215.              700,           // Weight
  216.              0,0,0,         // Italic, underlined, or strikeout
  217.              0,             // ANSI char set
  218.              0,             // Reserved precision field
  219.              0,             // Default clipping
  220.              PROOF_QUALITY, // Quality
  221.              FF_ROMAN | VARIABLE_PITCH,
  222.              "Times New Roman");
  223.  
  224.   // Setup for day number
  225.   OldFont = SelectObject(DC,NumFont);
  226.   SetBkMode(DC,TRANSPARENT);
  227.  
  228.   // Draw lg day number's shadow
  229.   SetTextColor(DC,RGB(128,128,128));
  230.   ShadRect = Rect;
  231.   OffsetRect(&ShadRect,1,1);
  232.   DrawText(DC,StrDay,strlen(StrDay),&ShadRect,
  233.            DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  234.  
  235.   // Draw lg day number
  236.   SetTextColor(DC,RGB(0,0,0));
  237.   DrawText(DC,StrDay,strlen(StrDay),&Rect,
  238.            DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  239.  
  240.   // Setup for other info
  241.   SelectObject(DC,SmlFont);
  242.  
  243.   // Draw month name
  244.   SetTextColor(DC,RGB(255,0,0));
  245.   strcpy(Tx,MonthName[Today.month-1]);
  246.   TextOut(DC,CenterTx(DC,Tx,Rect),StrtY + 1,Tx,strlen(Tx));
  247.  
  248.   // either year or DOY
  249.   if (ShowDOW)
  250.     {
  251.       // Display day of week
  252.       strcpy(Tx,Days[Today.dayofweek]);
  253.       SetTextColor(DC,RGB(0,0,128));
  254.       TextOut(DC,CenterTx(DC,Tx,Rect),StrtY + 22,Tx,strlen(Tx));
  255.     }
  256.   else
  257.     {
  258.       // Display year
  259.       strcpy(Tx,StrYr);
  260.       SetTextColor(DC,RGB(128,0,128));
  261.       TextOut(DC,CenterTx(DC,Tx,Rect),StrtY + 22,Tx,strlen(Tx));
  262.     }
  263.  
  264.   // Clean up
  265.   SelectObject(DC,OldFont);
  266.   DeleteObject(SmlFont);
  267.   DeleteObject(NumFont);
  268.  
  269. } /*AddInPaint*/
  270.  
  271. /*-------------------------------------------------------------------*/
  272.  
  273. // Tell Clysbar what kind of timer we need
  274.  
  275. int WINAPI AddInTimerNeeded()
  276.  
  277. {
  278.   return ait_Slow;
  279. } /*AddInTimerNeeded*/
  280.  
  281. /*-------------------------------------------------------------------*/
  282.  
  283. // Proc called when timer expires, perform timed duties
  284.  
  285. VOID WINAPI AddInTimerTick(HWND Wnd, HDC DC)
  286.  
  287. {
  288.   struct dosdate_t TstDate;
  289.  
  290.   // If add-in is never uncovered, Wnd will be NULL
  291.   if (Wnd == NULL)
  292.     return;
  293.  
  294.   // Check for a date change
  295.   _dos_getdate(&TstDate);
  296.  
  297.   // If different date, repaint window
  298.   if (TstDate.day != Today.day)
  299.     AddInPaint(Wnd,DC,FALSE);
  300.  
  301. } /*AddInTimerTick*/
  302.  
  303. /*-------------------------------------------------------------------*/
  304.  
  305. // Proc called when button pressed and released (used for toggling states)
  306.  
  307. VOID WINAPI AddInPressed(HWND Wnd, HDC DC)
  308.  
  309. {
  310.   // Toggle the "show day-of-week" indicator when button pressed
  311.   ShowDOW = !ShowDOW;
  312.  
  313.   AddInPaint(Wnd,DC,FALSE);
  314. } /*AddInPressed*/
  315.  
  316. /*-------------------------------------------------------------------*/
  317.  
  318. // Exit processing for Add-In
  319.  
  320. VOID WINAPI AddInExit()
  321.  
  322. {
  323. } /*AddInExit*/
  324.  
  325. /*-------------------------------------------------------------------*/
  326.  
  327. // Clysbar queries Add-In about itself for About box
  328.  
  329. VOID WINAPI AddInAbout(char far *Str1, char far *Str2,
  330.                            HICON far *TheIcon,
  331.                            COLORREF far *TitleCol,
  332.                            COLORREF far *TxCol,
  333.                            COLORREF far *BkCol)
  334.  
  335. {
  336.   strcpy(Str1,"C-Calend V2.10");
  337.   strcpy(Str2,"'C' Code Demo Example\n⌐ 1992 - 1994 by clySmic Software.\nAll Rights Reserved.");
  338.  
  339.   *TheIcon = LoadIcon(hInstance,"about");
  340.   *TitleCol = RGB(255,255,255);
  341.   *TxCol = RGB(192,192,192);
  342.   *BkCol = RGB(255,0,0);
  343. } /*AddInAbout*/
  344.  
  345. /*-------------------------------------------------------------------*/
  346.  
  347.  
  348. // Clysbar queries Add-In whether it'll accept d'n'd
  349.  
  350. BOOL WINAPI AddInAcceptDrops()
  351.  
  352. {
  353.   return FALSE;
  354. } /*AddInAcceptDrops*/
  355.  
  356. /*-------------------------------------------------------------------*/
  357.  
  358.  
  359. // Clysbar informs Add-In of a d'n'd drop
  360. #pragma argsused
  361. VOID WINAPI AddInDrop(HANDLE hDrop)
  362.  
  363. {
  364. } /*AddInDrop*/
  365.  
  366. /*-------------------------------------------------------------------*/
  367.  
  368. // Clysbar queries Add-In for Info Window text
  369.  
  370. // Return a zero-length string if you don't want to chg the text
  371.  
  372. VOID WINAPI AddInGetInfoWinTx(char *Tx)
  373.  
  374. {
  375.   if (GTxInBtn)
  376.     strcpy(Tx,"Calend");
  377.   else
  378.     {
  379.       FormIWDate();
  380.       strcpy(Tx,IWDate);
  381.     }
  382. } /*AddInGetInfoWinTx*/
  383.