Index: base/applications/mscutils/servman/listview.c =================================================================== --- base/applications/mscutils/servman/listview.c (revision 70290) +++ base/applications/mscutils/servman/listview.c (working copy) @@ -9,6 +9,25 @@ #include "precomp.h" +typedef struct { + 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) @@ -336,6 +355,8 @@ { LVCOLUMNW lvc = { 0 }; WCHAR szTemp[256]; + HDITEM hdi; + int i, n; Info->hListView = CreateWindowExW(WS_EX_CLIENTEDGE, WC_LISTVIEWW, @@ -356,73 +377,33 @@ 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.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); + for (n = 0; n < sizeof(Columns)/sizeof(Columns[0]); n++) + { + lvc.iSubItem = Columns[n].iSubItem; + lvc.cx = Columns[n].cx; - /* 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); + LoadStringW(hInstance, + Columns[n].idsText, + szTemp, + sizeof(szTemp)/sizeof(szTemp[0])); - /* 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); + i = ListView_InsertColumn(Info->hListView, Columns[n].iSubItem, &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); + hdi.mask = HDI_LPARAM; + hdi.lParam = ORD_ASCENDING; + (void)Header_SetItem(Info->hHeader, i, &hdi); + } - /* 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); - InitListViewImage(Info); /* check the details view menu item */ Index: base/applications/mscutils/servman/mainwnd.c =================================================================== --- base/applications/mscutils/servman/mainwnd.c (revision 70290) +++ base/applications/mscutils/servman/mainwnd.c (working copy) @@ -13,11 +13,6 @@ 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 [] = { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */ @@ -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; + ListView_GetItemText(Info->hListView, lParam1, Info->SortSelection, Item1, sizeof(Item1) / sizeof(WCHAR)); + ListView_GetItemText(Info->hListView, lParam2, Info->SortSelection, Item2, sizeof(Item2) / sizeof(WCHAR)); - 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); + 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; - } + Info->SortSelection = pnmv->iSubItem; + Info->SortDirection = hdi.lParam; - /* store a copy to have access from callback */ - hListView = Info->hListView; - (void)ListView_SortItems(Info->hListView, - CompareFunc, - pnmv->iSubItem); + /* 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: Index: base/applications/mscutils/servman/precomp.h =================================================================== --- base/applications/mscutils/servman/precomp.h (revision 70290) +++ base/applications/mscutils/servman/precomp.h (working copy) @@ -46,6 +46,9 @@ #define ACTION_RESUME 4 #define ACTION_RESTART 5 +#define ORD_ASCENDING 1 +#define ORD_DESCENDING -1 + typedef struct _MAIN_WND_INFO { HWND hMainWnd; @@ -52,6 +55,7 @@ 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; Index: base/applications/mscutils/servman/servman.c =================================================================== --- base/applications/mscutils/servman/servman.c (revision 70290) +++ base/applications/mscutils/servman/servman.c (working copy) @@ -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,