mirror of
https://github.com/reactos/reactos.git
synced 2025-05-21 18:16:07 +00:00
[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:
parent
8a7494dd08
commit
cba34a3d1a
4 changed files with 67 additions and 87 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue