From d301c440937fc3f9dda237d2b07da1a203fc61c8 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 30 Aug 2009 17:24:53 +0000 Subject: [PATCH] Fix selection events generation in multi-select wxTreeCtrl. Only deselect the items when the mouse is released if really necessary: add a flag indicating when it is instead of trying to deduce it in the mouse up handler. Closes #11099 (thanks to Jonathan Liu). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61784 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/treectrl.h | 3 +++ src/msw/treectrl.cpp | 13 ++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/include/wx/msw/treectrl.h b/include/wx/msw/treectrl.h index 41b8df96f1..e2b76ae601 100644 --- a/include/wx/msw/treectrl.h +++ b/include/wx/msw/treectrl.h @@ -318,6 +318,9 @@ private: // whether we need to trigger a state image click event bool m_triggerStateImageClick; + // whether we need to deselect other items on mouse up + bool m_mouseUpDeselect; + friend class wxTreeItemIndirectData; friend class wxTreeSortHelper; diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index f90ba117d3..b408ac740d 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -750,6 +750,7 @@ void wxTreeCtrl::Init() m_focusLost = true; m_changingSelection = false; m_triggerStateImageClick = false; + m_mouseUpDeselect = false; // initialize the global array of events now as it can't be done statically // with the wxEVT_XXX values being allocated during run-time only @@ -2876,6 +2877,7 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) else { SetFocusedItem(wxTreeItemId(htItem)); + m_mouseUpDeselect = true; } } else // click on a single selected item @@ -3025,16 +3027,13 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) case WM_LBUTTONUP: if ( isMultiple ) { - // deselect other items if multiple items selected + // deselect other items if needed if ( htItem ) { - wxArrayTreeItemIds selections; - size_t count = GetSelections(selections); - - if ( count > 1 && - !(wParam & MK_CONTROL) && - !(wParam & MK_SHIFT) ) + if ( m_mouseUpDeselect ) { + m_mouseUpDeselect = false; + wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, htItem); changingEvent.m_itemOld = htOldItem;