]> git.saurik.com Git - wxWidgets.git/commitdiff
fixes to allow dragging in multiselection tree ctrl (patch 759421)
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 10 Jul 2003 13:03:30 +0000 (13:03 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 10 Jul 2003 13:03:30 +0000 (13:03 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21865 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/generic/treectlg.cpp
src/msw/treectrl.cpp

index b7140c589af5e803d5601749609ea9dc00cf9ffc..2a4fb555b50a4623dd18c05ffd03ac8f9725665f 100644 (file)
@@ -3076,6 +3076,21 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event )
         }
         else if ( event.LeftUp() )
         {
+            // this facilitates multiple-item drag-and-drop
+
+            if (item && HasFlag(wxTR_MULTIPLE))
+            {
+                wxArrayTreeItemIds selections;
+                size_t count = GetSelections(selections);
+
+                if (count > 1 &&
+                    !event.ControlDown() &&
+                    !event.ShiftDown())
+                {
+                    SelectItem(item, true, false);
+                }
+            }
+
             if ( m_lastOnSame )
             {
                 if ( (item == m_current) &&
@@ -3118,14 +3133,24 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event )
                 return;
             }
 
-            // how should the selection work for this event?
-            bool is_multiple, extended_select, unselect_others;
-            EventFlagsToSelType(GetWindowStyleFlag(),
-                                event.ShiftDown(),
-                                event.ControlDown(),
-                                is_multiple, extended_select, unselect_others);
 
-            SelectItem(item, unselect_others, extended_select);
+            // clear the previously selected items, if the
+            // user clicked outside of the present selection.
+            // otherwise, perform the deselection on mouse-up.
+            // this allows multiple drag and drop to work.
+
+            if (!IsSelected(item))
+            {
+                // how should the selection work for this event?
+                bool is_multiple, extended_select, unselect_others;
+                EventFlagsToSelType(GetWindowStyleFlag(),
+                                    event.ShiftDown(),
+                                    event.ControlDown(),
+                                    is_multiple, extended_select, unselect_others);
+
+                SelectItem(item, unselect_others, extended_select);
+            }
+
 
             // For some reason, Windows isn't recognizing a left double-click,
             // so we need to simulate it here.  Allow 200 milliseconds for now.
index 74fbf339be60c699ebd2096ce3350a5f8b8287d6..59a4cccf424a56157cecfc38e9a68ad3ad40632f 100644 (file)
@@ -2121,20 +2121,34 @@ long wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
                     {
                         // avoid doing anything if we click on the only
                         // currently selected item
+                        
                         wxArrayTreeItemIds selections;
                         size_t count = GetSelections(selections);
                         if ( count == 0 ||
-                                count > 1 ||
-                                    HITEM(selections[0]) != htItem )
+                             count > 1 ||
+                             HITEM(selections[0]) != htItem )
                         {
-                            // clear the previously selected items
-                            UnselectAll();
-
-                            // prevent the click from starting in-place editing
-                            // which should only happen if we click on the
-                            // already selected item (and nothing else is
-                            // selected)
-                            TreeView_SelectItem(GetHwnd(), 0);
+                            // clear the previously selected items, if the
+                            // user clicked outside of the present selection.
+                            // otherwise, perform the deselection on mouse-up.
+                            // this allows multiple drag and drop to work.
+                            
+                            if (IsItemSelected(GetHwnd(), htItem))
+                            {
+                                ::SetFocus(GetHwnd(), htItem);
+                            }
+                             else
+                            {
+                                UnselectAll();
+
+                                // prevent the click from starting in-place editing
+                                // which should only happen if we click on the
+                                // already selected item (and nothing else is
+                                // selected)
+
+                                TreeView_SelectItem(GetHwnd(), 0);
+                                ::SelectItem(GetHwnd(), htItem);
+                            }
                         }
 
                         // reset on any click without Shift
@@ -2160,6 +2174,24 @@ long wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
                 break;
 
             case WM_LBUTTONUP:
+
+                // facilitates multiple drag-and-drop
+                if (htItem && isMultiple)
+                {
+                    wxArrayTreeItemIds selections;
+                    size_t count = GetSelections(selections);
+
+                    if (count > 1 &&
+                        !(wParam & MK_CONTROL) &&
+                        !(wParam & MK_SHIFT))
+                    {
+                        UnselectAll();
+                        TreeView_SelectItem(GetHwnd(), htItem);
+                    }
+                }
+
+                // fall through
+
             case WM_RBUTTONUP:
                 if ( m_dragImage )
                 {