Fixed int/HANDLE mismatches revealed by -DSTRICT.
[wine] / programs / progman / group.c
1 /*
2  * Program Manager
3  *
4  * Copyright 1996 Ulrich Schmid
5  */
6
7 #include <stdio.h>
8 #include <string.h>
9 #include "windows.h"
10 #include "windowsx.h"
11 #include "progman.h"
12
13 /***********************************************************************
14  *
15  *           GROUP_GroupWndProc
16  */
17
18 static LRESULT GROUP_GroupWndProc (HWND hWnd, UINT msg,
19                                    WPARAM wParam, LPARAM lParam)
20 {
21 #if 0
22   printf("G %4.4x %4.4x\n", msg, wParam);
23 #endif
24   switch (msg)
25     {
26     case WM_SYSCOMMAND:
27       if (wParam == SC_CLOSE) wParam = SC_MINIMIZE;
28       break;
29
30     case WM_CHILDACTIVATE:
31     case WM_NCLBUTTONDOWN:
32       Globals.hActiveGroup = (HLOCAL) GetWindowLong(hWnd, 0);
33       EnableMenuItem(Globals.hFileMenu, PM_MOVE , MF_GRAYED);
34       EnableMenuItem(Globals.hFileMenu, PM_COPY , MF_GRAYED);
35       break;
36     }
37   return(DefMDIChildProc(hWnd, msg, wParam, lParam));
38 }
39
40 /***********************************************************************
41  *
42  *           GROUP_RegisterGroupWinClass
43  */
44
45 ATOM GROUP_RegisterGroupWinClass()
46 {
47   WNDCLASS class;
48
49   class.style         = CS_HREDRAW | CS_VREDRAW;
50   class.lpfnWndProc   = GROUP_GroupWndProc;
51   class.cbClsExtra    = 0;
52   class.cbWndExtra    = sizeof(LONG);
53   class.hInstance     = Globals.hInstance;
54   class.hIcon         = LoadIcon (0, MAKEINTRESOURCE(OIC_WINEICON));
55   class.hCursor       = LoadCursor (0, IDC_ARROW);
56   class.hbrBackground = GetStockObject (WHITE_BRUSH);
57   class.lpszMenuName  = 0;
58   class.lpszClassName = STRING_GROUP_WIN_CLASS_NAME;
59
60   return RegisterClass(&class);
61 }
62
63 /***********************************************************************
64  *
65  *           GROUP_NewGroup
66  */
67
68 VOID GROUP_NewGroup()
69 {
70   CHAR szName[MAX_PATHNAME_LEN] = "";
71   CHAR szFile[MAX_PATHNAME_LEN] = "";
72   OFSTRUCT dummy;
73
74   if (!DIALOG_GroupAttributes(szName, szFile, MAX_PATHNAME_LEN)) return;
75
76   if (OpenFile(szFile, &dummy, OF_EXIST) == HFILE_ERROR)
77     {
78       /* File doesn't exist */
79       HLOCAL hGroup =
80         GROUP_AddGroup(szName, szFile, SW_SHOWNORMAL,
81                        DEF_GROUP_WIN_XPOS, DEF_GROUP_WIN_YPOS,
82                        DEF_GROUP_WIN_WIDTH, DEF_GROUP_WIN_HEIGHT, 0, 0,
83                        FALSE, FALSE, FALSE);
84       if (!hGroup) return;
85       GRPFILE_WriteGroupFile(hGroup);
86     }
87   else /* File exist */
88     GRPFILE_ReadGroupFile(szFile);
89
90   /* FIXME Update progman.ini */
91 }
92
93 /***********************************************************************
94  *
95  *           GROUP_AddGroup
96  */
97
98 HLOCAL GROUP_AddGroup(LPCSTR lpszName, LPCSTR lpszGrpFile, INT nCmdShow,
99                       INT x, INT y, INT width, INT height,
100                       INT iconx, INT icony,
101                       BOOL bFileNameModified, BOOL bOverwriteFileOk,
102                       /* FIXME shouldn't be necessary */
103                       BOOL bSuppressShowWindow)
104 {
105   GROUP *group, *prior;
106   MDICREATESTRUCT cs;
107   INT    seqnum;
108   HLOCAL hPrior, *p;
109   HLOCAL hGroup   = LocalAlloc(LMEM_FIXED, sizeof(GROUP));
110   HLOCAL hName    = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszName));
111   HLOCAL hGrpFile = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszGrpFile));
112   if (!hGroup || !hName || !hGrpFile)
113     {
114       MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
115       if (hGroup)   LocalFree(hGroup);
116       if (hName)    LocalFree(hName);
117       if (hGrpFile) LocalFree(hGrpFile);
118       return(0);
119     }
120   memcpy(LocalLock(hName), lpszName, 1 + lstrlen(lpszName));
121   memcpy(LocalLock(hGrpFile), lpszGrpFile, 1 + lstrlen(lpszGrpFile));
122
123   Globals.hActiveGroup   = hGroup;
124
125   seqnum = 1;
126   hPrior = 0;
127   p = &Globals.hGroups;
128   while (*p)
129     {
130       hPrior = *p;
131       prior  = LocalLock(hPrior);
132       p      = &prior->hNext;
133       if (prior->seqnum >= seqnum)
134         seqnum = prior->seqnum + 1;
135     }
136   *p = hGroup;
137
138   group = LocalLock(hGroup);
139   group->hPrior    = hPrior;
140   group->hNext     = 0;
141   group->hName     = hName;
142   group->hGrpFile  = hGrpFile;
143   group->bFileNameModified = bFileNameModified;
144   group->bOverwriteFileOk  = bOverwriteFileOk;
145   group->seqnum    = seqnum;
146   group->nCmdShow  = nCmdShow;
147   group->x         = x;
148   group->y         = y;
149   group->width     = width;
150   group->height    = height;
151   group->iconx     = iconx;
152   group->icony     = icony;
153   group->hPrograms = 0;
154   group->hActiveProgram = 0;
155
156   cs.szClass = STRING_GROUP_WIN_CLASS_NAME;
157   cs.szTitle = (LPSTR)lpszName;
158   cs.hOwner  = 0;
159   cs.x       = x;
160   cs.y       = y;
161   cs.cx      = width;
162   cs.cy      = height;
163   cs.style   = 0;
164   cs.lParam  = 0;
165
166   group->hWnd = (HWND)SendMessage(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&cs);
167
168   SetWindowLong(group->hWnd, 0, (LONG) hGroup);
169
170 #if 1
171   if (!bSuppressShowWindow) /* FIXME shouldn't be necessary */
172 #endif
173     {
174       ShowWindow (group->hWnd, nCmdShow);
175       UpdateWindow (group->hWnd);
176     }
177
178   return(hGroup);
179 }
180
181 /***********************************************************************
182  *
183  *           GROUP_ModifyGroup
184  */
185
186 VOID GROUP_ModifyGroup(HLOCAL hGroup)
187 {
188   GROUP *group = LocalLock(hGroup);
189   CHAR szName[MAX_PATHNAME_LEN];
190   CHAR szFile[MAX_PATHNAME_LEN];
191   lstrcpyn(szName, LocalLock(group->hName), MAX_PATHNAME_LEN);
192   lstrcpyn(szFile, LocalLock(group->hGrpFile), MAX_PATHNAME_LEN);
193
194   if (!DIALOG_GroupAttributes(szName, szFile, MAX_PATHNAME_LEN)) return;
195
196   if (strcmp(szFile, LocalLock(group->hGrpFile)))
197     group->bOverwriteFileOk = FALSE;
198
199   MAIN_ReplaceString(&group->hName,    szName);
200   MAIN_ReplaceString(&group->hGrpFile, szFile);
201
202   GRPFILE_WriteGroupFile(hGroup);
203
204   /* FIXME Delete old GrpFile if GrpFile changed */
205
206   /* FIXME Update progman.ini */
207
208   SetWindowText(group->hWnd, szName);
209 }
210
211 /***********************************************************************
212  *
213  *           GROUP_ShowGroupWindow
214  */
215
216 /* FIXME shouldn't be necessary */
217 VOID GROUP_ShowGroupWindow(HLOCAL hGroup)
218 {
219   GROUP *group = LocalLock(hGroup);
220   ShowWindow (group->hWnd, group->nCmdShow);
221   UpdateWindow (group->hWnd);
222 }
223
224 /***********************************************************************
225  *
226  *           GROUP_DeleteGroup
227  */
228
229 VOID GROUP_DeleteGroup(HLOCAL hGroup)
230 {
231   GROUP *group = LocalLock(hGroup);
232
233   Globals.hActiveGroup = 0;
234
235   if (group->hPrior)
236     ((GROUP*)LocalLock(group->hPrior))->hNext = group->hNext;
237   else Globals.hGroups = group->hNext;
238
239   if (group->hNext)
240     ((GROUP*)LocalLock(group->hNext))->hPrior = group->hPrior;
241
242   while (group->hPrograms)
243     PROGRAM_DeleteProgram(group->hPrograms, FALSE);
244
245   /* FIXME Update progman.ini */
246
247   SendMessage(Globals.hMDIWnd, WM_MDIDESTROY, (WPARAM)group->hWnd, 0);
248
249   LocalFree(group->hName);
250   LocalFree(group->hGrpFile);
251   LocalFree(hGroup);
252 }
253
254 /***********************************************************************
255  *
256  *           GROUP_FirstGroup
257  */
258
259 HLOCAL GROUP_FirstGroup()
260 {
261   return(Globals.hGroups);
262 }
263
264 /***********************************************************************
265  *
266  *           GROUP_NextGroup
267  */
268
269 HLOCAL GROUP_NextGroup(HLOCAL hGroup)
270 {
271   GROUP *group;
272   if (!hGroup) return(0);
273   group = LocalLock(hGroup);
274   return(group->hNext);
275 }
276
277 /***********************************************************************
278  *
279  *           GROUP_ActiveGroup
280  */
281
282 HLOCAL GROUP_ActiveGroup()
283 {
284   return(Globals.hActiveGroup);
285 }
286
287 /***********************************************************************
288  *
289  *           GROUP_GroupWnd
290  */
291
292 HWND GROUP_GroupWnd(HLOCAL hGroup)
293 {
294   GROUP *group;
295   if (!hGroup) return(0);
296   group = LocalLock(hGroup);
297   return(group->hWnd);
298 }
299
300 /***********************************************************************
301  *
302  *           GROUP_GroupName
303  */
304
305 LPCSTR GROUP_GroupName(HLOCAL hGroup)
306 {
307   GROUP *group;
308   if (!hGroup) return(0);
309   group = LocalLock(hGroup);
310   return(LocalLock(group->hName));
311 }
312
313 /* Local Variables:    */
314 /* c-file-style: "GNU" */
315 /* End:                */