|  | /* | 
|  | * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
|  | */ | 
|  |  | 
|  | #include <string.h> | 
|  | #include "windows.h" | 
|  | #include "windowsx.h" | 
|  | #include "progman.h" | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_ProgramWndProc | 
|  | */ | 
|  |  | 
|  | static LRESULT CALLBACK PROGRAM_ProgramWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) | 
|  | { | 
|  | switch (msg) | 
|  | { | 
|  | case WM_NCLBUTTONDOWN: | 
|  | { | 
|  | HLOCAL  hProgram = (HLOCAL) GetWindowLong(hWnd, 0); | 
|  | PROGRAM *program = LocalLock(hProgram); | 
|  | PROGGROUP   *group   = LocalLock(program->hGroup); | 
|  | group->hActiveProgram = hProgram; | 
|  | EnableMenuItem(Globals.hFileMenu, PM_MOVE , MF_ENABLED); | 
|  | EnableMenuItem(Globals.hFileMenu, PM_COPY , MF_ENABLED); | 
|  | break; | 
|  | } | 
|  | case WM_NCLBUTTONDBLCLK: | 
|  | { | 
|  | PROGRAM_ExecuteProgram((HLOCAL) GetWindowLong(hWnd, 0)); | 
|  | return(0); | 
|  | } | 
|  |  | 
|  | case WM_PAINTICON: | 
|  | case WM_NCPAINT: | 
|  | { | 
|  | PROGRAM *program; | 
|  | PAINTSTRUCT      ps; | 
|  | HDC              hdc; | 
|  | hdc     = BeginPaint(hWnd,&ps); | 
|  | program = LocalLock((HLOCAL) GetWindowLong(hWnd, 0)); | 
|  | if (program->hIcon) | 
|  | DrawIcon(hdc, 0, 0, program->hIcon); | 
|  | EndPaint(hWnd,&ps); | 
|  | break; | 
|  | } | 
|  | } | 
|  | return(DefWindowProc(hWnd, msg, wParam, lParam)); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_RegisterProgramWinClass | 
|  | */ | 
|  |  | 
|  | ATOM PROGRAM_RegisterProgramWinClass() | 
|  | { | 
|  | WNDCLASS class; | 
|  |  | 
|  | class.style         = CS_HREDRAW | CS_VREDRAW; | 
|  | class.lpfnWndProc   = PROGRAM_ProgramWndProc; | 
|  | class.cbClsExtra    = 0; | 
|  | class.cbWndExtra    = sizeof(LONG); | 
|  | class.hInstance     = Globals.hInstance; | 
|  | class.hIcon         = 0; | 
|  | class.hCursor       = LoadCursor (0, IDC_ARROW); | 
|  | class.hbrBackground = GetStockObject (WHITE_BRUSH); | 
|  | class.lpszMenuName  = 0; | 
|  | class.lpszClassName = STRING_PROGRAM_WIN_CLASS_NAME; | 
|  |  | 
|  | return RegisterClass(&class); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_NewProgram | 
|  | */ | 
|  |  | 
|  | VOID PROGRAM_NewProgram(HLOCAL hGroup) | 
|  | { | 
|  | INT  nCmdShow = SW_SHOWNORMAL; | 
|  | INT  nHotKey = 0; | 
|  | INT  nIconIndex = 0; | 
|  | CHAR szName[MAX_PATHNAME_LEN] = ""; | 
|  | CHAR szCmdLine[MAX_PATHNAME_LEN] = ""; | 
|  | CHAR szIconFile[MAX_PATHNAME_LEN] = ""; | 
|  | CHAR szWorkDir[MAX_PATHNAME_LEN] = ""; | 
|  | HICON hIcon = 0; | 
|  |  | 
|  | if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile, | 
|  | &hIcon, &nIconIndex, &nHotKey, | 
|  | &nCmdShow, MAX_PATHNAME_LEN)) | 
|  | return; | 
|  |  | 
|  | if (!hIcon) hIcon = LoadIcon(0, IDI_WINLOGO); | 
|  |  | 
|  |  | 
|  | if (!PROGRAM_AddProgram(hGroup, hIcon, szName, 0, 0, szCmdLine, szIconFile, | 
|  | nIconIndex, szWorkDir, nHotKey, nCmdShow)) | 
|  | return; | 
|  |  | 
|  | GRPFILE_WriteGroupFile(hGroup); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_ModifyProgram | 
|  | */ | 
|  |  | 
|  | VOID PROGRAM_ModifyProgram(HLOCAL hProgram) | 
|  | { | 
|  | PROGRAM *program = LocalLock(hProgram); | 
|  | CHAR szName[MAX_PATHNAME_LEN]; | 
|  | CHAR szCmdLine[MAX_PATHNAME_LEN]; | 
|  | CHAR szIconFile[MAX_PATHNAME_LEN]; | 
|  | CHAR szWorkDir[MAX_PATHNAME_LEN]; | 
|  |  | 
|  | lstrcpyn(szName, LocalLock(program->hName), MAX_PATHNAME_LEN); | 
|  | lstrcpyn(szCmdLine, LocalLock(program->hCmdLine), MAX_PATHNAME_LEN); | 
|  | lstrcpyn(szIconFile, LocalLock(program->hIconFile), MAX_PATHNAME_LEN); | 
|  | lstrcpyn(szWorkDir, LocalLock(program->hWorkDir), MAX_PATHNAME_LEN); | 
|  |  | 
|  | if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile, | 
|  | &program->hIcon, &program->nIconIndex, | 
|  | &program->nHotKey, &program->nCmdShow, | 
|  | MAX_PATHNAME_LEN)) | 
|  | return; | 
|  |  | 
|  | MAIN_ReplaceString(&program->hName, szName); | 
|  | MAIN_ReplaceString(&program->hCmdLine, szCmdLine); | 
|  | MAIN_ReplaceString(&program->hIconFile, szIconFile); | 
|  | MAIN_ReplaceString(&program->hWorkDir, szWorkDir); | 
|  |  | 
|  | SetWindowText(program->hWnd, szName); | 
|  | UpdateWindow(program->hWnd); | 
|  |  | 
|  | GRPFILE_WriteGroupFile(program->hGroup); | 
|  |  | 
|  | return; | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_AddProgram | 
|  | */ | 
|  |  | 
|  | HLOCAL PROGRAM_AddProgram(HLOCAL hGroup, HICON hIcon, LPCSTR lpszName, | 
|  | INT x, INT y, LPCSTR lpszCmdLine, | 
|  | LPCSTR lpszIconFile, INT nIconIndex, | 
|  | LPCSTR lpszWorkDir, INT nHotKey, INT nCmdShow) | 
|  | { | 
|  | PROGGROUP *group = LocalLock(hGroup); | 
|  | PROGRAM *program; | 
|  | HLOCAL hPrior, *p; | 
|  | HLOCAL hProgram  = LocalAlloc(LMEM_FIXED, sizeof(PROGRAM)); | 
|  | HLOCAL hName     = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszName)); | 
|  | HLOCAL hCmdLine  = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszCmdLine)); | 
|  | HLOCAL hIconFile = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszIconFile)); | 
|  | HLOCAL hWorkDir  = LocalAlloc(LMEM_FIXED, 1 + lstrlen(lpszWorkDir)); | 
|  | if (!hProgram || !hName || !hCmdLine || !hIconFile || !hWorkDir) | 
|  | { | 
|  | MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); | 
|  | if (hProgram)  LocalFree(hProgram); | 
|  | if (hName)     LocalFree(hName); | 
|  | if (hCmdLine)  LocalFree(hCmdLine); | 
|  | if (hIconFile) LocalFree(hIconFile); | 
|  | if (hWorkDir)  LocalFree(hWorkDir); | 
|  | return(0); | 
|  | } | 
|  | memcpy(LocalLock(hName),     lpszName,     1 + lstrlen(lpszName)); | 
|  | memcpy(LocalLock(hCmdLine),  lpszCmdLine,  1 + lstrlen(lpszCmdLine)); | 
|  | memcpy(LocalLock(hIconFile), lpszIconFile, 1 + lstrlen(lpszIconFile)); | 
|  | memcpy(LocalLock(hWorkDir),  lpszWorkDir,  1 + lstrlen(lpszWorkDir)); | 
|  |  | 
|  | group->hActiveProgram  = hProgram; | 
|  |  | 
|  | hPrior = 0; | 
|  | p = &group->hPrograms; | 
|  | while (*p) | 
|  | { | 
|  | hPrior = *p; | 
|  | p = &((PROGRAM*)LocalLock(hPrior))->hNext; | 
|  | } | 
|  | *p = hProgram; | 
|  |  | 
|  | program = LocalLock(hProgram); | 
|  | program->hGroup     = hGroup; | 
|  | program->hPrior     = hPrior; | 
|  | program->hNext      = 0; | 
|  | program->hName      = hName; | 
|  | program->hCmdLine   = hCmdLine; | 
|  | program->hIconFile  = hIconFile; | 
|  | program->nIconIndex = nIconIndex; | 
|  | program->hWorkDir   = hWorkDir; | 
|  | program->hIcon      = hIcon; | 
|  | program->nCmdShow   = nCmdShow; | 
|  | program->nHotKey    = nHotKey; | 
|  |  | 
|  | program->hWnd = | 
|  | CreateWindow (STRING_PROGRAM_WIN_CLASS_NAME, (LPSTR)lpszName, | 
|  | WS_CHILD | WS_CAPTION, | 
|  | x, y, CW_USEDEFAULT, CW_USEDEFAULT, | 
|  | group->hWnd, 0, Globals.hInstance, 0); | 
|  |  | 
|  | SetWindowLong(program->hWnd, 0, (LONG) hProgram); | 
|  |  | 
|  | ShowWindow (program->hWnd, SW_SHOWMINIMIZED); | 
|  | SetWindowPos (program->hWnd, 0, x, y, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); | 
|  | UpdateWindow (program->hWnd); | 
|  |  | 
|  | return hProgram; | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_CopyMoveProgram | 
|  | */ | 
|  |  | 
|  | VOID PROGRAM_CopyMoveProgram(HLOCAL hProgram, BOOL bMove) | 
|  | { | 
|  | PROGRAM *program = LocalLock(hProgram); | 
|  | PROGGROUP   *fromgroup = LocalLock(program->hGroup); | 
|  | HLOCAL hGroup = DIALOG_CopyMove(LocalLock(program->hName), | 
|  | LocalLock(fromgroup->hName), bMove); | 
|  | if (!hGroup) return; | 
|  |  | 
|  | /* FIXME shouldn't be necessary */ | 
|  | OpenIcon(((PROGGROUP*)LocalLock(hGroup))->hWnd); | 
|  |  | 
|  | if (!PROGRAM_AddProgram(hGroup, | 
|  | #if 0 | 
|  | CopyIcon(program->hIcon), | 
|  | #else | 
|  | program->hIcon, | 
|  | #endif | 
|  | LocalLock(program->hName), | 
|  | program->x, program->y, | 
|  | LocalLock(program->hCmdLine), | 
|  | LocalLock(program->hIconFile), | 
|  | program->nIconIndex, | 
|  | LocalLock(program->hWorkDir), | 
|  | program->nHotKey, program->nCmdShow)) return; | 
|  | GRPFILE_WriteGroupFile(hGroup); | 
|  |  | 
|  | if (bMove) PROGRAM_DeleteProgram(hProgram, TRUE); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_ExecuteProgram | 
|  | */ | 
|  |  | 
|  | VOID PROGRAM_ExecuteProgram(HLOCAL hProgram) | 
|  | { | 
|  | PROGRAM *program = LocalLock(hProgram); | 
|  | LPSTR lpszCmdLine = LocalLock(program->hCmdLine); | 
|  | LPSTR lpszWorkDir = LocalLock(program->hWorkDir); | 
|  |  | 
|  | /* FIXME set working directory */ | 
|  | lpszWorkDir = lpszWorkDir; | 
|  |  | 
|  | WinExec(lpszCmdLine, program->nCmdShow); | 
|  | if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_DeleteProgram | 
|  | */ | 
|  |  | 
|  | VOID PROGRAM_DeleteProgram(HLOCAL hProgram, BOOL bUpdateGrpFile) | 
|  | { | 
|  | PROGRAM *program = LocalLock(hProgram); | 
|  | PROGGROUP   *group   = LocalLock(program->hGroup); | 
|  |  | 
|  | group->hActiveProgram = 0; | 
|  |  | 
|  | if (program->hPrior) | 
|  | ((PROGRAM*)LocalLock(program->hPrior))->hNext = program->hNext; | 
|  | else | 
|  | ((PROGGROUP*)LocalLock(program->hGroup))->hPrograms = program->hNext; | 
|  |  | 
|  | if (program->hNext) | 
|  | ((PROGRAM*)LocalLock(program->hNext))->hPrior = program->hPrior; | 
|  |  | 
|  | if (bUpdateGrpFile) | 
|  | GRPFILE_WriteGroupFile(program->hGroup); | 
|  |  | 
|  | DestroyWindow(program->hWnd); | 
|  | #if 0 | 
|  | if (program->hIcon) | 
|  | DestroyIcon(program->hIcon); | 
|  | #endif | 
|  | LocalFree(program->hName); | 
|  | LocalFree(program->hCmdLine); | 
|  | LocalFree(program->hIconFile); | 
|  | LocalFree(program->hWorkDir); | 
|  | LocalFree(hProgram); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_FirstProgram | 
|  | */ | 
|  |  | 
|  | HLOCAL PROGRAM_FirstProgram(HLOCAL hGroup) | 
|  | { | 
|  | PROGGROUP *group; | 
|  | if (!hGroup) return(0); | 
|  | group = LocalLock(hGroup); | 
|  | return(group->hPrograms); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_NextProgram | 
|  | */ | 
|  |  | 
|  | HLOCAL PROGRAM_NextProgram(HLOCAL hProgram) | 
|  | { | 
|  | PROGRAM *program; | 
|  | if (!hProgram) return(0); | 
|  | program = LocalLock(hProgram); | 
|  | return(program->hNext); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_ActiveProgram | 
|  | */ | 
|  |  | 
|  | HLOCAL PROGRAM_ActiveProgram(HLOCAL hGroup) | 
|  | { | 
|  | PROGGROUP *group; | 
|  | if (!hGroup) return(0); | 
|  | group = LocalLock(hGroup); | 
|  | if (IsIconic(group->hWnd)) return(0); | 
|  |  | 
|  | return(group->hActiveProgram); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | * | 
|  | *           PROGRAM_ProgramName | 
|  | */ | 
|  |  | 
|  | LPCSTR PROGRAM_ProgramName(HLOCAL hProgram) | 
|  | { | 
|  | PROGRAM *program; | 
|  | if (!hProgram) return(0); | 
|  | program = LocalLock(hProgram); | 
|  | return(LocalLock(program->hName)); | 
|  | } | 
|  |  | 
|  | /* Local Variables:    */ | 
|  | /* c-file-style: "GNU" */ | 
|  | /* End:                */ |