ReactOS  0.4.13-dev-257-gfabbd7c
listview.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Services
3  * LICENSE: GPL - See COPYING in the top level directory
4  * FILE: base/applications/mscutils/servman/listview.c
5  * PURPOSE: service listview manipulation functions
6  * COPYRIGHT: Copyright 2006-2007 Ged Murphy <gedmurphy@reactos.org>
7  *
8  */
9 
10 #include "precomp.h"
11 
12 typedef struct _COLUMN_LIST
13 {
14  int iSubItem;
15  int cx;
17 } COLUMN_LIST;
18 
19 static const COLUMN_LIST Columns[] =
20 {
21  /* name */
22  { LVNAME, 150, IDS_FIRSTCOLUMN },
23  /* description */
24  { LVDESC, 240, IDS_SECONDCOLUMN },
25  /* status */
26  { LVSTATUS, 55, IDS_THIRDCOLUMN },
27  /* startup type */
28  { LVSTARTUP, 80, IDS_FOURTHCOLUMN },
29  /* logon as */
30  { LVLOGONAS, 100, IDS_FITHCOLUMN },
31 };
32 
33 VOID
35  DWORD View)
36 {
38 
39  if ((Style & LVS_TYPEMASK) != View)
40  {
42  GWL_STYLE,
43  (Style & ~LVS_TYPEMASK) | View);
44  }
45 }
46 
47 VOID
49  LPNMLISTVIEW pnmv)
50 {
52 
53  /* get handle to menu */
54  hMainMenu = GetMenu(Info->hMainWnd);
55 
56  /* activate properties menu item, if not already */
58  ID_PROP,
60  {
62  ID_PROP,
63  MF_ENABLED);
64  EnableMenuItem(GetSubMenu(Info->hShortcutMenu, 0),
65  ID_PROP,
66  MF_ENABLED);
67  SetMenuDefaultItem(GetSubMenu(Info->hShortcutMenu, 0),
68  ID_PROP,
69  MF_BYCOMMAND);
70  }
71 
72  /* activate delete menu item, if not already */
74  ID_DELETE,
76  {
78  ID_DELETE,
79  MF_ENABLED);
80  EnableMenuItem(GetSubMenu(Info->hShortcutMenu, 0),
81  ID_DELETE,
82  MF_ENABLED);
83  }
84 
85  /* set selected service */
86  Info->SelectedItem = pnmv->iItem;
87 
88  /* get pointer to selected service */
89  Info->pCurrentService = GetSelectedService(Info);
90 
91  /* set current selected service in the status bar */
92  SendMessage(Info->hStatus,
93  SB_SETTEXT,
94  1,
95  (LPARAM)Info->pCurrentService->lpDisplayName);
96 
97  /* show the properties button */
98  SendMessage(Info->hTool,
100  ID_PROP,
102 }
103 
104 VOID
106  ENUM_SERVICE_STATUS_PROCESS* pService,
107  UINT Column)
108 {
109  LVFINDINFO lvfi;
110  LVITEM lvItem;
111  INT index;
112 
113  lvfi.flags = LVFI_PARAM;
114  lvfi.lParam = (LPARAM)pService;
115  index = ListView_FindItem(Info->hListView,
116  -1,
117  &lvfi);
118  if (index != -1)
119  {
120  lvItem.iItem = index;
121  lvItem.iSubItem = Column;
122 
123  switch (Column)
124  {
125  case LVNAME:
126  {
127  LPQUERY_SERVICE_CONFIG lpServiceConfig;
128 
129  lpServiceConfig = GetServiceConfig(pService->lpServiceName);
130  if (lpServiceConfig)
131  {
132  lvItem.pszText = lpServiceConfig->lpDisplayName;
133  SendMessage(Info->hListView,
135  lvItem.iItem,
136  (LPARAM)&lvItem);
137 
139  0,
140  lpServiceConfig);
141  }
142  }
143  break;
144 
145  case LVDESC:
146  {
147  LPWSTR lpDescription;
148 
149  lpDescription = GetServiceDescription(pService->lpServiceName);
150 
151  lvItem.pszText = lpDescription;
152  SendMessage(Info->hListView,
154  lvItem.iItem,
155  (LPARAM) &lvItem);
156 
158  0,
159  lpDescription);
160  }
161  break;
162 
163  case LVSTATUS:
164  {
165  WCHAR szStatus[64];
166 
168  {
171  szStatus,
172  sizeof(szStatus) / sizeof(WCHAR));
173  }
174  else
175  {
176  szStatus[0] = 0;
177  }
178 
179  lvItem.pszText = szStatus;
180  SendMessageW(Info->hListView,
182  lvItem.iItem,
183  (LPARAM) &lvItem);
184  }
185  break;
186 
187  case LVSTARTUP:
188  {
189  LPQUERY_SERVICE_CONFIGW lpServiceConfig;
190  LPWSTR lpStartup = NULL;
191  DWORD StringId = 0;
192 
193  lpServiceConfig = GetServiceConfig(pService->lpServiceName);
194 
195  if (lpServiceConfig)
196  {
197  switch (lpServiceConfig->dwStartType)
198  {
199  case 2: StringId = IDS_SERVICES_AUTO; break;
200  case 3: StringId = IDS_SERVICES_MAN; break;
201  case 4: StringId = IDS_SERVICES_DIS; break;
202  }
203  }
204 
205  if (StringId)
206  AllocAndLoadString(&lpStartup,
207  hInstance,
208  StringId);
209 
210  lvItem.pszText = lpStartup;
211  SendMessageW(Info->hListView,
213  lvItem.iItem,
214  (LPARAM)&lvItem);
215 
216  LocalFree(lpStartup);
218  0,
219  lpServiceConfig);
220  }
221  break;
222 
223  case LVLOGONAS:
224  {
225  LPQUERY_SERVICE_CONFIG lpServiceConfig;
226 
227  lpServiceConfig = GetServiceConfig(pService->lpServiceName);
228  if (lpServiceConfig)
229  {
230  lvItem.pszText = lpServiceConfig->lpServiceStartName;
231  SendMessageW(Info->hListView,
233  lvItem.iItem,
234  (LPARAM)&lvItem);
235 
237  0,
238  lpServiceConfig);
239  }
240  }
241  break;
242  }
243  }
244 }
245 
246 BOOL
248 {
249  ENUM_SERVICE_STATUS_PROCESS *pService;
250  LVITEMW lvItem;
251  DWORD Index;
252 
253  SendMessage (Info->hListView,
254  WM_SETREDRAW,
255  FALSE,
256  0);
257 
258  (void)ListView_DeleteAllItems(Info->hListView);
259 
260  if (GetServiceList(Info))
261  {
262  for (Index = 0; Index < Info->NumServices; Index++)
263  {
264  INT i;
265 
266  pService = &Info->pAllServices[Index];
267 
268  /* set the display name */
269  ZeroMemory(&lvItem, sizeof(LVITEMW));
270  lvItem.mask = LVIF_TEXT | LVIF_PARAM;
271  lvItem.pszText = pService->lpDisplayName;
272 
273  /* Add the service pointer */
274  lvItem.lParam = (LPARAM)pService;
275 
276  /* add it to the listview */
277  lvItem.iItem = ListView_InsertItem(Info->hListView, &lvItem);
278 
279  /* fill out all the column data */
280  for (i = LVDESC; i <= LVLOGONAS; i++)
281  {
282  ChangeListViewText(Info, pService, i);
283  }
284  }
285 
287  }
288 
289  /* turn redraw flag on. */
290  SendMessageW(Info->hListView,
291  WM_SETREDRAW,
292  TRUE,
293  0);
294 
295  return TRUE;
296 }
297 
298 static VOID
300 {
301  HICON hSmIconItem, hLgIconItem;
302  HIMAGELIST hSmall, hLarge;
303 
307  1,
308  1);
309  if (hSmall)
310  {
311  hSmIconItem = LoadImageW(hInstance,
313  IMAGE_ICON,
314  16,
315  16,
316  0);
317  if (hSmIconItem)
318  {
319  ImageList_AddIcon(hSmall,
320  hSmIconItem);
321  (void)ListView_SetImageList(Info->hListView,
322  hSmall,
323  LVSIL_SMALL);
324 
325  DestroyIcon(hSmIconItem);
326  }
327  }
328 
332  1,
333  1);
334  if (hLarge)
335  {
336  hLgIconItem = LoadImageW(hInstance,
338  IMAGE_ICON,
339  32,
340  32,
341  0);
342  if (hLgIconItem)
343  {
344  ImageList_AddIcon(hLarge,
345  hLgIconItem);
346  (void)ListView_SetImageList(Info->hListView,
347  hLarge,
348  LVSIL_NORMAL);
349  DestroyIcon(hLgIconItem);
350  }
351  }
352 }
353 
354 BOOL
356 {
357  LVCOLUMNW lvc = { 0 };
358  WCHAR szTemp[256];
359  HDITEM hdi;
360  int i, n;
361 
363  WC_LISTVIEWW,
364  NULL,
367  0, 0, 0, 0,
368  Info->hMainWnd,
370  hInstance,
371  NULL);
372  if (Info->hListView == NULL)
373  {
374  MessageBoxW(Info->hMainWnd,
375  L"Could not create List View.",
376  L"Error",
377  MB_OK | MB_ICONERROR);
378  return FALSE;
379  }
380 
381  Info->hHeader = ListView_GetHeader(Info->hListView);
382 
384  LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);/*LVS_EX_GRIDLINES |*/
385 
387  lvc.fmt = LVCFMT_LEFT;
388  lvc.pszText = szTemp;
389 
390  /* Add columns to the list-view */
391  for (n = 0; n < sizeof(Columns) / sizeof(Columns[0]); n++)
392  {
393  lvc.iSubItem = Columns[n].iSubItem;
394  lvc.cx = Columns[n].cx;
395 
397  Columns[n].idsText,
398  szTemp,
399  sizeof(szTemp) / sizeof(szTemp[0]));
400 
401  i = ListView_InsertColumn(Info->hListView, Columns[n].iSubItem, &lvc);
402 
403  hdi.mask = HDI_LPARAM;
404  hdi.lParam = ORD_ASCENDING;
405  (void)Header_SetItem(Info->hHeader, i, &hdi);
406  }
407 
409 
410  /* check the details view menu item */
411  CheckMenuRadioItem(GetMenu(Info->hMainWnd),
415  MF_BYCOMMAND);
416 
417  return TRUE;
418 }
#define IDS_THIRDCOLUMN
Definition: resource.h:44
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define IDS_FITHCOLUMN
Definition: resource.h:46
static HICON
Definition: imagelist.c:84
#define ID_VIEW_DETAILS
Definition: resource.h:38
#define TRUE
Definition: types.h:120
#define IMAGE_ICON
Definition: winuser.h:212
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
#define LVCF_WIDTH
Definition: commctrl.h:2559
#define MF_BYCOMMAND
Definition: winuser.h:202
#define LVSIL_SMALL
Definition: commctrl.h:2271
#define LVSTARTUP
Definition: precomp.h:30
#define IDS_FIRSTCOLUMN
Definition: resource.h:42
LPWSTR GetServiceDescription(LPWSTR lpServiceName)
Definition: query.c:135
#define IDC_SERVLIST
Definition: resource.h:13
LPSTR lpServiceStartName
Definition: winsvc.h:152
#define LVCF_TEXT
Definition: commctrl.h:2560
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
VOID UpdateServiceCount(PMAIN_WND_INFO Info)
Definition: mainwnd.c:124
#define TB_SETSTATE
Definition: commctrl.h:1026
#define LVS_REPORT
Definition: commctrl.h:2234
VOID ListViewSelectionChanged(PMAIN_WND_INFO Info, LPNMLISTVIEW pnmv)
Definition: listview.c:48
BOOL WINAPI CheckMenuRadioItem(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT, _In_ UINT)
#define ListView_GetHeader(hwnd)
Definition: commctrl.h:2623
UINT WINAPI GetMenuState(_In_ HMENU, _In_ UINT, _In_ UINT)
#define WM_SETREDRAW
Definition: winuser.h:1598
#define WC_LISTVIEWW
Definition: commctrl.h:2229
GLdouble n
Definition: glext.h:7729
#define LVS_EX_FULLROWSELECT
Definition: commctrl.h:2706
ENUM_SERVICE_STATUS_PROCESS * GetSelectedService(PMAIN_WND_INFO Info)
Definition: query.c:13
#define LVCFMT_LEFT
Definition: commctrl.h:2570
#define ZeroMemory
Definition: winbase.h:1635
#define SM_CYSMICON
Definition: winuser.h:1003
#define WS_CHILD
Definition: pedump.c:617
#define ListView_InsertItem(hwnd, pitem)
Definition: commctrl.h:2380
static INT AllocAndLoadString(OUT LPTSTR *lpTarget, IN HINSTANCE hInst, IN UINT uID)
Definition: misc.c:60
#define HDITEM
Definition: commctrl.h:682
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int32_t INT
Definition: typedefs.h:56
#define SetWindowLongPtr
Definition: treelist.c:70
struct TraceInfo Info
#define IDS_FOURTHCOLUMN
Definition: resource.h:45
#define LBS_NOREDRAW
Definition: pedump.c:680
#define LVM_SETITEMTEXT
Definition: commctrl.h:2661
#define LVFI_PARAM
Definition: commctrl.h:2408
#define ILC_COLOR32
Definition: commctrl.h:343
#define LVIF_TEXT
Definition: commctrl.h:2281
#define LVCF_SUBITEM
Definition: commctrl.h:2561
HMENU hMainMenu
Definition: mplay32.c:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HINSTANCE hInstance
Definition: charmap.c:20
#define ListView_InsertColumn(hwnd, iCol, pcol)
Definition: commctrl.h:2608
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:769
#define ID_DELETE
Definition: resource.h:27
unsigned int BOOL
Definition: ntddk_ex.h:94
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_ UINT, _In_ int, _In_ int, _In_ UINT)
Definition: cursoricon.c:2172
#define LVSTATUS
Definition: precomp.h:29
#define SERVICE_RUNNING
Definition: winsvc.h:24
LPARAM lParam
Definition: commctrl.h:2340
#define SM_CXICON
Definition: winuser.h:962
#define MAKELONG(a, b)
Definition: typedefs.h:248
int iSubItem
Definition: listview.c:14
#define ListView_SetImageList(hwnd, himl, iImageList)
Definition: commctrl.h:2276
#define LVS_SORTASCENDING
Definition: commctrl.h:2240
#define LVS_EX_HEADERDRAGDROP
Definition: commctrl.h:2705
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
GLuint index
Definition: glext.h:6031
#define ORD_ASCENDING
Definition: precomp.h:43
#define IDS_SERVICES_DIS
Definition: resource.h:63
const DWORD Style
Definition: appswitch.c:71
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
#define IDS_SERVICES_STARTED
Definition: resource.h:59
__wchar_t WCHAR
Definition: xmlstorage.h:180
BOOL GetServiceList(PMAIN_WND_INFO Info)
Definition: query.c:279
static const WCHAR szStatus[]
Definition: http.c:73
LPWSTR pszText
Definition: commctrl.h:2337
#define MF_ENABLED
Definition: winuser.h:128
static const UCHAR Index[8]
Definition: usbohci.c:18
LPWSTR pszText
Definition: commctrl.h:2539
int WINAPI GetSystemMetrics(_In_ int)
BOOL RefreshServiceList(PMAIN_WND_INFO Info)
Definition: listview.c:247
unsigned long DWORD
Definition: ntddk_ex.h:95
#define LVLOGONAS
Definition: precomp.h:31
#define ListView_SetExtendedListViewStyle(hwndLV, dw)
Definition: commctrl.h:2697
INT WINAPI ImageList_AddIcon(HIMAGELIST himl, HICON hIcon)
Definition: imagelist.c:505
#define SM_CXSMICON
Definition: winuser.h:1002
UINT mask
Definition: commctrl.h:2332
#define SM_CYICON
Definition: winuser.h:963
#define index(s, c)
Definition: various.h:29
static const WCHAR L[]
Definition: oid.c:1250
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
LPQUERY_SERVICE_CONFIG GetServiceConfig(LPWSTR lpServiceName)
Definition: query.c:29
#define SB_SETTEXT
Definition: commctrl.h:1921
#define MB_ICONERROR
Definition: winuser.h:781
#define ILC_MASK
Definition: commctrl.h:336
#define LVSIL_NORMAL
Definition: commctrl.h:2270
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
struct _COLUMN_LIST COLUMN_LIST
HANDLE ProcessHeap
Definition: servman.c:15
#define GWL_STYLE
Definition: winuser.h:846
static VOID InitListViewImage(PMAIN_WND_INFO Info)
Definition: listview.c:299
VOID ChangeListViewText(PMAIN_WND_INFO Info, ENUM_SERVICE_STATUS_PROCESS *pService, UINT Column)
Definition: listview.c:105
#define LVCF_FMT
Definition: commctrl.h:2558
HWND hListView
Definition: gui.cpp:29
#define LVDESC
Definition: precomp.h:28
UINT idsText
Definition: listview.c:16
static const COLUMN_LIST Columns[]
Definition: listview.c:19
#define WS_BORDER
Definition: pedump.c:625
#define LBS_NOTIFY
Definition: pedump.c:678
#define LVM_SETITEMTEXTW
Definition: commctrl.h:2659
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1577
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define ID_PROP
Definition: resource.h:17
VOID SetListViewStyle(HWND hListView, DWORD View)
Definition: listview.c:34
unsigned int UINT
Definition: ndis.h:50
#define MB_OK
Definition: winuser.h:784
BOOL CreateListView(PMAIN_WND_INFO Info)
Definition: listview.c:355
#define LVFINDINFO
Definition: commctrl.h:2435
#define IDS_SECONDCOLUMN
Definition: resource.h:43
#define IDS_SERVICES_MAN
Definition: resource.h:62
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define IDI_SM_ICON
Definition: resource.h:66
#define HDI_LPARAM
Definition: commctrl.h:691
#define ListView_FindItem(hwnd, iStart, plvfi)
Definition: commctrl.h:2442
#define SendMessage
Definition: winuser.h:5709
#define LVIF_PARAM
Definition: commctrl.h:2283
#define TBSTATE_ENABLED
Definition: commctrl.h:946
#define LVITEM
Definition: commctrl.h:2347
#define LVS_TYPEMASK
Definition: commctrl.h:2237
#define GetWindowLongPtr
Definition: treelist.c:73
#define Header_SetItem(hwndHD, i, phdi)
Definition: commctrl.h:743
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define WS_VISIBLE
Definition: pedump.c:620
SERVICE_STATUS_PROCESS ServiceStatusProcess
Definition: winsvc.h:137
HMENU WINAPI GetMenu(_In_ HWND)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define IDS_SERVICES_AUTO
Definition: resource.h:61
#define LVNAME
Definition: precomp.h:27
#define HeapFree(x, y, z)
Definition: compat.h:394
#define ID_VIEW_LARGE
Definition: resource.h:35
#define ListView_DeleteAllItems(hwnd)
Definition: commctrl.h:2386