[COMCTL32]

* Sync with Wine 1.5.19.

svn path=/trunk/; revision=57914
This commit is contained in:
Amine Khaldi 2012-12-14 23:23:44 +00:00
parent ac35817a56
commit d501ae4e5a
26 changed files with 516 additions and 538 deletions

View file

@ -720,7 +720,7 @@ COMBOEX_SetExtendedStyle (COMBOEX_INFO *infoPtr, DWORD mask, DWORD style)
/* see if we need to change the word break proc on the edit */ /* see if we need to change the word break proc on the edit */
if ((infoPtr->dwExtStyle ^ dwTemp) & CBES_EX_PATHWORDBREAKPROC) if ((infoPtr->dwExtStyle ^ dwTemp) & CBES_EX_PATHWORDBREAKPROC)
SetPathWordBreakProc(infoPtr->hwndEdit, SetPathWordBreakProc(infoPtr->hwndEdit,
(infoPtr->dwExtStyle & CBES_EX_PATHWORDBREAKPROC) ? TRUE : FALSE); (infoPtr->dwExtStyle & CBES_EX_PATHWORDBREAKPROC) != 0);
/* test if the control's appearance has changed */ /* test if the control's appearance has changed */
mask = CBES_EX_NOEDITIMAGE | CBES_EX_NOEDITIMAGEINDENT; mask = CBES_EX_NOEDITIMAGE | CBES_EX_NOEDITIMAGEINDENT;
@ -1381,8 +1381,6 @@ static LRESULT COMBOEX_DrawItem (const COMBOEX_INFO *infoPtr, DRAWITEMSTRUCT con
item = infoPtr->edit; item = infoPtr->edit;
if (infoPtr->hwndEdit) { if (infoPtr->hwndEdit) {
INT len;
/* free previous text of edit item */ /* free previous text of edit item */
COMBOEX_FreeText(item); COMBOEX_FreeText(item);
item->mask &= ~CBEIF_TEXT; item->mask &= ~CBEIF_TEXT;
@ -2076,7 +2074,6 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
* For EN_CHANGE this issues the same calls and messages * For EN_CHANGE this issues the same calls and messages
* as the native seems to do. * as the native seems to do.
*/ */
WCHAR edit_text[260];
LPCWSTR lastwrk; LPCWSTR lastwrk;
cmp_func_t cmptext = get_cmp_func(infoPtr); cmp_func_t cmptext = get_cmp_func(infoPtr);
@ -2311,7 +2308,8 @@ COMBOEX_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return COMBOEX_WindowPosChanging (infoPtr, (WINDOWPOS *)lParam); return COMBOEX_WindowPosChanging (infoPtr, (WINDOWPOS *)lParam);
case WM_SETFOCUS: case WM_SETFOCUS:
SetFocus(infoPtr->hwndCombo); if (infoPtr->hwndEdit) SetFocus( infoPtr->hwndEdit );
else SetFocus( infoPtr->hwndCombo );
return 0; return 0;
case WM_SYSCOLORCHANGE: case WM_SYSCOLORCHANGE:

View file

@ -231,6 +231,7 @@ extern void UPDOWN_Unregister(void) DECLSPEC_HIDDEN;
int MONTHCAL_MonthLength(int month, int year) DECLSPEC_HIDDEN; int MONTHCAL_MonthLength(int month, int year) DECLSPEC_HIDDEN;
int MONTHCAL_CalculateDayOfWeek(SYSTEMTIME *date, BOOL inplace) DECLSPEC_HIDDEN; int MONTHCAL_CalculateDayOfWeek(SYSTEMTIME *date, BOOL inplace) DECLSPEC_HIDDEN;
LONG MONTHCAL_CompareSystemTime(const SYSTEMTIME *first, const SYSTEMTIME *second) DECLSPEC_HIDDEN;
extern void THEMING_Initialize(void) DECLSPEC_HIDDEN; extern void THEMING_Initialize(void) DECLSPEC_HIDDEN;
extern void THEMING_Uninitialize(void) DECLSPEC_HIDDEN; extern void THEMING_Uninitialize(void) DECLSPEC_HIDDEN;

View file

@ -4,6 +4,7 @@
* Copyright 1998, 1999 Eric Kohl * Copyright 1998, 1999 Eric Kohl
* Copyright 1999, 2000 Alex Priem <alexp@sci.kun.nl> * Copyright 1999, 2000 Alex Priem <alexp@sci.kun.nl>
* Copyright 2000 Chris Morgan <cmorgan@wpi.edu> * Copyright 2000 Chris Morgan <cmorgan@wpi.edu>
* Copyright 2012 Owen Rudge for CodeWeavers
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -138,6 +139,9 @@ static BOOL DATETIME_SendDateTimeChangeNotify (const DATETIME_INFO *infoPtr);
static const WCHAR allowedformatchars[] = {'d', 'h', 'H', 'm', 'M', 's', 't', 'y', 'X', 0}; static const WCHAR allowedformatchars[] = {'d', 'h', 'H', 'm', 'M', 's', 't', 'y', 'X', 0};
static const int maxrepetition [] = {4,2,2,2,4,2,2,4,-1}; static const int maxrepetition [] = {4,2,2,2,4,2,2,4,-1};
/* valid date limits */
static const SYSTEMTIME max_allowed_date = { /* wYear */ 9999, /* wMonth */ 12, /* wDayOfWeek */ 0, /* wDay */ 31 };
static const SYSTEMTIME min_allowed_date = { /* wYear */ 1752, /* wMonth */ 9, /* wDayOfWeek */ 0, /* wDay */ 14 };
static DWORD static DWORD
DATETIME_GetSystemTime (const DATETIME_INFO *infoPtr, SYSTEMTIME *systime) DATETIME_GetSystemTime (const DATETIME_INFO *infoPtr, SYSTEMTIME *systime)
@ -153,6 +157,43 @@ DATETIME_GetSystemTime (const DATETIME_INFO *infoPtr, SYSTEMTIME *systime)
return GDT_VALID; return GDT_VALID;
} }
/* Checks value is within configured date range
*
* PARAMETERS
*
* [I] infoPtr : valid pointer to control data
* [I] date : pointer to valid date data to check
*
* RETURN VALUE
*
* TRUE - date within configured range
* FALSE - date is outside configured range
*/
static BOOL DATETIME_IsDateInValidRange(const DATETIME_INFO *infoPtr, const SYSTEMTIME *date)
{
SYSTEMTIME range[2];
DWORD limits;
if ((MONTHCAL_CompareSystemTime(date, &max_allowed_date) == 1) ||
(MONTHCAL_CompareSystemTime(date, &min_allowed_date) == -1))
return FALSE;
limits = SendMessageW (infoPtr->hMonthCal, MCM_GETRANGE, 0, (LPARAM)range);
if (limits & GDTR_MAX)
{
if (MONTHCAL_CompareSystemTime(date, &range[1]) == 1)
return FALSE;
}
if (limits & GDTR_MIN)
{
if (MONTHCAL_CompareSystemTime(date, &range[0]) == -1)
return FALSE;
}
return TRUE;
}
static BOOL static BOOL
DATETIME_SetSystemTime (DATETIME_INFO *infoPtr, DWORD flag, const SYSTEMTIME *systime) DATETIME_SetSystemTime (DATETIME_INFO *infoPtr, DWORD flag, const SYSTEMTIME *systime)
@ -164,7 +205,7 @@ DATETIME_SetSystemTime (DATETIME_INFO *infoPtr, DWORD flag, const SYSTEMTIME *sy
systime->wHour, systime->wMinute, systime->wSecond); systime->wHour, systime->wMinute, systime->wSecond);
if (flag == GDT_VALID) { if (flag == GDT_VALID) {
if (systime->wYear < 1601 || systime->wYear > 30827 || if (systime->wYear == 0 ||
systime->wMonth < 1 || systime->wMonth > 12 || systime->wMonth < 1 || systime->wMonth > 12 ||
systime->wDay < 1 || systime->wDay < 1 ||
systime->wDay > MONTHCAL_MonthLength(systime->wMonth, systime->wYear) || systime->wDay > MONTHCAL_MonthLength(systime->wMonth, systime->wYear) ||
@ -175,6 +216,10 @@ DATETIME_SetSystemTime (DATETIME_INFO *infoPtr, DWORD flag, const SYSTEMTIME *sy
) )
return FALSE; return FALSE;
/* Windows returns true if the date is valid but outside the limits set */
if (DATETIME_IsDateInValidRange(infoPtr, systime) == FALSE)
return TRUE;
infoPtr->dateValid = TRUE; infoPtr->dateValid = TRUE;
infoPtr->date = *systime; infoPtr->date = *systime;
/* always store a valid day of week */ /* always store a valid day of week */
@ -462,6 +507,9 @@ static void
DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta) DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta)
{ {
SYSTEMTIME *date = &infoPtr->date; SYSTEMTIME *date = &infoPtr->date;
SYSTEMTIME range[2];
DWORD limits;
BOOL min;
TRACE ("%d\n", number); TRACE ("%d\n", number);
if ((number > infoPtr->nrFields) || (number < 0)) return; if ((number > infoPtr->nrFields) || (number < 0)) return;
@ -472,7 +520,13 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta)
case ONEDIGITYEAR: case ONEDIGITYEAR:
case TWODIGITYEAR: case TWODIGITYEAR:
case FULLYEAR: case FULLYEAR:
date->wYear = wrap(date->wYear, delta, 1752, 9999); if (delta == INT_MIN)
date->wYear = 1752;
else if (delta == INT_MAX)
date->wYear = 9999;
else
date->wYear = max(min(date->wYear + delta, 9999), 1752);
if (date->wDay > MONTHCAL_MonthLength(date->wMonth, date->wYear)) if (date->wDay > MONTHCAL_MonthLength(date->wMonth, date->wYear))
/* This can happen when moving away from a leap year. */ /* This can happen when moving away from a leap year. */
date->wDay = MONTHCAL_MonthLength(date->wMonth, date->wYear); date->wDay = MONTHCAL_MonthLength(date->wMonth, date->wYear);
@ -529,8 +583,28 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta)
date->wMinute = 0; date->wMinute = 0;
date->wHour = 0; date->wHour = 0;
} }
}
/* Ensure time is within bounds */
limits = SendMessageW (infoPtr->hMonthCal, MCM_GETRANGE, 0, (LPARAM)range);
min = delta < 0;
if (limits & (min ? GDTR_MIN : GDTR_MAX))
{
int i = (min ? 0 : 1);
if (MONTHCAL_CompareSystemTime(date, &range[i]) == (min ? -1 : 1))
{
date->wYear = range[i].wYear;
date->wMonth = range[i].wMonth;
date->wDayOfWeek = range[i].wDayOfWeek;
date->wDay = range[i].wDay;
date->wHour = range[i].wHour;
date->wMinute = range[i].wMinute;
date->wSecond = range[i].wSecond;
date->wMilliseconds = range[i].wMilliseconds;
}
}
}
static void static void
DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHORT *width) DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHORT *width)
@ -774,25 +848,43 @@ DATETIME_ApplySelectedField (DATETIME_INFO *infoPtr)
int fieldNum = infoPtr->select & DTHT_DATEFIELD; int fieldNum = infoPtr->select & DTHT_DATEFIELD;
int i, val=0, clamp_day=0; int i, val=0, clamp_day=0;
SYSTEMTIME date = infoPtr->date; SYSTEMTIME date = infoPtr->date;
int oldyear;
if (infoPtr->select == -1 || infoPtr->nCharsEntered == 0) if (infoPtr->select == -1 || infoPtr->nCharsEntered == 0)
return; return;
for (i=0; i<infoPtr->nCharsEntered; i++) if ((infoPtr->fieldspec[fieldNum] == ONELETTERAMPM) ||
val = val * 10 + infoPtr->charsEntered[i] - '0'; (infoPtr->fieldspec[fieldNum] == TWOLETTERAMPM))
val = infoPtr->charsEntered[0];
else {
for (i=0; i<infoPtr->nCharsEntered; i++)
val = val * 10 + infoPtr->charsEntered[i] - '0';
}
infoPtr->nCharsEntered = 0; infoPtr->nCharsEntered = 0;
switch (infoPtr->fieldspec[fieldNum]) { switch (infoPtr->fieldspec[fieldNum]) {
case ONEDIGITYEAR: case ONEDIGITYEAR:
case TWODIGITYEAR: case TWODIGITYEAR:
oldyear = date.wYear;
date.wYear = date.wYear - (date.wYear%100) + val; date.wYear = date.wYear - (date.wYear%100) + val;
clamp_day = 1;
if (DATETIME_IsDateInValidRange(infoPtr, &date))
clamp_day = 1;
else
date.wYear = oldyear;
break; break;
case INVALIDFULLYEAR: case INVALIDFULLYEAR:
case FULLYEAR: case FULLYEAR:
oldyear = date.wYear;
date.wYear = val; date.wYear = val;
clamp_day = 1;
if (DATETIME_IsDateInValidRange(infoPtr, &date))
clamp_day = 1;
else
date.wYear = oldyear;
break; break;
case ONEDIGITMONTH: case ONEDIGITMONTH:
case TWODIGITMONTH: case TWODIGITMONTH:
@ -805,9 +897,20 @@ DATETIME_ApplySelectedField (DATETIME_INFO *infoPtr)
break; break;
case ONEDIGIT12HOUR: case ONEDIGIT12HOUR:
case TWODIGIT12HOUR: case TWODIGIT12HOUR:
if (val >= 24)
val -= 20;
if (val >= 13)
date.wHour = val;
else if (val != 0) {
if (date.wHour >= 12) /* preserve current AM/PM state */
date.wHour = (val == 12 ? 12 : val + 12);
else
date.wHour = (val == 12 ? 0 : val);
}
break;
case ONEDIGIT24HOUR: case ONEDIGIT24HOUR:
case TWODIGIT24HOUR: case TWODIGIT24HOUR:
/* FIXME: Preserve AM/PM for 12HOUR? */
date.wHour = val; date.wHour = val;
break; break;
case ONEDIGITMINUTE: case ONEDIGITMINUTE:
@ -818,6 +921,16 @@ DATETIME_ApplySelectedField (DATETIME_INFO *infoPtr)
case TWODIGITSECOND: case TWODIGITSECOND:
date.wSecond = val; date.wSecond = val;
break; break;
case ONELETTERAMPM:
case TWOLETTERAMPM:
if (val == 'a' || val == 'A') {
if (date.wHour >= 12)
date.wHour -= 12;
} else if (val == 'p' || val == 'P') {
if (date.wHour < 12)
date.wHour += 12;
}
break;
} }
if (clamp_day && date.wDay > MONTHCAL_MonthLength(date.wMonth, date.wYear)) if (clamp_day && date.wDay > MONTHCAL_MonthLength(date.wMonth, date.wYear))
@ -1111,24 +1224,40 @@ DATETIME_KeyDown (DATETIME_INFO *infoPtr, DWORD vkCode)
static LRESULT static LRESULT
DATETIME_Char (DATETIME_INFO *infoPtr, WPARAM vkCode) DATETIME_Char (DATETIME_INFO *infoPtr, WPARAM vkCode)
{ {
int fieldNum = infoPtr->select & DTHT_DATEFIELD; int fieldNum, fieldSpec;
if (vkCode >= '0' && vkCode <= '9') { fieldNum = infoPtr->select & DTHT_DATEFIELD;
fieldSpec = infoPtr->fieldspec[fieldNum];
if (fieldSpec == ONELETTERAMPM || fieldSpec == TWOLETTERAMPM) {
infoPtr->charsEntered[0] = vkCode;
infoPtr->nCharsEntered = 1;
DATETIME_ApplySelectedField(infoPtr);
} else if (vkCode >= '0' && vkCode <= '9') {
int maxChars; int maxChars;
int fieldSpec;
infoPtr->charsEntered[infoPtr->nCharsEntered++] = vkCode; infoPtr->charsEntered[infoPtr->nCharsEntered++] = vkCode;
fieldSpec = infoPtr->fieldspec[fieldNum];
if (fieldSpec == INVALIDFULLYEAR || fieldSpec == FULLYEAR) if (fieldSpec == INVALIDFULLYEAR || fieldSpec == FULLYEAR)
maxChars = 4; maxChars = 4;
else else
maxChars = 2; maxChars = 2;
if ((fieldSpec == ONEDIGIT12HOUR ||
fieldSpec == TWODIGIT12HOUR ||
fieldSpec == ONEDIGIT24HOUR ||
fieldSpec == TWODIGIT24HOUR) &&
(infoPtr->nCharsEntered == 1))
{
if (vkCode >= '3')
maxChars = 1;
}
if (maxChars == infoPtr->nCharsEntered) if (maxChars == infoPtr->nCharsEntered)
DATETIME_ApplySelectedField(infoPtr); DATETIME_ApplySelectedField(infoPtr);
} }
return 0; return 0;
} }
@ -1316,7 +1445,7 @@ DATETIME_StyleChanged(DATETIME_INFO *infoPtr, WPARAM wStyleType, const STYLESTRU
infoPtr->hwndCheckbut = CreateWindowExW (0, WC_BUTTONW, 0, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, infoPtr->hwndCheckbut = CreateWindowExW (0, WC_BUTTONW, 0, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
2, 2, 13, 13, infoPtr->hwndSelf, 0, 2, 2, 13, 13, infoPtr->hwndSelf, 0,
(HINSTANCE)GetWindowLongPtrW (infoPtr->hwndSelf, GWLP_HINSTANCE), 0); (HINSTANCE)GetWindowLongPtrW (infoPtr->hwndSelf, GWLP_HINSTANCE), 0);
SendMessageW (infoPtr->hwndCheckbut, BM_SETCHECK, 1, 0); SendMessageW (infoPtr->hwndCheckbut, BM_SETCHECK, infoPtr->dateValid ? 1 : 0, 0);
} }
if ( (lpss->styleOld & DTS_SHOWNONE) && !(lpss->styleNew & DTS_SHOWNONE) ) { if ( (lpss->styleOld & DTS_SHOWNONE) && !(lpss->styleNew & DTS_SHOWNONE) ) {
DestroyWindow(infoPtr->hwndCheckbut); DestroyWindow(infoPtr->hwndCheckbut);

View file

@ -727,17 +727,9 @@ static void
HEADER_DrawTrackLine (const HEADER_INFO *infoPtr, HDC hdc, INT x) HEADER_DrawTrackLine (const HEADER_INFO *infoPtr, HDC hdc, INT x)
{ {
RECT rect; RECT rect;
HPEN hOldPen;
INT oldRop;
GetClientRect (infoPtr->hwndSelf, &rect); GetClientRect (infoPtr->hwndSelf, &rect);
PatBlt( hdc, x, rect.top, 1, rect.bottom - rect.top, DSTINVERT );
hOldPen = SelectObject (hdc, GetStockObject (BLACK_PEN));
oldRop = SetROP2 (hdc, R2_XORPEN);
MoveToEx (hdc, x, rect.top, NULL);
LineTo (hdc, x, rect.bottom);
SetROP2 (hdc, oldRop);
SelectObject (hdc, hOldPen);
} }
/*** /***
@ -1241,6 +1233,14 @@ HEADER_SetOrderArray(HEADER_INFO *infoPtr, INT size, const INT *order)
if ((UINT)size != infoPtr->uNumItem) if ((UINT)size != infoPtr->uNumItem)
return FALSE; return FALSE;
if (TRACE_ON(header))
{
TRACE("count=%d, order array={", size);
for (i = 0; i < size; i++)
TRACE("%d%c", order[i], i != size-1 ? ',' : '}');
TRACE("\n");
}
for (i=0; i<size; i++) for (i=0; i<size; i++)
{ {
if (order[i] >= size || order[i] < 0) if (order[i] >= size || order[i] < 0)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

View file

@ -1186,7 +1186,7 @@ ImageList_Draw (HIMAGELIST himl, INT i, HDC hdc, INT x, INT y, UINT fStyle)
/************************************************************************* /*************************************************************************
* ImageList_DrawEx [COMCTL32.@] * ImageList_DrawEx [COMCTL32.@]
* *
* Draws an image and allows to use extended drawing features. * Draws an image and allows using extended drawing features.
* *
* PARAMS * PARAMS
* himl [I] handle to image list * himl [I] handle to image list
@ -3366,7 +3366,7 @@ static HRESULT WINAPI ImageListImpl_Copy(IImageList *iface, int iDst,
return E_FAIL; return E_FAIL;
/* TODO: Add test for IID_ImageList2 too */ /* TODO: Add test for IID_ImageList2 too */
if (FAILED(IImageList_QueryInterface(punkSrc, &IID_IImageList, if (FAILED(IUnknown_QueryInterface(punkSrc, &IID_IImageList,
(void **) &src))) (void **) &src)))
return E_FAIL; return E_FAIL;
@ -3390,7 +3390,7 @@ static HRESULT WINAPI ImageListImpl_Merge(IImageList *iface, int i1,
TRACE("(%p)->(%d %p %d %d %d %s %p)\n", iface, i1, punk2, i2, dx, dy, debugstr_guid(riid), ppv); TRACE("(%p)->(%d %p %d %d %d %s %p)\n", iface, i1, punk2, i2, dx, dy, debugstr_guid(riid), ppv);
/* TODO: Add test for IID_ImageList2 too */ /* TODO: Add test for IID_ImageList2 too */
if (FAILED(IImageList_QueryInterface(punk2, &IID_IImageList, if (FAILED(IUnknown_QueryInterface(punk2, &IID_IImageList,
(void **) &iml2))) (void **) &iml2)))
return E_FAIL; return E_FAIL;
@ -3523,7 +3523,7 @@ static HRESULT WINAPI ImageListImpl_SetDragCursorImage(IImageList *iface,
return E_FAIL; return E_FAIL;
/* TODO: Add test for IID_ImageList2 too */ /* TODO: Add test for IID_ImageList2 too */
if (FAILED(IImageList_QueryInterface(punk, &IID_IImageList, if (FAILED(IUnknown_QueryInterface(punk, &IID_IImageList,
(void **) &iml2))) (void **) &iml2)))
return E_FAIL; return E_FAIL;

View file

@ -6,7 +6,7 @@
* Copyright 2000 Jason Mawdsley * Copyright 2000 Jason Mawdsley
* Copyright 2001 CodeWeavers Inc. * Copyright 2001 CodeWeavers Inc.
* Copyright 2002 Dimitrie O. Paun * Copyright 2002 Dimitrie O. Paun
* Copyright 2009-2011 Nikolay Sivov * Copyright 2009-2012 Nikolay Sivov
* Copyright 2009 Owen Rudge for CodeWeavers * Copyright 2009 Owen Rudge for CodeWeavers
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
@ -560,11 +560,8 @@ static inline int textcmpWT(LPCWSTR aw, LPCWSTR bt, BOOL isW)
static inline int lstrncmpiW(LPCWSTR s1, LPCWSTR s2, int n) static inline int lstrncmpiW(LPCWSTR s1, LPCWSTR s2, int n)
{ {
int res;
n = min(min(n, lstrlenW(s1)), lstrlenW(s2)); n = min(min(n, lstrlenW(s1)), lstrlenW(s2));
res = CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, s1, n, s2, n); return CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, s1, n, s2, n) - CSTR_EQUAL;
return res ? res - sizeof(WCHAR) : res;
} }
/******** Debugging functions *****************************************/ /******** Debugging functions *****************************************/
@ -3901,7 +3898,7 @@ static void LISTVIEW_MarqueeHighlight(LISTVIEW_INFO *infoPtr, const POINT *coord
} }
iterator_destroy(&new_elems); iterator_destroy(&new_elems);
LISTVIEW_InvalidateRect(infoPtr, &rect); LISTVIEW_InvalidateRect(infoPtr, &infoPtr->marqueeDrawRect);
} }
/*** /***
@ -4288,6 +4285,10 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL
{ {
if (lpLVItem->state & LVIS_FOCUSED) if (lpLVItem->state & LVIS_FOCUSED)
{ {
/* update selection mark */
if (infoPtr->nFocusedItem == -1 && infoPtr->nSelectionMark == -1)
infoPtr->nSelectionMark = lpLVItem->iItem;
if (infoPtr->nFocusedItem != -1) if (infoPtr->nFocusedItem != -1)
{ {
/* remove current focus */ /* remove current focus */
@ -4957,10 +4958,7 @@ static void LISTVIEW_RefreshReportGrid(LISTVIEW_INFO *infoPtr, HDC hdc)
itemheight = LISTVIEW_CalculateItemHeight(infoPtr); itemheight = LISTVIEW_CalculateItemHeight(infoPtr);
rcItem.left = infoPtr->rcList.left; rcItem.left = infoPtr->rcList.left;
rcItem.right = infoPtr->rcList.right; rcItem.right = infoPtr->rcList.right;
rcItem.bottom = rcItem.top = Origin.y - 1; for(y = Origin.y > 1 ? Origin.y - 1 : itemheight - 1 + Origin.y % itemheight; y<=infoPtr->rcList.bottom; y+=itemheight)
MoveToEx(hdc, rcItem.left, rcItem.top, NULL);
LineTo(hdc, rcItem.right, rcItem.top);
for(y=itemheight-1+Origin.y; y<=infoPtr->rcList.bottom; y+=itemheight)
{ {
rcItem.bottom = rcItem.top = y; rcItem.bottom = rcItem.top = y;
TRACE("horz rcItem=%s\n", wine_dbgstr_rect(&rcItem)); TRACE("horz rcItem=%s\n", wine_dbgstr_rect(&rcItem));
@ -8584,10 +8582,12 @@ static DWORD LISTVIEW_SetIconSpacing(LISTVIEW_INFO *infoPtr, INT cx, INT cy)
if (cy == -1) cy = GetSystemMetrics(SM_CYICONSPACING); if (cy == -1) cy = GetSystemMetrics(SM_CYICONSPACING);
/* if 0 then compute width /* if 0 then compute width
* FIXME: Should scan each item and determine max width of * FIXME: computed cx and cy is not matching native behaviour */
* icon or label, then make that the width */ if (cx == 0) {
if (cx == 0) cx = GetSystemMetrics(SM_CXICONSPACING);
cx = infoPtr->iconSpacing.cx; if (infoPtr->iconSize.cx + ICON_LR_PADDING > cx)
cx = infoPtr->iconSize.cx + ICON_LR_PADDING;
}
/* if 0 then compute height */ /* if 0 then compute height */
if (cy == 0) if (cy == 0)
@ -8829,26 +8829,31 @@ static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, const PO
* PARAMETER(S): * PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure * [I] infoPtr : valid pointer to the listview structure
* [I] nItem : item index * [I] nItem : item index
* [I] lpLVItem : item or subitem info * [I] item : item or subitem info
* *
* RETURN: * RETURN:
* SUCCESS : TRUE * SUCCESS : TRUE
* FAILURE : FALSE * FAILURE : FALSE
*/ */
static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITEMW *lpLVItem) static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITEMW *item)
{ {
BOOL bResult = TRUE; BOOL ret = TRUE;
LVITEMW lvItem; LVITEMW lvItem;
if (!item) return FALSE;
lvItem.iItem = nItem; lvItem.iItem = nItem;
lvItem.iSubItem = 0; lvItem.iSubItem = 0;
lvItem.mask = LVIF_STATE; lvItem.mask = LVIF_STATE;
lvItem.state = lpLVItem->state; lvItem.state = item->state;
lvItem.stateMask = lpLVItem->stateMask; lvItem.stateMask = item->stateMask;
TRACE("lvItem=%s\n", debuglvitem_t(&lvItem, TRUE)); TRACE("item=%s\n", debuglvitem_t(&lvItem, TRUE));
if (nItem == -1) if (nItem == -1)
{ {
UINT oldstate = 0;
BOOL notify;
/* select all isn't allowed in LVS_SINGLESEL */ /* select all isn't allowed in LVS_SINGLESEL */
if ((lvItem.state & lvItem.stateMask & LVIS_SELECTED) && (infoPtr->dwStyle & LVS_SINGLESEL)) if ((lvItem.state & lvItem.stateMask & LVIS_SELECTED) && (infoPtr->dwStyle & LVS_SINGLESEL))
return FALSE; return FALSE;
@ -8856,14 +8861,40 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITE
/* focus all isn't allowed */ /* focus all isn't allowed */
if (lvItem.state & lvItem.stateMask & LVIS_FOCUSED) return FALSE; if (lvItem.state & lvItem.stateMask & LVIS_FOCUSED) return FALSE;
notify = infoPtr->bDoChangeNotify;
if (infoPtr->dwStyle & LVS_OWNERDATA)
{
infoPtr->bDoChangeNotify = FALSE;
if (!(lvItem.state & LVIS_SELECTED) && LISTVIEW_GetSelectedCount(infoPtr))
oldstate |= LVIS_SELECTED;
if (infoPtr->nFocusedItem != -1) oldstate |= LVIS_FOCUSED;
}
/* apply to all items */ /* apply to all items */
for (lvItem.iItem = 0; lvItem.iItem < infoPtr->nItemCount; lvItem.iItem++) for (lvItem.iItem = 0; lvItem.iItem < infoPtr->nItemCount; lvItem.iItem++)
if (!LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE)) bResult = FALSE; if (!LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE)) ret = FALSE;
if (infoPtr->dwStyle & LVS_OWNERDATA)
{
NMLISTVIEW nmlv;
infoPtr->bDoChangeNotify = notify;
nmlv.iItem = -1;
nmlv.iSubItem = 0;
nmlv.uNewState = lvItem.state & lvItem.stateMask;
nmlv.uOldState = oldstate & lvItem.stateMask;
nmlv.uChanged = LVIF_STATE;
nmlv.ptAction.x = nmlv.ptAction.y = 0;
nmlv.lParam = 0;
notify_listview(infoPtr, LVN_ITEMCHANGED, &nmlv);
}
} }
else else
bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE); ret = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE);
return bResult; return ret;
} }
/*** /***
@ -8885,6 +8916,7 @@ static BOOL LISTVIEW_SetItemTextT(LISTVIEW_INFO *infoPtr, INT nItem, const LVITE
LVITEMW lvItem; LVITEMW lvItem;
if (!lpLVItem || nItem < 0 || nItem >= infoPtr->nItemCount) return FALSE; if (!lpLVItem || nItem < 0 || nItem >= infoPtr->nItemCount) return FALSE;
if (infoPtr->dwStyle & LVS_OWNERDATA) return FALSE;
lvItem.iItem = nItem; lvItem.iItem = nItem;
lvItem.iSubItem = lpLVItem->iSubItem; lvItem.iSubItem = lpLVItem->iSubItem;
@ -9252,21 +9284,15 @@ static BOOL LISTVIEW_Update(LISTVIEW_INFO *infoPtr, INT nItem)
*/ */
static BOOL LISTVIEW_DrawTrackLine(const LISTVIEW_INFO *infoPtr) static BOOL LISTVIEW_DrawTrackLine(const LISTVIEW_INFO *infoPtr)
{ {
HPEN hOldPen;
HDC hdc; HDC hdc;
INT oldROP;
if (infoPtr->xTrackLine == -1) if (infoPtr->xTrackLine == -1)
return FALSE; return FALSE;
if (!(hdc = GetDC(infoPtr->hwndSelf))) if (!(hdc = GetDC(infoPtr->hwndSelf)))
return FALSE; return FALSE;
hOldPen = SelectObject(hdc, GetStockObject(BLACK_PEN)); PatBlt( hdc, infoPtr->xTrackLine, infoPtr->rcList.top,
oldROP = SetROP2(hdc, R2_XORPEN); 1, infoPtr->rcList.bottom - infoPtr->rcList.top, DSTINVERT );
MoveToEx(hdc, infoPtr->xTrackLine, infoPtr->rcList.top, NULL);
LineTo(hdc, infoPtr->xTrackLine, infoPtr->rcList.bottom);
SetROP2(hdc, oldROP);
SelectObject(hdc, hOldPen);
ReleaseDC(infoPtr->hwndSelf, hdc); ReleaseDC(infoPtr->hwndSelf, hdc);
return TRUE; return TRUE;
} }
@ -9418,6 +9444,7 @@ static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
/* init item size to avoid division by 0 */ /* init item size to avoid division by 0 */
LISTVIEW_UpdateItemSize (infoPtr); LISTVIEW_UpdateItemSize (infoPtr);
LISTVIEW_UpdateSize (infoPtr);
if (infoPtr->uView == LV_VIEW_DETAILS) if (infoPtr->uView == LV_VIEW_DETAILS)
{ {
@ -10873,7 +10900,7 @@ static void LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr)
* The "2" is there to mimic the native control. I think it may be * The "2" is there to mimic the native control. I think it may be
* related to either padding or edges. (GLA 7/2002) * related to either padding or edges. (GLA 7/2002)
*/ */
if (!(infoPtr->dwStyle & WS_HSCROLL)) if (!(GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & WS_HSCROLL))
infoPtr->rcList.bottom -= GetSystemMetrics(SM_CYHSCROLL); infoPtr->rcList.bottom -= GetSystemMetrics(SM_CYHSCROLL);
infoPtr->rcList.bottom = max (infoPtr->rcList.bottom - 2, 0); infoPtr->rcList.bottom = max (infoPtr->rcList.bottom - 2, 0);
} }
@ -11431,7 +11458,6 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, (POINT*)lParam); return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, (POINT*)lParam);
case LVM_SETITEMSTATE: case LVM_SETITEMSTATE:
if (lParam == 0) return FALSE;
return LISTVIEW_SetItemState(infoPtr, (INT)wParam, (LPLVITEMW)lParam); return LISTVIEW_SetItemState(infoPtr, (INT)wParam, (LPLVITEMW)lParam);
case LVM_SETITEMTEXTA: case LVM_SETITEMTEXTA:
@ -11580,9 +11606,6 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_SHOWWINDOW: case WM_SHOWWINDOW:
return LISTVIEW_ShowWindow(infoPtr, wParam, lParam); return LISTVIEW_ShowWindow(infoPtr, wParam, lParam);
case WM_SIZE:
return LISTVIEW_Size(infoPtr, (short)LOWORD(lParam), (short)HIWORD(lParam));
case WM_STYLECHANGED: case WM_STYLECHANGED:
return LISTVIEW_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam); return LISTVIEW_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
@ -11614,16 +11637,14 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_WINDOWPOSCHANGED: case WM_WINDOWPOSCHANGED:
if (!(((WINDOWPOS *)lParam)->flags & SWP_NOSIZE)) if (!(((WINDOWPOS *)lParam)->flags & SWP_NOSIZE))
{ {
SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE |
SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE); SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (infoPtr->uView == LV_VIEW_DETAILS)) if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (infoPtr->uView == LV_VIEW_DETAILS))
{ {
if (notify_measureitem(infoPtr)) LISTVIEW_InvalidateList(infoPtr); if (notify_measureitem(infoPtr)) LISTVIEW_InvalidateList(infoPtr);
} }
LISTVIEW_Size(infoPtr, ((WINDOWPOS *)lParam)->cx, ((WINDOWPOS *)lParam)->cy);
LISTVIEW_UpdateSize(infoPtr);
LISTVIEW_UpdateScroll(infoPtr);
} }
return DefWindowProcW(hwnd, uMsg, wParam, lParam); return DefWindowProcW(hwnd, uMsg, wParam, lParam);

View file

@ -185,7 +185,14 @@ static inline void MONTHCAL_NotifySelectionChange(const MONTHCAL_INFO *infoPtr)
nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
nmsc.nmhdr.code = MCN_SELCHANGE; nmsc.nmhdr.code = MCN_SELCHANGE;
nmsc.stSelStart = infoPtr->minSel; nmsc.stSelStart = infoPtr->minSel;
nmsc.stSelEnd = infoPtr->maxSel; nmsc.stSelStart.wDayOfWeek = 0;
if(infoPtr->dwStyle & MCS_MULTISELECT){
nmsc.stSelEnd = infoPtr->maxSel;
nmsc.stSelEnd.wDayOfWeek = 0;
}
else
nmsc.stSelEnd = st_null;
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc); SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
} }
@ -198,7 +205,13 @@ static inline void MONTHCAL_NotifySelect(const MONTHCAL_INFO *infoPtr)
nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
nmsc.nmhdr.code = MCN_SELECT; nmsc.nmhdr.code = MCN_SELECT;
nmsc.stSelStart = infoPtr->minSel; nmsc.stSelStart = infoPtr->minSel;
nmsc.stSelEnd = infoPtr->maxSel; nmsc.stSelStart.wDayOfWeek = 0;
if(infoPtr->dwStyle & MCS_MULTISELECT){
nmsc.stSelEnd = infoPtr->maxSel;
nmsc.stSelEnd.wDayOfWeek = 0;
}
else
nmsc.stSelEnd = st_null;
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc); SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
} }
@ -296,7 +309,7 @@ static void MONTHCAL_CopyDate(const SYSTEMTIME *from, SYSTEMTIME *to)
* *
* Note that no date validation performed, already validated values expected. * Note that no date validation performed, already validated values expected.
*/ */
static LONG MONTHCAL_CompareSystemTime(const SYSTEMTIME *first, const SYSTEMTIME *second) LONG MONTHCAL_CompareSystemTime(const SYSTEMTIME *first, const SYSTEMTIME *second)
{ {
FILETIME ft_first, ft_second; FILETIME ft_first, ft_second;
@ -353,14 +366,17 @@ static BOOL MONTHCAL_IsDateInValidRange(const MONTHCAL_INFO *infoPtr,
else if(MONTHCAL_CompareSystemTime(date, &min_allowed_date) == -1) { else if(MONTHCAL_CompareSystemTime(date, &min_allowed_date) == -1) {
fix_st = &min_allowed_date; fix_st = &min_allowed_date;
} }
else if(infoPtr->rangeValid & GDTR_MAX) { else {
if((MONTHCAL_CompareSystemTime(date, &infoPtr->maxDate) == 1)) { if(infoPtr->rangeValid & GDTR_MAX) {
fix_st = &infoPtr->maxDate; if((MONTHCAL_CompareSystemTime(date, &infoPtr->maxDate) == 1)) {
fix_st = &infoPtr->maxDate;
}
} }
}
else if(infoPtr->rangeValid & GDTR_MIN) { if(infoPtr->rangeValid & GDTR_MIN) {
if((MONTHCAL_CompareSystemTime(date, &infoPtr->minDate) == -1)) { if((MONTHCAL_CompareSystemTime(date, &infoPtr->minDate) == -1)) {
fix_st = &infoPtr->minDate; fix_st = &infoPtr->minDate;
}
} }
} }
@ -369,7 +385,7 @@ static BOOL MONTHCAL_IsDateInValidRange(const MONTHCAL_INFO *infoPtr,
date->wMonth = fix_st->wMonth; date->wMonth = fix_st->wMonth;
} }
return fix_st ? FALSE : TRUE; return !fix_st;
} }
/* Checks passed range width with configured maximum selection count /* Checks passed range width with configured maximum selection count
@ -1273,7 +1289,7 @@ MONTHCAL_SetColor(MONTHCAL_INFO *infoPtr, UINT index, COLORREF color)
infoPtr->pens[PenText] = CreatePen(PS_SOLID, 1, infoPtr->colors[index]); infoPtr->pens[PenText] = CreatePen(PS_SOLID, 1, infoPtr->colors[index]);
} }
InvalidateRect(infoPtr->hwndSelf, NULL, index == MCSC_BACKGROUND ? TRUE : FALSE); InvalidateRect(infoPtr->hwndSelf, NULL, index == MCSC_BACKGROUND);
return prev; return prev;
} }

View file

@ -84,9 +84,6 @@ typedef struct
INT direction; /* direction of the scroll, (e.g. PGF_SCROLLUP) */ INT direction; /* direction of the scroll, (e.g. PGF_SCROLLUP) */
} PAGER_INFO; } PAGER_INFO;
#define MIN_ARROW_WIDTH 8
#define MIN_ARROW_HEIGHT 5
#define TIMERID1 1 #define TIMERID1 1
#define TIMERID2 2 #define TIMERID2 2
#define INITIAL_DELAY 500 #define INITIAL_DELAY 500
@ -116,115 +113,13 @@ PAGER_GetButtonRects(const PAGER_INFO* infoPtr, RECT* prcTopLeft, RECT* prcBotto
} }
} }
/* the horizontal arrows are:
*
* 01234 01234
* 1 * *
* 2 ** **
* 3*** ***
* 4*** ***
* 5 ** **
* 6 * *
* 7
*
*/
static void static void
PAGER_DrawHorzArrow (HDC hdc, RECT r, INT colorRef, BOOL left) PAGER_DrawButton(HDC hdc, COLORREF clrBk, RECT rc,
{
INT x, y, w, h;
HPEN hPen, hOldPen;
w = r.right - r.left + 1;
h = r.bottom - r.top + 1;
if ((h < MIN_ARROW_WIDTH) || (w < MIN_ARROW_HEIGHT))
return; /* refuse to draw partial arrow */
if (!(hPen = CreatePen( PS_SOLID, 1, GetSysColor( colorRef )))) return;
hOldPen = SelectObject ( hdc, hPen );
if (left)
{
x = r.left + ((w - MIN_ARROW_HEIGHT) / 2) + 3;
y = r.top + ((h - MIN_ARROW_WIDTH) / 2) + 1;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x--, y+5); y++;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x--, y+3); y++;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x, y+1);
}
else
{
x = r.left + ((w - MIN_ARROW_HEIGHT) / 2) + 1;
y = r.top + ((h - MIN_ARROW_WIDTH) / 2) + 1;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x++, y+5); y++;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x++, y+3); y++;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x, y+1);
}
SelectObject( hdc, hOldPen );
DeleteObject( hPen );
}
/* the vertical arrows are:
*
* 01234567 01234567
* 1****** **
* 2 **** ****
* 3 ** ******
* 4
*
*/
static void
PAGER_DrawVertArrow (HDC hdc, RECT r, INT colorRef, BOOL up)
{
INT x, y, w, h;
HPEN hPen, hOldPen;
w = r.right - r.left + 1;
h = r.bottom - r.top + 1;
if ((h < MIN_ARROW_WIDTH) || (w < MIN_ARROW_HEIGHT))
return; /* refuse to draw partial arrow */
if (!(hPen = CreatePen( PS_SOLID, 1, GetSysColor( colorRef )))) return;
hOldPen = SelectObject ( hdc, hPen );
if (up)
{
x = r.left + ((w - MIN_ARROW_HEIGHT) / 2) + 1;
y = r.top + ((h - MIN_ARROW_WIDTH) / 2) + 3;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x+5, y--); x++;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x+3, y--); x++;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x+1, y);
}
else
{
x = r.left + ((w - MIN_ARROW_HEIGHT) / 2) + 1;
y = r.top + ((h - MIN_ARROW_WIDTH) / 2) + 1;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x+5, y++); x++;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x+3, y++); x++;
MoveToEx (hdc, x, y, NULL);
LineTo (hdc, x+1, y);
}
SelectObject( hdc, hOldPen );
DeleteObject( hPen );
}
static void
PAGER_DrawButton(HDC hdc, COLORREF clrBk, RECT arrowRect,
BOOL horz, BOOL topLeft, INT btnState) BOOL horz, BOOL topLeft, INT btnState)
{ {
HBRUSH hBrush, hOldBrush; UINT flags;
RECT rc = arrowRect;
TRACE("arrowRect = %s, btnState = %d\n", wine_dbgstr_rect(&arrowRect), btnState); TRACE("rc = %s, btnState = %d\n", wine_dbgstr_rect(&rc), btnState);
if (btnState == PGF_INVISIBLE) if (btnState == PGF_INVISIBLE)
return; return;
@ -232,54 +127,26 @@ PAGER_DrawButton(HDC hdc, COLORREF clrBk, RECT arrowRect,
if ((rc.right - rc.left <= 0) || (rc.bottom - rc.top <= 0)) if ((rc.right - rc.left <= 0) || (rc.bottom - rc.top <= 0))
return; return;
hBrush = CreateSolidBrush(clrBk); if (horz)
hOldBrush = SelectObject(hdc, hBrush); flags = topLeft ? DFCS_SCROLLLEFT : DFCS_SCROLLRIGHT;
else
flags = topLeft ? DFCS_SCROLLUP : DFCS_SCROLLDOWN;
FillRect(hdc, &rc, hBrush); switch (btnState)
if (btnState == PGF_HOT)
{ {
DrawEdge( hdc, &rc, BDR_RAISEDINNER, BF_RECT); case PGF_HOT:
if (horz) break;
PAGER_DrawHorzArrow(hdc, rc, COLOR_WINDOWFRAME, topLeft); case PGF_NORMAL:
else flags |= DFCS_FLAT;
PAGER_DrawVertArrow(hdc, rc, COLOR_WINDOWFRAME, topLeft); break;
case PGF_DEPRESSED:
flags |= DFCS_PUSHED;
break;
case PGF_GRAYED:
flags |= DFCS_INACTIVE | DFCS_FLAT;
break;
} }
else if (btnState == PGF_NORMAL) DrawFrameControl( hdc, &rc, DFC_SCROLL, flags );
{
DrawEdge (hdc, &rc, BDR_OUTER, BF_FLAT);
if (horz)
PAGER_DrawHorzArrow(hdc, rc, COLOR_WINDOWFRAME, topLeft);
else
PAGER_DrawVertArrow(hdc, rc, COLOR_WINDOWFRAME, topLeft);
}
else if (btnState == PGF_DEPRESSED)
{
DrawEdge( hdc, &rc, BDR_SUNKENOUTER, BF_RECT);
if (horz)
PAGER_DrawHorzArrow(hdc, rc, COLOR_WINDOWFRAME, topLeft);
else
PAGER_DrawVertArrow(hdc, rc, COLOR_WINDOWFRAME, topLeft);
}
else if (btnState == PGF_GRAYED)
{
DrawEdge (hdc, &rc, BDR_OUTER, BF_FLAT);
if (horz)
{
PAGER_DrawHorzArrow(hdc, rc, COLOR_3DHIGHLIGHT, topLeft);
rc.left++, rc.top++; rc.right++, rc.bottom++;
PAGER_DrawHorzArrow(hdc, rc, COLOR_3DSHADOW, topLeft);
}
else
{
PAGER_DrawVertArrow(hdc, rc, COLOR_3DHIGHLIGHT, topLeft);
rc.left++, rc.top++; rc.right++, rc.bottom++;
PAGER_DrawVertArrow(hdc, rc, COLOR_3DSHADOW, topLeft);
}
}
SelectObject( hdc, hOldBrush );
DeleteObject(hBrush);
} }
/* << PAGER_GetDropTarget >> */ /* << PAGER_GetDropTarget >> */
@ -338,22 +205,24 @@ PAGER_GetBkColor(const PAGER_INFO *infoPtr)
} }
static void static void
PAGER_CalcSize (const PAGER_INFO *infoPtr, INT* size, BOOL getWidth) PAGER_CalcSize( PAGER_INFO *infoPtr )
{ {
NMPGCALCSIZE nmpgcs; NMPGCALCSIZE nmpgcs;
ZeroMemory (&nmpgcs, sizeof (NMPGCALCSIZE)); ZeroMemory (&nmpgcs, sizeof (NMPGCALCSIZE));
nmpgcs.hdr.hwndFrom = infoPtr->hwndSelf; nmpgcs.hdr.hwndFrom = infoPtr->hwndSelf;
nmpgcs.hdr.idFrom = GetWindowLongPtrW (infoPtr->hwndSelf, GWLP_ID); nmpgcs.hdr.idFrom = GetWindowLongPtrW (infoPtr->hwndSelf, GWLP_ID);
nmpgcs.hdr.code = PGN_CALCSIZE; nmpgcs.hdr.code = PGN_CALCSIZE;
nmpgcs.dwFlag = getWidth ? PGF_CALCWIDTH : PGF_CALCHEIGHT; nmpgcs.dwFlag = (infoPtr->dwStyle & PGS_HORZ) ? PGF_CALCWIDTH : PGF_CALCHEIGHT;
nmpgcs.iWidth = getWidth ? *size : 0; nmpgcs.iWidth = infoPtr->nWidth;
nmpgcs.iHeight = getWidth ? 0 : *size; nmpgcs.iHeight = infoPtr->nHeight;
SendMessageW (infoPtr->hwndNotify, WM_NOTIFY, nmpgcs.hdr.idFrom, (LPARAM)&nmpgcs); SendMessageW (infoPtr->hwndNotify, WM_NOTIFY, nmpgcs.hdr.idFrom, (LPARAM)&nmpgcs);
*size = getWidth ? nmpgcs.iWidth : nmpgcs.iHeight; if (infoPtr->dwStyle & PGS_HORZ)
infoPtr->nWidth = nmpgcs.iWidth;
else
infoPtr->nHeight = nmpgcs.iHeight;
TRACE("[%p] PGN_CALCSIZE returns %s=%d\n", infoPtr->hwndSelf, TRACE("[%p] PGN_CALCSIZE returns %dx%d\n", infoPtr->hwndSelf, nmpgcs.iWidth, nmpgcs.iHeight );
getWidth ? "width" : "height", *size);
} }
static void static void
@ -414,16 +283,15 @@ PAGER_GetScrollRange(PAGER_INFO* infoPtr)
RECT wndRect; RECT wndRect;
GetWindowRect(infoPtr->hwndSelf, &wndRect); GetWindowRect(infoPtr->hwndSelf, &wndRect);
PAGER_CalcSize(infoPtr);
if (infoPtr->dwStyle & PGS_HORZ) if (infoPtr->dwStyle & PGS_HORZ)
{ {
wndSize = wndRect.right - wndRect.left; wndSize = wndRect.right - wndRect.left;
PAGER_CalcSize(infoPtr, &infoPtr->nWidth, TRUE);
childSize = infoPtr->nWidth; childSize = infoPtr->nWidth;
} }
else else
{ {
wndSize = wndRect.bottom - wndRect.top; wndSize = wndRect.bottom - wndRect.top;
PAGER_CalcSize(infoPtr, &infoPtr->nHeight, FALSE);
childSize = infoPtr->nHeight; childSize = infoPtr->nHeight;
} }
@ -447,9 +315,10 @@ PAGER_UpdateBtns(PAGER_INFO *infoPtr, INT scrollRange, BOOL hideGrayBtns)
RECT rcTopLeft, rcBottomRight; RECT rcTopLeft, rcBottomRight;
/* get button rects */ /* get button rects */
PAGER_GetButtonRects(infoPtr, &rcTopLeft, &rcBottomRight, FALSE); PAGER_GetButtonRects(infoPtr, &rcTopLeft, &rcBottomRight, TRUE);
GetCursorPos(&pt); GetCursorPos(&pt);
ScreenToClient( infoPtr->hwndSelf, &pt );
/* update states based on scroll position */ /* update states based on scroll position */
if (infoPtr->nPos > 0) if (infoPtr->nPos > 0)
@ -457,7 +326,7 @@ PAGER_UpdateBtns(PAGER_INFO *infoPtr, INT scrollRange, BOOL hideGrayBtns)
if (infoPtr->TLbtnState == PGF_INVISIBLE || infoPtr->TLbtnState == PGF_GRAYED) if (infoPtr->TLbtnState == PGF_INVISIBLE || infoPtr->TLbtnState == PGF_GRAYED)
infoPtr->TLbtnState = PGF_NORMAL; infoPtr->TLbtnState = PGF_NORMAL;
} }
else if (PtInRect(&rcTopLeft, pt)) else if (!hideGrayBtns && PtInRect(&rcTopLeft, pt))
infoPtr->TLbtnState = PGF_GRAYED; infoPtr->TLbtnState = PGF_GRAYED;
else else
infoPtr->TLbtnState = PGF_INVISIBLE; infoPtr->TLbtnState = PGF_INVISIBLE;
@ -472,7 +341,7 @@ PAGER_UpdateBtns(PAGER_INFO *infoPtr, INT scrollRange, BOOL hideGrayBtns)
if (infoPtr->BRbtnState == PGF_INVISIBLE || infoPtr->BRbtnState == PGF_GRAYED) if (infoPtr->BRbtnState == PGF_INVISIBLE || infoPtr->BRbtnState == PGF_GRAYED)
infoPtr->BRbtnState = PGF_NORMAL; infoPtr->BRbtnState = PGF_NORMAL;
} }
else if (PtInRect(&rcBottomRight, pt)) else if (!hideGrayBtns && PtInRect(&rcBottomRight, pt))
infoPtr->BRbtnState = PGF_GRAYED; infoPtr->BRbtnState = PGF_GRAYED;
else else
infoPtr->BRbtnState = PGF_INVISIBLE; infoPtr->BRbtnState = PGF_INVISIBLE;
@ -547,68 +416,6 @@ PAGER_WindowPosChanging(PAGER_INFO* infoPtr, WINDOWPOS *winpos)
return DefWindowProcW (infoPtr->hwndSelf, WM_WINDOWPOSCHANGING, 0, (LPARAM)winpos); return DefWindowProcW (infoPtr->hwndSelf, WM_WINDOWPOSCHANGING, 0, (LPARAM)winpos);
} }
static INT
PAGER_SetFixedWidth(PAGER_INFO* infoPtr)
{
/* Must set the non-scrollable dimension to be less than the full height/width
* so that NCCalcSize is called. The Microsoft docs mention 3/4 factor for button
* size, and experimentation shows that the effect is almost right. */
RECT wndRect;
INT delta, h;
GetWindowRect(infoPtr->hwndSelf, &wndRect);
/* see what the app says for btn width */
PAGER_CalcSize(infoPtr, &infoPtr->nWidth, TRUE);
if (infoPtr->dwStyle & CCS_NORESIZE)
{
delta = wndRect.right - wndRect.left - infoPtr->nWidth;
if (delta > infoPtr->nButtonSize)
infoPtr->nWidth += 4 * infoPtr->nButtonSize / 3;
else if (delta > 0)
infoPtr->nWidth += infoPtr->nButtonSize / 3;
}
h = wndRect.bottom - wndRect.top + infoPtr->nButtonSize;
TRACE("[%p] infoPtr->nWidth set to %d\n",
infoPtr->hwndSelf, infoPtr->nWidth);
return h;
}
static INT
PAGER_SetFixedHeight(PAGER_INFO* infoPtr)
{
/* Must set the non-scrollable dimension to be less than the full height/width
* so that NCCalcSize is called. The Microsoft docs mention 3/4 factor for button
* size, and experimentation shows that the effect is almost right. */
RECT wndRect;
INT delta, w;
GetWindowRect(infoPtr->hwndSelf, &wndRect);
/* see what the app says for btn height */
PAGER_CalcSize(infoPtr, &infoPtr->nHeight, FALSE);
if (infoPtr->dwStyle & CCS_NORESIZE)
{
delta = wndRect.bottom - wndRect.top - infoPtr->nHeight;
if (delta > infoPtr->nButtonSize)
infoPtr->nHeight += infoPtr->nButtonSize;
else if (delta > 0)
infoPtr->nHeight += infoPtr->nButtonSize / 3;
}
w = wndRect.right - wndRect.left + infoPtr->nButtonSize;
TRACE("[%p] infoPtr->nHeight set to %d\n",
infoPtr->hwndSelf, infoPtr->nHeight);
return w;
}
/****************************************************************** /******************************************************************
* For the PGM_RECALCSIZE message (but not the other uses in * * For the PGM_RECALCSIZE message (but not the other uses in *
* this module), the native control does only the following: * * this module), the native control does only the following: *
@ -693,28 +500,14 @@ PAGER_SetButtonSize (PAGER_INFO* infoPtr, INT iButtonSize)
static LRESULT static LRESULT
PAGER_SetChild (PAGER_INFO* infoPtr, HWND hwndChild) PAGER_SetChild (PAGER_INFO* infoPtr, HWND hwndChild)
{ {
INT hw;
infoPtr->hwndChild = IsWindow (hwndChild) ? hwndChild : 0; infoPtr->hwndChild = IsWindow (hwndChild) ? hwndChild : 0;
if (infoPtr->hwndChild) if (infoPtr->hwndChild)
{ {
TRACE("[%p] hwndChild=%p\n", infoPtr->hwndSelf, infoPtr->hwndChild); TRACE("[%p] hwndChild=%p\n", infoPtr->hwndSelf, infoPtr->hwndChild);
if (infoPtr->dwStyle & PGS_HORZ) { SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0,
hw = PAGER_SetFixedHeight(infoPtr); SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
/* adjust non-scrollable dimension to fit the child */
SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, hw, infoPtr->nHeight,
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER |
SWP_NOSIZE | SWP_NOACTIVATE);
}
else {
hw = PAGER_SetFixedWidth(infoPtr);
/* adjust non-scrollable dimension to fit the child */
SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, infoPtr->nWidth, hw,
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER |
SWP_NOSIZE | SWP_NOACTIVATE);
}
/* position child within the page scroller */ /* position child within the page scroller */
SetWindowPos(infoPtr->hwndChild, HWND_TOP, SetWindowPos(infoPtr->hwndChild, HWND_TOP,
@ -853,11 +646,12 @@ PAGER_NCCalcSize(PAGER_INFO* infoPtr, WPARAM wParam, LPRECT lpRect)
MapWindowPoints (0, infoPtr->hwndSelf, (LPPOINT)&rcChild, 2); /* FIXME: RECT != 2 POINTS */ MapWindowPoints (0, infoPtr->hwndSelf, (LPPOINT)&rcChild, 2); /* FIXME: RECT != 2 POINTS */
GetWindowRect (infoPtr->hwndSelf, &rcWindow); GetWindowRect (infoPtr->hwndSelf, &rcWindow);
infoPtr->nWidth = lpRect->right - lpRect->left;
infoPtr->nHeight = lpRect->bottom - lpRect->top;
PAGER_CalcSize( infoPtr );
if (infoPtr->dwStyle & PGS_HORZ) if (infoPtr->dwStyle & PGS_HORZ)
{ {
infoPtr->nWidth = lpRect->right - lpRect->left;
PAGER_CalcSize (infoPtr, &infoPtr->nWidth, TRUE);
if (infoPtr->TLbtnState && (lpRect->left + infoPtr->nButtonSize < lpRect->right)) if (infoPtr->TLbtnState && (lpRect->left + infoPtr->nButtonSize < lpRect->right))
lpRect->left += infoPtr->nButtonSize; lpRect->left += infoPtr->nButtonSize;
if (infoPtr->BRbtnState && (lpRect->right - infoPtr->nButtonSize > lpRect->left)) if (infoPtr->BRbtnState && (lpRect->right - infoPtr->nButtonSize > lpRect->left))
@ -865,9 +659,6 @@ PAGER_NCCalcSize(PAGER_INFO* infoPtr, WPARAM wParam, LPRECT lpRect)
} }
else else
{ {
infoPtr->nHeight = lpRect->bottom - lpRect->top;
PAGER_CalcSize (infoPtr, &infoPtr->nHeight, FALSE);
if (infoPtr->TLbtnState && (lpRect->top + infoPtr->nButtonSize < lpRect->bottom)) if (infoPtr->TLbtnState && (lpRect->top + infoPtr->nButtonSize < lpRect->bottom))
lpRect->top += infoPtr->nButtonSize; lpRect->top += infoPtr->nButtonSize;
if (infoPtr->BRbtnState && (lpRect->bottom - infoPtr->nButtonSize > lpRect->top)) if (infoPtr->BRbtnState && (lpRect->bottom - infoPtr->nButtonSize > lpRect->top))

View file

@ -745,7 +745,7 @@ void PROGRESS_Register (void)
ZeroMemory (&wndClass, sizeof(wndClass)); ZeroMemory (&wndClass, sizeof(wndClass));
wndClass.style = CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW; wndClass.style = CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW;
wndClass.lpfnWndProc = (WNDPROC)ProgressWindowProc; wndClass.lpfnWndProc = ProgressWindowProc;
wndClass.cbClsExtra = 0; wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = sizeof (PROGRESS_INFO *); wndClass.cbWndExtra = sizeof (PROGRESS_INFO *);
wndClass.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW); wndClass.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW);

View file

@ -171,6 +171,7 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, const PropSheetInfo* psInfo); static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, const PropSheetInfo* psInfo);
static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg, const PropSheetInfo* psInfo); static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg, const PropSheetInfo* psInfo);
static BOOL PROPSHEET_DoCommand(HWND hwnd, WORD wID); static BOOL PROPSHEET_DoCommand(HWND hwnd, WORD wID);
static BOOL PROPSHEET_RemovePage(HWND hwndDlg, int index, HPROPSHEETPAGE hpage);
static INT_PTR CALLBACK static INT_PTR CALLBACK
PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
@ -554,13 +555,12 @@ static BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEW lppsp,
if (IS_INTRESOURCE( lppsp->pszTitle )) if (IS_INTRESOURCE( lppsp->pszTitle ))
{ {
if (!LoadStringW( lppsp->hInstance, (DWORD_PTR)lppsp->pszTitle,szTitle,sizeof(szTitle)/sizeof(szTitle[0]) )) if (LoadStringW( lppsp->hInstance, (DWORD_PTR)lppsp->pszTitle, szTitle, sizeof(szTitle)/sizeof(szTitle[0]) ))
{
pTitle = pszNull;
FIXME("Could not load resource #%04x?\n",LOWORD(lppsp->pszTitle));
}
else
pTitle = szTitle; pTitle = szTitle;
else if (*p)
pTitle = p;
else
pTitle = pszNull;
} }
else else
pTitle = lppsp->pszTitle; pTitle = lppsp->pszTitle;
@ -1173,7 +1173,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
SendMessageW(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList); SendMessageW(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList);
} }
SendMessageW(GetDlgItem(hwndTabCtrl, IDC_TABCONTROL), WM_SETREDRAW, 0, 0); SendMessageW(hwndTabCtrl, WM_SETREDRAW, 0, 0);
for (i = 0; i < nTabs; i++) for (i = 0; i < nTabs; i++)
{ {
if ( psInfo->proppage[i].hasIcon ) if ( psInfo->proppage[i].hasIcon )
@ -1189,7 +1189,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
item.pszText = (LPWSTR) psInfo->proppage[i].pszText; item.pszText = (LPWSTR) psInfo->proppage[i].pszText;
SendMessageW(hwndTabCtrl, TCM_INSERTITEMW, i, (LPARAM)&item); SendMessageW(hwndTabCtrl, TCM_INSERTITEMW, i, (LPARAM)&item);
} }
SendMessageW(GetDlgItem(hwndTabCtrl, IDC_TABCONTROL), WM_SETREDRAW, 1, 0); SendMessageW(hwndTabCtrl, WM_SETREDRAW, 1, 0);
return TRUE; return TRUE;
} }
@ -1474,6 +1474,9 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent,
/* Free a no more needed copy */ /* Free a no more needed copy */
Free(pTemplateCopy); Free(pTemplateCopy);
if(!hwndPage)
return FALSE;
psInfo->proppage[index].hwndPage = hwndPage; psInfo->proppage[index].hwndPage = hwndPage;
/* Subclass exterior wizard pages */ /* Subclass exterior wizard pages */
@ -2025,7 +2028,14 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
psn.lParam = 0; psn.lParam = 0;
if (!psInfo->proppage[index].hwndPage) { if (!psInfo->proppage[index].hwndPage) {
PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage); if(!PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage)) {
PROPSHEET_RemovePage(hwndDlg, index, NULL);
if(index >= psInfo->nPages)
index--;
if(index < 0)
return FALSE;
continue;
}
} }
/* Resize the property sheet page to the fit in the Tab control /* Resize the property sheet page to the fit in the Tab control
@ -2273,7 +2283,8 @@ static BOOL PROPSHEET_AddPage(HWND hwndDlg,
if (ppsp->dwFlags & PSP_PREMATURE) if (ppsp->dwFlags & PSP_PREMATURE)
{ {
/* Create the page but don't show it */ /* Create the page but don't show it */
PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp); if(!PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp))
return FALSE;
} }
/* /*

View file

@ -2135,8 +2135,10 @@ REBAR_HandleUDDrag (REBAR_INFO *infoPtr, const POINT *ptsmove)
if(yOff < 0) if(yOff < 0)
{ {
/* Place the band above the current top row */ /* Place the band above the current top row */
if(iHitBand==0 && (infoPtr->uNumBands==1 || REBAR_GetBand(infoPtr, 1)->fStyle&RBBS_BREAK))
return;
DPA_DeletePtr(infoPtr->bands, iHitBand); DPA_DeletePtr(infoPtr->bands, iHitBand);
hitBand->fStyle &= RBBS_BREAK; hitBand->fStyle &= ~RBBS_BREAK;
REBAR_GetBand(infoPtr, 0)->fStyle |= RBBS_BREAK; REBAR_GetBand(infoPtr, 0)->fStyle |= RBBS_BREAK;
infoPtr->iGrabbedBand = DPA_InsertPtr( infoPtr->iGrabbedBand = DPA_InsertPtr(
infoPtr->bands, 0, hitBand); infoPtr->bands, 0, hitBand);
@ -2144,6 +2146,8 @@ REBAR_HandleUDDrag (REBAR_INFO *infoPtr, const POINT *ptsmove)
else if(yOff > REBAR_GetBand(infoPtr, infoPtr->uNumBands - 1)->rcBand.bottom) else if(yOff > REBAR_GetBand(infoPtr, infoPtr->uNumBands - 1)->rcBand.bottom)
{ {
/* Place the band below the current bottom row */ /* Place the band below the current bottom row */
if(iHitBand == infoPtr->uNumBands-1 && hitBand->fStyle&RBBS_BREAK)
return;
DPA_DeletePtr(infoPtr->bands, iHitBand); DPA_DeletePtr(infoPtr->bands, iHitBand);
hitBand->fStyle |= RBBS_BREAK; hitBand->fStyle |= RBBS_BREAK;
infoPtr->iGrabbedBand = DPA_InsertPtr( infoPtr->iGrabbedBand = DPA_InsertPtr(

View file

@ -1284,7 +1284,7 @@ StatusWindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return STATUSBAR_WMGetText (infoPtr, (INT)wParam, (LPWSTR)lParam); return STATUSBAR_WMGetText (infoPtr, (INT)wParam, (LPWSTR)lParam);
case WM_GETTEXTLENGTH: case WM_GETTEXTLENGTH:
return STATUSBAR_GetTextLength (infoPtr, 0); return LOWORD(STATUSBAR_GetTextLength (infoPtr, 0));
case WM_LBUTTONDBLCLK: case WM_LBUTTONDBLCLK:
return STATUSBAR_SendMouseNotify(infoPtr, NM_DBLCLK, msg, wParam, lParam); return STATUSBAR_SendMouseNotify(infoPtr, NM_DBLCLK, msg, wParam, lParam);

View file

@ -77,7 +77,7 @@ static BOOL COMCTL32_ChrCmpHelperA(WORD ch1, WORD ch2, DWORD dwFlags)
else else
str2[1] = '\0'; str2[1] = '\0';
return CompareStringA(GetThreadLocale(), dwFlags, str1, -1, str2, -1) - 2; return CompareStringA(GetThreadLocale(), dwFlags, str1, -1, str2, -1) - CSTR_EQUAL;
} }
/************************************************************************* /*************************************************************************
@ -117,7 +117,7 @@ static BOOL COMCTL32_ChrCmpIA(WORD ch1, WORD ch2)
*/ */
static inline BOOL COMCTL32_ChrCmpIW(WCHAR ch1, WCHAR ch2) static inline BOOL COMCTL32_ChrCmpIW(WCHAR ch1, WCHAR ch2)
{ {
return CompareStringW(GetThreadLocale(), NORM_IGNORECASE, &ch1, 1, &ch2, 1) - 2; return CompareStringW(GetThreadLocale(), NORM_IGNORECASE, &ch1, 1, &ch2, 1) - CSTR_EQUAL;
} }
/************************************************************************** /**************************************************************************
@ -299,12 +299,8 @@ LPSTR WINAPI StrChrA(LPCSTR lpszStr, WORD ch)
*/ */
INT WINAPI StrCmpNIA(LPCSTR lpszStr, LPCSTR lpszComp, INT iLen) INT WINAPI StrCmpNIA(LPCSTR lpszStr, LPCSTR lpszComp, INT iLen)
{ {
INT iRet;
TRACE("(%s,%s,%i)\n", debugstr_a(lpszStr), debugstr_a(lpszComp), iLen); TRACE("(%s,%s,%i)\n", debugstr_a(lpszStr), debugstr_a(lpszComp), iLen);
return CompareStringA(GetThreadLocale(), NORM_IGNORECASE, lpszStr, iLen, lpszComp, iLen) - CSTR_EQUAL;
iRet = CompareStringA(GetThreadLocale(), NORM_IGNORECASE, lpszStr, iLen, lpszComp, iLen);
return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0;
} }
/************************************************************************* /*************************************************************************
@ -314,12 +310,8 @@ INT WINAPI StrCmpNIA(LPCSTR lpszStr, LPCSTR lpszComp, INT iLen)
*/ */
INT WINAPI StrCmpNIW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen) INT WINAPI StrCmpNIW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen)
{ {
INT iRet;
TRACE("(%s,%s,%i)\n", debugstr_w(lpszStr), debugstr_w(lpszComp), iLen); TRACE("(%s,%s,%i)\n", debugstr_w(lpszStr), debugstr_w(lpszComp), iLen);
return CompareStringW(GetThreadLocale(), NORM_IGNORECASE, lpszStr, iLen, lpszComp, iLen) - CSTR_EQUAL;
iRet = CompareStringW(GetThreadLocale(), NORM_IGNORECASE, lpszStr, iLen, lpszComp, iLen);
return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0;
} }
/************************************************************************* /*************************************************************************
@ -496,12 +488,8 @@ LPWSTR WINAPI StrChrW(LPCWSTR lpszStr, WCHAR ch)
*/ */
INT WINAPI StrCmpNA(LPCSTR lpszStr, LPCSTR lpszComp, INT iLen) INT WINAPI StrCmpNA(LPCSTR lpszStr, LPCSTR lpszComp, INT iLen)
{ {
INT iRet;
TRACE("(%s,%s,%i)\n", debugstr_a(lpszStr), debugstr_a(lpszComp), iLen); TRACE("(%s,%s,%i)\n", debugstr_a(lpszStr), debugstr_a(lpszComp), iLen);
return CompareStringA(GetThreadLocale(), 0, lpszStr, iLen, lpszComp, iLen) - CSTR_EQUAL;
iRet = CompareStringA(GetThreadLocale(), 0, lpszStr, iLen, lpszComp, iLen);
return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0;
} }
/************************************************************************** /**************************************************************************
@ -511,12 +499,8 @@ INT WINAPI StrCmpNA(LPCSTR lpszStr, LPCSTR lpszComp, INT iLen)
*/ */
INT WINAPI StrCmpNW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen) INT WINAPI StrCmpNW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen)
{ {
INT iRet;
TRACE("(%s,%s,%i)\n", debugstr_w(lpszStr), debugstr_w(lpszComp), iLen); TRACE("(%s,%s,%i)\n", debugstr_w(lpszStr), debugstr_w(lpszComp), iLen);
return CompareStringW(GetThreadLocale(), 0, lpszStr, iLen, lpszComp, iLen) - CSTR_EQUAL;
iRet = CompareStringW(GetThreadLocale(), 0, lpszStr, iLen, lpszComp, iLen);
return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0;
} }
/************************************************************************** /**************************************************************************
@ -877,10 +861,11 @@ BOOL WINAPI IntlStrEqWorkerA(BOOL bCase, LPCSTR lpszStr, LPCSTR lpszComp,
TRACE("(%d,%s,%s,%d)\n", bCase, TRACE("(%d,%s,%s,%d)\n", bCase,
debugstr_a(lpszStr), debugstr_a(lpszComp), iLen); debugstr_a(lpszStr), debugstr_a(lpszComp), iLen);
/* FIXME: These flags are undocumented and unknown by our CompareString. /* FIXME: This flag is undocumented and unknown by our CompareString.
* We need defines for them. * We need a define for it.
*/ */
dwFlags |= bCase ? 0x10000000 : 0x10000001; dwFlags = 0x10000000;
if (!bCase) dwFlags |= NORM_IGNORECASE;
iRet = CompareStringA(GetThreadLocale(), iRet = CompareStringA(GetThreadLocale(),
dwFlags, lpszStr, iLen, lpszComp, iLen); dwFlags, lpszStr, iLen, lpszComp, iLen);
@ -888,7 +873,7 @@ BOOL WINAPI IntlStrEqWorkerA(BOOL bCase, LPCSTR lpszStr, LPCSTR lpszComp,
if (!iRet) if (!iRet)
iRet = CompareStringA(2048, dwFlags, lpszStr, iLen, lpszComp, iLen); iRet = CompareStringA(2048, dwFlags, lpszStr, iLen, lpszComp, iLen);
return iRet == 2 ? TRUE : FALSE; return iRet == CSTR_EQUAL;
} }
/************************************************************************* /*************************************************************************
@ -905,10 +890,11 @@ BOOL WINAPI IntlStrEqWorkerW(BOOL bCase, LPCWSTR lpszStr, LPCWSTR lpszComp,
TRACE("(%d,%s,%s,%d)\n", bCase, TRACE("(%d,%s,%s,%d)\n", bCase,
debugstr_w(lpszStr),debugstr_w(lpszComp), iLen); debugstr_w(lpszStr),debugstr_w(lpszComp), iLen);
/* FIXME: These flags are undocumented and unknown by our CompareString. /* FIXME: This flag is undocumented and unknown by our CompareString.
* We need defines for them. * We need a define for it.
*/ */
dwFlags = bCase ? 0x10000000 : 0x10000001; dwFlags = 0x10000000;
if (!bCase) dwFlags |= NORM_IGNORECASE;
iRet = CompareStringW(GetThreadLocale(), iRet = CompareStringW(GetThreadLocale(),
dwFlags, lpszStr, iLen, lpszComp, iLen); dwFlags, lpszStr, iLen, lpszComp, iLen);
@ -916,5 +902,5 @@ BOOL WINAPI IntlStrEqWorkerW(BOOL bCase, LPCWSTR lpszStr, LPCWSTR lpszComp,
if (!iRet) if (!iRet)
iRet = CompareStringW(2048, dwFlags, lpszStr, iLen, lpszComp, iLen); iRet = CompareStringW(2048, dwFlags, lpszStr, iLen, lpszComp, iLen);
return iRet == 2 ? TRUE : FALSE; return iRet == CSTR_EQUAL;
} }

View file

@ -2879,14 +2879,13 @@ static LRESULT TAB_DeleteItem (TAB_INFO *infoPtr, INT iItem)
if (iItem < 0 || iItem >= infoPtr->uNumItem) return FALSE; if (iItem < 0 || iItem >= infoPtr->uNumItem) return FALSE;
TAB_InvalidateTabArea(infoPtr);
item = TAB_GetItem(infoPtr, iItem); item = TAB_GetItem(infoPtr, iItem);
Free(item->pszText); Free(item->pszText);
Free(item); Free(item);
infoPtr->uNumItem--; infoPtr->uNumItem--;
DPA_DeletePtr(infoPtr->items, iItem); DPA_DeletePtr(infoPtr->items, iItem);
TAB_InvalidateTabArea(infoPtr);
if (infoPtr->uNumItem == 0) if (infoPtr->uNumItem == 0)
{ {
if (infoPtr->iHotTracked >= 0) if (infoPtr->iHotTracked >= 0)
@ -3021,7 +3020,7 @@ static LRESULT TAB_Create (HWND hwnd, LPARAM lParam)
TEXTMETRICW fontMetrics; TEXTMETRICW fontMetrics;
HDC hdc; HDC hdc;
HFONT hOldFont; HFONT hOldFont;
DWORD dwStyle; DWORD style;
infoPtr = Alloc (sizeof(TAB_INFO)); infoPtr = Alloc (sizeof(TAB_INFO));
@ -3055,11 +3054,13 @@ static LRESULT TAB_Create (HWND hwnd, LPARAM lParam)
/* The tab control always has the WS_CLIPSIBLINGS style. Even /* The tab control always has the WS_CLIPSIBLINGS style. Even
if you don't specify it in CreateWindow. This is necessary in if you don't specify it in CreateWindow. This is necessary in
order for paint to work correctly. This follows windows behaviour. */ order for paint to work correctly. This follows windows behaviour. */
dwStyle = GetWindowLongW(hwnd, GWL_STYLE); style = GetWindowLongW(hwnd, GWL_STYLE);
SetWindowLongW(hwnd, GWL_STYLE, dwStyle|WS_CLIPSIBLINGS); if (style & TCS_VERTICAL) style |= TCS_MULTILINE;
style |= WS_CLIPSIBLINGS;
SetWindowLongW(hwnd, GWL_STYLE, style);
infoPtr->dwStyle = dwStyle | WS_CLIPSIBLINGS; infoPtr->dwStyle = style;
infoPtr->exStyle = (dwStyle & TCS_FLATBUTTONS) ? TCS_EX_FLATSEPARATORS : 0; infoPtr->exStyle = (style & TCS_FLATBUTTONS) ? TCS_EX_FLATSEPARATORS : 0;
if (infoPtr->dwStyle & TCS_TOOLTIPS) { if (infoPtr->dwStyle & TCS_TOOLTIPS) {
/* Create tooltip control */ /* Create tooltip control */

View file

@ -217,9 +217,6 @@ typedef enum
#define TOOLBAR_NOWHERE (-1) #define TOOLBAR_NOWHERE (-1)
#define TOOLBAR_HasText(x, y) (TOOLBAR_GetText(x, y) ? TRUE : FALSE)
#define TOOLBAR_HasDropDownArrows(exStyle) ((exStyle & TBSTYLE_EX_DRAWDDARROWS) ? TRUE : FALSE)
/* Used to find undocumented extended styles */ /* Used to find undocumented extended styles */
#define TBSTYLE_EX_ALL (TBSTYLE_EX_DRAWDDARROWS | \ #define TBSTYLE_EX_ALL (TBSTYLE_EX_DRAWDDARROWS | \
TBSTYLE_EX_UNDOC1 | \ TBSTYLE_EX_UNDOC1 | \
@ -258,6 +255,11 @@ static inline int default_top_margin(const TOOLBAR_INFO *infoPtr)
return (infoPtr->dwStyle & TBSTYLE_FLAT ? 0 : TOP_BORDER); return (infoPtr->dwStyle & TBSTYLE_FLAT ? 0 : TOP_BORDER);
} }
static inline BOOL TOOLBAR_HasDropDownArrows(DWORD exStyle)
{
return (exStyle & TBSTYLE_EX_DRAWDDARROWS) != 0;
}
static LPWSTR static LPWSTR
TOOLBAR_GetText(const TOOLBAR_INFO *infoPtr, const TBUTTON_INFO *btnPtr) TOOLBAR_GetText(const TOOLBAR_INFO *infoPtr, const TBUTTON_INFO *btnPtr)
{ {
@ -428,7 +430,7 @@ TOOLBAR_GetImageListForDrawing (const TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPt
if (!TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) { if (!TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) {
if (btnPtr->iBitmap == I_IMAGENONE) return NULL; if (btnPtr->iBitmap == I_IMAGENONE) return NULL;
ERR("bitmap for ID %d, index %d is not valid, number of bitmaps in imagelist: %d\n", WARN("bitmap for ID %d, index %d is not valid, number of bitmaps in imagelist: %d\n",
HIWORD(btnPtr->iBitmap), LOWORD(btnPtr->iBitmap), infoPtr->nNumBitmaps); HIWORD(btnPtr->iBitmap), LOWORD(btnPtr->iBitmap), infoPtr->nNumBitmaps);
return NULL; return NULL;
} }
@ -1247,7 +1249,7 @@ TOOLBAR_CalcStrings (const TOOLBAR_INFO *infoPtr, LPSIZE lpSize)
btnPtr = infoPtr->buttons; btnPtr = infoPtr->buttons;
for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) { for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
if(TOOLBAR_HasText(infoPtr, btnPtr)) if(TOOLBAR_GetText(infoPtr, btnPtr))
{ {
TOOLBAR_MeasureString(infoPtr, btnPtr, hdc, &sz); TOOLBAR_MeasureString(infoPtr, btnPtr, hdc, &sz);
if (sz.cx > lpSize->cx) if (sz.cx > lpSize->cx)
@ -1775,11 +1777,14 @@ TOOLBAR_LayoutToolbar(TOOLBAR_INFO *infoPtr)
static INT static INT
TOOLBAR_InternalHitTest (const TOOLBAR_INFO *infoPtr, const POINT *lpPt) TOOLBAR_InternalHitTest (const TOOLBAR_INFO *infoPtr, const POINT *lpPt, BOOL *button)
{ {
TBUTTON_INFO *btnPtr; TBUTTON_INFO *btnPtr;
INT i; INT i;
if (button)
*button = FALSE;
btnPtr = infoPtr->buttons; btnPtr = infoPtr->buttons;
for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) { for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
if (btnPtr->fsState & TBSTATE_HIDDEN) if (btnPtr->fsState & TBSTATE_HIDDEN)
@ -1794,6 +1799,8 @@ TOOLBAR_InternalHitTest (const TOOLBAR_INFO *infoPtr, const POINT *lpPt)
else { else {
if (PtInRect (&btnPtr->rect, *lpPt)) { if (PtInRect (&btnPtr->rect, *lpPt)) {
TRACE(" ON BUTTON %d!\n", i); TRACE(" ON BUTTON %d!\n", i);
if (button)
*button = TRUE;
return i; return i;
} }
} }
@ -2399,7 +2406,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
nmtb.tbButton.iString >= 0 ? debugstr_w(infoPtr->strings[nmtb.tbButton.iString]) nmtb.tbButton.iString >= 0 ? debugstr_w(infoPtr->strings[nmtb.tbButton.iString])
: ""); : "");
/* insert button into the apropriate list */ /* insert button into the appropriate list */
index = TOOLBAR_GetButtonIndex (custInfo->tbInfo, nmtb.tbButton.idCommand, FALSE); index = TOOLBAR_GetButtonIndex (custInfo->tbInfo, nmtb.tbButton.idCommand, FALSE);
if (index == -1) if (index == -1)
{ {
@ -3133,7 +3140,7 @@ TOOLBAR_CheckButton (TOOLBAR_INFO *infoPtr, INT Id, LPARAM lParam)
btnPtr = &infoPtr->buttons[nIndex]; btnPtr = &infoPtr->buttons[nIndex];
bChecked = (btnPtr->fsState & TBSTATE_CHECKED) ? TRUE : FALSE; bChecked = (btnPtr->fsState & TBSTATE_CHECKED) != 0;
if (LOWORD(lParam) == FALSE) if (LOWORD(lParam) == FALSE)
btnPtr->fsState &= ~TBSTATE_CHECKED; btnPtr->fsState &= ~TBSTATE_CHECKED;
@ -3664,7 +3671,7 @@ TOOLBAR_HideButton (TOOLBAR_INFO *infoPtr, INT Id, BOOL fHide)
static inline LRESULT static inline LRESULT
TOOLBAR_HitTest (const TOOLBAR_INFO *infoPtr, const POINT* lpPt) TOOLBAR_HitTest (const TOOLBAR_INFO *infoPtr, const POINT* lpPt)
{ {
return TOOLBAR_InternalHitTest (infoPtr, lpPt); return TOOLBAR_InternalHitTest (infoPtr, lpPt, NULL);
} }
@ -4481,20 +4488,22 @@ TOOLBAR_SetDrawTextFlags (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
* (MSDN says that this parameter is reserved) * (MSDN says that this parameter is reserved)
*/ */
static LRESULT static LRESULT
TOOLBAR_SetExtendedStyle (TOOLBAR_INFO *infoPtr, LPARAM lParam) TOOLBAR_SetExtendedStyle (TOOLBAR_INFO *infoPtr, DWORD mask, DWORD style)
{ {
DWORD dwOldStyle; DWORD old_style = infoPtr->dwExStyle;
dwOldStyle = infoPtr->dwExStyle; TRACE("mask=0x%08x, style=0x%08x\n", mask, style);
infoPtr->dwExStyle = (DWORD)lParam;
TRACE("new style 0x%08x\n", infoPtr->dwExStyle); if (mask)
infoPtr->dwExStyle = (old_style & ~mask) | (style & mask);
else
infoPtr->dwExStyle = style;
if (infoPtr->dwExStyle & ~TBSTYLE_EX_ALL) if (infoPtr->dwExStyle & ~TBSTYLE_EX_ALL)
FIXME("Unknown Toolbar Extended Style 0x%08x. Please report.\n", FIXME("Unknown Toolbar Extended Style 0x%08x. Please report.\n",
(infoPtr->dwExStyle & ~TBSTYLE_EX_ALL)); (infoPtr->dwExStyle & ~TBSTYLE_EX_ALL));
if ((dwOldStyle ^ infoPtr->dwExStyle) & TBSTYLE_EX_MIXEDBUTTONS) if ((old_style ^ infoPtr->dwExStyle) & TBSTYLE_EX_MIXEDBUTTONS)
TOOLBAR_CalcToolbar(infoPtr); TOOLBAR_CalcToolbar(infoPtr);
else else
TOOLBAR_LayoutToolbar(infoPtr); TOOLBAR_LayoutToolbar(infoPtr);
@ -4502,7 +4511,7 @@ TOOLBAR_SetExtendedStyle (TOOLBAR_INFO *infoPtr, LPARAM lParam)
TOOLBAR_AutoSize(infoPtr); TOOLBAR_AutoSize(infoPtr);
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE); InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
return (LRESULT)dwOldStyle; return old_style;
} }
@ -5155,7 +5164,7 @@ TOOLBAR_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
TRACE("hwnd = %p, style=0x%08x\n", hwnd, lpcs->style); TRACE("hwnd = %p, style=0x%08x\n", hwnd, lpcs->style);
infoPtr->dwStyle = lpcs->style; infoPtr->dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
GetClientRect(hwnd, &infoPtr->client_rect); GetClientRect(hwnd, &infoPtr->client_rect);
infoPtr->bUnicode = infoPtr->hwndNotify && infoPtr->bUnicode = infoPtr->hwndNotify &&
(NFR_UNICODE == SendMessageW(hwnd, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_REQUERY)); (NFR_UNICODE == SendMessageW(hwnd, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_REQUERY));
@ -5374,13 +5383,13 @@ static LRESULT
TOOLBAR_LButtonDblClk (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) TOOLBAR_LButtonDblClk (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{ {
POINT pt; POINT pt;
INT nHit; BOOL button;
pt.x = (short)LOWORD(lParam); pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam); pt.y = (short)HIWORD(lParam);
nHit = TOOLBAR_InternalHitTest (infoPtr, &pt); TOOLBAR_InternalHitTest (infoPtr, &pt, &button);
if (nHit >= 0) if (button)
TOOLBAR_LButtonDown (infoPtr, wParam, lParam); TOOLBAR_LButtonDown (infoPtr, wParam, lParam);
else if (infoPtr->dwStyle & CCS_ADJUSTABLE) else if (infoPtr->dwStyle & CCS_ADJUSTABLE)
TOOLBAR_Customize (infoPtr); TOOLBAR_Customize (infoPtr);
@ -5398,6 +5407,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
NMTOOLBARA nmtb; NMTOOLBARA nmtb;
NMMOUSE nmmouse; NMMOUSE nmmouse;
BOOL bDragKeyPressed; BOOL bDragKeyPressed;
BOOL button;
TRACE("\n"); TRACE("\n");
@ -5412,11 +5422,12 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
pt.x = (short)LOWORD(lParam); pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam); pt.y = (short)HIWORD(lParam);
nHit = TOOLBAR_InternalHitTest (infoPtr, &pt); nHit = TOOLBAR_InternalHitTest (infoPtr, &pt, &button);
btnPtr = &infoPtr->buttons[nHit]; if (button)
btnPtr = &infoPtr->buttons[nHit];
if ((nHit >= 0) && bDragKeyPressed && (infoPtr->dwStyle & CCS_ADJUSTABLE)) if (button && bDragKeyPressed && (infoPtr->dwStyle & CCS_ADJUSTABLE))
{ {
infoPtr->nButtonDrag = nHit; infoPtr->nButtonDrag = nHit;
SetCapture (infoPtr->hwndSelf); SetCapture (infoPtr->hwndSelf);
@ -5427,7 +5438,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
hCursorDrag = LoadCursorW(COMCTL32_hModule, (LPCWSTR)IDC_MOVEBUTTON); hCursorDrag = LoadCursorW(COMCTL32_hModule, (LPCWSTR)IDC_MOVEBUTTON);
SetCursor(hCursorDrag); SetCursor(hCursorDrag);
} }
else if (nHit >= 0) else if (button)
{ {
RECT arrowRect; RECT arrowRect;
infoPtr->nOldHit = nHit; infoPtr->nOldHit = nHit;
@ -5474,9 +5485,9 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
* NOTE: native doesn't do this, but that is a bug */ * NOTE: native doesn't do this, but that is a bug */
GetCursorPos(&pt); GetCursorPos(&pt);
ScreenToClient(infoPtr->hwndSelf, &pt); ScreenToClient(infoPtr->hwndSelf, &pt);
nHit = TOOLBAR_InternalHitTest(infoPtr, &pt); nHit = TOOLBAR_InternalHitTest(infoPtr, &pt, &button);
if (!infoPtr->bAnchor || (nHit >= 0)) if (!infoPtr->bAnchor || button)
TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); TOOLBAR_SetHotItemEx(infoPtr, button ? nHit : TOOLBAR_NOWHERE, HICF_MOUSE | HICF_LMOUSE);
/* remove any left mouse button down or double-click messages /* remove any left mouse button down or double-click messages
* so that we can get a toggle effect on the button */ * so that we can get a toggle effect on the button */
@ -5494,7 +5505,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
btnPtr->fsState |= TBSTATE_PRESSED; btnPtr->fsState |= TBSTATE_PRESSED;
TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); TOOLBAR_SetHotItemEx(infoPtr, button ? nHit : TOOLBAR_NOWHERE, HICF_MOUSE | HICF_LMOUSE);
if (btnPtr->fsState & TBSTATE_ENABLED) if (btnPtr->fsState & TBSTATE_ENABLED)
InvalidateRect(infoPtr->hwndSelf, &btnPtr->rect, TRUE); InvalidateRect(infoPtr->hwndSelf, &btnPtr->rect, TRUE);
@ -5502,7 +5513,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
SetCapture (infoPtr->hwndSelf); SetCapture (infoPtr->hwndSelf);
} }
if (nHit >=0) if (button)
{ {
memset(&nmtb, 0, sizeof(nmtb)); memset(&nmtb, 0, sizeof(nmtb));
nmtb.iItem = btnPtr->idCommand; nmtb.iItem = btnPtr->idCommand;
@ -5512,7 +5523,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
nmmouse.dwHitInfo = nHit; nmmouse.dwHitInfo = nHit;
/* !!! Undocumented - sends NM_LDOWN with the NMMOUSE structure. */ /* !!! Undocumented - sends NM_LDOWN with the NMMOUSE structure. */
if (nHit < 0) if (!button)
nmmouse.dwItemSpec = -1; nmmouse.dwItemSpec = -1;
else else
{ {
@ -5539,6 +5550,7 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
NMHDR hdr; NMHDR hdr;
NMMOUSE nmmouse; NMMOUSE nmmouse;
NMTOOLBARA nmtb; NMTOOLBARA nmtb;
BOOL button;
if (infoPtr->hwndToolTip) if (infoPtr->hwndToolTip)
TOOLBAR_RelayEvent (infoPtr->hwndToolTip, infoPtr->hwndSelf, TOOLBAR_RelayEvent (infoPtr->hwndToolTip, infoPtr->hwndSelf,
@ -5546,10 +5558,10 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
pt.x = (short)LOWORD(lParam); pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam); pt.y = (short)HIWORD(lParam);
nHit = TOOLBAR_InternalHitTest (infoPtr, &pt); nHit = TOOLBAR_InternalHitTest (infoPtr, &pt, &button);
if (!infoPtr->bAnchor || (nHit >= 0)) if (!infoPtr->bAnchor || button)
TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); TOOLBAR_SetHotItemEx(infoPtr, button ? nHit : TOOLBAR_NOWHERE, HICF_MOUSE | HICF_LMOUSE);
if (infoPtr->nButtonDrag >= 0) { if (infoPtr->nButtonDrag >= 0) {
RECT rcClient; RECT rcClient;
@ -5609,7 +5621,7 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
} }
/* button under cursor changed so need to re-set hot item */ /* button under cursor changed so need to re-set hot item */
TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); TOOLBAR_SetHotItemEx(infoPtr, button ? nHit : TOOLBAR_NOWHERE, HICF_MOUSE | HICF_LMOUSE);
infoPtr->nButtonDrag = -1; infoPtr->nButtonDrag = -1;
TOOLBAR_SendNotify(&hdr, infoPtr, TBN_TOOLBARCHANGE); TOOLBAR_SendNotify(&hdr, infoPtr, TBN_TOOLBARCHANGE);
@ -5674,7 +5686,7 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
* NM_CLICK with the NMMOUSE structure. */ * NM_CLICK with the NMMOUSE structure. */
nmmouse.dwHitInfo = nHit; nmmouse.dwHitInfo = nHit;
if (nHit < 0) if (!button)
nmmouse.dwItemSpec = -1; nmmouse.dwItemSpec = -1;
else else
{ {
@ -5697,14 +5709,15 @@ TOOLBAR_RButtonUp(TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
INT nHit; INT nHit;
NMMOUSE nmmouse; NMMOUSE nmmouse;
POINT pt; POINT pt;
BOOL button;
pt.x = (short)LOWORD(lParam); pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam); pt.y = (short)HIWORD(lParam);
nHit = TOOLBAR_InternalHitTest(infoPtr, &pt); nHit = TOOLBAR_InternalHitTest(infoPtr, &pt, &button);
nmmouse.dwHitInfo = nHit; nmmouse.dwHitInfo = nHit;
if (nHit < 0) { if (!button) {
nmmouse.dwItemSpec = -1; nmmouse.dwItemSpec = -1;
} else { } else {
nmmouse.dwItemSpec = infoPtr->buttons[nmmouse.dwHitInfo].idCommand; nmmouse.dwItemSpec = infoPtr->buttons[nmmouse.dwHitInfo].idCommand;
@ -5803,6 +5816,7 @@ TOOLBAR_MouseMove (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
TRACKMOUSEEVENT trackinfo; TRACKMOUSEEVENT trackinfo;
INT nHit; INT nHit;
TBUTTON_INFO *btnPtr; TBUTTON_INFO *btnPtr;
BOOL button;
if ((infoPtr->dwStyle & TBSTYLE_TOOLTIPS) && (infoPtr->hwndToolTip == NULL)) if ((infoPtr->dwStyle & TBSTYLE_TOOLTIPS) && (infoPtr->hwndToolTip == NULL))
TOOLBAR_TooltipCreateControl(infoPtr); TOOLBAR_TooltipCreateControl(infoPtr);
@ -5833,11 +5847,11 @@ TOOLBAR_MouseMove (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
pt.x = (short)LOWORD(lParam); pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam); pt.y = (short)HIWORD(lParam);
nHit = TOOLBAR_InternalHitTest (infoPtr, &pt); nHit = TOOLBAR_InternalHitTest (infoPtr, &pt, &button);
if (((infoPtr->dwStyle & TBSTYLE_FLAT) || GetWindowTheme (infoPtr->hwndSelf)) if (((infoPtr->dwStyle & TBSTYLE_FLAT) || GetWindowTheme (infoPtr->hwndSelf))
&& (!infoPtr->bAnchor || (nHit >= 0))) && (!infoPtr->bAnchor || button))
TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE); TOOLBAR_SetHotItemEx(infoPtr, button ? nHit : TOOLBAR_NOWHERE, HICF_MOUSE);
if (infoPtr->nOldHit != nHit) if (infoPtr->nOldHit != nHit)
{ {
@ -6629,7 +6643,7 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_SetDrawTextFlags (infoPtr, wParam, lParam); return TOOLBAR_SetDrawTextFlags (infoPtr, wParam, lParam);
case TB_SETEXTENDEDSTYLE: case TB_SETEXTENDEDSTYLE:
return TOOLBAR_SetExtendedStyle (infoPtr, lParam); return TOOLBAR_SetExtendedStyle (infoPtr, wParam, lParam);
case TB_SETHOTIMAGELIST: case TB_SETHOTIMAGELIST:
return TOOLBAR_SetHotImageList (infoPtr, wParam, (HIMAGELIST)lParam); return TOOLBAR_SetHotImageList (infoPtr, wParam, (HIMAGELIST)lParam);

View file

@ -171,6 +171,8 @@ typedef struct
#define ICON_HEIGHT 16 #define ICON_HEIGHT 16
#define ICON_WIDTH 16 #define ICON_WIDTH 16
#define MAX_TEXT_SIZE_A 80 /* maximum retrieving text size by ANSI message */
static LRESULT CALLBACK static LRESULT CALLBACK
TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uId, DWORD_PTR dwRef); TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uId, DWORD_PTR dwRef);
@ -943,6 +945,22 @@ TOOLTIPS_GetToolFromPoint (const TOOLTIPS_INFO *infoPtr, HWND hwnd, const POINT
return -1; return -1;
} }
static inline void
TOOLTIPS_CopyInfoT (const TTTOOL_INFO *toolPtr, TTTOOLINFOW *ti, BOOL isW)
{
if (ti->lpszText) {
if (toolPtr->lpszText == NULL ||
IS_INTRESOURCE(toolPtr->lpszText) ||
toolPtr->lpszText == LPSTR_TEXTCALLBACKW)
ti->lpszText = toolPtr->lpszText;
else if (isW)
strcpyW (ti->lpszText, toolPtr->lpszText);
else
/* ANSI version, the buffer is maximum 80 bytes without null. */
WideCharToMultiByte(CP_ACP, 0, toolPtr->lpszText, -1,
(LPSTR)ti->lpszText, MAX_TEXT_SIZE_A, NULL, NULL);
}
}
static BOOL static BOOL
TOOLTIPS_IsWindowActive (HWND hwnd) TOOLTIPS_IsWindowActive (HWND hwnd)
@ -1199,8 +1217,7 @@ TOOLTIPS_EnumToolsT (const TOOLTIPS_INFO *infoPtr, UINT uIndex, TTTOOLINFOW *ti,
ti->uId = toolPtr->uId; ti->uId = toolPtr->uId;
ti->rect = toolPtr->rect; ti->rect = toolPtr->rect;
ti->hinst = toolPtr->hinst; ti->hinst = toolPtr->hinst;
/* ti->lpszText = toolPtr->lpszText; */ TOOLTIPS_CopyInfoT (toolPtr, ti, isW);
ti->lpszText = NULL; /* FIXME */
if (ti->cbSize >= TTTOOLINFOA_V2_SIZE) if (ti->cbSize >= TTTOOLINFOA_V2_SIZE)
ti->lParam = toolPtr->lParam; ti->lParam = toolPtr->lParam;
@ -1246,8 +1263,7 @@ TOOLTIPS_GetCurrentToolT (const TOOLTIPS_INFO *infoPtr, TTTOOLINFOW *ti, BOOL is
ti->uFlags = toolPtr->uFlags; ti->uFlags = toolPtr->uFlags;
ti->rect = toolPtr->rect; ti->rect = toolPtr->rect;
ti->hinst = toolPtr->hinst; ti->hinst = toolPtr->hinst;
/* ti->lpszText = toolPtr->lpszText; */ TOOLTIPS_CopyInfoT (toolPtr, ti, isW);
ti->lpszText = NULL; /* FIXME */
if (ti->cbSize >= TTTOOLINFOW_V2_SIZE) if (ti->cbSize >= TTTOOLINFOW_V2_SIZE)
ti->lParam = toolPtr->lParam; ti->lParam = toolPtr->lParam;
@ -1328,12 +1344,13 @@ TOOLTIPS_GetTextT (const TOOLTIPS_INFO *infoPtr, TTTOOLINFOW *ti, BOOL isW)
/* NB this API is broken, there is no way for the app to determine /* NB this API is broken, there is no way for the app to determine
what size buffer it requires nor a way to specify how long the what size buffer it requires nor a way to specify how long the
one it supplies is. We'll assume it's up to INFOTIPSIZE */ one it supplies is. According to the test result, it's up to
80 bytes by the ANSI version. */
buffer[0] = '\0'; buffer[0] = '\0';
TOOLTIPS_GetTipText(infoPtr, nTool, buffer); TOOLTIPS_GetTipText(infoPtr, nTool, buffer);
WideCharToMultiByte(CP_ACP, 0, buffer, -1, (LPSTR)ti->lpszText, WideCharToMultiByte(CP_ACP, 0, buffer, -1, (LPSTR)ti->lpszText,
INFOTIPSIZE, NULL, NULL); MAX_TEXT_SIZE_A, NULL, NULL);
} }
return 0; return 0;
@ -1385,8 +1402,7 @@ TOOLTIPS_GetToolInfoT (const TOOLTIPS_INFO *infoPtr, TTTOOLINFOW *ti, BOOL isW)
ti->uFlags = toolPtr->uFlags; ti->uFlags = toolPtr->uFlags;
ti->rect = toolPtr->rect; ti->rect = toolPtr->rect;
ti->hinst = toolPtr->hinst; ti->hinst = toolPtr->hinst;
/* lpToolInfo->lpszText = toolPtr->lpszText; */ TOOLTIPS_CopyInfoT (toolPtr, ti, isW);
ti->lpszText = NULL; /* FIXME */
if (ti->cbSize >= TTTOOLINFOW_V2_SIZE) if (ti->cbSize >= TTTOOLINFOW_V2_SIZE)
ti->lParam = toolPtr->lParam; ti->lParam = toolPtr->lParam;
@ -1420,8 +1436,7 @@ TOOLTIPS_HitTestT (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOW lptthit,
lptthit->ti.uId = toolPtr->uId; lptthit->ti.uId = toolPtr->uId;
lptthit->ti.rect = toolPtr->rect; lptthit->ti.rect = toolPtr->rect;
lptthit->ti.hinst = toolPtr->hinst; lptthit->ti.hinst = toolPtr->hinst;
/* lptthit->ti.lpszText = toolPtr->lpszText; */ TOOLTIPS_CopyInfoT (toolPtr, &lptthit->ti, isW);
lptthit->ti.lpszText = NULL; /* FIXME */
if (lptthit->ti.cbSize >= TTTOOLINFOW_V2_SIZE) if (lptthit->ti.cbSize >= TTTOOLINFOW_V2_SIZE)
lptthit->ti.lParam = toolPtr->lParam; lptthit->ti.lParam = toolPtr->lParam;
} }

View file

@ -457,7 +457,7 @@ TRACKBAR_AutoPage (TRACKBAR_INFO *infoPtr, POINT clickPoint)
TRACKBAR_PageUp(infoPtr); TRACKBAR_PageUp(infoPtr);
else return FALSE; else return FALSE;
infoPtr->flags |= TB_THUMBPOSCHANGED; TRACKBAR_UpdateThumb (infoPtr);
TRACKBAR_InvalidateThumbMove (infoPtr, prevPos, infoPtr->lPos); TRACKBAR_InvalidateThumbMove (infoPtr, prevPos, infoPtr->lPos);
return TRUE; return TRUE;
@ -1151,10 +1151,13 @@ TRACKBAR_SetPos (TRACKBAR_INFO *infoPtr, BOOL fPosition, LONG lPosition)
static inline LRESULT static inline LRESULT
TRACKBAR_SetRange (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lRange) TRACKBAR_SetRange (TRACKBAR_INFO *infoPtr, BOOL redraw, LONG range)
{ {
infoPtr->lRangeMin = (SHORT)LOWORD(lRange); BOOL changed = infoPtr->lRangeMin != (SHORT)LOWORD(range) ||
infoPtr->lRangeMax = (SHORT)HIWORD(lRange); infoPtr->lRangeMax != (SHORT)HIWORD(range);
infoPtr->lRangeMin = (SHORT)LOWORD(range);
infoPtr->lRangeMax = (SHORT)HIWORD(range);
if (infoPtr->lPos < infoPtr->lRangeMin) { if (infoPtr->lPos < infoPtr->lRangeMin) {
infoPtr->lPos = infoPtr->lRangeMin; infoPtr->lPos = infoPtr->lRangeMin;
@ -1169,15 +1172,20 @@ TRACKBAR_SetRange (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lRange)
infoPtr->lPageSize = (infoPtr->lRangeMax - infoPtr->lRangeMin) / 5; infoPtr->lPageSize = (infoPtr->lRangeMax - infoPtr->lRangeMin) / 5;
if (infoPtr->lPageSize == 0) infoPtr->lPageSize = 1; if (infoPtr->lPageSize == 0) infoPtr->lPageSize = 1;
if (fRedraw) TRACKBAR_InvalidateAll(infoPtr); if (changed && (infoPtr->dwStyle & TBS_AUTOTICKS))
TRACKBAR_RecalculateTics (infoPtr);
if (redraw) TRACKBAR_InvalidateAll(infoPtr);
return 0; return 0;
} }
static inline LRESULT static inline LRESULT
TRACKBAR_SetRangeMax (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lMax) TRACKBAR_SetRangeMax (TRACKBAR_INFO *infoPtr, BOOL redraw, LONG lMax)
{ {
BOOL changed = infoPtr->lRangeMax != lMax;
infoPtr->lRangeMax = lMax; infoPtr->lRangeMax = lMax;
if (infoPtr->lPos > infoPtr->lRangeMax) { if (infoPtr->lPos > infoPtr->lRangeMax) {
infoPtr->lPos = infoPtr->lRangeMax; infoPtr->lPos = infoPtr->lRangeMax;
@ -1187,15 +1195,20 @@ TRACKBAR_SetRangeMax (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lMax)
infoPtr->lPageSize = (infoPtr->lRangeMax - infoPtr->lRangeMin) / 5; infoPtr->lPageSize = (infoPtr->lRangeMax - infoPtr->lRangeMin) / 5;
if (infoPtr->lPageSize == 0) infoPtr->lPageSize = 1; if (infoPtr->lPageSize == 0) infoPtr->lPageSize = 1;
if (fRedraw) TRACKBAR_InvalidateAll(infoPtr); if (changed && (infoPtr->dwStyle & TBS_AUTOTICKS))
TRACKBAR_RecalculateTics (infoPtr);
if (redraw) TRACKBAR_InvalidateAll(infoPtr);
return 0; return 0;
} }
static inline LRESULT static inline LRESULT
TRACKBAR_SetRangeMin (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lMin) TRACKBAR_SetRangeMin (TRACKBAR_INFO *infoPtr, BOOL redraw, LONG lMin)
{ {
BOOL changed = infoPtr->lRangeMin != lMin;
infoPtr->lRangeMin = lMin; infoPtr->lRangeMin = lMin;
if (infoPtr->lPos < infoPtr->lRangeMin) { if (infoPtr->lPos < infoPtr->lRangeMin) {
infoPtr->lPos = infoPtr->lRangeMin; infoPtr->lPos = infoPtr->lRangeMin;
@ -1205,7 +1218,10 @@ TRACKBAR_SetRangeMin (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lMin)
infoPtr->lPageSize = (infoPtr->lRangeMax - infoPtr->lRangeMin) / 5; infoPtr->lPageSize = (infoPtr->lRangeMax - infoPtr->lRangeMin) / 5;
if (infoPtr->lPageSize == 0) infoPtr->lPageSize = 1; if (infoPtr->lPageSize == 0) infoPtr->lPageSize = 1;
if (fRedraw) TRACKBAR_InvalidateAll(infoPtr); if (changed && (infoPtr->dwStyle & TBS_AUTOTICKS))
TRACKBAR_RecalculateTics (infoPtr);
if (redraw) TRACKBAR_InvalidateAll(infoPtr);
return 0; return 0;
} }
@ -1648,11 +1664,10 @@ TRACKBAR_MouseMove (TRACKBAR_INFO *infoPtr, INT x, INT y)
if (dragPos == oldPos) return TRUE; if (dragPos == oldPos) return TRUE;
infoPtr->lPos = dragPos; infoPtr->lPos = dragPos;
TRACKBAR_UpdateThumb (infoPtr);
infoPtr->flags |= TB_THUMBPOSCHANGED;
notify_with_scroll (infoPtr, TB_THUMBTRACK | (infoPtr->lPos<<16)); notify_with_scroll (infoPtr, TB_THUMBTRACK | (infoPtr->lPos<<16));
TRACKBAR_InvalidateThumbMove(infoPtr, oldPos, dragPos); TRACKBAR_InvalidateThumbMove(infoPtr, oldPos, dragPos);
UpdateWindow (infoPtr->hwndSelf); UpdateWindow (infoPtr->hwndSelf);

View file

@ -66,44 +66,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(treeview); WINE_DEFAULT_DEBUG_CHANNEL(treeview);
enum StateListType
{
OriginInternal,
OriginUser
};
/* internal structures */ /* internal structures */
typedef struct _TREEITEM /* HTREEITEM is a _TREEINFO *. */
{
HTREEITEM parent; /* handle to parent or 0 if at root */
HTREEITEM nextSibling; /* handle to next item in list, 0 if last */
HTREEITEM firstChild; /* handle to first child or 0 if no child */
UINT callbackMask;
UINT state;
UINT stateMask;
LPWSTR pszText;
int cchTextMax;
int iImage;
int iSelectedImage;
int iExpandedImage;
int cChildren;
LPARAM lParam;
int iIntegral; /* item height multiplier (1 is normal) */
int iLevel; /* indentation level:0=root level */
HTREEITEM lastChild;
HTREEITEM prevSibling; /* handle to prev item in list, 0 if first */
RECT rect;
LONG linesOffset;
LONG stateOffset;
LONG imageOffset;
LONG textOffset;
LONG textWidth; /* horizontal text extent for pszText */
LONG visibleOrder; /* visible ordering, 0 is first visible item */
} TREEVIEW_ITEM;
typedef struct tagTREEVIEW_INFO typedef struct tagTREEVIEW_INFO
{ {
HWND hwnd; HWND hwnd;
@ -162,7 +125,6 @@ typedef struct tagTREEVIEW_INFO
HIMAGELIST himlState; HIMAGELIST himlState;
int stateImageHeight; int stateImageHeight;
int stateImageWidth; int stateImageWidth;
enum StateListType statehimlType;
HDPA items; HDPA items;
DWORD lastKeyPressTimestamp; DWORD lastKeyPressTimestamp;
@ -171,6 +133,35 @@ typedef struct tagTREEVIEW_INFO
WCHAR szSearchParam[ MAX_PATH ]; WCHAR szSearchParam[ MAX_PATH ];
} TREEVIEW_INFO; } TREEVIEW_INFO;
typedef struct _TREEITEM /* HTREEITEM is a _TREEINFO *. */
{
HTREEITEM parent; /* handle to parent or 0 if at root */
HTREEITEM nextSibling; /* handle to next item in list, 0 if last */
HTREEITEM firstChild; /* handle to first child or 0 if no child */
UINT callbackMask;
UINT state;
UINT stateMask;
LPWSTR pszText;
int cchTextMax;
int iImage;
int iSelectedImage;
int iExpandedImage;
int cChildren;
LPARAM lParam;
int iIntegral; /* item height multiplier (1 is normal) */
int iLevel; /* indentation level:0=root level */
HTREEITEM lastChild;
HTREEITEM prevSibling; /* handle to prev item in list, 0 if first */
RECT rect;
LONG linesOffset;
LONG stateOffset;
LONG imageOffset;
LONG textOffset;
LONG textWidth; /* horizontal text extent for pszText */
LONG visibleOrder; /* visible ordering, 0 is first visible item */
const TREEVIEW_INFO *infoPtr; /* tree data this item belongs to */
} TREEVIEW_ITEM;
/******** Defines that TREEVIEW_ProcessLetterKeys uses ****************/ /******** Defines that TREEVIEW_ProcessLetterKeys uses ****************/
#define KEY_DELAY 450 #define KEY_DELAY 450
@ -217,7 +208,6 @@ static VOID TREEVIEW_Invalidate(const TREEVIEW_INFO *, const TREEVIEW_ITEM *);
static LRESULT TREEVIEW_DoSelectItem(TREEVIEW_INFO *, INT, HTREEITEM, INT); static LRESULT TREEVIEW_DoSelectItem(TREEVIEW_INFO *, INT, HTREEITEM, INT);
static VOID TREEVIEW_SetFirstVisible(TREEVIEW_INFO *, TREEVIEW_ITEM *, BOOL); static VOID TREEVIEW_SetFirstVisible(TREEVIEW_INFO *, TREEVIEW_ITEM *, BOOL);
static LRESULT TREEVIEW_EnsureVisible(TREEVIEW_INFO *, HTREEITEM, BOOL); static LRESULT TREEVIEW_EnsureVisible(TREEVIEW_INFO *, HTREEITEM, BOOL);
static LRESULT TREEVIEW_RButtonUp(const TREEVIEW_INFO *, const POINT *);
static LRESULT TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel); static LRESULT TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel);
static VOID TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr); static VOID TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr);
static LRESULT TREEVIEW_HScroll(TREEVIEW_INFO *, WPARAM); static LRESULT TREEVIEW_HScroll(TREEVIEW_INFO *, WPARAM);
@ -858,7 +848,9 @@ static INT TREEVIEW_NotifyFormat (TREEVIEW_INFO *infoPtr, HWND hwndFrom, UINT nC
format = SendMessageW(hwndFrom, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwnd, NF_QUERY); format = SendMessageW(hwndFrom, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwnd, NF_QUERY);
TRACE("format=%d\n", format); TRACE("format=%d\n", format);
if (format != NFR_ANSI && format != NFR_UNICODE) return 0; /* Invalid format returned by NF_QUERY defaults to ANSI*/
if (format != NFR_ANSI && format != NFR_UNICODE)
format = NFR_ANSI;
infoPtr->bNtfUnicode = (format == NFR_UNICODE); infoPtr->bNtfUnicode = (format == NFR_UNICODE);
@ -1020,6 +1012,7 @@ TREEVIEW_AllocateItem(const TREEVIEW_INFO *infoPtr)
newItem->iImage = 0; newItem->iImage = 0;
newItem->iSelectedImage = 0; newItem->iSelectedImage = 0;
newItem->iExpandedImage = (WORD)I_IMAGENONE; newItem->iExpandedImage = (WORD)I_IMAGENONE;
newItem->infoPtr = infoPtr;
if (DPA_InsertPtr(infoPtr->items, INT_MAX, newItem) == -1) if (DPA_InsertPtr(infoPtr->items, INT_MAX, newItem) == -1)
{ {
@ -1621,7 +1614,7 @@ TREEVIEW_DeleteItem(TREEVIEW_INFO *infoPtr, HTREEITEM item)
static LRESULT static LRESULT
TREEVIEW_SetRedraw(TREEVIEW_INFO* infoPtr, WPARAM wParam) TREEVIEW_SetRedraw(TREEVIEW_INFO* infoPtr, WPARAM wParam)
{ {
infoPtr->bRedraw = wParam ? TRUE : FALSE; infoPtr->bRedraw = wParam != 0;
if (infoPtr->bRedraw) if (infoPtr->bRedraw)
{ {
@ -1793,11 +1786,8 @@ TREEVIEW_SetImageList(TREEVIEW_INFO *infoPtr, UINT type, HIMAGELIST himlNew)
infoPtr->himlState = himlNew; infoPtr->himlState = himlNew;
if (himlNew) if (himlNew)
{
ImageList_GetIconSize(himlNew, &infoPtr->stateImageWidth, ImageList_GetIconSize(himlNew, &infoPtr->stateImageWidth,
&infoPtr->stateImageHeight); &infoPtr->stateImageHeight);
infoPtr->statehimlType = OriginUser;
}
else else
{ {
infoPtr->stateImageWidth = 0; infoPtr->stateImageWidth = 0;
@ -2093,7 +2083,13 @@ TREEVIEW_GetItemT(const TREEVIEW_INFO *infoPtr, LPTVITEMEXW tvItem, BOOL isW)
TREEVIEW_ITEM *item = tvItem->hItem; TREEVIEW_ITEM *item = tvItem->hItem;
if (!TREEVIEW_ValidItem(infoPtr, item)) if (!TREEVIEW_ValidItem(infoPtr, item))
return FALSE; {
if (!item) return FALSE;
TRACE("got item from different tree %p, called from %p\n", item->infoPtr, infoPtr);
infoPtr = item->infoPtr;
if (!TREEVIEW_ValidItem(infoPtr, item)) return FALSE;
}
TREEVIEW_UpdateDispInfo(infoPtr, item, tvItem->mask); TREEVIEW_UpdateDispInfo(infoPtr, item, tvItem->mask);
@ -3243,21 +3239,23 @@ TREEVIEW_Collapse(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
RECT scrollRect; RECT scrollRect;
LONG scrollDist = 0; LONG scrollDist = 0;
TREEVIEW_ITEM *nextItem = NULL, *tmpItem; TREEVIEW_ITEM *nextItem = NULL, *tmpItem;
BOOL wasExpanded;
TRACE("TVE_COLLAPSE %p %s\n", item, TREEVIEW_ItemName(item)); TRACE("TVE_COLLAPSE %p %s\n", item, TREEVIEW_ItemName(item));
if (!(item->state & TVIS_EXPANDED)) if (!TREEVIEW_HasChildren(infoPtr, item))
return FALSE; return FALSE;
if (bUser || !(item->state & TVIS_EXPANDEDONCE)) if (bUser)
TREEVIEW_SendExpanding(infoPtr, item, action); TREEVIEW_SendExpanding(infoPtr, item, action);
if (item->firstChild == NULL) if (item->firstChild == NULL)
return FALSE; return FALSE;
wasExpanded = (item->state & TVIS_EXPANDED) != 0;
item->state &= ~TVIS_EXPANDED; item->state &= ~TVIS_EXPANDED;
if (bUser || !(item->state & TVIS_EXPANDEDONCE)) if (wasExpanded && bUser)
TREEVIEW_SendExpanded(infoPtr, item, action); TREEVIEW_SendExpanded(infoPtr, item, action);
bSetSelection = (infoPtr->selectedItem != NULL bSetSelection = (infoPtr->selectedItem != NULL
@ -3338,7 +3336,7 @@ TREEVIEW_Collapse(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
bSetFirstVisible ? item : infoPtr->firstVisible, bSetFirstVisible ? item : infoPtr->firstVisible,
TRUE); TRUE);
return TRUE; return wasExpanded;
} }
static BOOL static BOOL
@ -3353,8 +3351,8 @@ TREEVIEW_Expand(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
TRACE("(%p, %p, partial=%d, %d\n", infoPtr, item, partial, user); TRACE("(%p, %p, partial=%d, %d\n", infoPtr, item, partial, user);
if (item->state & TVIS_EXPANDED) if (!TREEVIEW_HasChildren(infoPtr, item))
return TRUE; return FALSE;
tmpItem = item; nextItem = NULL; tmpItem = item; nextItem = NULL;
while (tmpItem) while (tmpItem)
@ -3820,6 +3818,9 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
TEXTMETRICW textMetric; TEXTMETRICW textMetric;
TRACE("%p %p\n", hwnd, hItem); TRACE("%p %p\n", hwnd, hItem);
if (!(infoPtr->dwStyle & TVS_EDITLABELS))
return NULL;
if (!TREEVIEW_ValidItem(infoPtr, hItem)) if (!TREEVIEW_ValidItem(infoPtr, hItem))
return NULL; return NULL;
@ -4050,8 +4051,6 @@ TREEVIEW_TrackMouse(const TREEVIEW_INFO *infoPtr, POINT pt)
else if (msg.message >= WM_LBUTTONDOWN && else if (msg.message >= WM_LBUTTONDOWN &&
msg.message <= WM_RBUTTONDBLCLK) msg.message <= WM_RBUTTONDBLCLK)
{ {
if (msg.message == WM_RBUTTONUP)
TREEVIEW_RButtonUp(infoPtr, &pt);
break; break;
} }
@ -4267,34 +4266,17 @@ TREEVIEW_RButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam)
else else
{ {
SetFocus(infoPtr->hwnd); SetFocus(infoPtr->hwnd);
TREEVIEW_SendSimpleNotify(infoPtr, NM_RCLICK); if(!TREEVIEW_SendSimpleNotify(infoPtr, NM_RCLICK))
{
/* Send a WM_CONTEXTMENU message in response to the RBUTTONUP */
SendMessageW(infoPtr->hwndNotify, WM_CONTEXTMENU,
(WPARAM)infoPtr->hwnd, (LPARAM)GetMessagePos());
}
} }
return 0; return 0;
} }
static LRESULT
TREEVIEW_RButtonUp(const TREEVIEW_INFO *infoPtr, const POINT *pPt)
{
TVHITTESTINFO ht;
ht.pt = *pPt;
TREEVIEW_HitTest(infoPtr, &ht);
if (ht.hItem)
{
/* Change to screen coordinate for WM_CONTEXTMENU */
ClientToScreen(infoPtr->hwnd, &ht.pt);
/* Send a WM_CONTEXTMENU message in response to the RBUTTONUP */
SendMessageW(infoPtr->hwnd, WM_CONTEXTMENU,
(WPARAM)infoPtr->hwnd, MAKELPARAM(ht.pt.x, ht.pt.y));
}
return 0;
}
static LRESULT static LRESULT
TREEVIEW_CreateDragImage(TREEVIEW_INFO *infoPtr, LPARAM lParam) TREEVIEW_CreateDragImage(TREEVIEW_INFO *infoPtr, LPARAM lParam)
{ {
@ -4975,7 +4957,6 @@ TREEVIEW_InitCheckboxes(TREEVIEW_INFO *infoPtr)
int nIndex; int nIndex;
infoPtr->himlState = ImageList_Create(16, 16, ILC_COLOR | ILC_MASK, 3, 0); infoPtr->himlState = ImageList_Create(16, 16, ILC_COLOR | ILC_MASK, 3, 0);
infoPtr->statehimlType = OriginInternal;
hdcScreen = GetDC(0); hdcScreen = GetDC(0);
@ -5095,10 +5076,7 @@ TREEVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
infoPtr->hwndNotify = lpcs->hwndParent; infoPtr->hwndNotify = lpcs->hwndParent;
infoPtr->hwndToolTip = 0; infoPtr->hwndToolTip = 0;
infoPtr->bNtfUnicode = IsWindowUnicode (hwnd); /* Determine what type of notify should be issued (sets infoPtr->bNtfUnicode) */
/* Determine what type of notify should be issued */
/* sets infoPtr->bNtfUnicode */
TREEVIEW_NotifyFormat(infoPtr, infoPtr->hwndNotify, NF_REQUERY); TREEVIEW_NotifyFormat(infoPtr, infoPtr->hwndNotify, NF_REQUERY);
if (!(infoPtr->dwStyle & TVS_NOTOOLTIPS)) if (!(infoPtr->dwStyle & TVS_NOTOOLTIPS))
@ -5139,8 +5117,6 @@ TREEVIEW_Destroy(TREEVIEW_INFO *infoPtr)
CloseThemeData (GetWindowTheme (infoPtr->hwnd)); CloseThemeData (GetWindowTheme (infoPtr->hwnd));
if (infoPtr->statehimlType == OriginInternal)
ImageList_Destroy(infoPtr->himlState);
/* Deassociate treeview from the window before doing anything drastic. */ /* Deassociate treeview from the window before doing anything drastic. */
SetWindowLongPtrW(infoPtr->hwnd, 0, 0); SetWindowLongPtrW(infoPtr->hwnd, 0, 0);
@ -5269,13 +5245,11 @@ TREEVIEW_KeyDown(TREEVIEW_INFO *infoPtr, WPARAM wParam)
break; break;
case VK_ADD: case VK_ADD:
if (!(prevItem->state & TVIS_EXPANDED)) TREEVIEW_Expand(infoPtr, prevItem, FALSE, TRUE);
TREEVIEW_Expand(infoPtr, prevItem, FALSE, TRUE);
break; break;
case VK_SUBTRACT: case VK_SUBTRACT:
if (prevItem->state & TVIS_EXPANDED) TREEVIEW_Collapse(infoPtr, prevItem, FALSE, TRUE);
TREEVIEW_Collapse(infoPtr, prevItem, FALSE, TRUE);
break; break;
case VK_PRIOR: case VK_PRIOR:

View file

@ -3037,6 +3037,8 @@ extern "C" {
#define TVIS_STATEIMAGEMASK 0xF000 #define TVIS_STATEIMAGEMASK 0xF000
#define TVIS_USERMASK 0xF000 #define TVIS_USERMASK 0xF000
#define TVIS_FOCUSED 0x0001
#define I_CHILDRENCALLBACK (-1) #define I_CHILDRENCALLBACK (-1)
#define LPTV_ITEMW LPTVITEMW #define LPTV_ITEMW LPTVITEMW

View file

@ -48,7 +48,7 @@ reactos/dll/win32/browseui # Out of sync
reactos/dll/win32/cabinet # Synced to Wine-1.5.19 reactos/dll/win32/cabinet # Synced to Wine-1.5.19
reactos/dll/win32/clusapi # Synced to Wine-1.5.19 reactos/dll/win32/clusapi # Synced to Wine-1.5.19
reactos/dll/win32/comcat # Synced to Wine-1.5.4 reactos/dll/win32/comcat # Synced to Wine-1.5.4
reactos/dll/win32/comctl32 # Synced to Wine 1.3.37 reactos/dll/win32/comctl32 # Synced to Wine 1.5.19
reactos/dll/win32/comdlg32 # Synced to Wine 1.3.37 reactos/dll/win32/comdlg32 # Synced to Wine 1.3.37
reactos/dll/win32/compstui # Synced to Wine-1.5.19 reactos/dll/win32/compstui # Synced to Wine-1.5.19
reactos/dll/win32/credui # Synced to Wine-1.5.4 reactos/dll/win32/credui # Synced to Wine-1.5.4