comctl32/tab: Implemented TCS_MULTISELECT for mouse selection.

This commit is contained in:
Nikolay Sivov 2009-03-28 10:20:51 -04:00 committed by Alexandre Julliard
parent e2b1604f4a
commit 4b2ea6f4e2

View File

@ -32,7 +32,7 @@
* TODO: * TODO:
* *
* Styles: * Styles:
* TCS_MULTISELECT * TCS_MULTISELECT - implement for VK_SPACE selection
* TCS_RIGHT * TCS_RIGHT
* TCS_RIGHTJUSTIFY * TCS_RIGHTJUSTIFY
* TCS_SCROLLOPPOSITE * TCS_SCROLLOPPOSITE
@ -42,9 +42,6 @@
* Extended Styles: * Extended Styles:
* TCS_EX_REGISTERDROP * TCS_EX_REGISTERDROP
* *
* States:
* TCIS_BUTTONPRESSED
*
* Notifications: * Notifications:
* NM_RELEASEDCAPTURE * NM_RELEASEDCAPTURE
* TCN_FOCUSCHANGE * TCN_FOCUSCHANGE
@ -162,6 +159,7 @@ static const WCHAR themeClass[] = { 'T','a','b',0 };
static void TAB_InvalidateTabArea(const TAB_INFO *); static void TAB_InvalidateTabArea(const TAB_INFO *);
static void TAB_EnsureSelectionVisible(TAB_INFO *); static void TAB_EnsureSelectionVisible(TAB_INFO *);
static void TAB_DrawItemInterior(const TAB_INFO *, HDC, INT, RECT*); static void TAB_DrawItemInterior(const TAB_INFO *, HDC, INT, RECT*);
static LRESULT TAB_DeselectAll(TAB_INFO *, BOOL);
static BOOL static BOOL
TAB_SendSimpleNotify (const TAB_INFO *infoPtr, UINT code) TAB_SendSimpleNotify (const TAB_INFO *infoPtr, UINT code)
@ -587,6 +585,7 @@ TAB_LButtonDown (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
POINT pt; POINT pt;
INT newItem; INT newItem;
UINT dummy; UINT dummy;
LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
if (infoPtr->hwndToolTip) if (infoPtr->hwndToolTip)
TAB_RelayEvent (infoPtr->hwndToolTip, infoPtr->hwnd, TAB_RelayEvent (infoPtr->hwndToolTip, infoPtr->hwnd,
@ -607,14 +606,43 @@ TAB_LButtonDown (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
TRACE("On Tab, item %d\n", newItem); TRACE("On Tab, item %d\n", newItem);
if (newItem != -1 && infoPtr->iSelected != newItem) if ((newItem != -1) && (infoPtr->iSelected != newItem))
{ {
if (!TAB_SendSimpleNotify(infoPtr, TCN_SELCHANGING)) if ((lStyle & TCS_BUTTONS) && (lStyle & TCS_MULTISELECT) &&
(wParam & MK_CONTROL))
{ {
TAB_SetCurSel(infoPtr, newItem); RECT r;
/* toggle multiselection */
TAB_GetItem(infoPtr, newItem)->dwState ^= TCIS_BUTTONPRESSED;
if (TAB_InternalGetItemRect (infoPtr, newItem, &r, NULL))
InvalidateRect (infoPtr->hwnd, &r, TRUE);
}
else
{
INT i;
BOOL pressed = FALSE;
/* any button pressed ? */
for (i = 0; i < infoPtr->uNumItem; i++)
if ((TAB_GetItem (infoPtr, i)->dwState & TCIS_BUTTONPRESSED) &&
(infoPtr->iSelected != i))
{
pressed = TRUE;
break;
}
TAB_SendSimpleNotify(infoPtr, TCN_SELCHANGING);
if (pressed)
TAB_DeselectAll (infoPtr, FALSE);
else
TAB_SetCurSel(infoPtr, newItem);
TAB_SendSimpleNotify(infoPtr, TCN_SELCHANGE); TAB_SendSimpleNotify(infoPtr, TCN_SELCHANGE);
} }
} }
return 0; return 0;
} }