Module: wine Branch: master Commit: 4b2ea6f4e2517fb8b7fc120874a8dd322f08de1c URL: http://source.winehq.org/git/wine.git/?a=commit;h=4b2ea6f4e2517fb8b7fc120874...
Author: Nikolay Sivov bunglehead@gmail.com Date: Sat Mar 28 10:20:51 2009 -0400
comctl32/tab: Implemented TCS_MULTISELECT for mouse selection.
---
dlls/comctl32/tab.c | 42 +++++++++++++++++++++++++++++++++++------- 1 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c index 1354054..86f9e12 100644 --- a/dlls/comctl32/tab.c +++ b/dlls/comctl32/tab.c @@ -32,7 +32,7 @@ * TODO: * * Styles: - * TCS_MULTISELECT + * TCS_MULTISELECT - implement for VK_SPACE selection * TCS_RIGHT * TCS_RIGHTJUSTIFY * TCS_SCROLLOPPOSITE @@ -42,9 +42,6 @@ * Extended Styles: * TCS_EX_REGISTERDROP * - * States: - * TCIS_BUTTONPRESSED - * * Notifications: * NM_RELEASEDCAPTURE * TCN_FOCUSCHANGE @@ -162,6 +159,7 @@ static const WCHAR themeClass[] = { 'T','a','b',0 }; static void TAB_InvalidateTabArea(const TAB_INFO *); static void TAB_EnsureSelectionVisible(TAB_INFO *); static void TAB_DrawItemInterior(const TAB_INFO *, HDC, INT, RECT*); +static LRESULT TAB_DeselectAll(TAB_INFO *, BOOL);
static BOOL TAB_SendSimpleNotify (const TAB_INFO *infoPtr, UINT code) @@ -587,6 +585,7 @@ TAB_LButtonDown (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam) POINT pt; INT newItem; UINT dummy; + LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
if (infoPtr->hwndToolTip) 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);
- 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); } } + return 0; }