Few fixes for ListView
Vitaliy Margolen
wine-patch at kievinfo.com
Thu Mar 13 00:53:48 CST 2003
Here is my first few fixes for ListView. More to come.
Vitaliy Margolen
changelog:
dlls/comctl32/listview.c
changes for Icon and SmallIcon modes:
- fix typo causing wrong scroll boundaries
- reverse mouse wheel scroll directions
- fix navigation with keyboard when auto arranged
Index: listview.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/listview.c,v
retrieving revision 1.343
diff -u -r1.343 listview.c
--- listview.c 7 Mar 2003 20:35:30 -0000 1.343
+++ listview.c 13 Mar 2003 06:41:07 -0000
@@ -2167,7 +2167,7 @@
for (i = 0; i < infoPtr->nItemCount; i++)
{
x = (LONG)DPA_GetPtr(infoPtr->hdpaPosX, i);
- y = (LONG)DPA_GetPtr(infoPtr->hdpaPosX, i);
+ y = (LONG)DPA_GetPtr(infoPtr->hdpaPosY, i);
lprcView->right = max(lprcView->right, x);
lprcView->bottom = max(lprcView->bottom, y);
}
@@ -5426,6 +5426,7 @@
UINT uMask = 0;
LVFINDINFOW lvFindInfo;
INT nCountPerColumn;
+ INT nCountPerRow;
INT i;
TRACE("nItem=%d, uFlags=%x, nItemCount=%d\n", nItem, uFlags, infoPtr->nItemCount);
@@ -5466,6 +5467,18 @@
}
else
{
+ /* Special case for autoarrange - move 'til the top of a list */
+ if (is_autoarrange(infoPtr))
+ {
+ nCountPerRow = LISTVIEW_GetCountPerRow(infoPtr);
+ while (nItem - nCountPerRow >= 0)
+ {
+ nItem -= nCountPerRow;
+ if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
+ return nItem;
+ }
+ return -1;
+ }
lvFindInfo.flags = LVFI_NEARESTXY;
lvFindInfo.vkDirection = VK_UP;
ListView_GetItemPosition(infoPtr->hwndSelf, nItem, &lvFindInfo.pt);
@@ -5489,6 +5502,18 @@
}
else
{
+ /* Special case for autoarrange - move 'til the bottom of a list */
+ if (is_autoarrange(infoPtr))
+ {
+ nCountPerRow = LISTVIEW_GetCountPerRow(infoPtr);
+ while (nItem + nCountPerRow < infoPtr->nItemCount )
+ {
+ nItem += nCountPerRow;
+ if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
+ return nItem;
+ }
+ return -1;
+ }
lvFindInfo.flags = LVFI_NEARESTXY;
lvFindInfo.vkDirection = VK_DOWN;
ListView_GetItemPosition(infoPtr->hwndSelf, nItem, &lvFindInfo.pt);
@@ -5513,6 +5538,18 @@
}
else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
{
+ /* Special case for autoarrange - move 'ti the beginning of a row */
+ if (is_autoarrange(infoPtr))
+ {
+ nCountPerRow = LISTVIEW_GetCountPerRow(infoPtr);
+ while (nItem % nCountPerRow > 0)
+ {
+ nItem --;
+ if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
+ return nItem;
+ }
+ return -1;
+ }
lvFindInfo.flags = LVFI_NEARESTXY;
lvFindInfo.vkDirection = VK_LEFT;
ListView_GetItemPosition(infoPtr->hwndSelf, nItem, &lvFindInfo.pt);
@@ -5537,6 +5574,18 @@
}
else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
{
+ /* Special case for autoarrange - move 'til the end of a row */
+ if (is_autoarrange(infoPtr))
+ {
+ nCountPerRow = LISTVIEW_GetCountPerRow(infoPtr);
+ while (nItem % nCountPerRow < nCountPerRow - 1 )
+ {
+ nItem ++;
+ if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
+ return nItem;
+ }
+ return -1;
+ }
lvFindInfo.flags = LVFI_NEARESTXY;
lvFindInfo.vkDirection = VK_RIGHT;
ListView_GetItemPosition(infoPtr->hwndSelf, nItem, &lvFindInfo.pt);
@@ -7403,7 +7452,7 @@
* should be fixed in the future.
*/
LISTVIEW_VScroll(infoPtr, SB_INTERNAL, (gcWheelDelta < 0) ?
- LISTVIEW_SCROLL_ICON_LINE_SIZE : -LISTVIEW_SCROLL_ICON_LINE_SIZE, 0);
+ -LISTVIEW_SCROLL_ICON_LINE_SIZE : LISTVIEW_SCROLL_ICON_LINE_SIZE, 0);
break;
case LVS_REPORT:
More information about the wine-patches
mailing list