home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 June / VPR0106A.BIN / OLS / TCL228 / TCL228.lzh / EXESRC.lzh / timer.c < prev    next >
C/C++ Source or Header  |  1999-09-18  |  12KB  |  458 lines

  1. /*-------------------------------------------
  2.   timer.c
  3.            Kazubon 1998-1999
  4. ---------------------------------------------*/
  5.  
  6. #include "tclock.h"
  7.  
  8. // structure for timer setting
  9. typedef struct _tagTimerStruct
  10. {
  11.     char name[80];
  12.     int id;
  13.     int minute;
  14.     char fname[1024];
  15.     BOOL bRepeat;
  16.     BOOL bBlink;
  17. } TIMERSTRUCT;
  18. typedef TIMERSTRUCT* PTIMERSTRUCT;
  19.  
  20. // structure for timer executing
  21. typedef struct _tagTimerStruct2
  22. {
  23.     char name[80];
  24.     int id;
  25.     DWORD seconds;
  26.     DWORD tickonstart;
  27. } TIMERSTRUCT2;
  28. typedef TIMERSTRUCT2* PTIMERSTRUCT2;
  29.  
  30. BOOL CALLBACK DlgProcTimer(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  31. static void OnInit(HWND hDlg);
  32. static void OnDestroy(HWND hDlg);
  33. static void OnOK(HWND hDlg);
  34. static void OnTimerName(HWND hDlg);
  35. static void OnDel(HWND hDlg);
  36. static void OnTest(HWND hDlg, WORD id);
  37. static void Ring(HWND hwnd, int id);
  38.  
  39. static int nTimerCount = 0;
  40. static PTIMERSTRUCT2 pTimersWorking = NULL;
  41.  
  42. // propsheet.c
  43. void SetMyDialgPos(HWND hwnd);
  44. // page3.c
  45. void OnSanshoAlarm(HWND hDlg, WORD id);
  46.  
  47. /*------------------------------------------------
  48.    open "Timer" dialog
  49. --------------------------------------------------*/
  50. void DialogTimer(HWND hwnd)
  51. {
  52.     HWND hwndTray;
  53.     
  54.     hwndTray = FindWindow("Shell_TrayWnd", NULL);
  55.     if(hDlgTimer && IsWindow(hDlgTimer))
  56.         ;
  57.     else
  58.         hDlgTimer = CreateDialog(hInst, MAKEINTRESOURCE(IDD_TIMER),
  59.             NULL, (DLGPROC)DlgProcTimer);
  60.     SetForegroundWindow98(hDlgTimer);
  61. }
  62.  
  63. /*------------------------------------------------
  64.    dialog procedure of "Timer" dialog
  65. --------------------------------------------------*/
  66. BOOL CALLBACK DlgProcTimer(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  67. {
  68.     switch(message)
  69.     {
  70.         case WM_INITDIALOG:
  71.             SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIconTClock);
  72.             OnInit(hDlg);
  73.             SetMyDialgPos(hDlg);
  74.             return TRUE;
  75.         case WM_COMMAND:
  76.         {
  77.             WORD id, code;
  78.             id = LOWORD(wParam); code = HIWORD(wParam);
  79.             switch(id)
  80.             {
  81.                 case IDC_TIMERNAME:
  82.                     if(code == CBN_EDITCHANGE)
  83.                         OnTimerName(hDlg);
  84.                     else if(code == CBN_SELCHANGE)
  85.                         PostMessage(hDlg, WM_COMMAND,
  86.                             MAKELONG(id, CBN_EDITCHANGE), 0);
  87.                     break;
  88.                 case IDC_TIMERDEL:
  89.                     OnDel(hDlg);
  90.                     break;
  91.                 case IDC_TIMERMINUTE:
  92.                     break;
  93.                 case IDC_TIMERFILE:
  94.                     break;
  95.                 case IDC_TIMERSANSHO:
  96.                     OnSanshoAlarm(hDlg, id); break;
  97.                 case IDC_TIMERTEST:
  98.                     OnTest(hDlg, id); break;
  99.                 case IDC_TIMERHELP:
  100.                     MyHelp(GetParent(hDlg), 8); break;
  101.                 case IDOK:
  102.                     OnOK(hDlg);
  103.                 case IDCANCEL:
  104.                     DestroyWindow(hDlg);
  105.             }
  106.             return TRUE;
  107.         }
  108.         case WM_DESTROY:
  109.             MyHelp(hDlg, -1);
  110.             StopFile();
  111.             OnDestroy(hDlg);
  112.             hDlgTimer = NULL;
  113.             break;
  114.         case MM_MCINOTIFY:
  115.         case MM_WOM_DONE:
  116.             StopFile();
  117.             SendDlgItemMessage(hDlg, IDC_TIMERTEST, BM_SETIMAGE, IMAGE_ICON,
  118.                 (LPARAM)hIconPlay);
  119.             return TRUE;
  120.     }
  121.     return FALSE;
  122. }
  123.  
  124. /*------------------------------------------------
  125.    initialize "Timer" dialog
  126. --------------------------------------------------*/
  127. void OnInit(HWND hDlg)
  128. {
  129.     HFONT hfont;
  130.     char s[1024], subkey[20];
  131.     int i, count;
  132.     
  133.     hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  134.     if(hfont)
  135.         SendDlgItemMessage(hDlg, IDC_TIMERNAME,
  136.             WM_SETFONT, (WPARAM)hfont, 0);
  137.     
  138.     SendDlgItemMessage(hDlg, IDC_TIMERSPIN, UDM_SETRANGE, 0,
  139.         MAKELONG(1440, 0));
  140.     
  141.     count = GetMyRegLong("", "TimerNum", 0);
  142.     for(i = 0; i < count; i++)
  143.     {
  144.         PTIMERSTRUCT pts;
  145.         int index;
  146.         
  147.         pts = (PTIMERSTRUCT)malloc(sizeof(TIMERSTRUCT));
  148.         wsprintf(subkey, "Timer%d", i + 1);
  149.         GetMyRegStr(subkey, "Name", pts->name, 80, "");
  150.         pts->id = GetMyRegLong(subkey, "ID", 0);
  151.         pts->minute = GetMyRegLong(subkey, "Minute", 10);
  152.         GetMyRegStr(subkey, "File", pts->fname, 1024, "");
  153.         pts->bRepeat = GetMyRegLong(subkey, "Repeat", FALSE);
  154.         pts->bBlink = GetMyRegLong(subkey, "Blink", FALSE);
  155.         index = CBAddString(hDlg, IDC_TIMERNAME, (LPARAM)pts->name);
  156.         CBSetItemData(hDlg, IDC_TIMERNAME, index, (LPARAM)pts);
  157.     }
  158.     if(count > 0)
  159.         CBSetCurSel(hDlg, IDC_TIMERNAME, 0);
  160.     else
  161.         SendDlgItemMessage(hDlg, IDC_TIMERSPIN, UDM_SETPOS, 0, 10);
  162.     OnTimerName(hDlg);
  163.     
  164.     SendDlgItemMessage(hDlg, IDC_TIMERTEST, BM_SETIMAGE, IMAGE_ICON,
  165.         (LPARAM)hIconPlay);
  166.     
  167.     SendDlgItemMessage(hDlg, IDC_TIMERDEL, BM_SETIMAGE, IMAGE_ICON,
  168.         (LPARAM)hIconDel);
  169. }
  170.  
  171. /*------------------------------------------------
  172.   free memories associated with combo box.
  173. --------------------------------------------------*/
  174. void OnDestroy(HWND hDlg)
  175. {
  176.     int i, count;
  177.     
  178.     count = CBGetCount(hDlg, IDC_TIMERNAME);
  179.     for(i = 0; i < count; i++)
  180.     {
  181.         PTIMERSTRUCT pts;
  182.         pts = (PTIMERSTRUCT)CBGetItemData(hDlg, IDC_TIMERNAME, i);
  183.         free(pts);
  184.     }
  185. }
  186.  
  187. /*------------------------------------------------
  188.    called when "OK" button is clicked,
  189.    start timer
  190. --------------------------------------------------*/
  191. void OnOK(HWND hDlg)
  192. {
  193.     char subkey[20], s[1024], name[80];
  194.     int i, j, id, count, minutes;
  195.     PTIMERSTRUCT2 temp;
  196.     
  197.     GetDlgItemText(hDlg, IDC_TIMERNAME, s, 80);
  198.     strcpy(name, s);
  199.     
  200.     // save settings
  201.     j = 1; id = -1;
  202.     count = CBGetCount(hDlg, IDC_TIMERNAME);
  203.     for(i = 0; i < count; i++)
  204.     {
  205.         PTIMERSTRUCT pts;
  206.         pts = (PTIMERSTRUCT)CBGetItemData(hDlg, IDC_TIMERNAME, i);
  207.         if(strcmp(pts->name, name) != 0)
  208.         {
  209.             wsprintf(subkey, "Timer%d", j + 1);
  210.             SetMyRegStr(subkey, "Name", pts->name);
  211.             SetMyRegLong(subkey, "ID", pts->id);
  212.             SetMyRegLong(subkey, "Minute", pts->minute);
  213.             SetMyRegStr(subkey, "File", pts->fname);
  214.             SetMyRegLong(subkey, "Repeat", pts->bRepeat);
  215.             SetMyRegLong(subkey, "Blink", pts->bBlink);
  216.             j++;
  217.         }
  218.         else id = pts->id;
  219.     }
  220.     SetMyRegLong("", "TimerNum", j);
  221.     
  222.     if(id < 0)
  223.     {
  224.         id = 0;
  225.         for(i = 0; i < count; i++)
  226.         {
  227.             PTIMERSTRUCT pts;
  228.             pts = (PTIMERSTRUCT)CBGetItemData(hDlg, IDC_TIMERNAME, i);
  229.             if(pts->id >= id) id = pts->id + 1;
  230.         }
  231.     }
  232.     strcpy(subkey, "Timer1");
  233.     SetMyRegStr(subkey, "Name", name);
  234.     SetMyRegLong(subkey, "ID", id);
  235.     minutes = SendDlgItemMessage(hDlg, IDC_TIMERSPIN, UDM_GETPOS, 0, 0);
  236.     SetMyRegLong(subkey, "Minute", minutes);
  237.     GetDlgItemText(hDlg, IDC_TIMERFILE, s, MAX_PATH);
  238.     SetMyRegStr(subkey, "File", s);
  239.     SetMyRegLong(subkey, "Repeat",
  240.         IsDlgButtonChecked(hDlg, IDC_TIMERREPEAT));
  241.     SetMyRegLong(subkey, "Blink",
  242.         IsDlgButtonChecked(hDlg, IDC_TIMERBLINK));
  243.     
  244.     // start timer
  245.     temp = pTimersWorking;
  246.     pTimersWorking = (PTIMERSTRUCT2)malloc(
  247.         sizeof(TIMERSTRUCT2)*(nTimerCount + 1));
  248.     for(i = 0; i < nTimerCount; i++) pTimersWorking[i] = temp[i];
  249.     if(temp) free(temp);
  250.     strcpy(pTimersWorking[i].name, name);
  251.     pTimersWorking[i].id = id;
  252.     pTimersWorking[i].seconds = minutes * 60;
  253.     pTimersWorking[i].tickonstart = GetTickCount();
  254.     
  255.     nTimerCount++;
  256. }
  257.  
  258. /*------------------------------------------------
  259.    called when "Name" edit box is changed
  260. --------------------------------------------------*/
  261. void OnTimerName(HWND hDlg)
  262. {
  263.     char s[1024];
  264.     int i, count;
  265.     
  266.     GetDlgItemText(hDlg, IDC_TIMERNAME, s, 80);
  267.     count = CBGetCount(hDlg, IDC_TIMERNAME);
  268.     for(i = 0; i < count; i++)
  269.     {
  270.         PTIMERSTRUCT pts;
  271.         pts = (PTIMERSTRUCT)CBGetItemData(hDlg, IDC_TIMERNAME, i);
  272.         if(strcmp(s, pts->name) == 0)
  273.         {
  274.             SetDlgItemInt(hDlg, IDC_TIMERMINUTE, pts->minute, FALSE);
  275.             SetDlgItemText(hDlg, IDC_TIMERFILE, pts->fname);
  276.             CheckDlgButton(hDlg, IDC_TIMERREPEAT, pts->bRepeat);
  277.             CheckDlgButton(hDlg, IDC_TIMERBLINK, pts->bBlink);
  278.             break;
  279.         }
  280.     }
  281.     
  282.     EnableDlgItem(hDlg, IDC_TIMERDEL, i < count);
  283. }
  284.  
  285. /*------------------------------------------------
  286.    delete one setting of timer
  287. --------------------------------------------------*/
  288. void OnDel(HWND hDlg)
  289. {
  290.     char s[1024], subkey[20];
  291.     int i, count;
  292.     
  293.     GetDlgItemText(hDlg, IDC_TIMERNAME, s, 80);
  294.     count = CBGetCount(hDlg, IDC_TIMERNAME);
  295.     for(i = 0; i < count; i++)
  296.     {
  297.         PTIMERSTRUCT pts;
  298.         pts = (PTIMERSTRUCT)CBGetItemData(hDlg, IDC_TIMERNAME, i);
  299.         if(strcmp(s, pts->name) == 0) { free(pts); break; }
  300.     }
  301.     if(i >= count) return;
  302.     
  303.     CBDeleteString(hDlg, IDC_TIMERNAME, i);
  304.     if(count > 1)
  305.         CBSetCurSel(hDlg, IDC_TIMERNAME, (i>0)?(i-1):i);
  306.     else
  307.         SetDlgItemText(hDlg, IDC_TIMERNAME, "");
  308.     OnTimerName(hDlg);
  309.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  310.     
  311.     wsprintf(subkey, "Timer%d", count);
  312.     DelMyRegKey(subkey);
  313.     
  314.     for(i = 0; i < count - 1; i++)
  315.     {
  316.         PTIMERSTRUCT pts;
  317.         pts = (PTIMERSTRUCT)CBGetItemData(hDlg, IDC_TIMERNAME, i);
  318.         wsprintf(subkey, "Timer%d", i + 1);
  319.         SetMyRegStr(subkey, "Name", pts->name);
  320.         SetMyRegLong(subkey, "ID", pts->id);
  321.         SetMyRegLong(subkey, "Minute", pts->minute);
  322.         SetMyRegStr(subkey, "File", pts->fname);
  323.         SetMyRegLong(subkey, "Repeat", pts->bRepeat);
  324.         SetMyRegLong(subkey, "Blink", pts->bBlink);
  325.     }
  326.     SetMyRegLong("", "TimerNum", count - 1);
  327. }
  328.  
  329. /*------------------------------------------------
  330.    play or stop sound in dialog
  331. --------------------------------------------------*/
  332. void OnTest(HWND hDlg, WORD id)
  333. {
  334.     char fname[MAX_PATH];
  335.     
  336.     GetDlgItemText(hDlg, id - 3, fname, MAX_PATH);
  337.     if(fname[0] == 0) return;
  338.  
  339.     if((HICON)SendDlgItemMessage(hDlg, id, BM_GETIMAGE, IMAGE_ICON, 0)
  340.         == hIconPlay)
  341.     {
  342.         if(PlayFile(hDlg, fname, 0))
  343.         {
  344.             SendDlgItemMessage(hDlg, id, BM_SETIMAGE, IMAGE_ICON,
  345.                 (LPARAM)hIconStop);
  346.             InvalidateRect(GetDlgItem(hDlg, id), NULL, FALSE);
  347.         }
  348.     }
  349.     else StopFile();
  350. }
  351.  
  352. /*------------------------------------------------
  353.     called when main window receives WM_TIMER
  354. --------------------------------------------------*/
  355. void CheckTimer(HWND hwnd, SYSTEMTIME* st)
  356. {
  357.     int i;
  358.     DWORD tick;
  359.     
  360.     if(nTimerCount == 0) return;
  361.     tick = GetTickCount();
  362.     for(i = 0; i < nTimerCount; i++)
  363.     {
  364.         DWORD seconds;
  365.         
  366.         seconds = (tick - pTimersWorking[i].tickonstart) / 1000;
  367.         if(seconds > pTimersWorking[i].seconds)
  368.         {
  369.             Ring(hwnd, pTimersWorking[i].id);
  370.             StopTimer(hwnd, i);
  371.             i--;
  372.         }
  373.     }
  374. }
  375.  
  376. /*------------------------------------------------
  377.     sound or open file of timer.
  378. --------------------------------------------------*/
  379. void Ring(HWND hwnd, int id)
  380. {
  381.     char subkey[20], fname[1024];
  382.     int i, count;
  383.     
  384.     count = GetMyRegLong("", "TimerNum", 0);
  385.     for(i = 0; i < count; i++)
  386.     {
  387.         wsprintf(subkey, "Timer%d", i + 1);
  388.         if(id == GetMyRegLong(subkey, "ID", 0))
  389.         {
  390.             GetMyRegStr(subkey, "File", fname, 1024, "");
  391.             PlayFile(hwnd, fname,
  392.                 GetMyRegLong(subkey, "Repeat", FALSE)?(-1):0);
  393.             if(GetMyRegLong(subkey, "Blink", FALSE))
  394.                 PostMessage(hwndClock, WM_USER+2, FALSE, 0);
  395.             break;
  396.         }
  397.     }
  398. }
  399.  
  400. /*------------------------------------------------
  401.     clear all timer
  402. --------------------------------------------------*/
  403. void EndTimer(void)
  404. {
  405.     if(pTimersWorking) free(pTimersWorking);
  406.     nTimerCount = 0;
  407. }
  408.  
  409. /*----------------------------------------------------------------
  410.     called when main window receives WM_USER+11 from TCDLL.dll,
  411.     send back timer name and remained time.
  412. ------------------------------------------------------------------*/
  413. int OnQueryTimerInfo(HWND hwndSrc, HWND hwndDst, int num)
  414. {
  415.     char s[80];
  416.     DWORD tick;
  417.     int seconds;
  418.     
  419.     if(num < nTimerCount)
  420.     {
  421.         tick = GetTickCount();
  422.         seconds = (tick - pTimersWorking[num].tickonstart) / 1000;
  423.         seconds = pTimersWorking[num].seconds - seconds;
  424.         wsprintf(s, "  %s %02d:%02d",
  425.             pTimersWorking[num].name, seconds / 60, seconds % 60);
  426.         CopyToShareBuf(s);
  427.         return 1;
  428.     }
  429.     return 0;
  430. }
  431.  
  432. /*---------------------------------------------------------------
  433.     called when main window receives WM_USER+12 from TCDLL.dll,
  434.     free memory to clear one timer
  435. -----------------------------------------------------------------*/
  436. void StopTimer(HWND hwnd, int tostop)
  437. {
  438.     PTIMERSTRUCT2 temp;
  439.     int i, j;
  440.     
  441.     if(tostop >= nTimerCount) return;
  442.     
  443.     temp = pTimersWorking;
  444.     if(nTimerCount > 1)
  445.     {
  446.         pTimersWorking = (PTIMERSTRUCT2)malloc(
  447.             sizeof(TIMERSTRUCT2)*(nTimerCount - 1));
  448.         for(i = 0, j = 0; i < nTimerCount; i++)
  449.         {
  450.             if(tostop != i) pTimersWorking[j++] = temp[i];
  451.         }
  452.     }
  453.     else pTimersWorking = NULL;
  454.     if(temp) free(temp);
  455.     nTimerCount--;
  456. }
  457.  
  458.