mirror of
https://github.com/reactos/reactos.git
synced 2025-07-23 02:43:38 +00:00
* Create a branch for USB experiments.
svn path=/branches/usb-experiments/; revision=72629
This commit is contained in:
parent
28d8ba0d3e
commit
0ee830d7a4
23049 changed files with 0 additions and 1313991 deletions
336
base/shell/progman/program.c
Normal file
336
base/shell/progman/program.c
Normal file
|
@ -0,0 +1,336 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue