Module: wine Branch: master Commit: af02e1082818a45a135a32686c77b84f0c699f73 URL: http://source.winehq.org/git/wine.git/?a=commit;h=af02e1082818a45a135a32686c...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Aug 10 15:11:02 2016 +0300
comctl32/treeview: Fix item dragging and selection for TVS_FULLROWSELECT style.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/comctl32/treeview.c | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-)
diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c index dc31a9b..55e22e2 100644 --- a/dlls/comctl32/treeview.c +++ b/dlls/comctl32/treeview.c @@ -4197,9 +4197,9 @@ TREEVIEW_LButtonDoubleClick(TREEVIEW_INFO *infoPtr, LPARAM lParam) static LRESULT TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam) { + BOOL do_track, do_select, bDoLabelEdit; HWND hwnd = infoPtr->hwnd; TVHITTESTINFO ht; - BOOL bTrack, bDoLabelEdit;
/* If Edit control is active - kill it and return. * The best way to do it is to set focus to itself. @@ -4219,15 +4219,32 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam) TRACE("item %d\n", TREEVIEW_GetItemIndex(infoPtr, ht.hItem));
/* update focusedItem and redraw both items */ - if(ht.hItem && (ht.flags & TVHT_ONITEM)) + if (ht.hItem) { - infoPtr->focusedItem = ht.hItem; - TREEVIEW_InvalidateItem(infoPtr, infoPtr->focusedItem); - TREEVIEW_InvalidateItem(infoPtr, infoPtr->selectedItem); + BOOL do_focus; + + if (TREEVIEW_IsFullRowSelect(infoPtr)) + do_focus = ht.flags & (TVHT_ONITEMINDENT | TVHT_ONITEM | TVHT_ONITEMRIGHT); + else + do_focus = ht.flags & TVHT_ONITEM; + + if (do_focus) + { + infoPtr->focusedItem = ht.hItem; + TREEVIEW_InvalidateItem(infoPtr, infoPtr->focusedItem); + TREEVIEW_InvalidateItem(infoPtr, infoPtr->selectedItem); + } }
- bTrack = (ht.flags & TVHT_ONITEM) - && !(infoPtr->dwStyle & TVS_DISABLEDRAGDROP); + if (!(infoPtr->dwStyle & TVS_DISABLEDRAGDROP)) + { + if (TREEVIEW_IsFullRowSelect(infoPtr)) + do_track = ht.flags & (TVHT_ONITEMINDENT | TVHT_ONITEM | TVHT_ONITEMRIGHT); + else + do_track = ht.flags & TVHT_ONITEM; + } + else + do_track = FALSE;
/* * If the style allows editing and the node is already selected @@ -4237,16 +4254,15 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam) (ht.flags & TVHT_ONITEMLABEL) && (infoPtr->selectedItem == ht.hItem);
/* Send NM_CLICK right away */ - if (!bTrack) - if (TREEVIEW_SendSimpleNotify(infoPtr, NM_CLICK)) - goto setfocus; + if (!do_track && TREEVIEW_SendSimpleNotify(infoPtr, NM_CLICK)) + goto setfocus;
if (ht.flags & TVHT_ONITEMBUTTON) { TREEVIEW_Toggle(infoPtr, ht.hItem, TRUE); goto setfocus; } - else if (bTrack) + else if (do_track) { /* if TREEVIEW_TrackMouse == 1 dragging occurred and the cursor left the dragged item's rectangle */ if (TREEVIEW_TrackMouse(infoPtr, ht.pt)) { @@ -4268,9 +4284,14 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam) } }
- if (bTrack && TREEVIEW_SendSimpleNotify(infoPtr, NM_CLICK)) + if (do_track && TREEVIEW_SendSimpleNotify(infoPtr, NM_CLICK)) goto setfocus;
+ if (TREEVIEW_IsFullRowSelect(infoPtr)) + do_select = ht.flags & (TVHT_ONITEMINDENT | TVHT_ONITEMICON | TVHT_ONITEMLABEL | TVHT_ONITEMRIGHT); + else + do_select = ht.flags & (TVHT_ONITEMICON | TVHT_ONITEMLABEL); + if (bDoLabelEdit) { if (infoPtr->Timer & TV_EDIT_TIMER_SET) @@ -4279,7 +4300,7 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam) SetTimer(hwnd, TV_EDIT_TIMER, GetDoubleClickTime(), 0); infoPtr->Timer |= TV_EDIT_TIMER_SET; } - else if (ht.flags & (TVHT_ONITEMICON|TVHT_ONITEMLABEL)) /* select the item if the hit was inside of the icon or text */ + else if (do_select) { TREEVIEW_ITEM *selection = infoPtr->selectedItem;