Took a stab at implementing LBS_NOSEL.
[wine] / programs / clock / main.c
1 /*
2  * Clock
3  *
4  * Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch>
5  *
6  * Clock is partially based on
7  * - Program Manager by Ulrich Schmied
8  * - rolex.c by Jim Peterson
9  *
10  */
11
12 #include <stdio.h>
13 #include "windows.h"
14 #include "main.h"
15 #include "license.h"
16 #include "version.h"
17 #include "language.h"
18 #include "winclock.h"
19 #include "commdlg.h"
20
21 CLOCK_GLOBALS Globals;
22
23 /***********************************************************************
24  *
25  *           CLOCK_MenuCommand
26  *
27  *  All handling of main menu events
28  */
29
30 int CLOCK_MenuCommand (WPARAM wParam)
31 {  
32    switch (wParam) {
33      case CL_ANALOG: {
34          Globals.bAnalog = TRUE;
35          LANGUAGE_UpdateMenuCheckmarks();
36          SendMessage(Globals.hMainWnd, WM_PAINT, 0, 0);
37          break;      
38        } 
39      case CL_DIGITAL: {
40          Globals.bAnalog = FALSE;
41          LANGUAGE_UpdateMenuCheckmarks();
42          SendMessage(Globals.hMainWnd, WM_PAINT, 0, 0);
43          break;        
44        }
45      case CL_FONT: {
46          MAIN_FileChooseFont();
47          break;
48        }
49      case CL_WITHOUT_TITLE: {     
50          Globals.bWithoutTitle = !Globals.bWithoutTitle;
51          LANGUAGE_UpdateWindowCaption();
52          LANGUAGE_UpdateMenuCheckmarks();
53          break;
54        } 
55      case CL_ON_TOP: {
56          Globals.bAlwaysOnTop = !Globals.bAlwaysOnTop;
57          LANGUAGE_UpdateMenuCheckmarks();
58          break;
59        }  
60      case CL_SECONDS: {
61          Globals.bSeconds = !Globals.bSeconds;
62          LANGUAGE_UpdateMenuCheckmarks();
63          SendMessage(Globals.hMainWnd, WM_PAINT, 0, 0);
64          break;
65        }
66      case CL_DATE: {
67          Globals.bDate = !Globals.bDate;
68          LANGUAGE_UpdateMenuCheckmarks();
69          LANGUAGE_UpdateWindowCaption();
70          break;
71        }
72      case CL_INFO_LICENSE: {
73          WineLicense(Globals.hMainWnd);
74          break;
75        }
76      case CL_INFO_NO_WARRANTY: {
77          WineWarranty(Globals.hMainWnd);
78          break;
79        }
80      case CL_INFO_ABOUT_WINE: {
81          ShellAbout(Globals.hMainWnd, "Clock", "Clock\n" WINE_RELEASE_INFO, 0);
82          break;
83        }
84      /* Handle languages */
85      default:
86          LANGUAGE_DefaultHandle(wParam); 
87    }
88    return 0;
89 }
90
91 VOID MAIN_FileChooseFont(VOID) {
92
93   CHOOSEFONT font;
94   LOGFONT        lf;
95
96         font.lStructSize     = sizeof(font);
97         font.hwndOwner       = Globals.hMainWnd;
98         font.hDC             = NULL;
99         font.lpLogFont       = &lf;
100         font.iPointSize      = 0;
101         font.Flags           = 0;
102         font.rgbColors       = 0;
103         font.lCustData       = 0;
104         font.lpfnHook        = 0;
105         font.lpTemplateName  = 0;
106         font.hInstance       = Globals.hInstance;
107 /*        font.lpszStyle       = LF_FACESIZE; */
108         font.nFontType       = 0;
109         font.nSizeMin        = 0;
110         font.nSizeMax        = 144;
111
112         if (ChooseFont(&font)) {
113             /* do nothing yet */
114         }
115
116 }
117
118 /***********************************************************************
119  *
120  *           CLOCK_WndProc
121  */
122
123 LRESULT WINAPI CLOCK_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
124 {
125     PAINTSTRUCT ps;
126     HDC context;
127
128     switch (msg) {
129
130         case WM_CREATE: {
131             printf("WM_CREATE\n");
132             break;
133         }
134
135         case WM_RBUTTONUP: {
136             printf("WM_RBUTTONUP\n");
137             Globals.bWithoutTitle = !Globals.bWithoutTitle;
138             LANGUAGE_UpdateMenuCheckmarks();               
139             LANGUAGE_UpdateWindowCaption();
140             UpdateWindow (Globals.hMainWnd);
141             break;
142         }
143
144         case WM_PAINT: {
145             printf("WM_PAINT\n");
146             context = BeginPaint(hWnd, &ps);
147             if(Globals.bAnalog) {
148                 DrawFace(context);
149                 Idle(context);
150             }
151                else 
152             {
153                /* do nothing */
154             }
155             EndPaint(hWnd, &ps);
156             break;
157         }
158
159         case WM_SIZE: {
160             printf("WM_SIZE\n");
161             Globals.MaxX = LOWORD(lParam);
162             Globals.MaxY = HIWORD(lParam);
163             OldHour.DontRedraw   = TRUE;
164             OldMinute.DontRedraw = TRUE;
165             OldSecond.DontRedraw = TRUE;
166             break;
167         }
168           
169         case WM_COMMAND: {
170             CLOCK_MenuCommand(wParam);
171             break;
172         } 
173
174         case WM_DESTROY: {
175             printf("WM_DESTROY\n");
176             PostQuitMessage (0);
177             break;
178         }
179
180         default:
181           return DefWindowProc (hWnd, msg, wParam, lParam);
182     }
183     return 0l;
184 }
185
186
187
188 /***********************************************************************
189  *
190  *           WinMain
191  */
192
193 int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
194 {
195     MSG      msg;
196     WNDCLASS class;
197     
198     char szClassName[] = "CLClass";  /* To make sure className >= 0x10000 */
199     char szWinName[]   = "Clock";
200
201     /* Setup Globals */
202     Globals.bAnalog         = TRUE;
203     Globals.bSeconds        = TRUE;
204     Globals.lpszIniFile     = "clock.ini";
205     Globals.lpszIcoFile     = "clock.ico";
206
207     Globals.hInstance       = hInstance;
208     Globals.hMainIcon       = ExtractIcon(Globals.hInstance, 
209                                           Globals.lpszIcoFile, 0);
210                                           
211     if (!Globals.hMainIcon) Globals.hMainIcon = 
212                                   LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
213
214     if (!prev){
215         class.style         = CS_HREDRAW | CS_VREDRAW;
216         class.lpfnWndProc   = CLOCK_WndProc;
217         class.cbClsExtra    = 0;
218         class.cbWndExtra    = 0;
219         class.hInstance     = Globals.hInstance;
220         class.hIcon         = LoadIcon (0, IDI_APPLICATION);
221         class.hCursor       = LoadCursor (0, IDC_ARROW);
222         class.hbrBackground = GetStockObject (GRAY_BRUSH);
223         class.lpszMenuName  = 0;
224         class.lpszClassName = szClassName;
225     }
226
227     if (!RegisterClass (&class)) return FALSE;
228
229     Globals.hMainWnd = CreateWindow (szClassName, szWinName, WS_OVERLAPPEDWINDOW,
230         CW_USEDEFAULT, CW_USEDEFAULT, Globals.MaxX, Globals.MaxY, 0,
231         LoadMenu(Globals.hInstance, STRING_MENU_Xx), Globals.hInstance, 0);
232                         
233     LANGUAGE_SelectByName("En");
234     SetMenu(Globals.hMainWnd, Globals.hMainMenu);
235
236     LANGUAGE_UpdateMenuCheckmarks();
237
238     ShowWindow (Globals.hMainWnd, show);
239     UpdateWindow (Globals.hMainWnd);
240
241     while (TRUE) {
242         Sleep(1);
243         if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
244                 if (msg.message == WM_QUIT) return msg.wParam;
245                 TranslateMessage(&msg);
246                 DispatchMessage(&msg);
247                 Idle(NULL);
248         }
249           else Idle(NULL);
250     }
251
252     /* We will never reach the following statement !   */
253     return 0;    
254 }
255