wine/programs/progman/group.c
2012-02-21 11:30:16 +01:00

324 lines
8.2 KiB
C

/*
* 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)
{
switch (msg)
{
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE) wParam = SC_MINIMIZE;
break;
case WM_CHILDACTIVATE:
case WM_NCLBUTTONDOWN:
Globals.hActiveGroup = (HLOCAL)GetWindowLongPtrW(hWnd, 0);
EnableMenuItem(Globals.hFileMenu, PM_MOVE , MF_GRAYED);
EnableMenuItem(Globals.hFileMenu, PM_COPY , MF_GRAYED);
break;
}
return DefMDIChildProcW(hWnd, msg, wParam, lParam);
}
/***********************************************************************
*
* GROUP_RegisterGroupWinClass
*/
ATOM GROUP_RegisterGroupWinClass(void)
{
WNDCLASSW 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 = LoadIconW (0, (LPWSTR)IDI_WINLOGO);
class.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW);
class.hbrBackground = GetStockObject (WHITE_BRUSH);
class.lpszMenuName = 0;
class.lpszClassName = STRING_GROUP_WIN_CLASS_NAME;
return RegisterClassW(&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;
MDICREATESTRUCTW cs;
INT seqnum;
HLOCAL hPrior, *p;
HLOCAL hGroup = LocalAlloc(LMEM_FIXED, sizeof(PROGGROUP));
HLOCAL hName = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszName));
HLOCAL hGrpFile = LocalAlloc(LMEM_FIXED, 1 + strlen(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 + strlen(lpszName));
memcpy(LocalLock(hGrpFile), lpszGrpFile, 1 + strlen(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 = NULL;
cs.hOwner = 0;
cs.x = x;
cs.y = y;
cs.cx = width;
cs.cy = height;
cs.style = 0;
cs.lParam = 0;
group->hWnd = (HWND)SendMessageA(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&cs);
SetWindowTextA( group->hWnd, lpszName );
SetWindowLongPtrW(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];
lstrcpynA(szName, LocalLock(group->hName), MAX_PATHNAME_LEN);
lstrcpynA(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 */
SetWindowTextA(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 */
SendMessageW(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));
}