UINT GetLVItemState(HWND hwnd, int i, UINT mask)
{
return ListView_GetItemState(hwnd, i, mask);
}
void GetLVItemText(HWND hwnd, int iItem, int iSubItem, LPSTR pszText, int cchTextMax)
{
ListView_GetItemText(hwnd, iItem, iSubItem, pszText, cchTextMax);
}
void SetLVItemText(HWND hwnd, int i, int iSubItem, LPSTR pszText)
{
ListView_SetItemText(hwnd, i, iSubItem, pszText);
}
BOOL GetLVItem(HWND hListView, UINT mask, int iItem, int iSubItem,
LPLVITEM pitem, UINT stateMask)
{
pitem->mask = mask;
pitem->stateMask = stateMask;
pitem->iItem = iItem;
pitem->iSubItem = iSubItem;
return ListView_GetItem(hListView, pitem);
}
int GetHeaderItemCount(HWND hwndHD)
{
return Header_GetItemCount(hwndHD);
}
HWND GetLVHeaderControl(HWND hListView)
{
return ListView_GetHeader(hListView);
}
int GetLVColumnsCount(HWND hListView)
{
return (GetHeaderItemCount(GetLVHeaderControl(hListView)));
}
void SwapLVItems(HWND hListView, int iItem1, int iItem2)
{
//I assume that 4K buffer is really enough for storing the content of a column
const LOCAL_BUFFER_SIZE = 4096;
LVITEM lvi1, lvi2;
UINT uMask = LVIF_TEXT | LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM | LVIF_STATE;
char szBuffer1[LOCAL_BUFFER_SIZE + 1], szBuffer2[LOCAL_BUFFER_SIZE + 1];
lvi1.pszText = szBuffer1;
lvi2.pszText = szBuffer2;
lvi1.cchTextMax = sizeof(szBuffer1);
lvi2.cchTextMax = sizeof(szBuffer2);
BOOL bResult1 = GetLVItem(hListView, uMask, iItem1, 0, &lvi1, (UINT)-1);
BOOL bResult2 = GetLVItem(hListView, uMask, iItem2, 0, &lvi2, (UINT)-1);
if (bResult1 && bResult2)
{
lvi1.iItem = iItem2;
lvi2.iItem = iItem1;
lvi1.mask = uMask;
lvi2.mask = uMask;
lvi1.stateMask = (UINT)-1;
lvi2.stateMask = (UINT)-1;
//swap the items
ListView_SetItem(hListView, &lvi1);
ListView_SetItem(hListView, &lvi2);
int iColCount = GetLVColumnsCount(hListView);
//Loop for swapping each column in the items.
for (int iIndex = 1; iIndex < iColCount; iIndex++)
{
szBuffer1[0] = '\0';
szBuffer2[0] = '\0';
GetLVItemText(hListView, iItem1, iIndex,
szBuffer1, LOCAL_BUFFER_SIZE);
GetLVItemText(hListView, iItem2, iIndex,
szBuffer2, LOCAL_BUFFER_SIZE);
SetLVItemText(hListView, iItem2, iIndex, szBuffer1);
SetLVItemText(hListView, iItem1, iIndex, szBuffer2);
}
}
}
//Move up the selected items
void MoveLVSelectedItemsUp(HWND hListView)
{
int iCount = ListView_GetItemCount(hListView);
for (int iIndex = 1; iIndex < iCount; iIndex++)
if (GetLVItemState(hListView, iIndex, LVIS_SELECTED) != 0)
SwapLVItems(hListView, iIndex, iIndex - 1);
}
//Move down the selected items
void MoveLVSelectedItemsDown(HWND hListView)
{
int iCount = ListView_GetItemCount(hListView);
for (int iIndex = iCount - 1; iIndex >= 0; iIndex--)
if (GetLVItemState(hListView, iIndex, LVIS_SELECTED) != 0)
SwapLVItems(hListView, iIndex, iIndex + 1);
}
|