|  | /* | 
|  | * Program Manager | 
|  | * | 
|  | * Copyright 1996 Ulrich Schmid | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
|  | */ | 
|  |  | 
|  | #define WIN32_LEAN_AND_MEAN | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  | #include "windows.h" | 
|  | #include "progman.h" | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_GroupWndProc | 
|  | */ | 
|  |  | 
|  | static LRESULT CALLBACK GROUP_GroupWndProc(HWND hWnd, UINT msg, | 
|  | WPARAM wParam, LPARAM lParam) | 
|  | { | 
|  | #if 0 | 
|  | printf("G %4.4x %4.4x\n", msg, wParam); | 
|  | #endif | 
|  | switch (msg) | 
|  | { | 
|  | case WM_SYSCOMMAND: | 
|  | if (wParam == SC_CLOSE) wParam = SC_MINIMIZE; | 
|  | break; | 
|  |  | 
|  | case WM_CHILDACTIVATE: | 
|  | case WM_NCLBUTTONDOWN: | 
|  | Globals.hActiveGroup = (HLOCAL) GetWindowLongPtr(hWnd, 0); | 
|  | EnableMenuItem(Globals.hFileMenu, PM_MOVE , MF_GRAYED); | 
|  | EnableMenuItem(Globals.hFileMenu, PM_COPY , MF_GRAYED); | 
|  | break; | 
|  | } | 
|  | return(DefMDIChildProc(hWnd, msg, wParam, lParam)); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_RegisterGroupWinClass | 
|  | */ | 
|  |  | 
|  | ATOM GROUP_RegisterGroupWinClass(void) | 
|  | { | 
|  | WNDCLASS class; | 
|  |  | 
|  | class.style         = CS_HREDRAW | CS_VREDRAW; | 
|  | class.lpfnWndProc   = GROUP_GroupWndProc; | 
|  | class.cbClsExtra    = 0; | 
|  | class.cbWndExtra    = sizeof(LONG_PTR); | 
|  | class.hInstance     = Globals.hInstance; | 
|  | class.hIcon         = LoadIcon (0, IDI_WINLOGO); | 
|  | class.hCursor       = LoadCursor (0, IDC_ARROW); | 
|  | class.hbrBackground = GetStockObject (WHITE_BRUSH); | 
|  | class.lpszMenuName  = 0; | 
|  | class.lpszClassName = STRING_GROUP_WIN_CLASS_NAME; | 
|  |  | 
|  | return RegisterClass(&class); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_NewGroup | 
|  | */ | 
|  |  | 
|  | VOID GROUP_NewGroup(void) | 
|  | { | 
|  | CHAR szName[MAX_PATHNAME_LEN] = ""; | 
|  | CHAR szFile[MAX_PATHNAME_LEN] = ""; | 
|  | OFSTRUCT dummy; | 
|  |  | 
|  | if (!DIALOG_GroupAttributes(szName, szFile, MAX_PATHNAME_LEN)) return; | 
|  |  | 
|  | if (OpenFile(szFile, &dummy, OF_EXIST) == HFILE_ERROR) | 
|  | { | 
|  | /* File doesn't exist */ | 
|  | HLOCAL hGroup = | 
|  | GROUP_AddGroup(szName, szFile, SW_SHOWNORMAL, | 
|  | DEF_GROUP_WIN_XPOS, DEF_GROUP_WIN_YPOS, | 
|  | DEF_GROUP_WIN_WIDTH, DEF_GROUP_WIN_HEIGHT, 0, 0, | 
|  | FALSE, FALSE, FALSE); | 
|  | if (!hGroup) return; | 
|  | GRPFILE_WriteGroupFile(hGroup); | 
|  | } | 
|  | else /* File exist */ | 
|  | GRPFILE_ReadGroupFile(szFile); | 
|  |  | 
|  | /* FIXME Update progman.ini */ | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_AddGroup | 
|  | */ | 
|  |  | 
|  | HLOCAL GROUP_AddGroup(LPCSTR lpszName, LPCSTR lpszGrpFile, INT nCmdShow, | 
|  | INT x, INT y, INT width, INT height, | 
|  | INT iconx, INT icony, | 
|  | BOOL bFileNameModified, BOOL bOverwriteFileOk, | 
|  | /* FIXME shouldn't be necessary */ | 
|  | BOOL bSuppressShowWindow) | 
|  | { | 
|  | PROGGROUP *group, *prior; | 
|  | MDICREATESTRUCT cs; | 
|  | INT    seqnum; | 
|  | HLOCAL hPrior, *p; | 
|  | HLOCAL hGroup   = LocalAlloc(LMEM_FIXED, sizeof(PROGGROUP)); | 
|  | HLOCAL hName    = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszName)); | 
|  | HLOCAL hGrpFile = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszGrpFile)); | 
|  | if (!hGroup || !hName || !hGrpFile) | 
|  | { | 
|  | MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); | 
|  | if (hGroup)   LocalFree(hGroup); | 
|  | if (hName)    LocalFree(hName); | 
|  | if (hGrpFile) LocalFree(hGrpFile); | 
|  | return(0); | 
|  | } | 
|  | memcpy(LocalLock(hName), lpszName, 1 + lstrlen(lpszName)); | 
|  | memcpy(LocalLock(hGrpFile), lpszGrpFile, 1 + lstrlen(lpszGrpFile)); | 
|  |  | 
|  | Globals.hActiveGroup   = hGroup; | 
|  |  | 
|  | seqnum = 1; | 
|  | hPrior = 0; | 
|  | p = &Globals.hGroups; | 
|  | while (*p) | 
|  | { | 
|  | hPrior = *p; | 
|  | prior  = LocalLock(hPrior); | 
|  | p      = &prior->hNext; | 
|  | if (prior->seqnum >= seqnum) | 
|  | seqnum = prior->seqnum + 1; | 
|  | } | 
|  | *p = hGroup; | 
|  |  | 
|  | group = LocalLock(hGroup); | 
|  | group->hPrior    = hPrior; | 
|  | group->hNext     = 0; | 
|  | group->hName     = hName; | 
|  | group->hGrpFile  = hGrpFile; | 
|  | group->bFileNameModified = bFileNameModified; | 
|  | group->bOverwriteFileOk  = bOverwriteFileOk; | 
|  | group->seqnum    = seqnum; | 
|  | group->nCmdShow  = nCmdShow; | 
|  | group->x         = x; | 
|  | group->y         = y; | 
|  | group->width     = width; | 
|  | group->height    = height; | 
|  | group->iconx     = iconx; | 
|  | group->icony     = icony; | 
|  | group->hPrograms = 0; | 
|  | group->hActiveProgram = 0; | 
|  |  | 
|  | cs.szClass = STRING_GROUP_WIN_CLASS_NAME; | 
|  | cs.szTitle = lpszName; | 
|  | cs.hOwner  = 0; | 
|  | cs.x       = x; | 
|  | cs.y       = y; | 
|  | cs.cx      = width; | 
|  | cs.cy      = height; | 
|  | cs.style   = 0; | 
|  | cs.lParam  = 0; | 
|  |  | 
|  | group->hWnd = (HWND)SendMessage(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&cs); | 
|  |  | 
|  | SetWindowLongPtr(group->hWnd, 0, (LONG_PTR) hGroup); | 
|  |  | 
|  | #if 1 | 
|  | if (!bSuppressShowWindow) /* FIXME shouldn't be necessary */ | 
|  | #endif | 
|  | { | 
|  | ShowWindow (group->hWnd, nCmdShow); | 
|  | UpdateWindow (group->hWnd); | 
|  | } | 
|  |  | 
|  | return(hGroup); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_ModifyGroup | 
|  | */ | 
|  |  | 
|  | VOID GROUP_ModifyGroup(HLOCAL hGroup) | 
|  | { | 
|  | PROGGROUP *group = LocalLock(hGroup); | 
|  | CHAR szName[MAX_PATHNAME_LEN]; | 
|  | CHAR szFile[MAX_PATHNAME_LEN]; | 
|  | lstrcpyn(szName, LocalLock(group->hName), MAX_PATHNAME_LEN); | 
|  | lstrcpyn(szFile, LocalLock(group->hGrpFile), MAX_PATHNAME_LEN); | 
|  |  | 
|  | if (!DIALOG_GroupAttributes(szName, szFile, MAX_PATHNAME_LEN)) return; | 
|  |  | 
|  | if (strcmp(szFile, LocalLock(group->hGrpFile))) | 
|  | group->bOverwriteFileOk = FALSE; | 
|  |  | 
|  | MAIN_ReplaceString(&group->hName,    szName); | 
|  | MAIN_ReplaceString(&group->hGrpFile, szFile); | 
|  |  | 
|  | GRPFILE_WriteGroupFile(hGroup); | 
|  |  | 
|  | /* FIXME Delete old GrpFile if GrpFile changed */ | 
|  |  | 
|  | /* FIXME Update progman.ini */ | 
|  |  | 
|  | SetWindowText(group->hWnd, szName); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_ShowGroupWindow | 
|  | */ | 
|  |  | 
|  | /* FIXME shouldn't be necessary */ | 
|  | VOID GROUP_ShowGroupWindow(HLOCAL hGroup) | 
|  | { | 
|  | PROGGROUP *group = LocalLock(hGroup); | 
|  | ShowWindow (group->hWnd, group->nCmdShow); | 
|  | UpdateWindow (group->hWnd); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_DeleteGroup | 
|  | */ | 
|  |  | 
|  | VOID GROUP_DeleteGroup(HLOCAL hGroup) | 
|  | { | 
|  | PROGGROUP *group = LocalLock(hGroup); | 
|  |  | 
|  | Globals.hActiveGroup = 0; | 
|  |  | 
|  | if (group->hPrior) | 
|  | ((PROGGROUP*)LocalLock(group->hPrior))->hNext = group->hNext; | 
|  | else Globals.hGroups = group->hNext; | 
|  |  | 
|  | if (group->hNext) | 
|  | ((PROGGROUP*)LocalLock(group->hNext))->hPrior = group->hPrior; | 
|  |  | 
|  | while (group->hPrograms) | 
|  | PROGRAM_DeleteProgram(group->hPrograms, FALSE); | 
|  |  | 
|  | /* FIXME Update progman.ini */ | 
|  |  | 
|  | SendMessage(Globals.hMDIWnd, WM_MDIDESTROY, (WPARAM)group->hWnd, 0); | 
|  |  | 
|  | LocalFree(group->hName); | 
|  | LocalFree(group->hGrpFile); | 
|  | LocalFree(hGroup); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_FirstGroup | 
|  | */ | 
|  |  | 
|  | HLOCAL GROUP_FirstGroup(void) | 
|  | { | 
|  | return(Globals.hGroups); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_NextGroup | 
|  | */ | 
|  |  | 
|  | HLOCAL GROUP_NextGroup(HLOCAL hGroup) | 
|  | { | 
|  | PROGGROUP *group; | 
|  | if (!hGroup) return(0); | 
|  | group = LocalLock(hGroup); | 
|  | return(group->hNext); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_ActiveGroup | 
|  | */ | 
|  |  | 
|  | HLOCAL GROUP_ActiveGroup(void) | 
|  | { | 
|  | return(Globals.hActiveGroup); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_GroupWnd | 
|  | */ | 
|  |  | 
|  | HWND GROUP_GroupWnd(HLOCAL hGroup) | 
|  | { | 
|  | PROGGROUP *group; | 
|  | if (!hGroup) return(0); | 
|  | group = LocalLock(hGroup); | 
|  | return(group->hWnd); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           GROUP_GroupName | 
|  | */ | 
|  |  | 
|  | LPCSTR GROUP_GroupName(HLOCAL hGroup) | 
|  | { | 
|  | PROGGROUP *group; | 
|  | if (!hGroup) return(0); | 
|  | group = LocalLock(hGroup); | 
|  | return(LocalLock(group->hName)); | 
|  | } | 
|  |  | 
|  | /* Local Variables:    */ | 
|  | /* c-file-style: "GNU" */ | 
|  | /* End:                */ |