Sort the listview when clicking the Name or Type headers.
This commit is contained in:
parent
853329befe
commit
979d543368
|
@ -30,12 +30,21 @@
|
||||||
#include <windowsx.h>
|
#include <windowsx.h>
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
|
typedef struct tagLINE_INFO
|
||||||
|
{
|
||||||
|
DWORD dwValType;
|
||||||
|
LPTSTR name;
|
||||||
|
void* val;
|
||||||
|
size_t val_len;
|
||||||
|
} LINE_INFO;
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Global and Local Variables:
|
* Global and Local Variables:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static WNDPROC g_orgListWndProc;
|
static WNDPROC g_orgListWndProc;
|
||||||
|
static DWORD g_columnToSort = ~0UL;
|
||||||
|
static BOOL g_invertSort = FALSE;
|
||||||
|
|
||||||
#define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1)
|
#define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1)
|
||||||
static int default_column_widths[MAX_LIST_COLUMNS] = { 200, 175, 400 };
|
static int default_column_widths[MAX_LIST_COLUMNS] = { 200, 175, 400 };
|
||||||
|
@ -47,9 +56,16 @@ static int column_alignment[MAX_LIST_COLUMNS] = { LVCFMT_LEFT, LVCFMT_LEFT, LVCF
|
||||||
*/
|
*/
|
||||||
static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValBuf, DWORD dwCount)
|
static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValBuf, DWORD dwCount)
|
||||||
{
|
{
|
||||||
|
LINE_INFO* linfo;
|
||||||
LVITEM item;
|
LVITEM item;
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
|
linfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LINE_INFO) + dwCount);
|
||||||
|
linfo->dwValType = dwValType;
|
||||||
|
linfo->val_len = dwCount;
|
||||||
|
memcpy(&linfo[1], ValBuf, dwCount);
|
||||||
|
linfo->name = _tcsdup(Name);
|
||||||
|
|
||||||
item.mask = LVIF_TEXT | LVIF_PARAM;
|
item.mask = LVIF_TEXT | LVIF_PARAM;
|
||||||
item.iItem = 0;/*idx; */
|
item.iItem = 0;/*idx; */
|
||||||
item.iSubItem = 0;
|
item.iSubItem = 0;
|
||||||
|
@ -60,7 +76,8 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB
|
||||||
if (item.cchTextMax == 0)
|
if (item.cchTextMax == 0)
|
||||||
item.pszText = LPSTR_TEXTCALLBACK;
|
item.pszText = LPSTR_TEXTCALLBACK;
|
||||||
item.iImage = 0;
|
item.iImage = 0;
|
||||||
item.lParam = (LPARAM)dwValType;
|
item.lParam = (LPARAM)linfo;
|
||||||
|
|
||||||
/* item.lParam = (LPARAM)ValBuf; */
|
/* item.lParam = (LPARAM)ValBuf; */
|
||||||
#if (_WIN32_IE >= 0x0300)
|
#if (_WIN32_IE >= 0x0300)
|
||||||
item.iIndent = 0;
|
item.iIndent = 0;
|
||||||
|
@ -138,7 +155,7 @@ static void OnGetDispInfo(NMLVDISPINFO* plvdi)
|
||||||
plvdi->item.pszText = _T("(Default)");
|
plvdi->item.pszText = _T("(Default)");
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
switch (plvdi->item.lParam) {
|
switch (((LINE_INFO*)plvdi->item.lParam)->dwValType) {
|
||||||
case REG_SZ:
|
case REG_SZ:
|
||||||
plvdi->item.pszText = _T("REG_SZ");
|
plvdi->item.pszText = _T("REG_SZ");
|
||||||
break;
|
break;
|
||||||
|
@ -184,17 +201,23 @@ static void OnGetDispInfo(NMLVDISPINFO* plvdi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
||||||
{
|
{
|
||||||
TCHAR buf1[1000];
|
LINE_INFO*l, *r;
|
||||||
TCHAR buf2[1000];
|
l = (LINE_INFO*)lParam1;
|
||||||
|
r = (LINE_INFO*)lParam2;
|
||||||
ListView_GetItemText((HWND)lParamSort, lParam1, 0, buf1, sizeof(buf1));
|
|
||||||
ListView_GetItemText((HWND)lParamSort, lParam2, 0, buf2, sizeof(buf2));
|
if (g_columnToSort == ~0UL)
|
||||||
return _tcscmp(buf1, buf2);
|
g_columnToSort = 0;
|
||||||
|
|
||||||
|
if (g_columnToSort == 1 && l->dwValType != r->dwValType)
|
||||||
|
return g_invertSort ? (int)r->dwValType - (int)l->dwValType : (int)l->dwValType - (int)r->dwValType;
|
||||||
|
if (g_columnToSort == 2)
|
||||||
|
{
|
||||||
|
/* FIXME: Sort on value */
|
||||||
|
}
|
||||||
|
return g_invertSort ? _tcscmp(r->name, l->name) : _tcscmp(l->name, r->name);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static void ListViewPopUpMenu(HWND hWnd, POINT pt)
|
static void ListViewPopUpMenu(HWND hWnd, POINT pt)
|
||||||
{}
|
{}
|
||||||
|
@ -223,6 +246,17 @@ static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR
|
||||||
case LVN_GETDISPINFO:
|
case LVN_GETDISPINFO:
|
||||||
OnGetDispInfo((NMLVDISPINFO*)lParam);
|
OnGetDispInfo((NMLVDISPINFO*)lParam);
|
||||||
break;
|
break;
|
||||||
|
case LVN_COLUMNCLICK:
|
||||||
|
if (g_columnToSort == ((LPNMLISTVIEW)lParam)->iSubItem)
|
||||||
|
g_invertSort = !g_invertSort;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_columnToSort = ((LPNMLISTVIEW)lParam)->iSubItem;
|
||||||
|
g_invertSort = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView_SortItems(hWnd, CompareFunc, hWnd);
|
||||||
|
break;
|
||||||
case NM_DBLCLK: {
|
case NM_DBLCLK: {
|
||||||
NMITEMACTIVATE* nmitem = (LPNMITEMACTIVATE)lParam;
|
NMITEMACTIVATE* nmitem = (LPNMITEMACTIVATE)lParam;
|
||||||
LVHITTESTINFO info;
|
LVHITTESTINFO info;
|
||||||
|
@ -316,6 +350,18 @@ HWND CreateListView(HWND hwndParent, int id)
|
||||||
BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPTSTR keyPath)
|
BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPTSTR keyPath)
|
||||||
{
|
{
|
||||||
if (hwndLV != NULL) {
|
if (hwndLV != NULL) {
|
||||||
|
INT count, i;
|
||||||
|
count = ListView_GetItemCount(hwndLV);
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
LVITEM item;
|
||||||
|
item.mask = LVIF_PARAM;
|
||||||
|
item.iItem = i;
|
||||||
|
ListView_GetItem(hwndLV, &item);
|
||||||
|
free(((LINE_INFO*)item.lParam)->name);
|
||||||
|
HeapFree(GetProcessHeap(), 0, (void*)item.lParam);
|
||||||
|
}
|
||||||
|
g_columnToSort = ~0UL;
|
||||||
ListView_DeleteAllItems(hwndLV);
|
ListView_DeleteAllItems(hwndLV);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,8 +402,7 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPTSTR keyPath)
|
||||||
HeapFree(GetProcessHeap(), 0, ValBuf);
|
HeapFree(GetProcessHeap(), 0, ValBuf);
|
||||||
HeapFree(GetProcessHeap(), 0, ValName);
|
HeapFree(GetProcessHeap(), 0, ValName);
|
||||||
}
|
}
|
||||||
/*ListView_SortItemsEx(hwndLV, CompareFunc, hwndLV); */
|
ListView_SortItems(hwndLV, CompareFunc, hwndLV);
|
||||||
/* SendMessage(hwndLV, LVM_SORTITEMSEX, (WPARAM)CompareFunc, (LPARAM)hwndLV); */
|
|
||||||
ShowWindow(hwndLV, SW_SHOW);
|
ShowWindow(hwndLV, SW_SHOW);
|
||||||
RegCloseKey(hNewKey);
|
RegCloseKey(hNewKey);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue