comctl32/listview: Respect column order while scrolling columns.

This commit is contained in:
Nikolay Sivov 2009-08-04 00:22:15 +04:00 committed by Alexandre Julliard
parent 7d2bc2f9df
commit 6f723508e5
1 changed files with 29 additions and 11 deletions

View File

@ -4907,19 +4907,29 @@ static void LISTVIEW_ScrollColumns(LISTVIEW_INFO *infoPtr, INT nColumn, INT dx)
RECT rcOld, rcCol; RECT rcOld, rcCol;
POINT ptOrigin; POINT ptOrigin;
INT nCol; INT nCol;
HDITEMW hdi;
if (nColumn < 0 || DPA_GetPtrCount(infoPtr->hdpaColumns) < 1) return; if (nColumn < 0 || DPA_GetPtrCount(infoPtr->hdpaColumns) < 1) return;
lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, min(nColumn, DPA_GetPtrCount(infoPtr->hdpaColumns) - 1)); lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, min(nColumn, DPA_GetPtrCount(infoPtr->hdpaColumns) - 1));
rcCol = lpColumnInfo->rcHeader; rcCol = lpColumnInfo->rcHeader;
if (nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) if (nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns))
rcCol.left = rcCol.right; rcCol.left = rcCol.right;
/* adjust the other columns */ /* adjust the other columns */
for (nCol = nColumn; nCol < DPA_GetPtrCount(infoPtr->hdpaColumns); nCol++) hdi.mask = HDI_ORDER;
if (SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, nColumn, (LPARAM)&hdi))
{ {
lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nCol); INT nOrder = hdi.iOrder;
lpColumnInfo->rcHeader.left += dx; for (nCol = 0; nCol < DPA_GetPtrCount(infoPtr->hdpaColumns); nCol++)
lpColumnInfo->rcHeader.right += dx; {
hdi.mask = HDI_ORDER;
SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, nCol, (LPARAM)&hdi);
if (hdi.iOrder >= nOrder) {
lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nCol);
lpColumnInfo->rcHeader.left += dx;
lpColumnInfo->rcHeader.right += dx;
}
}
} }
/* do not update screen if not in report mode */ /* do not update screen if not in report mode */
@ -9526,6 +9536,7 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
case HDN_ITEMCHANGEDA: case HDN_ITEMCHANGEDA:
{ {
COLUMN_INFO *lpColumnInfo; COLUMN_INFO *lpColumnInfo;
HDITEMW hdi;
INT dx, cxy; INT dx, cxy;
notify_forward_header(infoPtr, lpnmh); notify_forward_header(infoPtr, lpnmh);
@ -9534,8 +9545,6 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
if (!lpnmh->pitem || !(lpnmh->pitem->mask & HDI_WIDTH)) if (!lpnmh->pitem || !(lpnmh->pitem->mask & HDI_WIDTH))
{ {
HDITEMW hdi;
hdi.mask = HDI_WIDTH; hdi.mask = HDI_WIDTH;
if (!SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, lpnmh->iItem, (LPARAM)&hdi)) return 0; if (!SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, lpnmh->iItem, (LPARAM)&hdi)) return 0;
cxy = hdi.cxy; cxy = hdi.cxy;
@ -9549,8 +9558,17 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
if (dx != 0) if (dx != 0)
{ {
lpColumnInfo->rcHeader.right += dx; lpColumnInfo->rcHeader.right += dx;
if (lpnmh->iItem + 1 < DPA_GetPtrCount(infoPtr->hdpaColumns))
LISTVIEW_ScrollColumns(infoPtr, lpnmh->iItem + 1, dx); hdi.mask = HDI_ORDER;
SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, lpnmh->iItem, (LPARAM)&hdi);
/* not the rightmost one */
if (hdi.iOrder + 1 < DPA_GetPtrCount(infoPtr->hdpaColumns))
{
INT nIndex = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX,
hdi.iOrder + 1, 0);
LISTVIEW_ScrollColumns(infoPtr, nIndex, dx);
}
else else
{ {
/* only needs to update the scrolls */ /* only needs to update the scrolls */
@ -9579,7 +9597,7 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
} }
/* when shrinking the last column clear the now unused field */ /* when shrinking the last column clear the now unused field */
if (lpnmh->iItem == DPA_GetPtrCount(infoPtr->hdpaColumns) - 1) if (hdi.iOrder == DPA_GetPtrCount(infoPtr->hdpaColumns) - 1)
{ {
RECT right; RECT right;