Fixed language handling. Removed some dependencies on Wine internals.
[wine] / programs / clock / language.c
1 /*
2  * Clock
3  *
4  * Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch>
5  * Copyright 1998 Karl Backström <karl_b@geocities.com>
6  */
7
8 #include <stdio.h>
9 #include "windows.h"
10 #include "main.h"
11 #include "language.h"
12 #include "winnls.h"
13
14 CHAR STRING_MENU_Xx[]      = "MENU_Xx";
15
16 VOID LANGUAGE_UpdateMenuCheckmarks(VOID) {
17
18     if(Globals.bAnalog == TRUE) {
19     
20         /* analog clock */
21         
22         CheckMenuItem(Globals.hPropertiesMenu, CL_ANALOG, \
23                        MF_BYCOMMAND | MF_CHECKED);
24         CheckMenuItem(Globals.hPropertiesMenu, CL_DIGITAL, \
25                        MF_BYCOMMAND | MF_UNCHECKED);
26         EnableMenuItem(Globals.hPropertiesMenu, CL_FONT, \
27                        MF_BYCOMMAND | MF_GRAYED);
28     }
29         else 
30     {
31     
32         /* digital clock */
33         
34         CheckMenuItem(Globals.hPropertiesMenu, CL_ANALOG, \
35                        MF_BYCOMMAND | MF_UNCHECKED);
36         CheckMenuItem(Globals.hPropertiesMenu, CL_DIGITAL, \
37                        MF_BYCOMMAND | MF_CHECKED);
38         EnableMenuItem(Globals.hPropertiesMenu, CL_FONT, \
39                        MF_BYCOMMAND);
40                        
41     }
42     
43     CheckMenuItem(Globals.hPropertiesMenu, CL_WITHOUT_TITLE, MF_BYCOMMAND | \
44                  (Globals.bWithoutTitle ? MF_CHECKED : MF_UNCHECKED));
45     CheckMenuItem(Globals.hSystemMenu, CL_ON_TOP, MF_BYCOMMAND | \
46                  (Globals.bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED));
47     CheckMenuItem(Globals.hPropertiesMenu, CL_SECONDS, MF_BYCOMMAND | \
48                  (Globals.bSeconds ? MF_CHECKED : MF_UNCHECKED));
49     CheckMenuItem(Globals.hPropertiesMenu, CL_DATE, MF_BYCOMMAND | \
50                  (Globals.bDate ? MF_CHECKED : MF_UNCHECKED));
51 }
52
53 VOID LANGUAGE_UpdateWindowCaption(VOID) {
54
55   CHAR szCaption[MAX_STRING_LEN];
56   CHAR szDate[MAX_STRING_LEN];
57   
58   LPSTR date = szDate;
59   
60   SYSTEMTIME st;
61   LPSYSTEMTIME lpst = &st;
62
63   GetLocalTime(&st);
64   GetDateFormat(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, lpst, NULL, date,
65                 MAX_STRING_LEN);
66
67   /* Set frame caption */
68   LoadString(Globals.hInstance, IDS_CLOCK, szCaption, sizeof(szCaption));
69   if (Globals.bDate) {
70      lstrcat(szCaption, " - ");
71      lstrcat(szCaption, szDate);
72   }
73   SetWindowText(Globals.hMainWnd, szCaption);
74
75 }
76
77
78
79 static BOOL LANGUAGE_LoadStringOther(UINT num, UINT ids, LPSTR str, UINT len)
80 {
81   ids -= Globals.wStringTableOffset;
82   ids += num * 0x100;
83   return(LoadString(Globals.hInstance, ids, str, len));
84 };
85
86 VOID LANGUAGE_SelectByName(LPCSTR lang)
87 {
88   INT i;
89   CHAR szNewLang[3];
90
91   for (i = 0; i <= MAX_LANGUAGE_NUMBER; i++)
92     if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_ID, szNewLang, 
93                 sizeof(szNewLang)) && !lstrcmp(lang, szNewLang))
94       {
95         LANGUAGE_SelectByNumber(i);
96         return;
97       }
98
99   /* Fallback */
100     for (i = 0; i <= MAX_LANGUAGE_NUMBER; i++)
101     if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_ID, szNewLang, sizeof(szNewLang)))
102       {
103         LANGUAGE_SelectByNumber(i);
104         return;
105       }
106
107     MessageBox(Globals.hMainWnd, "No language found", "FATAL ERROR", MB_OK);
108     PostQuitMessage(1);
109 }
110
111 VOID LANGUAGE_SelectByNumber(UINT num)
112 {
113   INT    i;
114   CHAR   szLanguage[3];
115
116   CHAR   szItem[MAX_STRING_LEN];
117   HMENU  hMainMenu;
118
119   /* Select string table */
120   Globals.wStringTableOffset = num * 0x100;
121
122   /* Get Language id */
123   LoadString(Globals.hInstance, IDS_LANGUAGE_ID, szLanguage, sizeof(szLanguage));
124
125   /* Change Resource names */
126   lstrcpyn(STRING_MENU_Xx + sizeof(STRING_MENU_Xx) - 3, szLanguage, 3);
127
128   /* Create menu */
129   hMainMenu = LoadMenu(Globals.hInstance, STRING_MENU_Xx);
130     Globals.hPropertiesMenu     = GetSubMenu(hMainMenu, 0);
131     Globals.hLanguageMenu       = GetSubMenu(hMainMenu, 1);
132     Globals.hInfoMenu           = GetSubMenu(hMainMenu, 2);
133
134   /* Remove dummy item */
135   RemoveMenu(Globals.hLanguageMenu, 0, MF_BYPOSITION);
136   /* Add language items */
137   for (i = 0; i <= MAX_LANGUAGE_NUMBER; i++)
138     if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_MENU_ITEM, szItem, sizeof(szItem)))
139              AppendMenu(Globals.hLanguageMenu, MF_STRING | MF_BYCOMMAND,
140                         CL_FIRST_LANGUAGE + i, szItem);
141   EnableMenuItem(Globals.hLanguageMenu, CL_FIRST_LANGUAGE + num, MF_BYCOMMAND | MF_CHECKED);
142
143   SetMenu(Globals.hMainWnd, hMainMenu);
144
145   /* Destroy old menu */
146   if (Globals.hMainMenu) DestroyMenu(Globals.hMainMenu);
147   Globals.hMainMenu = hMainMenu;
148
149   /* specific for Clock: */
150
151   LANGUAGE_UpdateMenuCheckmarks();
152   LANGUAGE_UpdateWindowCaption();   
153
154   Globals.hSystemMenu = GetSystemMenu(Globals.hMainWnd, TRUE);
155
156   /* FIXME: Append a SEPARATOR to Globals.hSystemMenu here */
157
158   LoadString(Globals.hInstance, IDS_MENU_ON_TOP, szItem, sizeof(szItem));
159   AppendMenu(Globals.hSystemMenu, MF_STRING | MF_BYCOMMAND, 1000, szItem);
160 }
161
162 VOID LANGUAGE_DefaultHandle(WPARAM wParam)
163 {
164   if ((wParam >=CL_FIRST_LANGUAGE) && (wParam<=CL_LAST_LANGUAGE))
165           LANGUAGE_SelectByNumber(wParam - CL_FIRST_LANGUAGE);
166      else printf("Unimplemented menu command %i\n", wParam);
167 }
168
169 /* Local Variables:    */
170 /* c-file-style: "GNU" */
171 /* End:                */