Module: wine Branch: master Commit: 66bad889f42431f98418a1518cee2cacd9ea0d24 URL: http://source.winehq.org/git/wine.git/?a=commit;h=66bad889f42431f98418a1518c...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Oct 4 03:59:51 2010 +0400
comctl32/treeview: Prevent item height to be calculated to zero value.
---
dlls/comctl32/tests/treeview.c | 26 ++++++++++++++++++++++++++ dlls/comctl32/treeview.c | 15 ++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c index 906a12d..1de63c6 100644 --- a/dlls/comctl32/tests/treeview.c +++ b/dlls/comctl32/tests/treeview.c @@ -713,6 +713,32 @@ static void test_get_set_itemheight(void) ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_itemheight_seq, "test get set item height", FALSE);
+ /* without TVS_NONEVENHEIGHT */ + SetWindowLong(hTree, GWL_STYLE, GetWindowLong(hTree, GWL_STYLE) & ~TVS_NONEVENHEIGHT); + /* odd value */ + ulOldHeight = SendMessage( hTree, TVM_SETITEMHEIGHT, 3, 0); + ok(ulOldHeight == 8, "got %d, expected %d\n", ulOldHeight, 8); + ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); + ok(ulNewHeight == 2, "got %d, expected %d\n", ulNewHeight, 2); + + ulOldHeight = SendMessage( hTree, TVM_SETITEMHEIGHT, 4, 0); + ok(ulOldHeight == 2, "got %d, expected %d\n", ulOldHeight, 2); + ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); + ok(ulNewHeight == 4, "got %d, expected %d\n", ulNewHeight, 4); + + /* with TVS_NONEVENHEIGHT */ + SetWindowLong(hTree, GWL_STYLE, GetWindowLong(hTree, GWL_STYLE) | TVS_NONEVENHEIGHT); + /* odd value */ + ulOldHeight = SendMessage( hTree, TVM_SETITEMHEIGHT, 3, 0); + ok(ulOldHeight == 4, "got %d, expected %d\n", ulOldHeight, 4); + ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); + ok(ulNewHeight == 3, "got %d, expected %d\n", ulNewHeight, 3); + /* even value */ + ulOldHeight = SendMessage( hTree, TVM_SETITEMHEIGHT, 10, 0); + ok(ulOldHeight == 3, "got %d, expected %d\n", ulOldHeight, 3); + ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); + ok(ulNewHeight == 10, "got %d, expected %d\n", ulNewHeight, 10); + DestroyWindow(hTree); }
diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c index 9609336..1ffcf64 100644 --- a/dlls/comctl32/treeview.c +++ b/dlls/comctl32/treeview.c @@ -1828,7 +1828,7 @@ TREEVIEW_SetItemHeight(TREEVIEW_INFO *infoPtr, INT newHeight) { INT prevHeight = infoPtr->uItemHeight;
- TRACE("%d\n", newHeight); + TRACE("new=%d, old=%d\n", newHeight, prevHeight); if (newHeight == -1) { infoPtr->uItemHeight = TREEVIEW_NaturalHeight(infoPtr); @@ -1836,13 +1836,17 @@ TREEVIEW_SetItemHeight(TREEVIEW_INFO *infoPtr, INT newHeight) } else { - infoPtr->uItemHeight = newHeight; - infoPtr->bHeightSet = TRUE; + if (newHeight == 0) newHeight = 1; + infoPtr->uItemHeight = newHeight; + infoPtr->bHeightSet = TRUE; }
/* Round down, unless we support odd ("non even") heights. */ - if (!(infoPtr->dwStyle & TVS_NONEVENHEIGHT)) - infoPtr->uItemHeight &= ~1; + if (!(infoPtr->dwStyle & TVS_NONEVENHEIGHT) && infoPtr->uItemHeight != 1) + { + infoPtr->uItemHeight &= ~1; + TRACE("after rounding=%d\n", infoPtr->uItemHeight); + }
if (infoPtr->uItemHeight != prevHeight) { @@ -2062,6 +2066,7 @@ static inline LRESULT TREEVIEW_GetVisibleCount(const TREEVIEW_INFO *infoPtr) { /* Surprise! This does not take integral height into account. */ + TRACE("client=%d, item=%d\n", infoPtr->clientHeight, infoPtr->uItemHeight); return infoPtr->clientHeight / infoPtr->uItemHeight; }