+++ /dev/null
-/*
- * 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
- */
-
-/*
- * PROJECT: ReactOS Program Manager
- * COPYRIGHT: GPL - See COPYING in the top level directory
- * FILE: base/shell/progman/program.c
- * PURPOSE: Program items helper functions
- * PROGRAMMERS: Ulrich Schmid
- * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
- */
-
-#include "progman.h"
-
-#if 0
-
-static LRESULT CALLBACK PROGRAM_ProgramWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- switch (msg)
- {
- case WM_NCLBUTTONDOWN:
- {
- HLOCAL hProgram = (HLOCAL) GetWindowLongPtrW(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) GetWindowLongPtrW(hWnd, 0));
- return(0);
- }
-
- case WM_PAINTICON:
- case WM_NCPAINT:
- {
- PROGRAM *program;
- PAINTSTRUCT ps;
- HDC hdc;
- hdc = BeginPaint(hWnd,&ps);
- program = LocalLock((HLOCAL) GetWindowLongPtrW(hWnd, 0));
- if (program->hIcon)
- DrawIcon(hdc, 0, 0, program->hIcon);
- EndPaint(hWnd,&ps);
- break;
- }
- }
- return DefWindowProcW(hWnd, msg, wParam, lParam);
-}
-
-#endif
-
-
-
-/***********************************************************************
- *
- * PROGRAM_NewProgram
- */
-
-VOID PROGRAM_NewProgram(PROGGROUP* hGroup)
-{
- HICON hIcon = NULL;
- INT nIconIndex = 0;
- INT nHotKey = 0;
- INT nCmdShow = SW_SHOWNORMAL;
- BOOL bNewVDM = FALSE;
- WCHAR szTitle[MAX_PATHNAME_LEN] = L"";
- WCHAR szCmdLine[MAX_PATHNAME_LEN] = L"";
- WCHAR szIconFile[MAX_PATHNAME_LEN] = L"";
- WCHAR szWorkDir[MAX_PATHNAME_LEN] = L"";
-
- if (!DIALOG_ProgramAttributes(szTitle, szCmdLine, szWorkDir, szIconFile,
- &hIcon, &nIconIndex, &nHotKey, &nCmdShow, &bNewVDM,
- MAX_PATHNAME_LEN))
- {
- return;
- }
-
- if (!hIcon)
- hIcon = LoadIconW(NULL, MAKEINTRESOURCEW(IDI_WINLOGO));
-
- if (!PROGRAM_AddProgram(hGroup, hIcon, szTitle, -1, -1, szCmdLine, szIconFile,
- nIconIndex, szWorkDir, nHotKey, nCmdShow, bNewVDM))
- {
- return;
- }
-
- GRPFILE_WriteGroupFile(hGroup);
-}
-
-/***********************************************************************
- *
- * PROGRAM_ModifyProgram
- */
-
-VOID PROGRAM_ModifyProgram(PROGRAM* hProgram)
-{
- LVITEMW lvItem;
- WCHAR szName[MAX_PATHNAME_LEN];
- WCHAR szWorkDir[MAX_PATHNAME_LEN];
- WCHAR szCmdLine[MAX_PATHNAME_LEN];
- WCHAR szIconFile[MAX_PATHNAME_LEN];
-
- lstrcpynW(szName , hProgram->hName , ARRAYSIZE(szName));
- lstrcpynW(szCmdLine , hProgram->hCmdLine , ARRAYSIZE(szCmdLine));
- lstrcpynW(szIconFile, hProgram->hIconFile, ARRAYSIZE(szIconFile));
- lstrcpynW(szWorkDir , hProgram->hWorkDir , ARRAYSIZE(szWorkDir));
-
- if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile,
- &hProgram->hIcon, &hProgram->nIconIndex,
- &hProgram->nHotKey, &hProgram->nCmdShow,
- &hProgram->bNewVDM, MAX_PATHNAME_LEN))
- {
- return;
- }
-
- MAIN_ReplaceString(&hProgram->hName , szName);
- MAIN_ReplaceString(&hProgram->hCmdLine , szCmdLine);
- MAIN_ReplaceString(&hProgram->hIconFile, szIconFile);
- MAIN_ReplaceString(&hProgram->hWorkDir , szWorkDir);
-
- ZeroMemory(&lvItem, sizeof(lvItem));
- lvItem.mask = LVIF_TEXT;
- lvItem.iSubItem = 0;
- lvItem.pszText = szName;
- SendMessageW(hProgram->hGroup->hListView, LVM_SETITEMTEXTW, hProgram->iItem, (LPARAM)&lvItem);
-
- GRPFILE_WriteGroupFile(hProgram->hGroup);
-}
-
-/***********************************************************************
- *
- * PROGRAM_AddProgram
- */
-
-PROGRAM*
-PROGRAM_AddProgram(PROGGROUP* hGroup, HICON hIcon, LPCWSTR lpszName,
- INT x, INT y, LPCWSTR lpszCmdLine, LPCWSTR lpszIconFile, INT nIconIndex,
- LPCWSTR lpszWorkDir, INT nHotKey, INT nCmdShow, BOOL bNewVDM)
-{
- PROGRAM* hProgram;
- PROGRAM* hPrior;
- PROGRAM** p;
- LPWSTR hCmdLine;
- LPWSTR hIconFile;
- LPWSTR hName;
- LPWSTR hWorkDir;
- LVITEMW lvItem;
- INT iItem;
-
- hProgram = Alloc(HEAP_ZERO_MEMORY, sizeof(*hProgram));
- hName = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszName) + 1) * sizeof(WCHAR));
- hCmdLine = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszCmdLine) + 1) * sizeof(WCHAR));
- hIconFile = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszIconFile) + 1) * sizeof(WCHAR));
- hWorkDir = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszWorkDir) + 1) * sizeof(WCHAR));
- if (!hProgram || !hName || !hCmdLine || !hIconFile || !hWorkDir)
- {
- MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
- if (hProgram) Free(hProgram);
- if (hName) Free(hName);
- if (hCmdLine) Free(hCmdLine);
- if (hIconFile) Free(hIconFile);
- if (hWorkDir) Free(hWorkDir);
- return NULL;
- }
- memcpy(hName , lpszName , (wcslen(lpszName) + 1) * sizeof(WCHAR));
- memcpy(hCmdLine , lpszCmdLine , (wcslen(lpszCmdLine) + 1) * sizeof(WCHAR));
- memcpy(hIconFile, lpszIconFile, (wcslen(lpszIconFile) + 1) * sizeof(WCHAR));
- memcpy(hWorkDir , lpszWorkDir , (wcslen(lpszWorkDir) + 1) * sizeof(WCHAR));
-
- hGroup->hActiveProgram = hProgram;
-
- hPrior = NULL;
- for (p = &hGroup->hPrograms; *p; p = &hPrior->hNext)
- hPrior = *p;
- *p = hProgram;
-
- hProgram->hGroup = hGroup;
- hProgram->hPrior = hPrior;
- hProgram->hNext = NULL;
- hProgram->hName = hName;
- hProgram->hCmdLine = hCmdLine;
- hProgram->hIconFile = hIconFile;
- hProgram->nIconIndex = nIconIndex;
- hProgram->hWorkDir = hWorkDir;
- hProgram->hIcon = hIcon;
- hProgram->nCmdShow = nCmdShow;
- hProgram->nHotKey = nHotKey;
- hProgram->bNewVDM = bNewVDM;
- hProgram->TagsSize = 0;
- hProgram->Tags = NULL;
-
- ZeroMemory(&lvItem, sizeof(lvItem));
- lvItem.mask = LVIF_PARAM | LVIF_IMAGE | LVIF_TEXT;
- lvItem.pszText = (LPWSTR)lpszName;
- lvItem.lParam = (LPARAM)hProgram;
- lvItem.iImage = ImageList_ReplaceIcon(hGroup->hListLarge, -1, hIcon);
- DestroyIcon(hIcon);
-
- lvItem.iItem = SendMessageA(hGroup->hListView, LVM_GETITEMCOUNT, 0, 0);
- iItem = SendMessageW(hGroup->hListView, LVM_INSERTITEMW, 0, (LPARAM)&lvItem);
- hProgram->iItem = iItem;
- if (x != -1 && y != -1)
- SendMessageA(hGroup->hListView, LVM_SETITEMPOSITION, lvItem.iItem, MAKELPARAM(x, y));
-
- return hProgram;
-}
-
-
-
-/***********************************************************************
- *
- * PROGRAM_CopyMoveProgram
- */
-
-VOID PROGRAM_CopyMoveProgram(PROGRAM* hProgram, BOOL bMove)
-{
- PROGGROUP* hGroup;
-
- hGroup = DIALOG_CopyMove(hProgram, bMove);
- if (!hGroup)
- return;
-
- /* FIXME: shouldn't be necessary */
- OpenIcon(hGroup->hWnd);
-
- if (!PROGRAM_AddProgram(hGroup,
- hProgram->hIcon,
- hProgram->hName,
- hProgram->x,
- hProgram->y,
- hProgram->hCmdLine,
- hProgram->hIconFile,
- hProgram->nIconIndex,
- hProgram->hWorkDir,
- hProgram->nHotKey,
- hProgram->nCmdShow,
- hProgram->bNewVDM))
- {
- return;
- }
-
- GRPFILE_WriteGroupFile(hGroup);
-
- if (bMove)
- PROGRAM_DeleteProgram(hProgram, TRUE);
-}
-
-/***********************************************************************
- *
- * PROGRAM_ExecuteProgram
- */
-
-VOID PROGRAM_ExecuteProgram(PROGRAM* hProgram)
-{
- // TODO: Use a (private?) shell API with which one can use hProgram->bNewVDM
-
- ShellExecuteW(NULL, NULL, hProgram->hCmdLine, NULL, hProgram->hWorkDir, hProgram->nCmdShow);
-
- if (Globals.bMinOnRun)
- CloseWindow(Globals.hMainWnd);
-}
-
-/***********************************************************************
- *
- * PROGRAM_DeleteProgram
- */
-
-VOID PROGRAM_DeleteProgram(PROGRAM* hProgram, BOOL bUpdateGrpFile)
-{
- PROGGROUP* group;
-
- group = hProgram->hGroup;
- if (hProgram->hGroup->hActiveProgram == hProgram)
- group->hActiveProgram = NULL;
-
- SendMessageA(group->hListView, LVM_DELETEITEM, hProgram->iItem, 0);
-
- if (hProgram->hPrior)
- hProgram->hPrior->hNext = hProgram->hNext;
- else
- hProgram->hGroup->hPrograms = hProgram->hNext;
-
- if (hProgram->hNext)
- hProgram->hNext->hPrior = hProgram->hPrior;
-
- if (bUpdateGrpFile)
- GRPFILE_WriteGroupFile(hProgram->hGroup);
-
-#if 0
- DestroyWindow(program->hWnd);
- if (program->hIcon)
- DestroyIcon(program->hIcon);
-#endif
-
- if (hProgram->Tags)
- Free(hProgram->Tags);
- Free(hProgram->hName);
- Free(hProgram->hCmdLine);
- Free(hProgram->hIconFile);
- Free(hProgram->hWorkDir);
- Free(hProgram);
-}
-
-
-/***********************************************************************
- *
- * PROGRAM_ActiveProgram
- */
-
-PROGRAM* PROGRAM_ActiveProgram(PROGGROUP* hGroup)
-{
- if (!hGroup) return NULL;
- if (IsIconic(hGroup->hWnd)) return NULL;
- return hGroup->hActiveProgram;
-}