[SERVMAN]

Improved column ordering.
Patch by Carlo Bramini.
CORE-10674 #resolve #comment Thanks a lot!

svn path=/trunk/; revision=71098
This commit is contained in:
Eric Kohl 2016-04-03 22:13:01 +00:00
parent 8a7494dd08
commit cba34a3d1a
4 changed files with 67 additions and 87 deletions

View file

@ -9,6 +9,27 @@
#include "precomp.h" #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 VOID
SetListViewStyle(HWND hListView, SetListViewStyle(HWND hListView,
DWORD View) DWORD View)
@ -336,6 +357,8 @@ CreateListView(PMAIN_WND_INFO Info)
{ {
LVCOLUMNW lvc = { 0 }; LVCOLUMNW lvc = { 0 };
WCHAR szTemp[256]; WCHAR szTemp[256];
HDITEM hdi;
int i, n;
Info->hListView = CreateWindowExW(WS_EX_CLIENTEDGE, Info->hListView = CreateWindowExW(WS_EX_CLIENTEDGE,
WC_LISTVIEWW, WC_LISTVIEWW,
@ -356,72 +379,32 @@ CreateListView(PMAIN_WND_INFO Info)
return FALSE; return FALSE;
} }
Info->hHeader = ListView_GetHeader(Info->hListView);
(void)ListView_SetExtendedListViewStyle(Info->hListView, (void)ListView_SetExtendedListViewStyle(Info->hListView,
LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);/*LVS_EX_GRIDLINES |*/ LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);/*LVS_EX_GRIDLINES |*/
lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT; lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;
lvc.fmt = LVCFMT_LEFT; lvc.fmt = LVCFMT_LEFT;
lvc.pszText = szTemp;
/* Add columns to the list-view */ /* Add columns to the list-view */
/* name */ for (n = 0; n < sizeof(Columns) / sizeof(Columns[0]); n++)
lvc.iSubItem = LVNAME; {
lvc.cx = 150; lvc.iSubItem = Columns[n].iSubItem;
LoadStringW(hInstance, lvc.cx = Columns[n].cx;
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, LoadStringW(hInstance,
IDS_SECONDCOLUMN, Columns[n].idsText,
szTemp, szTemp,
sizeof(szTemp) / sizeof(WCHAR)); sizeof(szTemp) / sizeof(szTemp[0]));
lvc.pszText = szTemp;
(void)ListView_InsertColumn(Info->hListView,
1,
&lvc);
/* status */ i = ListView_InsertColumn(Info->hListView, Columns[n].iSubItem, &lvc);
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 */ hdi.mask = HDI_LPARAM;
lvc.iSubItem = LVSTARTUP; hdi.lParam = ORD_ASCENDING;
lvc.cx = 80; (void)Header_SetItem(Info->hHeader, i, &hdi);
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);
InitListViewImage(Info); InitListViewImage(Info);

View file

@ -13,11 +13,6 @@
static const WCHAR szMainWndClass[] = L"ServManWndClass"; static const WCHAR szMainWndClass[] = L"ServManWndClass";
BOOL bSortAscending = TRUE;
/* Temporary copy for access from list-view sort CompareFunc */
HWND hListView;
/* Toolbar buttons */ /* Toolbar buttons */
static const TBBUTTON Buttons [] = static const TBBUTTON Buttons [] =
{ /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */ { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
@ -246,21 +241,13 @@ VOID SetMenuAndButtonStates(PMAIN_WND_INFO Info)
static INT CALLBACK static INT CALLBACK
CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{ {
PMAIN_WND_INFO Info = (PMAIN_WND_INFO)lParamSort;
WCHAR Item1[256], Item2[256]; 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; return wcscmp(Item1, Item2) * Info->SortDirection;
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);
} }
@ -737,23 +724,26 @@ MainWndProc(HWND hwnd,
case LVN_COLUMNCLICK: case LVN_COLUMNCLICK:
{ {
static int iLastSortColumn = 0;
LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; 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 */ /* get new sort parameters */
if (pnmv->iSubItem == iLastSortColumn) Info->SortSelection = pnmv->iSubItem;
bSortAscending = !bSortAscending; Info->SortDirection = hdi.lParam;
else
{
iLastSortColumn = pnmv->iSubItem;
bSortAscending = TRUE;
}
/* store a copy to have access from callback */ /* set new sort direction and save */
hListView = Info->hListView; hdi.lParam = (hdi.lParam == ORD_ASCENDING) ?
(void)ListView_SortItems(Info->hListView, ORD_DESCENDING : ORD_ASCENDING;
(void)Header_SetItem(Info->hHeader, pnmv->iSubItem, &hdi);
(void)ListView_SortItemsEx(Info->hListView,
CompareFunc, CompareFunc,
pnmv->iSubItem); (LPARAM)Info);
} }
break; break;
case LVN_ITEMCHANGED: case LVN_ITEMCHANGED:

View file

@ -46,12 +46,16 @@
#define ACTION_RESUME 4 #define ACTION_RESUME 4
#define ACTION_RESTART 5 #define ACTION_RESTART 5
#define ORD_ASCENDING 1
#define ORD_DESCENDING -1
typedef struct _MAIN_WND_INFO typedef struct _MAIN_WND_INFO
{ {
HWND hMainWnd; HWND hMainWnd;
HWND hListView; HWND hListView;
HWND hStatus; HWND hStatus;
HWND hTool; HWND hTool;
HWND hHeader;
HMENU hShortcutMenu; HMENU hShortcutMenu;
int nCmdShow; int nCmdShow;
@ -59,6 +63,9 @@ typedef struct _MAIN_WND_INFO
ENUM_SERVICE_STATUS_PROCESS *pCurrentService; ENUM_SERVICE_STATUS_PROCESS *pCurrentService;
INT SelectedItem;/* selection number in the list view */ INT SelectedItem;/* selection number in the list view */
INT SortSelection;
INT SortDirection;
BOOL bDlgOpen; BOOL bDlgOpen;
BOOL bInMenuLoop; BOOL bInMenuLoop;
BOOL bIsUserAnAdmin; BOOL bIsUserAnAdmin;

View file

@ -41,7 +41,7 @@ wWinMain(HINSTANCE hThisInstance,
ProcessHeap = GetProcessHeap(); ProcessHeap = GetProcessHeap();
icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES; icex.dwICC = ICC_WIN95_CLASSES | ICC_COOL_CLASSES;
InitCommonControlsEx(&icex); InitCommonControlsEx(&icex);
if (!AllocAndLoadString(&lpAppName, if (!AllocAndLoadString(&lpAppName,