reactos/base/applications/mscutils/servman/listview.c

419 lines
12 KiB
C

/*
* PROJECT: ReactOS Services
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/applications/mscutils/servman/listview.c
* PURPOSE: service listview manipulation functions
* COPYRIGHT: Copyright 2006-2007 Ged Murphy <gedmurphy@reactos.org>
*
*/
#include "precomp.h"
typedef struct _COLUMN_LIST
{
int iSubItem;
int cx;
UINT idsText;
} COLUMN_LIST;
static const COLUMN_LIST Columns[] =
{
/* name */
{ LVNAME, 150, IDS_FIRSTCOLUMN },
/* description */
{ LVDESC, 240, IDS_SECONDCOLUMN },
/* status */
{ LVSTATUS, 55, IDS_THIRDCOLUMN },
/* startup type */
{ LVSTARTUP, 80, IDS_FOURTHCOLUMN },
/* logon as */
{ LVLOGONAS, 100, IDS_FITHCOLUMN },
};
VOID
SetListViewStyle(HWND hListView,
DWORD View)
{
DWORD Style = GetWindowLongPtr(hListView, GWL_STYLE);
if ((Style & LVS_TYPEMASK) != View)
{
SetWindowLongPtr(hListView,
GWL_STYLE,
(Style & ~LVS_TYPEMASK) | View);
}
}
VOID
ListViewSelectionChanged(PMAIN_WND_INFO Info,
LPNMLISTVIEW pnmv)
{
HMENU hMainMenu;
/* get handle to menu */
hMainMenu = GetMenu(Info->hMainWnd);
/* activate properties menu item, if not already */
if (GetMenuState(hMainMenu,
ID_PROP,
MF_BYCOMMAND) != MF_ENABLED)
{
EnableMenuItem(hMainMenu,
ID_PROP,
MF_ENABLED);
EnableMenuItem(GetSubMenu(Info->hShortcutMenu, 0),
ID_PROP,
MF_ENABLED);
SetMenuDefaultItem(GetSubMenu(Info->hShortcutMenu, 0),
ID_PROP,
MF_BYCOMMAND);
}
/* activate delete menu item, if not already */
if (GetMenuState(hMainMenu,
ID_DELETE,
MF_BYCOMMAND) != MF_ENABLED)
{
EnableMenuItem(hMainMenu,
ID_DELETE,
MF_ENABLED);
EnableMenuItem(GetSubMenu(Info->hShortcutMenu, 0),
ID_DELETE,
MF_ENABLED);
}
/* set selected service */
Info->SelectedItem = pnmv->iItem;
/* get pointer to selected service */
Info->pCurrentService = GetSelectedService(Info);
/* set current selected service in the status bar */
SendMessage(Info->hStatus,
SB_SETTEXT,
1,
(LPARAM)Info->pCurrentService->lpDisplayName);
/* show the properties button */
SendMessage(Info->hTool,
TB_SETSTATE,
ID_PROP,
(LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
}
VOID
ChangeListViewText(PMAIN_WND_INFO Info,
ENUM_SERVICE_STATUS_PROCESS* pService,
UINT Column)
{
LVFINDINFO lvfi;
LVITEM lvItem;
INT index;
lvfi.flags = LVFI_PARAM;
lvfi.lParam = (LPARAM)pService;
index = ListView_FindItem(Info->hListView,
-1,
&lvfi);
if (index != -1)
{
lvItem.iItem = index;
lvItem.iSubItem = Column;
switch (Column)
{
case LVNAME:
{
LPQUERY_SERVICE_CONFIG lpServiceConfig;
lpServiceConfig = GetServiceConfig(pService->lpServiceName);
if (lpServiceConfig)
{
lvItem.pszText = lpServiceConfig->lpDisplayName;
SendMessage(Info->hListView,
LVM_SETITEMTEXT,
lvItem.iItem,
(LPARAM)&lvItem);
HeapFree(ProcessHeap,
0,
lpServiceConfig);
}
}
break;
case LVDESC:
{
LPWSTR lpDescription;
lpDescription = GetServiceDescription(pService->lpServiceName);
lvItem.pszText = lpDescription;
SendMessage(Info->hListView,
LVM_SETITEMTEXTW,
lvItem.iItem,
(LPARAM) &lvItem);
HeapFree(ProcessHeap,
0,
lpDescription);
}
break;
case LVSTATUS:
{
WCHAR szStatus[64];
if (pService->ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)
{
LoadStringW(hInstance,
IDS_SERVICES_STARTED,
szStatus,
sizeof(szStatus) / sizeof(WCHAR));
}
else
{
szStatus[0] = 0;
}
lvItem.pszText = szStatus;
SendMessageW(Info->hListView,
LVM_SETITEMTEXT,
lvItem.iItem,
(LPARAM) &lvItem);
}
break;
case LVSTARTUP:
{
LPQUERY_SERVICE_CONFIGW lpServiceConfig;
LPWSTR lpStartup = NULL;
DWORD StringId = 0;
lpServiceConfig = GetServiceConfig(pService->lpServiceName);
if (lpServiceConfig)
{
switch (lpServiceConfig->dwStartType)
{
case 2: StringId = IDS_SERVICES_AUTO; break;
case 3: StringId = IDS_SERVICES_MAN; break;
case 4: StringId = IDS_SERVICES_DIS; break;
}
}
if (StringId)
AllocAndLoadString(&lpStartup,
hInstance,
StringId);
lvItem.pszText = lpStartup;
SendMessageW(Info->hListView,
LVM_SETITEMTEXTW,
lvItem.iItem,
(LPARAM)&lvItem);
LocalFree(lpStartup);
HeapFree(ProcessHeap,
0,
lpServiceConfig);
}
break;
case LVLOGONAS:
{
LPQUERY_SERVICE_CONFIG lpServiceConfig;
lpServiceConfig = GetServiceConfig(pService->lpServiceName);
if (lpServiceConfig)
{
lvItem.pszText = lpServiceConfig->lpServiceStartName;
SendMessageW(Info->hListView,
LVM_SETITEMTEXT,
lvItem.iItem,
(LPARAM)&lvItem);
HeapFree(ProcessHeap,
0,
lpServiceConfig);
}
}
break;
}
}
}
BOOL
RefreshServiceList(PMAIN_WND_INFO Info)
{
ENUM_SERVICE_STATUS_PROCESS *pService;
LVITEMW lvItem;
DWORD Index;
SendMessage (Info->hListView,
WM_SETREDRAW,
FALSE,
0);
(void)ListView_DeleteAllItems(Info->hListView);
if (GetServiceList(Info))
{
for (Index = 0; Index < Info->NumServices; Index++)
{
INT i;
pService = &Info->pAllServices[Index];
/* set the display name */
ZeroMemory(&lvItem, sizeof(LVITEMW));
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.pszText = pService->lpDisplayName;
/* Add the service pointer */
lvItem.lParam = (LPARAM)pService;
/* add it to the listview */
lvItem.iItem = ListView_InsertItem(Info->hListView, &lvItem);
/* fill out all the column data */
for (i = LVDESC; i <= LVLOGONAS; i++)
{
ChangeListViewText(Info, pService, i);
}
}
UpdateServiceCount(Info);
}
/* turn redraw flag on. */
SendMessageW(Info->hListView,
WM_SETREDRAW,
TRUE,
0);
return TRUE;
}
static VOID
InitListViewImage(PMAIN_WND_INFO Info)
{
HICON hSmIconItem, hLgIconItem;
HIMAGELIST hSmall, hLarge;
hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_MASK | ILC_COLOR32,
1,
1);
if (hSmall)
{
hSmIconItem = LoadImageW(hInstance,
MAKEINTRESOURCE(IDI_SM_ICON),
IMAGE_ICON,
16,
16,
0);
if (hSmIconItem)
{
ImageList_AddIcon(hSmall,
hSmIconItem);
(void)ListView_SetImageList(Info->hListView,
hSmall,
LVSIL_SMALL);
DestroyIcon(hSmIconItem);
}
}
hLarge = ImageList_Create(GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON),
ILC_MASK | ILC_COLOR32,
1,
1);
if (hLarge)
{
hLgIconItem = LoadImageW(hInstance,
MAKEINTRESOURCE(IDI_SM_ICON),
IMAGE_ICON,
32,
32,
0);
if (hLgIconItem)
{
ImageList_AddIcon(hLarge,
hLgIconItem);
(void)ListView_SetImageList(Info->hListView,
hLarge,
LVSIL_NORMAL);
DestroyIcon(hLgIconItem);
}
}
}
BOOL
CreateListView(PMAIN_WND_INFO Info)
{
LVCOLUMNW lvc = { 0 };
WCHAR szTemp[256];
HDITEM hdi;
int i, n;
Info->hListView = CreateWindowExW(WS_EX_CLIENTEDGE,
WC_LISTVIEWW,
NULL,
WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER |
LBS_NOTIFY | LVS_SORTASCENDING | LBS_NOREDRAW,
0, 0, 0, 0,
Info->hMainWnd,
(HMENU) IDC_SERVLIST,
hInstance,
NULL);
if (Info->hListView == NULL)
{
MessageBoxW(Info->hMainWnd,
L"Could not create List View.",
L"Error",
MB_OK | MB_ICONERROR);
return FALSE;
}
Info->hHeader = ListView_GetHeader(Info->hListView);
(void)ListView_SetExtendedListViewStyle(Info->hListView,
LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);/*LVS_EX_GRIDLINES |*/
lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;
lvc.fmt = LVCFMT_LEFT;
lvc.pszText = szTemp;
/* Add columns to the list-view */
for (n = 0; n < sizeof(Columns) / sizeof(Columns[0]); n++)
{
lvc.iSubItem = Columns[n].iSubItem;
lvc.cx = Columns[n].cx;
LoadStringW(hInstance,
Columns[n].idsText,
szTemp,
sizeof(szTemp) / sizeof(szTemp[0]));
i = ListView_InsertColumn(Info->hListView, Columns[n].iSubItem, &lvc);
hdi.mask = HDI_LPARAM;
hdi.lParam = ORD_ASCENDING;
(void)Header_SetItem(Info->hHeader, i, &hdi);
}
InitListViewImage(Info);
/* check the details view menu item */
CheckMenuRadioItem(GetMenu(Info->hMainWnd),
ID_VIEW_LARGE,
ID_VIEW_DETAILS,
ID_VIEW_DETAILS,
MF_BYCOMMAND);
return TRUE;
}