1 /* 2 * PROJECT: ReactOS Applications 3 * LICENSE: LGPL - See COPYING in the top level directory 4 * FILE: base/applications/msconfig_new/comctl32ex/listview.c 5 * PURPOSE: List-View helper functions. 6 * COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr> 7 */ 8 9 #include "precomp.h" 10 #include "listview.h" 11 12 ///////////// ListView Sorting ///////////// 13 14 typedef struct __tagSort 15 { 16 HWND hList; 17 int nClickedColumn; 18 BOOL bSortAsc; 19 } Sort, *PSort; 20 21 int CALLBACK 22 SortListView(LPARAM lItemParam1, 23 LPARAM lItemParam2, 24 LPARAM lPSort_S) 25 { 26 PSort pSort = (PSort)lPSort_S; 27 28 int iItem1 = (int)lItemParam1; 29 int iItem2 = (int)lItemParam2; 30 31 WCHAR strItem1[MAX_VALUE_NAME]; 32 WCHAR strItem2[MAX_VALUE_NAME]; 33 34 ListView_GetItemText(pSort->hList, iItem1, pSort->nClickedColumn, strItem1, MAX_VALUE_NAME); 35 ListView_GetItemText(pSort->hList, iItem2, pSort->nClickedColumn, strItem2, MAX_VALUE_NAME); 36 37 // StrCmpLogicalW helps in comparing numbers intelligently, 10 is greater that 2, other 38 // wise string comparison will always return 2 is greater that 10... 39 return ( pSort->bSortAsc ? StrCmpLogicalW(strItem1, strItem2) : StrCmpLogicalW(strItem2, strItem1) ); 40 } 41 42 BOOL 43 ListView_SortEx(HWND hListView, 44 int iSortingColumn, 45 int iSortedColumn) 46 { 47 HWND hHeader; 48 HDITEM hColumn; 49 BOOL bSortAsc; 50 Sort sort; 51 52 if ((GetWindowLongPtr(hListView, GWL_STYLE) & ~LVS_NOSORTHEADER) == 0) 53 return TRUE; 54 55 hHeader = ListView_GetHeader(hListView); 56 SecureZeroMemory(&hColumn, sizeof(hColumn)); 57 58 if ( (iSortedColumn != -1) && (iSortedColumn != iSortingColumn) ) 59 { 60 hColumn.mask = HDI_FORMAT | HDI_LPARAM; 61 Header_GetItem(hHeader, iSortedColumn, &hColumn); 62 hColumn.fmt &= ~HDF_SORTUP & ~HDF_SORTDOWN; 63 hColumn.lParam = 0; // 0: deactivated, 1: false, 2: true. 64 Header_SetItem(hHeader, iSortedColumn, &hColumn); 65 } 66 67 hColumn.mask = HDI_FORMAT | HDI_LPARAM; 68 Header_GetItem(hHeader, iSortingColumn, &hColumn); 69 70 bSortAsc = !(hColumn.lParam == 2); // 0: deactivated, 1: false, 2: true. 71 72 hColumn.fmt &= (bSortAsc ? ~HDF_SORTDOWN : ~HDF_SORTUP ); 73 hColumn.fmt |= (bSortAsc ? HDF_SORTUP : HDF_SORTDOWN); 74 hColumn.lParam = (LPARAM)(bSortAsc ? 2 : 1); 75 Header_SetItem(hHeader, iSortingColumn, &hColumn); 76 77 /* Sort the list */ 78 sort.bSortAsc = bSortAsc; 79 sort.hList = hListView; 80 sort.nClickedColumn = iSortingColumn; 81 return ListView_SortItemsEx(hListView, SortListView, (LPARAM)&sort); 82 } 83 84 ////////////////////////////////////////////// 85 86 /* EOF */ 87