Sweden-Number/programs/progman/group.c

314 lines
7.4 KiB
C
Raw Normal View History

Release 960302 Sat Mar 2 18:19:06 1996 Alexandre Julliard <julliard@lrc.epfl.ch> * [controls/scroll.c] Fixed SCROLL_THUMB painting fixes from Alex Korobka to store the current tracking window. * [files/file.c] Fixed two file descriptor leaks in FILE_OpenFile(). * [if1632/relay32.c] [loader/module.c] [loader/pe_image.c] [tools/build.c] Replaced LOADEDFILEINFO structure by OFSTRUCT. * [memory/atom.c] Reload the pointer to the atom table in ATOM_GetTable() and ATOM_AddAtom() in case the LOCAL_Alloc() calls caused the table to move in linear memory. Fri Mar 1 11:57:13 1996 Frans van Dorsselaer <dorssel@rulhm1.leidenuniv.nl> * [include/callback.h] Added support for CallWordBreakProc(). * [controls/edit.c] New caret handling (really efficient / fast). Implemented EM_SETWORDBREAKPROC and EM_GETWORDBREAKPROC. Fixed EM_SETFONT so it now also creates a proper new caret. Wed Feb 28 22:03:34 1996 Daniel Schepler <daniel@frobnitz.wustl.edu> * [controls/desktop.c] [misc/main.c] [windows/event.c] [windows/win.c] Added WM_DELETE protocol to top-level windows. * [controls/scroll.c] Fixed a problem which caused slow scrolling to continue uncontrollably. * [misc/exec.c] Implemented ExitWindows(). * [windows/win.c] Set top-level owned windows to be transient. Wed Feb 28 19:13:22 1996 Ulrich Schmid <uschmid@mail.hh.provi.de> * [programs/progman/*] Added a program manager. Wed Feb 28 18:38:01 1996 Duncan C Thomson <duncan@spd.eee.strath.ac.uk> * [resources/sysres_Eo.c] Added support for Esperanto [Eo] language. Wed Feb 28 00:23:00 1996 Thomas Sandford <t.d.g.sandford@prds-grn.demon.co.uk> * [if1632/user32.spec] Added EndDialog, GetDlgItem, GetDlgItemInt, SetDlgItemInt, * [win32/init.c] Added task.h to includes. GetModuleHandleA() - return hInstance if called with NULL parameter. Freecell needs this. NOTE this may indicate a problem with differentiation between hModule and hInstance within Wine. * [win32/resource.c] FindResource32() and LoadResource32() - Removed #if 0's around conversion from hInstance to hModule. See remarks above. * [win32/string32.c] WIN32_UniLen() - removed stray semicolon. Tue Feb 27 21:05:18 1996 Jim Peterson <jspeter@birch.ee.vt.edu> * [windows/caret.c] Set blink rate with call to GetProfileInt(). * [rc/winerc.c] In new_style(), made initial flag settings WS_CHILD | WS_VISIBLE instead of 0. This seems to correspond to Borland's defaults, and the flags can be unset by using the (rather obtuse) "| NOT WS_CHILD" or "| NOT WS_VISIBLE" technique in the *.rc file. * [win32/time.c] In GetLocalTime() and GetSystemTime(), used tv_sec field of result returned by gettimeofday() instead of making second call to time(). This eliminates clock jitter if the seconds change between the two calls (rare, but possible). * [include/wintypes.h] Added "#define _far" and "#define _pascal". * [windows/win.c] Added function GetDesktopHwnd(). * [include/xmalloc.h] Removed the '#ifdef HAVE_STDLIB_H' structure, since it seemed to have been removed from 'configure', and was causing redefinition warnings. Tue Feb 27 19:31:11 1996 Albrecht Kleine <kleine@ak.sax.de> * [windows/winpos.c] Added RDW_ALLCHILDREN flag in SetWindowPos (handling SWP_FRAMECHANGED) to force a repaint when setting menu bars with different rows. Sun Feb 25 21:15:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu> * [windows/syscolors.c] [controls/scroll.c] Fixed DrawFocusRect pen and SCROLL_THUMB painting.
1996-03-02 20:34:10 +01:00
/*
* Program Manager
*
* Copyright 1996 Ulrich Schmid
*/
#include <stdio.h>
#include <windows.h>
#include "progman.h"
/***********************************************************************
*
* GROUP_GroupWndProc
*/
static LRESULT 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) GetWindowLong(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()
{
WNDCLASS class;
class.style = CS_HREDRAW | CS_VREDRAW;
class.lpfnWndProc = GROUP_GroupWndProc;
class.cbClsExtra = 0;
class.cbWndExtra = sizeof(LONG);
class.hInstance = Globals.hInstance;
class.hIcon = LoadIcon (0, MAKEINTRESOURCE(OIC_WINEICON));
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()
{
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)
{
GROUP *group, *prior;
MDICREATESTRUCT cs;
INT seqnum;
HLOCAL hPrior, *p;
HLOCAL hGroup = LocalAlloc(LMEM_FIXED, sizeof(GROUP));
HLOCAL hName = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszName));
HLOCAL hGrpFile = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszGrpFile));
if (!hGroup || !hName || !hGrpFile)
{
MessageBox(Globals.hMainWnd, "out of memory", lpszName, MB_OK);
if (hGroup) LocalFree(hGroup);
if (hName) LocalFree(hName);
if (hGrpFile) LocalFree(hGrpFile);
return(0);
}
hmemcpy(LocalLock(hName), lpszName, 1 + lstrlen(lpszName));
hmemcpy(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 = (LPSTR)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);
SetWindowLong(group->hWnd, 0, (LONG) 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)
{
GROUP *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)
{
GROUP *group = LocalLock(hGroup);
ShowWindow (group->hWnd, group->nCmdShow);
UpdateWindow (group->hWnd);
}
/***********************************************************************
*
* GROUP_DeleteGroup
*/
VOID GROUP_DeleteGroup(HLOCAL hGroup)
{
GROUP *group = LocalLock(hGroup);
Globals.hActiveGroup = 0;
if (group->hPrior)
((GROUP*)LocalLock(group->hPrior))->hNext = group->hNext;
else Globals.hGroups = group->hNext;
if (group->hNext)
((GROUP*)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()
{
return(Globals.hGroups);
}
/***********************************************************************
*
* GROUP_NextGroup
*/
HLOCAL GROUP_NextGroup(HLOCAL hGroup)
{
GROUP *group;
if (!hGroup) return(0);
group = LocalLock(hGroup);
return(group->hNext);
}
/***********************************************************************
*
* GROUP_ActiveGroup
*/
HLOCAL GROUP_ActiveGroup()
{
return(Globals.hActiveGroup);
}
/***********************************************************************
*
* GROUP_GroupWnd
*/
HWND GROUP_GroupWnd(HLOCAL hGroup)
{
GROUP *group;
if (!hGroup) return(0);
group = LocalLock(hGroup);
return(group->hWnd);
}
/***********************************************************************
*
* GROUP_GroupName
*/
LPCSTR GROUP_GroupName(HLOCAL hGroup)
{
GROUP *group;
if (!hGroup) return(0);
group = LocalLock(hGroup);
return(LocalLock(group->hName));
}
/* Local Variables: */
/* c-file-style: "GNU" */
/* End: */