Author: ekohl Date: Sun Apr 3 22:13:01 2016 New Revision: 71098
URL: http://svn.reactos.org/svn/reactos?rev=71098&view=rev Log: [SERVMAN] Improved column ordering. Patch by Carlo Bramini. CORE-10674 #resolve #comment Thanks a lot!
Modified: trunk/reactos/base/applications/mscutils/servman/listview.c trunk/reactos/base/applications/mscutils/servman/mainwnd.c trunk/reactos/base/applications/mscutils/servman/precomp.h trunk/reactos/base/applications/mscutils/servman/servman.c
Modified: trunk/reactos/base/applications/mscutils/servman/listview.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils/... ============================================================================== --- trunk/reactos/base/applications/mscutils/servman/listview.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/mscutils/servman/listview.c [iso-8859-1] Sun Apr 3 22:13:01 2016 @@ -8,6 +8,27 @@ */
#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, @@ -336,6 +357,8 @@ { LVCOLUMNW lvc = { 0 }; WCHAR szTemp[256]; + HDITEM hdi; + int i, n;
Info->hListView = CreateWindowExW(WS_EX_CLIENTEDGE, WC_LISTVIEWW, @@ -356,72 +379,32 @@ 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 */ - /* name */ - lvc.iSubItem = LVNAME; - lvc.cx = 150; - LoadStringW(hInstance, - IDS_FIRSTCOLUMN, - szTemp, - sizeof(szTemp) / sizeof(WCHAR)); - lvc.pszText = szTemp; - (void)ListView_InsertColumn(Info->hListView, - 0, - &lvc); - - /* description */ - lvc.iSubItem = LVDESC; - lvc.cx = 240; - LoadStringW(hInstance, - IDS_SECONDCOLUMN, - szTemp, - sizeof(szTemp) / sizeof(WCHAR)); - lvc.pszText = szTemp; - (void)ListView_InsertColumn(Info->hListView, - 1, - &lvc); - - /* status */ - lvc.iSubItem = LVSTATUS; - lvc.cx = 55; - LoadStringW(hInstance, - IDS_THIRDCOLUMN, - szTemp, - sizeof(szTemp) / sizeof(WCHAR)); - lvc.pszText = szTemp; - (void)ListView_InsertColumn(Info->hListView, - 2, - &lvc); - - /* startup type */ - lvc.iSubItem = LVSTARTUP; - lvc.cx = 80; - LoadStringW(hInstance, - IDS_FOURTHCOLUMN, - szTemp, - sizeof(szTemp) / sizeof(WCHAR)); - lvc.pszText = szTemp; - (void)ListView_InsertColumn(Info->hListView, - 3, - &lvc); - - /* logon as */ - lvc.iSubItem = LVLOGONAS; - lvc.cx = 100; - LoadStringW(hInstance, - IDS_FITHCOLUMN, - szTemp, - sizeof(szTemp) / sizeof(WCHAR)); - lvc.pszText = szTemp; - (void)ListView_InsertColumn(Info->hListView, - 4, - &lvc); + 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);
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 Apr 3 22:13:01 2016 @@ -12,11 +12,6 @@ #include <windowsx.h>
static const WCHAR szMainWndClass[] = L"ServManWndClass"; - -BOOL bSortAscending = TRUE; - -/* Temporary copy for access from list-view sort CompareFunc */ -HWND hListView;
/* Toolbar buttons */ static const TBBUTTON Buttons [] = @@ -246,21 +241,13 @@ static INT CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { + PMAIN_WND_INFO Info = (PMAIN_WND_INFO)lParamSort; 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); + + ListView_GetItemText(Info->hListView, lParam1, Info->SortSelection, Item1, sizeof(Item1) / sizeof(WCHAR)); + ListView_GetItemText(Info->hListView, lParam2, Info->SortSelection, Item2, sizeof(Item2) / sizeof(WCHAR)); + + return wcscmp(Item1, Item2) * Info->SortDirection; }
@@ -737,23 +724,26 @@
case LVN_COLUMNCLICK: { - static int iLastSortColumn = 0; LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; + HDITEM hdi; + + /* get pending sort direction for clicked column */ + hdi.mask = HDI_LPARAM; + (void)Header_GetItem(Info->hHeader, pnmv->iSubItem, &hdi);
/* 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); + Info->SortSelection = pnmv->iSubItem; + Info->SortDirection = hdi.lParam; + + /* set new sort direction and save */ + hdi.lParam = (hdi.lParam == ORD_ASCENDING) ? + ORD_DESCENDING : ORD_ASCENDING; + + (void)Header_SetItem(Info->hHeader, pnmv->iSubItem, &hdi); + + (void)ListView_SortItemsEx(Info->hListView, + CompareFunc, + (LPARAM)Info); } break; case LVN_ITEMCHANGED:
Modified: trunk/reactos/base/applications/mscutils/servman/precomp.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils/... ============================================================================== --- trunk/reactos/base/applications/mscutils/servman/precomp.h [iso-8859-1] (original) +++ trunk/reactos/base/applications/mscutils/servman/precomp.h [iso-8859-1] Sun Apr 3 22:13:01 2016 @@ -46,12 +46,16 @@ #define ACTION_RESUME 4 #define ACTION_RESTART 5
+#define ORD_ASCENDING 1 +#define ORD_DESCENDING -1 + typedef struct _MAIN_WND_INFO { HWND hMainWnd; HWND hListView; HWND hStatus; HWND hTool; + HWND hHeader; HMENU hShortcutMenu; int nCmdShow;
@@ -59,6 +63,9 @@ ENUM_SERVICE_STATUS_PROCESS *pCurrentService;
INT SelectedItem;/* selection number in the list view */ + INT SortSelection; + INT SortDirection; + BOOL bDlgOpen; BOOL bInMenuLoop; BOOL bIsUserAnAdmin;
Modified: trunk/reactos/base/applications/mscutils/servman/servman.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils/... ============================================================================== --- trunk/reactos/base/applications/mscutils/servman/servman.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/mscutils/servman/servman.c [iso-8859-1] Sun Apr 3 22:13:01 2016 @@ -41,7 +41,7 @@ ProcessHeap = GetProcessHeap();
icex.dwSize = sizeof(INITCOMMONCONTROLSEX); - icex.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES; + icex.dwICC = ICC_WIN95_CLASSES | ICC_COOL_CLASSES; InitCommonControlsEx(&icex);
if (!AllocAndLoadString(&lpAppName,