Nikolay Sivov : comctl32/header: Implement HDF_FIXEDWIDTH format flag.
Alexandre Julliard
julliard at winehq.org
Tue Sep 8 08:55:30 CDT 2009
Module: wine
Branch: master
Commit: a4c22a142c2b305a02806b788f56aed219b07588
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a4c22a142c2b305a02806b788f56aed219b07588
Author: Nikolay Sivov <bunglehead at 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);
}
More information about the wine-cvs
mailing list