Author: akhaldi
Date: Sun Sep 6 20:19:58 2015
New Revision: 69069
URL:
http://svn.reactos.org/svn/reactos?rev=69069&view=rev
Log:
[SERVMAN] Introduce the ability to sort the services list-view by any column in ascending
and descending order. Brought to you by Joachim Henze. CORE-10122
Modified:
trunk/reactos/base/applications/mscutils/servman/mainwnd.c
Modified: trunk/reactos/base/applications/mscutils/servman/mainwnd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils…
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/mainwnd.c [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/mainwnd.c [iso-8859-1] Sun Sep 6
20:19:58 2015
@@ -15,6 +15,8 @@
BOOL bSortAscending = TRUE;
+/* Temporary copy for access from list-view sort CompareFunc */
+HWND hListView;
/* Toolbar buttons */
static const TBBUTTON Buttons [] =
@@ -23,7 +25,7 @@
{TBICON_REFRESH, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /*
refresh */
{TBICON_EXPORT, ID_EXPORT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /*
export */
- /* Note: First item for a seperator is its width in pixels */
+ /* Note: First item for a separator is its width in pixels */
{15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /*
separator */
{TBICON_CREATE, ID_CREATE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 },
/* create */
@@ -244,20 +246,21 @@
static INT CALLBACK
CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
- ENUM_SERVICE_STATUS_PROCESS *Param1;
- ENUM_SERVICE_STATUS_PROCESS *Param2;
-// INT iSubItem = (LPARAM)lParamSort;
-
- if (bSortAscending) {
- Param1 = (ENUM_SERVICE_STATUS_PROCESS *)lParam1;
- Param2 = (ENUM_SERVICE_STATUS_PROCESS *)lParam2;
- }
- else
- {
- Param1 = (ENUM_SERVICE_STATUS_PROCESS *)lParam2;
- Param2 = (ENUM_SERVICE_STATUS_PROCESS *)lParam1;
- }
- return _wcsicmp(Param1->lpDisplayName, Param2->lpDisplayName);
+ WCHAR Item1[256], Item2[256];
+ LVFINDINFO IndexInfo;
+ INT Index;
+
+ IndexInfo.flags = LVFI_PARAM;
+
+ IndexInfo.lParam = lParam1;
+ Index = ListView_FindItem(hListView, -1, &IndexInfo);
+ ListView_GetItemText(hListView, Index, (INT)lParamSort, Item1, sizeof(Item1) /
sizeof(WCHAR));
+
+ IndexInfo.lParam = lParam2;
+ Index = ListView_FindItem(hListView, -1, &IndexInfo);
+ ListView_GetItemText(hListView, Index, (INT)lParamSort, Item2, sizeof(Item2) /
sizeof(WCHAR));
+
+ return bSortAscending ? wcscmp(Item1, Item2) : wcscmp(Item2, Item1);
}
@@ -732,15 +735,25 @@
case LVN_COLUMNCLICK:
{
+ static int iLastSortColumn = 0;
LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
+ /* get new sort parameters */
+ if (pnmv->iSubItem == iLastSortColumn)
+ bSortAscending = !bSortAscending;
+ else
+ {
+ iLastSortColumn = pnmv->iSubItem;
+ bSortAscending = TRUE;
+ }
+
+ /* store a copy to have access from callback */
+ hListView = Info->hListView;
(void)ListView_SortItems(Info->hListView,
CompareFunc,
pnmv->iSubItem);
- bSortAscending = !bSortAscending;
}
break;
-
case LVN_ITEMCHANGED:
{
LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;