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

  1. /*-------------------------------------------
  2.   pageformat.c
  3.   "Format" page of properties
  4.                        KAZUBON 1997-1998
  5. ---------------------------------------------*/
  6.  
  7. #include "tclock.h"
  8.  
  9. static void OnInit(HWND hDlg);
  10. static void OnApply(HWND hDlg);
  11. static void OnLocale(HWND hDlg);
  12. static void OnCustom(HWND hDlg);
  13. static void On12Hour(HWND hDlg);
  14. static void OnFormatCheck(HWND hDlg, WORD id);
  15.  
  16. static HWND hwndPage;
  17. static int ilang;  // language code. ex) 0x411 - Japanese
  18. static int idate;  // 0: mm/dd/yy 1: dd/mm/yy 2: yy/mm/dd
  19. static BOOL bDayOfWeekIsLast;   // yy/mm/dd ddd
  20. static BOOL bTimeMarkerIsFirst; // AM/PM hh:nn:ss
  21. static char sMon[11];  //
  22.  
  23. BOOL CALLBACK DlgProcFormat2(HWND, UINT, WPARAM, LPARAM);
  24.  
  25. /*------------------------------------------------
  26.    Dialog Procedure for the "Format" page
  27. --------------------------------------------------*/
  28. BOOL CALLBACK PageFormatProc(HWND hDlg, UINT message,
  29.     WPARAM wParam, LPARAM lParam)
  30. {
  31.     switch(message)
  32.     {
  33.         case WM_INITDIALOG:
  34.             OnInit(hDlg);
  35.             return TRUE;
  36.         case WM_COMMAND:
  37.         {
  38.             WORD id, code;
  39.             id = LOWORD(wParam); code = HIWORD(wParam);
  40.             if(id == IDC_LOCALE && code == CBN_SELCHANGE)
  41.                 OnLocale(hDlg);
  42.             // format textbox
  43.             else if(id == IDC_FORMAT && code == EN_CHANGE)
  44.                 SendPSChanged(hDlg);
  45.             // "Custumize Format"
  46.             else if(id == IDC_CUSTOM)
  47.                 OnCustom(hDlg);
  48.             // "12H"
  49.             else if(id == IDC_12HOUR)
  50.                 On12Hour(hDlg);
  51.             // "year" -- "Internet Time"
  52.             else if(IDC_YEAR <= id && id <= IDC_AMPM)
  53.                 OnFormatCheck(hDlg, id);
  54.             // "detail..."
  55.             else if(id == IDC_FORMATDETAIL)
  56.             {
  57.                 int r;
  58.                 r = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_FORMAT2),
  59.                     hwndSheet, DlgProcFormat2, (LPARAM)ilang);
  60.                 if(r == IDOK) SendPSChanged(hDlg);
  61.             }
  62.             return TRUE;
  63.         }
  64.         case WM_NOTIFY:
  65.             switch(((NMHDR *)lParam)->code)
  66.             {
  67.                 case PSN_APPLY: OnApply(hDlg); break;
  68.                 case PSN_HELP: MyHelp(GetParent(hDlg), 2); break;
  69.             }
  70.             return TRUE;
  71.     }
  72.     return FALSE;
  73. }
  74.  
  75. char *entrydate[] = { "Year", "Month", "MonthS", "Day", "Weekday",
  76.     "Hour", "Minute", "Second", "Kaigyo", "InternetTime",
  77.     "AMPM", "Hour12", "Custom",  };
  78.  
  79. /*------------------------------------------------
  80.   Initialize Locale Infomation
  81. --------------------------------------------------*/
  82. void InitLocale(HWND hwnd)
  83. {
  84.     char s[21];
  85.     int i, sel;
  86.     int aLangDayOfWeekIsLast[] =
  87.         { LANG_JAPANESE, LANG_KOREAN, 0 };
  88.     int aTimeMarkerIsFirst[] = 
  89.         { LANG_CHINESE, LANG_JAPANESE, LANG_KOREAN, 0 };
  90.  
  91.     if(hwnd)
  92.     {
  93.         sel = CBGetCurSel(hwnd, IDC_LOCALE);
  94.         ilang = CBGetItemData(hwnd, IDC_LOCALE, sel);
  95.     }
  96.     else
  97.     {
  98.         ilang = GetMyRegLong("", "Locale", (int)GetUserDefaultLangID());
  99.     }
  100. //    ilang = (int)GetUserDefaultLangID();
  101. //    ilang = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
  102.     GetLocaleInfoWA(ilang, LOCALE_IDATE, s, 20);
  103.     idate = atoi(s);
  104.     GetLocaleInfoWA(ilang, LOCALE_SABBREVDAYNAME1, sMon, 10);
  105.     
  106.     bDayOfWeekIsLast = FALSE;
  107.     for(i = 0; aLangDayOfWeekIsLast[i]; i++)
  108.     {
  109.         if((ilang & 0x00ff) == aLangDayOfWeekIsLast[i])
  110.         {
  111.             bDayOfWeekIsLast = TRUE; break;
  112.         }
  113.     }
  114.     bTimeMarkerIsFirst = FALSE;
  115.     for(i = 0; aTimeMarkerIsFirst[i]; i++)
  116.     {
  117.         if((ilang & 0x00ff) == aTimeMarkerIsFirst[i])
  118.         {
  119.             bTimeMarkerIsFirst = TRUE; break;
  120.         }
  121.     }
  122. }
  123.  
  124. /*------------------------------------------------
  125.   for EnumSystemLocales function
  126. --------------------------------------------------*/
  127. BOOL CALLBACK EnumLocalesProc(LPTSTR lpLocaleString)
  128. {
  129.     char s[81];
  130.     int x, index;
  131.     
  132.     x = atox(lpLocaleString);
  133.     if(GetLocaleInfoWA(x, LOCALE_SLANGUAGE, s, 80) > 0)
  134.         index = CBAddString(hwndPage, IDC_LOCALE, (LPARAM)s);
  135.     else
  136.         index = CBAddString(hwndPage, IDC_LOCALE, (LPARAM)lpLocaleString);
  137.     CBSetItemData(hwndPage, IDC_LOCALE, index, x);
  138.     return TRUE;
  139. }
  140.  
  141. /*------------------------------------------------
  142.   Initialize the "Format" page
  143. --------------------------------------------------*/
  144. void OnInit(HWND hDlg)
  145. {
  146.     HFONT hfont;
  147.     char s[1024];
  148.     int i, count, nKaigyo;
  149.     
  150.     hwndPage = hDlg;
  151.     
  152.     hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  153.     if(hfont)
  154.     {
  155.         SendDlgItemMessage(hDlg, IDC_LOCALE, WM_SETFONT, (WPARAM)hfont, 0);
  156.         SendDlgItemMessage(hDlg, IDC_AMSYMBOL, WM_SETFONT, (WPARAM)hfont, 0);
  157.         SendDlgItemMessage(hDlg, IDC_PMSYMBOL, WM_SETFONT, (WPARAM)hfont, 0);
  158.     }
  159.     hfont = (HFONT)GetStockObject(SYSTEM_FIXED_FONT);
  160.     if(hfont)
  161.         SendDlgItemMessage(hDlg, IDC_FORMAT, WM_SETFONT, (WPARAM)hfont, 0);
  162.     
  163.     // Fill and select the "Locale" combobox
  164.     EnumSystemLocales(EnumLocalesProc, LCID_INSTALLED);
  165.     CBSetCurSel(hDlg, IDC_LOCALE, 0);
  166.     ilang = GetMyRegLong("", "Locale", (int)GetUserDefaultLangID());
  167.     count = CBGetCount(hDlg, IDC_LOCALE);
  168.     for(i = 0; i < count; i++)
  169.     {
  170.         int x;
  171.         x = CBGetItemData(hDlg, IDC_LOCALE, i);
  172.         if(x == ilang)
  173.         {
  174.             CBSetCurSel(hDlg, IDC_LOCALE, i); break;
  175.         }
  176.     }
  177.     
  178.     InitLocale(hDlg);
  179.     
  180.     // "year" -- "second"
  181.     for(i = IDC_YEAR; i <= IDC_SECOND; i++)
  182.     {
  183.         CheckDlgButton(hDlg, i,
  184.             GetMyRegLong("", entrydate[i - IDC_YEAR], TRUE));
  185.     }
  186.     
  187.     if(IsDlgButtonChecked(hDlg, IDC_MONTH))
  188.         CheckRadioButton(hDlg, IDC_MONTH, IDC_MONTHS, IDC_MONTH);
  189.     if(IsDlgButtonChecked(hDlg, IDC_MONTHS))
  190.         CheckRadioButton(hDlg, IDC_MONTH, IDC_MONTHS, IDC_MONTHS);
  191.     
  192.     nKaigyo = GetMyRegLong("", entrydate[IDC_KAIGYO - IDC_YEAR], -1);
  193.     if(nKaigyo < 0)
  194.     {
  195.         RECT rc;
  196.         HWND hwnd;
  197.         nKaigyo = 1;
  198.         hwnd = FindWindow("Shell_TrayWnd", NULL);
  199.         if(hwnd != NULL)
  200.         {
  201.             GetClientRect(hwnd, &rc);
  202.             // if the task bar is positioned horizontally
  203.             if(rc.right > rc.bottom) nKaigyo = 0;
  204.         }
  205.     }
  206.     CheckDlgButton(hDlg, IDC_KAIGYO, nKaigyo);
  207.     
  208.     // "Internet Time" -- "Customize format"
  209.     for(i = IDC_INTERNETTIME; i <= IDC_CUSTOM; i++)
  210.     {
  211.         CheckDlgButton(hDlg, i,
  212.             GetMyRegLong("", entrydate[i - IDC_YEAR], FALSE));
  213.     }
  214.     
  215.     GetMyRegStr("", "Format", s, 1024, "");
  216.     SetDlgItemText(hDlg, IDC_FORMAT, s);
  217.     
  218.     On12Hour(hDlg);
  219.     OnCustom(hDlg);
  220. }
  221.  
  222. /*------------------------------------------------
  223.   "Apply" button
  224. --------------------------------------------------*/
  225. void OnApply(HWND hDlg)
  226. {
  227.     char s[1024];
  228.     int i;
  229.     
  230.     SetMyRegLong("", "Locale",
  231.         CBGetItemData(hDlg, IDC_LOCALE, CBGetCurSel(hDlg, IDC_LOCALE)));
  232.     
  233.     for(i = IDC_YEAR; i <= IDC_CUSTOM; i++)
  234.     {
  235.         SetMyRegLong("", entrydate[i - IDC_YEAR], IsDlgButtonChecked(hDlg, i));
  236.     }
  237.     
  238.     GetDlgItemText(hDlg, IDC_FORMAT, s, 1024);
  239.     SetMyRegStr("", "Format", s);
  240. }
  241.  
  242. /*------------------------------------------------
  243.   When changed "Locale" combobox
  244. --------------------------------------------------*/
  245. void OnLocale(HWND hDlg)
  246. {
  247.     InitLocale(hDlg);
  248.     OnCustom(hDlg);
  249. }
  250.  
  251. /*------------------------------------------------
  252.   "Customize format" checkbox
  253. --------------------------------------------------*/
  254. void OnCustom(HWND hDlg)
  255. {
  256.     BOOL b;
  257.     int i;
  258.     
  259.     b = IsDlgButtonChecked(hDlg, IDC_CUSTOM);
  260.     EnableDlgItem(hDlg, IDC_FORMAT, b);
  261.     
  262.     for(i = IDC_YEAR; i <= IDC_AMPM; i++)
  263.         EnableDlgItem(hDlg, i, !b);
  264.  
  265.     if(!b) OnFormatCheck(hDlg, 0);
  266.  
  267.     SendPSChanged(hDlg);
  268. }
  269.  
  270. /*------------------------------------------------
  271.    "12H" combobox
  272. --------------------------------------------------*/
  273. void On12Hour(HWND hDlg)
  274. {
  275.     BOOL b;
  276.     b = IsDlgButtonChecked(hDlg, IDC_12HOUR);
  277.     if(!b)
  278.     {
  279.         CheckDlgButton(hDlg, IDC_AMPM, 0);
  280.         if(!IsDlgButtonChecked(hDlg, IDC_CUSTOM))
  281.             OnFormatCheck(hDlg, 0);
  282.     }
  283.     
  284.     SendPSChanged(hDlg);
  285. }
  286.  
  287. #define CHECKS(a) checks[(a)-IDC_YEAR]
  288.  
  289. /*------------------------------------------------
  290.   When clicked "year" -- "am/pm"
  291. --------------------------------------------------*/
  292. void OnFormatCheck(HWND hDlg, WORD id)
  293. {
  294.     char s[1024];
  295.     int checks[15];
  296.     int i;
  297.     
  298.     for(i = IDC_YEAR; i <= IDC_AMPM; i++)
  299.     {
  300.         CHECKS(i) = IsDlgButtonChecked(hDlg, i);
  301.     }
  302.     
  303.     if(id == IDC_MONTH || id == IDC_MONTHS)
  304.     {
  305.         if(id == IDC_MONTH && CHECKS(IDC_MONTH))
  306.         {
  307.             CheckRadioButton(hDlg, IDC_MONTH, IDC_MONTHS, IDC_MONTH);
  308.             CHECKS(IDC_MONTHS) = FALSE;
  309.         }
  310.         if(id == IDC_MONTHS && CHECKS(IDC_MONTHS))
  311.         {
  312.             CheckRadioButton(hDlg, IDC_MONTH, IDC_MONTHS, IDC_MONTHS);
  313.             CHECKS(IDC_MONTH) = FALSE;
  314.         }
  315.     }
  316.     
  317.     if(id == IDC_AMPM)
  318.     {
  319.         CheckDlgButton(hDlg, IDC_12HOUR, 1);
  320.         On12Hour(hDlg);
  321.     }
  322.     
  323.     CreateFormat(s, checks);
  324.     SetDlgItemText(hDlg, IDC_FORMAT, s);
  325.     SendPSChanged(hDlg);
  326. }
  327.  
  328. /*------------------------------------------------
  329.   Initialize a format string. Called from main.c
  330. --------------------------------------------------*/
  331. void InitFormat(void)
  332. {
  333.     char s[1024];
  334.     int i, checks[15];
  335.     RECT rc;
  336.     HWND hwnd;
  337.     BOOL b;
  338.     
  339.     if(GetMyRegLong("", entrydate[IDC_CUSTOM-IDC_YEAR], FALSE))
  340.         return;
  341.     
  342.     InitLocale(NULL);
  343.     
  344.     for(i = IDC_YEAR; i <= IDC_SECOND; i++)
  345.     {
  346.         CHECKS(i) = GetMyRegLong("", entrydate[i - IDC_YEAR], TRUE);
  347.     }
  348.     
  349.     if(CHECKS(IDC_MONTH)) CHECKS(IDC_MONTHS) = FALSE;
  350.     if(CHECKS(IDC_MONTHS)) CHECKS(IDC_MONTH) = FALSE;
  351.     
  352.     CHECKS(IDC_INTERNETTIME) = GetMyRegLong("",
  353.         entrydate[IDC_INTERNETTIME - IDC_YEAR], FALSE);
  354.     
  355.     b = FALSE;
  356.     hwnd = FindWindow("Shell_TrayWnd", NULL);
  357.     if(hwnd != NULL)
  358.     {
  359.         GetClientRect(hwnd, &rc);
  360.         if(rc.right < rc.bottom) b = TRUE;
  361.     }
  362.     CHECKS(IDC_KAIGYO) = 
  363.         GetMyRegLong("", entrydate[IDC_KAIGYO - IDC_YEAR], b);
  364.     CHECKS(IDC_AMPM) = GetMyRegLong("", entrydate[IDC_AMPM-IDC_YEAR], FALSE);
  365.     
  366.     CreateFormat(s, checks);
  367.     SetMyRegStr("", "Format", s);
  368. }
  369.  
  370. /*------------------------------------------------
  371.   Create a format string automatically
  372. --------------------------------------------------*/
  373. void CreateFormat(char* dst, int* checks)
  374. {
  375.     BOOL bdate = FALSE, btime = FALSE;
  376.     int i;
  377.     
  378.     for(i = IDC_YEAR; i <= IDC_WEEKDAY; i++)
  379.     {
  380.         if(CHECKS(i)) { bdate = TRUE; break; }
  381.     }
  382.     for(i = IDC_HOUR; i <= IDC_AMPM; i++)
  383.     {
  384.         if(CHECKS(i)) { btime = TRUE; break; }
  385.     }
  386.     
  387.     dst[0] = 0;
  388.     
  389.     if(!bDayOfWeekIsLast && CHECKS(IDC_WEEKDAY))
  390.     {
  391.         strcat(dst, "ddd");
  392.         for(i = IDC_YEAR; i <= IDC_DAY; i++)
  393.         {
  394.             if(CHECKS(i))
  395.             {
  396.                 if((ilang & 0x00ff) == LANG_CHINESE) strcat(dst, " ");
  397.                 else if(sMon[0] && sMon[ strlen(sMon) - 1 ] == '.')
  398.                     strcat(dst, " ");
  399.                 else strcat(dst, ", ");
  400.                 break;
  401.             }
  402.         }
  403.     }
  404.     
  405.     if(idate == 0)
  406.     {
  407.         if(CHECKS(IDC_MONTH) || CHECKS(IDC_MONTHS))
  408.         {
  409.             if(CHECKS(IDC_MONTH)) strcat(dst, "mm");
  410.             if(CHECKS(IDC_MONTHS)) strcat(dst, "mmm");
  411.             if(CHECKS(IDC_DAY) || CHECKS(IDC_YEAR))
  412.             {
  413.                 if(CHECKS(IDC_MONTH)) strcat(dst, "/");
  414.                 else strcat(dst, " ");
  415.             }
  416.         }
  417.         if(CHECKS(IDC_DAY))
  418.         {
  419.             strcat(dst, "dd");
  420.             if(CHECKS(IDC_YEAR))
  421.             {
  422.                 if(CHECKS(IDC_MONTH)) strcat(dst, "/");
  423.                 else strcat(dst, ", ");
  424.             }
  425.         }
  426.         if(CHECKS(IDC_YEAR)) strcat(dst, "yy");
  427.     }
  428.     else if(idate == 1)
  429.     {
  430.         if(CHECKS(IDC_DAY))
  431.         {
  432.             strcat(dst, "dd");
  433.             if(CHECKS(IDC_MONTH) || CHECKS(IDC_MONTHS))
  434.             {
  435.                 if(CHECKS(IDC_MONTH)) strcat(dst, "/");
  436.                 else strcat(dst, " ");
  437.             }
  438.             else if(CHECKS(IDC_YEAR)) strcat(dst, "/");
  439.         }
  440.         if(CHECKS(IDC_MONTH) || CHECKS(IDC_MONTHS))
  441.         {
  442.             if(CHECKS(IDC_MONTH)) strcat(dst, "mm");
  443.             if(CHECKS(IDC_MONTHS)) strcat(dst, "mmm");
  444.             if(CHECKS(IDC_YEAR))
  445.             {
  446.                 if(CHECKS(IDC_MONTH)) strcat(dst, "/");
  447.                 else strcat(dst, " ");
  448.             }
  449.         }
  450.         if(CHECKS(IDC_YEAR)) strcat(dst, "yy");
  451.     }
  452.     else
  453.     {
  454.         if(CHECKS(IDC_YEAR))
  455.         {
  456.             strcat(dst, "yy");
  457.             if(CHECKS(IDC_MONTH) || CHECKS(IDC_MONTHS)
  458.                 || CHECKS(IDC_DAY))
  459.             {
  460.                 if(CHECKS(IDC_MONTHS)) strcat(dst, " ");
  461.                 else strcat(dst, "/");
  462.             }
  463.         }
  464.         if(CHECKS(IDC_MONTH) || CHECKS(IDC_MONTHS))
  465.         {
  466.             if(CHECKS(IDC_MONTH)) strcat(dst, "mm");
  467.             if(CHECKS(IDC_MONTHS)) strcat(dst, "mmm");
  468.             if(CHECKS(IDC_DAY))
  469.             {
  470.                 if(CHECKS(IDC_MONTHS)) strcat(dst, " ");
  471.                 else strcat(dst, "/");
  472.             }
  473.         }
  474.         if(CHECKS(IDC_DAY)) strcat(dst, "dd");
  475.     }
  476.     
  477.     if(bDayOfWeekIsLast && CHECKS(IDC_WEEKDAY))
  478.     {
  479.         for(i = IDC_YEAR; i <= IDC_DAY; i++)
  480.         {
  481.             if(CHECKS(i)) { strcat(dst, " "); break; }
  482.         }
  483.         strcat(dst, "ddd");
  484.     }
  485.     
  486.     if(bdate && btime)
  487.     {
  488.         if(CHECKS(IDC_KAIGYO)) strcat(dst, "\\n");
  489.         else
  490.         {
  491.             if(idate < 2 && CHECKS(IDC_MONTHS) && CHECKS(IDC_YEAR))
  492.                 strcat(dst, " ");
  493.             strcat(dst, " ");
  494.         }
  495.     }
  496.     
  497.     if(bTimeMarkerIsFirst && CHECKS(IDC_AMPM))
  498.     {
  499.         strcat(dst, "tt");
  500.         if(CHECKS(IDC_HOUR) || CHECKS(IDC_MINUTE) || 
  501.             CHECKS(IDC_SECOND) || CHECKS(IDC_INTERNETTIME))
  502.             strcat(dst, " ");
  503.     }
  504.     
  505.     if(CHECKS(IDC_HOUR))
  506.     {
  507.         strcat(dst, "hh");
  508.         if(CHECKS(IDC_MINUTE) || CHECKS(IDC_SECOND)) strcat(dst, ":");
  509.         else if(CHECKS(IDC_INTERNETTIME) || 
  510.             (!bTimeMarkerIsFirst && CHECKS(IDC_AMPM))) strcat(dst, " ");
  511.     }
  512.     if(CHECKS(IDC_MINUTE))
  513.     {
  514.         strcat(dst, "nn");
  515.         if(CHECKS(IDC_SECOND)) strcat(dst, ":");
  516.         else if(CHECKS(IDC_INTERNETTIME) || 
  517.             (!bTimeMarkerIsFirst && CHECKS(IDC_AMPM))) strcat(dst, " ");
  518.     }
  519.     if(CHECKS(IDC_SECOND))
  520.     {
  521.         strcat(dst, "ss");
  522.         if(CHECKS(IDC_INTERNETTIME) || 
  523.             (!bTimeMarkerIsFirst && CHECKS(IDC_AMPM))) strcat(dst, " ");
  524.     }
  525.     
  526.     if(!bTimeMarkerIsFirst && CHECKS(IDC_AMPM))
  527.     {
  528.         strcat(dst, "tt");
  529.         if(CHECKS(IDC_INTERNETTIME)) strcat(dst, " ");
  530.     }
  531.     
  532.     if(CHECKS(IDC_INTERNETTIME)) strcat(dst, "@@@");
  533. }
  534.