4 * Copyright 1996 Ulrich Schmid
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 /***********************************************************************
28 static LRESULT CALLBACK
GROUP_GroupWndProc(HWND hWnd
, UINT msg
,
29 WPARAM wParam
, LPARAM lParam
)
34 if (wParam
== SC_CLOSE
) wParam
= SC_MINIMIZE
;
37 case WM_CHILDACTIVATE
:
38 case WM_NCLBUTTONDOWN
:
39 Globals
.hActiveGroup
= (HLOCAL
)GetWindowLongPtrW(hWnd
, 0);
40 EnableMenuItem(Globals
.hFileMenu
, PM_MOVE
, MF_GRAYED
);
41 EnableMenuItem(Globals
.hFileMenu
, PM_COPY
, MF_GRAYED
);
44 return DefMDIChildProcW(hWnd
, msg
, wParam
, lParam
);
47 /***********************************************************************
49 * GROUP_RegisterGroupWinClass
52 ATOM
GROUP_RegisterGroupWinClass(void)
56 class.style
= CS_HREDRAW
| CS_VREDRAW
;
57 class.lpfnWndProc
= GROUP_GroupWndProc
;
59 class.cbWndExtra
= sizeof(LONG_PTR
);
60 class.hInstance
= Globals
.hInstance
;
61 class.hIcon
= LoadIconW (0, (LPWSTR
)IDI_WINLOGO
);
62 class.hCursor
= LoadCursorW (0, (LPWSTR
)IDC_ARROW
);
63 class.hbrBackground
= GetStockObject (WHITE_BRUSH
);
64 class.lpszMenuName
= 0;
65 class.lpszClassName
= STRING_GROUP_WIN_CLASS_NAME
;
67 return RegisterClassW(&class);
70 /***********************************************************************
75 VOID
GROUP_NewGroup(void)
77 CHAR szName
[MAX_PATHNAME_LEN
] = "";
78 CHAR szFile
[MAX_PATHNAME_LEN
] = "";
81 if (!DIALOG_GroupAttributes(szName
, szFile
, MAX_PATHNAME_LEN
)) return;
83 if (OpenFile(szFile
, &dummy
, OF_EXIST
) == HFILE_ERROR
)
85 /* File doesn't exist */
87 GROUP_AddGroup(szName
, szFile
, SW_SHOWNORMAL
,
88 DEF_GROUP_WIN_XPOS
, DEF_GROUP_WIN_YPOS
,
89 DEF_GROUP_WIN_WIDTH
, DEF_GROUP_WIN_HEIGHT
, 0, 0,
92 GRPFILE_WriteGroupFile(hGroup
);
95 GRPFILE_ReadGroupFile(szFile
);
97 /* FIXME Update progman.ini */
100 /***********************************************************************
105 HLOCAL
GROUP_AddGroup(LPCSTR lpszName
, LPCSTR lpszGrpFile
, INT nCmdShow
,
106 INT x
, INT y
, INT width
, INT height
,
107 INT iconx
, INT icony
,
108 BOOL bFileNameModified
, BOOL bOverwriteFileOk
,
109 /* FIXME shouldn't be necessary */
110 BOOL bSuppressShowWindow
)
112 PROGGROUP
*group
, *prior
;
116 HLOCAL hGroup
= LocalAlloc(LMEM_FIXED
, sizeof(PROGGROUP
));
117 HLOCAL hName
= LocalAlloc(LMEM_FIXED
, 1 + strlen(lpszName
));
118 HLOCAL hGrpFile
= LocalAlloc(LMEM_FIXED
, 1 + strlen(lpszGrpFile
));
119 if (!hGroup
|| !hName
|| !hGrpFile
)
121 MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY
, IDS_ERROR
, MB_OK
);
122 if (hGroup
) LocalFree(hGroup
);
123 if (hName
) LocalFree(hName
);
124 if (hGrpFile
) LocalFree(hGrpFile
);
127 memcpy(LocalLock(hName
), lpszName
, 1 + strlen(lpszName
));
128 memcpy(LocalLock(hGrpFile
), lpszGrpFile
, 1 + strlen(lpszGrpFile
));
130 Globals
.hActiveGroup
= hGroup
;
134 p
= &Globals
.hGroups
;
138 prior
= LocalLock(hPrior
);
140 if (prior
->seqnum
>= seqnum
)
141 seqnum
= prior
->seqnum
+ 1;
145 group
= LocalLock(hGroup
);
146 group
->hPrior
= hPrior
;
148 group
->hName
= hName
;
149 group
->hGrpFile
= hGrpFile
;
150 group
->bFileNameModified
= bFileNameModified
;
151 group
->bOverwriteFileOk
= bOverwriteFileOk
;
152 group
->seqnum
= seqnum
;
153 group
->nCmdShow
= nCmdShow
;
156 group
->width
= width
;
157 group
->height
= height
;
158 group
->iconx
= iconx
;
159 group
->icony
= icony
;
160 group
->hPrograms
= 0;
161 group
->hActiveProgram
= 0;
163 cs
.szClass
= STRING_GROUP_WIN_CLASS_NAME
;
174 group
->hWnd
= (HWND
)SendMessageW(Globals
.hMDIWnd
, WM_MDICREATE
, 0, (LPARAM
)&cs
);
176 group
->hWnd
= (HWND
)SendMessageA(Globals
.hMDIWnd
, WM_MDICREATE
, 0, (LPARAM
)&cs
);
178 SetWindowTextA( group
->hWnd
, lpszName
);
179 SetWindowLongPtrW(group
->hWnd
, 0, (LONG_PTR
) hGroup
);
182 if (!bSuppressShowWindow
) /* FIXME shouldn't be necessary */
185 ShowWindow (group
->hWnd
, nCmdShow
);
186 UpdateWindow (group
->hWnd
);
192 /***********************************************************************
197 VOID
GROUP_ModifyGroup(HLOCAL hGroup
)
199 PROGGROUP
*group
= LocalLock(hGroup
);
200 CHAR szName
[MAX_PATHNAME_LEN
];
201 CHAR szFile
[MAX_PATHNAME_LEN
];
202 lstrcpynA(szName
, LocalLock(group
->hName
), MAX_PATHNAME_LEN
);
203 lstrcpynA(szFile
, LocalLock(group
->hGrpFile
), MAX_PATHNAME_LEN
);
205 if (!DIALOG_GroupAttributes(szName
, szFile
, MAX_PATHNAME_LEN
)) return;
207 if (strcmp(szFile
, LocalLock(group
->hGrpFile
)))
208 group
->bOverwriteFileOk
= FALSE
;
210 MAIN_ReplaceString(&group
->hName
, szName
);
211 MAIN_ReplaceString(&group
->hGrpFile
, szFile
);
213 GRPFILE_WriteGroupFile(hGroup
);
215 /* FIXME Delete old GrpFile if GrpFile changed */
217 /* FIXME Update progman.ini */
219 SetWindowTextA(group
->hWnd
, szName
);
222 /***********************************************************************
224 * GROUP_ShowGroupWindow
227 /* FIXME shouldn't be necessary */
228 VOID
GROUP_ShowGroupWindow(HLOCAL hGroup
)
230 PROGGROUP
*group
= LocalLock(hGroup
);
231 ShowWindow (group
->hWnd
, group
->nCmdShow
);
232 UpdateWindow (group
->hWnd
);
235 /***********************************************************************
240 VOID
GROUP_DeleteGroup(HLOCAL hGroup
)
242 PROGGROUP
*group
= LocalLock(hGroup
);
244 Globals
.hActiveGroup
= 0;
247 ((PROGGROUP
*)LocalLock(group
->hPrior
))->hNext
= group
->hNext
;
248 else Globals
.hGroups
= group
->hNext
;
251 ((PROGGROUP
*)LocalLock(group
->hNext
))->hPrior
= group
->hPrior
;
253 while (group
->hPrograms
)
254 PROGRAM_DeleteProgram(group
->hPrograms
, FALSE
);
256 /* FIXME Update progman.ini */
258 SendMessageW(Globals
.hMDIWnd
, WM_MDIDESTROY
, (WPARAM
)group
->hWnd
, 0);
260 LocalFree(group
->hName
);
261 LocalFree(group
->hGrpFile
);
265 /***********************************************************************
270 HLOCAL
GROUP_FirstGroup(void)
272 return(Globals
.hGroups
);
275 /***********************************************************************
280 HLOCAL
GROUP_NextGroup(HLOCAL hGroup
)
283 if (!hGroup
) return(0);
284 group
= LocalLock(hGroup
);
285 return(group
->hNext
);
288 /***********************************************************************
293 HLOCAL
GROUP_ActiveGroup(void)
295 return(Globals
.hActiveGroup
);
298 /***********************************************************************
303 HWND
GROUP_GroupWnd(HLOCAL hGroup
)
306 if (!hGroup
) return(0);
307 group
= LocalLock(hGroup
);
311 /***********************************************************************
316 LPCSTR
GROUP_GroupName(HLOCAL hGroup
)
319 if (!hGroup
) return(0);
320 group
= LocalLock(hGroup
);
321 return(LocalLock(group
->hName
));