Revert "[SHELL32] SHChangeNotify: Use tree for CDirectoryList (#6784)" (#6800)
[reactos.git] / base / applications / mscutils / servman / listview.c
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;
16 UINT idsText;
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
34 SetListViewStyle(HWND hListView,
35 DWORD View)
36 {
37 DWORD Style = GetWindowLongPtr(hListView, GWL_STYLE);
38
39 if ((Style & LVS_TYPEMASK) != View)
40 {
41 SetWindowLongPtr(hListView,
42 GWL_STYLE,
43 (Style & ~LVS_TYPEMASK) | View);
44 }
45 }
46
47 VOID
48 ListViewSelectionChanged(PMAIN_WND_INFO Info,
49 LPNMLISTVIEW pnmv)
50 {
51 HMENU hMainMenu;
52
53 /* get handle to menu */
54 hMainMenu = GetMenu(Info->hMainWnd);
55
56 /* activate properties menu item, if not already */
57 if (GetMenuState(hMainMenu,
58 ID_PROP,
59 MF_BYCOMMAND) != MF_ENABLED)
60 {
61 EnableMenuItem(hMainMenu,
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 */
73 if (GetMenuState(hMainMenu,
74 ID_DELETE,
75 MF_BYCOMMAND) != MF_ENABLED)
76 {
77 EnableMenuItem(hMainMenu,
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,
99 TB_SETSTATE,
100 ID_PROP,
101 (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
102 }
103
104 VOID
105 ChangeListViewText(PMAIN_WND_INFO Info,
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,
134 LVM_SETITEMTEXT,
135 lvItem.iItem,
136 (LPARAM)&lvItem);
137
138 HeapFree(ProcessHeap,
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,
153 LVM_SETITEMTEXTW,
154 lvItem.iItem,
155 (LPARAM) &lvItem);
156
157 HeapFree(ProcessHeap,
158 0,
159 lpDescription);
160 }
161 break;
162
163 case LVSTATUS:
164 {
165 WCHAR szStatus[64];
166
167 if (pService->ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)
168 {
169 LoadStringW(hInstance,
170 IDS_SERVICES_STARTED,
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,
181 LVM_SETITEMTEXT,
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,
212 LVM_SETITEMTEXTW,
213 lvItem.iItem,
214 (LPARAM)&lvItem);
215
216 LocalFree(lpStartup);
217 HeapFree(ProcessHeap,
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,
232 LVM_SETITEMTEXT,
233 lvItem.iItem,
234 (LPARAM)&lvItem);
235
236 HeapFree(ProcessHeap,
237 0,
238 lpServiceConfig);
239 }
240 }
241 break;
242 }
243 }
244 }
245
246 BOOL
247 RefreshServiceList(PMAIN_WND_INFO Info)
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
286 UpdateServiceCount(Info);
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
299 InitListViewImage(PMAIN_WND_INFO Info)
300 {
301 HICON hSmIconItem, hLgIconItem;
302 HIMAGELIST hSmall, hLarge;
303
304 hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
305 GetSystemMetrics(SM_CYSMICON),
306 ILC_MASK | ILC_COLOR32,
307 1,
308 1);
309 if (hSmall)
310 {
311 hSmIconItem = LoadImageW(hInstance,
312 MAKEINTRESOURCE(IDI_SM_ICON),
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
329 hLarge = ImageList_Create(GetSystemMetrics(SM_CXICON),
330 GetSystemMetrics(SM_CYICON),
331 ILC_MASK | ILC_COLOR32,
332 1,
333 1);
334 if (hLarge)
335 {
336 hLgIconItem = LoadImageW(hInstance,
337 MAKEINTRESOURCE(IDI_SM_ICON),
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
355 CreateListView(PMAIN_WND_INFO Info)
356 {
357 LVCOLUMNW lvc = { 0 };
358 WCHAR szTemp[256];
359 HDITEM hdi;
360 int i, n;
361
362 Info->hListView = CreateWindowExW(WS_EX_CLIENTEDGE,
363 WC_LISTVIEWW,
364 NULL,
365 WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER |
366 LBS_NOTIFY | LVS_SORTASCENDING | LBS_NOREDRAW,
367 0, 0, 0, 0,
368 Info->hMainWnd,
369 (HMENU) IDC_SERVLIST,
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
383 (void)ListView_SetExtendedListViewStyle(Info->hListView,
384 LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);/*LVS_EX_GRIDLINES |*/
385
386 lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;
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
396 LoadStringW(hInstance,
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
408 InitListViewImage(Info);
409
410 /* check the details view menu item */
411 CheckMenuRadioItem(GetMenu(Info->hMainWnd),
412 ID_VIEW_LARGE,
413 ID_VIEW_DETAILS,
414 ID_VIEW_DETAILS,
415 MF_BYCOMMAND);
416
417 return TRUE;
418 }