Module: wine Branch: master Commit: a4c22a142c2b305a02806b788f56aed219b07588 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a4c22a142c2b305a02806b788f...
Author: Nikolay Sivov bunglehead@gmail.com Date: Sun Sep 6 02:24:26 2009 +0400
comctl32/header: Implement HDF_FIXEDWIDTH format flag.
---
dlls/comctl32/header.c | 44 ++++++++++++++-------- dlls/comctl32/tests/header.c | 83 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 18 deletions(-)
diff --git a/dlls/comctl32/header.c b/dlls/comctl32/header.c index 7c8f161..15586c1 100644 --- a/dlls/comctl32/header.c +++ b/dlls/comctl32/header.c @@ -624,6 +624,13 @@ HEADER_InternalHitTest (const HEADER_INFO *infoPtr, const POINT *lpPt, UINT *pFl rcTest = rect; rcTest.right = rcTest.left + DIVIDER_WIDTH; if (PtInRect (&rcTest, *lpPt)) { + if (infoPtr->items[HEADER_PrevItem(infoPtr, iCount)].fmt & HDF_FIXEDWIDTH) + { + *pFlags |= HHT_ONHEADER; + *pItem = iCount; + TRACE("ON HEADER %d\n", *pItem); + return; + } if (bNoWidth) { *pFlags |= HHT_ONDIVOPEN; *pItem = HEADER_PrevItem(infoPtr, iCount); @@ -640,7 +647,9 @@ HEADER_InternalHitTest (const HEADER_INFO *infoPtr, const POINT *lpPt, UINT *pFl } rcTest = rect; rcTest.left = rcTest.right - DIVIDER_WIDTH; - if (PtInRect (&rcTest, *lpPt)) { + if (!(infoPtr->items[iCount].fmt & HDF_FIXEDWIDTH) && + PtInRect (&rcTest, *lpPt)) + { *pFlags |= HHT_ONDIVIDER; *pItem = iCount; TRACE("ON DIVIDER %d\n", *pItem); @@ -655,21 +664,24 @@ HEADER_InternalHitTest (const HEADER_INFO *infoPtr, const POINT *lpPt, UINT *pFl }
/* check for last divider part (on nowhere) */ - rect = infoPtr->items[infoPtr->uNumItem-1].rect; - rect.left = rect.right; - rect.right += DIVIDER_WIDTH; - if (PtInRect (&rect, *lpPt)) { - if (bNoWidth) { - *pFlags |= HHT_ONDIVOPEN; - *pItem = infoPtr->uNumItem - 1; - TRACE("ON DIVOPEN %d\n", *pItem); - return; - } - else { - *pFlags |= HHT_ONDIVIDER; - *pItem = infoPtr->uNumItem-1; - TRACE("ON DIVIDER %d\n", *pItem); - return; + if (!(infoPtr->items[infoPtr->uNumItem-1].fmt & HDF_FIXEDWIDTH)) + { + rect = infoPtr->items[infoPtr->uNumItem-1].rect; + rect.left = rect.right; + rect.right += DIVIDER_WIDTH; + if (PtInRect (&rect, *lpPt)) { + if (bNoWidth) { + *pFlags |= HHT_ONDIVOPEN; + *pItem = infoPtr->uNumItem - 1; + TRACE("ON DIVOPEN %d\n", *pItem); + return; + } + else { + *pFlags |= HHT_ONDIVIDER; + *pItem = infoPtr->uNumItem-1; + TRACE("ON DIVIDER %d\n", *pItem); + return; + } } }
diff --git a/dlls/comctl32/tests/header.c b/dlls/comctl32/tests/header.c index 611433e..3088a00 100644 --- a/dlls/comctl32/tests/header.c +++ b/dlls/comctl32/tests/header.c @@ -24,6 +24,7 @@ #include <assert.h>
#include "wine/test.h" +#include "v6util.h" #include "msg.h"
typedef struct tagEXPECTEDNOTIFY @@ -1083,7 +1084,6 @@ static void test_hdm_bitmapmarginMessages(HWND hParent)
static void test_hdm_index_messages(HWND hParent) { - HWND hChild; int retVal; int loopcnt; @@ -1196,6 +1196,74 @@ static void test_hdm_index_messages(HWND hParent) DestroyWindow(hChild); }
+static void test_hdf_fixedwidth(HWND hParent) +{ + HWND hChild; + HDITEM hdItem; + DWORD ret; + RECT rect; + HDHITTESTINFO ht; + + hChild = create_custom_header_control(hParent, FALSE); + + hdItem.mask = HDI_WIDTH | HDI_FORMAT; + hdItem.fmt = HDF_FIXEDWIDTH; + hdItem.cxy = 80; + + ret = SendMessage(hChild, HDM_INSERTITEM, 0, (LPARAM)&hdItem); + expect(0, ret); + + /* try to change width */ + rect.right = rect.bottom = 0; + SendMessage(hChild, HDM_GETITEMRECT, 0, (LPARAM)&rect); + ok(rect.right != 0, "Expected not zero width\n"); + ok(rect.bottom != 0, "Expected not zero height\n"); + + SendMessage(hChild, WM_LBUTTONDOWN, 0, MAKELPARAM(rect.right, rect.bottom / 2)); + SendMessage(hChild, WM_MOUSEMOVE, 0, MAKELPARAM(rect.right + 20, rect.bottom / 2)); + SendMessage(hChild, WM_LBUTTONUP, 0, MAKELPARAM(rect.right + 20, rect.bottom / 2)); + + SendMessage(hChild, HDM_GETITEMRECT, 0, (LPARAM)&rect); + + if (hdItem.cxy != rect.right) + { + win_skip("HDF_FIXEDWIDTH format not supported\n"); + DestroyWindow(hChild); + return; + } + + /* try to adjust with message */ + hdItem.mask = HDI_WIDTH; + hdItem.cxy = 90; + + ret = SendMessage(hChild, HDM_SETITEM, 0, (LPARAM)&hdItem); + expect(TRUE, ret); + + rect.right = 0; + SendMessage(hChild, HDM_GETITEMRECT, 0, (LPARAM)&rect); + expect(90, rect.right); + + /* hittesting doesn't report ondivider flag for HDF_FIXEDWIDTH */ + ht.pt.x = rect.right - 1; + ht.pt.y = rect.bottom / 2; + SendMessage(hChild, HDM_HITTEST, 0, (LPARAM)&ht); + expect(HHT_ONHEADER, ht.flags); + + /* try to adjust with message */ + hdItem.mask = HDI_FORMAT; + hdItem.fmt = 0; + + ret = SendMessage(hChild, HDM_SETITEM, 0, (LPARAM)&hdItem); + expect(TRUE, ret); + + ht.pt.x = 90; + ht.pt.y = rect.bottom / 2; + SendMessage(hChild, HDM_HITTEST, 0, (LPARAM)&ht); + expect(HHT_ONDIVIDER, ht.flags); + + DestroyWindow(hChild); +} + #define TEST_NMCUSTOMDRAW(draw_stage, item_spec, lparam, _left, _top, _right, _bottom) \ ok(nm->dwDrawStage == draw_stage, "Invalid dwDrawStage %d vs %d\n", draw_stage, nm->dwDrawStage); \ if (item_spec != -1) \ @@ -1558,6 +1626,7 @@ static int init(void) START_TEST(header) { HWND parent_hwnd; + ULONG_PTR ctx_cookie;
if (!init()) return; @@ -1583,6 +1652,16 @@ START_TEST(header) test_hdm_unicodeformatMessages(parent_hwnd); test_hdm_bitmapmarginMessages(parent_hwnd);
- DestroyWindow(parent_hwnd); + if (!load_v6_module(&ctx_cookie)) + { + DestroyWindow(parent_hwnd); + return; + } + + /* comctl32 version 6 tests start here */ + test_hdf_fixedwidth(parent_hwnd);
+ unload_v6_module(ctx_cookie); + + DestroyWindow(parent_hwnd); }