Changed // comments to /* */ so WINE compiles with non-gcc compilers
[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 #ifdef WINELIB
14 #include "options.h"
15 #endif
16
17 CHAR STRING_MENU_Xx[]      = "MENU_Xx";
18
19 VOID LANGUAGE_UpdateMenuCheckmarks(VOID) {
20
21     if(Globals.bAnalog == TRUE) {
22     
23         /* analog clock */
24         
25         CheckMenuItem(Globals.hPropertiesMenu, CL_ANALOG, \
26                        MF_BYCOMMAND | MF_CHECKED);
27         CheckMenuItem(Globals.hPropertiesMenu, CL_DIGITAL, \
28                        MF_BYCOMMAND | MF_UNCHECKED);
29         EnableMenuItem(Globals.hPropertiesMenu, CL_FONT, \
30                        MF_BYCOMMAND | MF_GRAYED);
31     }
32         else 
33     {
34     
35         /* digital clock */
36         
37         CheckMenuItem(Globals.hPropertiesMenu, CL_ANALOG, \
38                        MF_BYCOMMAND | MF_UNCHECKED);
39         CheckMenuItem(Globals.hPropertiesMenu, CL_DIGITAL, \
40                        MF_BYCOMMAND | MF_CHECKED);
41         EnableMenuItem(Globals.hPropertiesMenu, CL_FONT, \
42                        MF_BYCOMMAND);
43                        
44     }
45     
46     CheckMenuItem(Globals.hPropertiesMenu, CL_WITHOUT_TITLE, MF_BYCOMMAND | \
47                  (Globals.bWithoutTitle ? MF_CHECKED : MF_UNCHECKED));
48     CheckMenuItem(Globals.hSystemMenu, CL_ON_TOP, MF_BYCOMMAND | \
49                  (Globals.bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED));
50     CheckMenuItem(Globals.hPropertiesMenu, CL_SECONDS, MF_BYCOMMAND | \
51                  (Globals.bSeconds ? MF_CHECKED : MF_UNCHECKED));
52     CheckMenuItem(Globals.hPropertiesMenu, CL_DATE, MF_BYCOMMAND | \
53                  (Globals.bDate ? MF_CHECKED : MF_UNCHECKED));
54 }
55
56 VOID LANGUAGE_UpdateWindowCaption(VOID) {
57
58   CHAR szCaption[MAX_STRING_LEN];
59   CHAR szDate[MAX_STRING_LEN];
60   
61   LPSTR date = szDate;
62   
63   SYSTEMTIME st;
64   LPSYSTEMTIME lpst = &st;
65
66   GetLocalTime(&st);
67   GetDateFormat(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, lpst, NULL, date,
68                 MAX_STRING_LEN);
69
70   /* Set frame caption */
71   LoadString(Globals.hInstance, IDS_CLOCK, szCaption, sizeof(szCaption));
72   if (Globals.bDate) {
73      lstrcat(szCaption, " - ");
74      lstrcat(szCaption, szDate);
75   }
76   SetWindowText(Globals.hMainWnd, szCaption);
77
78 }
79
80
81
82 static BOOL LANGUAGE_LoadStringOther(UINT num, UINT ids, LPSTR str, UINT len)
83 {
84   ids -= Globals.wStringTableOffset;
85   ids += num * 0x100;
86   return(LoadString(Globals.hInstance, ids, str, len));
87 };
88
89 VOID LANGUAGE_SelectByName(LPCSTR lang)
90 {
91   INT i;
92   CHAR szNewLang[3];
93
94   for (i = 0; i <= MAX_LANGUAGE_NUMBER; i++)
95     if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_ID, szNewLang, 
96                 sizeof(szNewLang)) && !lstrcmp(lang, szNewLang))
97       {
98         LANGUAGE_SelectByNumber(i);
99         return;
100       }
101
102   /* Fallback */
103     for (i = 0; i <= MAX_LANGUAGE_NUMBER; i++)
104     if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_ID, szNewLang, sizeof(szNewLang)))
105       {
106         LANGUAGE_SelectByNumber(i);
107         return;
108       }
109
110     MessageBox(Globals.hMainWnd, "No language found", "FATAL ERROR", MB_OK);
111     PostQuitMessage(1);
112 }
113
114 VOID LANGUAGE_SelectByNumber(UINT num)
115 {
116   INT    i;
117   CHAR   szLanguage[3];
118
119   CHAR   szItem[MAX_STRING_LEN];
120   HMENU  hMainMenu;
121
122   /* Select string table */
123   Globals.wStringTableOffset = num * 0x100;
124
125   /* Get Language id */
126   LoadString(Globals.hInstance, IDS_LANGUAGE_ID, szLanguage, sizeof(szLanguage));
127   Globals.lpszLanguage = szLanguage;
128
129   /* Change Resource names */
130   lstrcpyn(STRING_MENU_Xx + sizeof(STRING_MENU_Xx) - 3, szLanguage, 3);
131
132   /* Create menu */
133   hMainMenu = LoadMenu(Globals.hInstance, STRING_MENU_Xx);
134     Globals.hPropertiesMenu     = GetSubMenu(hMainMenu, 0);
135     Globals.hLanguageMenu       = GetSubMenu(hMainMenu, 1);
136     Globals.hInfoMenu           = GetSubMenu(hMainMenu, 2);
137
138   /* Remove dummy item */
139   RemoveMenu(Globals.hLanguageMenu, 0, MF_BYPOSITION);
140   /* Add language items */
141   for (i = 0; i <= MAX_LANGUAGE_NUMBER; i++)
142     if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_MENU_ITEM, szItem, sizeof(szItem)))
143              AppendMenu(Globals.hLanguageMenu, MF_STRING | MF_BYCOMMAND,
144                         CL_FIRST_LANGUAGE + i, szItem);
145   EnableMenuItem(Globals.hLanguageMenu, CL_FIRST_LANGUAGE + num, MF_BYCOMMAND | MF_CHECKED);
146
147   SetMenu(Globals.hMainWnd, hMainMenu);
148
149   /* Destroy old menu */
150   if (Globals.hMainMenu) DestroyMenu(Globals.hMainMenu);
151   Globals.hMainMenu = hMainMenu;
152
153 #ifdef WINELIB
154   /* Update system menus */
155   for (i = 0; Languages[i].name && lstrcmp(szLanguage, Languages[i].name);) i++;
156   if (Languages[i].name) Options.language = i;
157 #endif
158
159   /* specific for Clock: */
160
161   LANGUAGE_UpdateMenuCheckmarks();
162   LANGUAGE_UpdateWindowCaption();   
163
164   Globals.hSystemMenu = GetSystemMenu(Globals.hMainWnd, TRUE);
165
166   /* FIXME: Append a SEPARATOR to Globals.hSystemMenu here */
167
168   LoadString(Globals.hInstance, IDS_MENU_ON_TOP, szItem, sizeof(szItem));
169   AppendMenu(Globals.hSystemMenu, MF_STRING | MF_BYCOMMAND, 1000, szItem);
170 }
171
172 VOID LANGUAGE_DefaultHandle(WPARAM wParam)
173 {
174   if ((wParam >=CL_FIRST_LANGUAGE) && (wParam<=CL_LAST_LANGUAGE))
175           LANGUAGE_SelectByNumber(wParam - CL_FIRST_LANGUAGE);
176      else printf("Unimplemented menu command %i\n", wParam);
177 }
178
179 VOID LANGUAGE_Init(VOID)
180 {
181   CHAR szBuffer[MAX_PATHNAME_LEN];
182
183   #ifdef WINELIB
184    Globals.lpszLanguage = Languages[Options.language].name;
185   #endif
186   
187   if (Globals.lpszLanguage == "En") {
188         PROFILE_GetWineIniString("programs", "language", "En", szBuffer, 
189                                   sizeof(szBuffer));       
190         Globals.lpszLanguage = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(szBuffer)));
191
192 /*        hmemcpy(Globals.lpszLanguage, szBuffer, 1+lstrlen(szBuffer));  */
193         lstrcpyn(Globals.lpszLanguage, szBuffer, strlen(szBuffer)+1); 
194   }
195 }
196
197 /* Local Variables:    */
198 /* c-file-style: "GNU" */
199 /* End:                */