From 3de637c6327315ca39acdfd98171d50e6fb38904 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 4 Feb 2011 02:06:00 +0100 Subject: [PATCH] Allow drag'n'drop reordering of assembly tree nodes. --- ILSpy/AssemblyListTreeNode.cs | 30 ++++++++++++++++++++++++++++-- ILSpy/AssemblyTreeNode.cs | 4 +++- SharpTreeView/SharpTreeNode.cs | 1 + SharpTreeView/SharpTreeView.cs | 16 +++++++++++----- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/ILSpy/AssemblyListTreeNode.cs b/ILSpy/AssemblyListTreeNode.cs index 08b8d8c7b..178896410 100644 --- a/ILSpy/AssemblyListTreeNode.cs +++ b/ILSpy/AssemblyListTreeNode.cs @@ -7,6 +7,8 @@ using System.IO; using System.Linq; using System.Text; using System.Threading; +using System.Windows; + using ICSharpCode.TreeView; using Mono.Cecil; @@ -33,9 +35,33 @@ namespace ICSharpCode.ILSpy this.Children.Remove(node); } - public override DropEffect CanDrop(System.Windows.IDataObject data, DropEffect requestedEffect) + public override DropEffect CanDrop(IDataObject data, DropEffect requestedEffect) + { + if (data.GetDataPresent(AssemblyTreeNode.DataFormat)) + return DropEffect.Move; + else + return DropEffect.None; + } + + public override void Drop(IDataObject data, int index, DropEffect finalEffect) { - return requestedEffect; + string[] files = data.GetData(AssemblyTreeNode.DataFormat) as string[]; + if (files != null) { + var nodes = (from file in files + select OpenAssembly(file) into node + where node != null + select node).Distinct().ToList(); + foreach (AssemblyTreeNode node in nodes) { + int nodeIndex = this.Children.IndexOf(node); + if (nodeIndex < index) + index--; + this.Children.RemoveAt(nodeIndex); + } + nodes.Reverse(); + foreach (AssemblyTreeNode node in nodes) { + this.Children.Insert(index, node); + } + } } public AssemblyTreeNode OpenAssembly(string file) diff --git a/ILSpy/AssemblyTreeNode.cs b/ILSpy/AssemblyTreeNode.cs index 33b109846..b7cfc3bce 100644 --- a/ILSpy/AssemblyTreeNode.cs +++ b/ILSpy/AssemblyTreeNode.cs @@ -152,10 +152,12 @@ namespace ICSharpCode.ILSpy Parent.DeleteCore(nodes); // handle deletion in the AssemblyListTreeNode } + internal const string DataFormat = "ILSpyAssemblies"; + public override IDataObject Copy(SharpTreeNode[] nodes) { DataObject dataObject = new DataObject(); - dataObject.SetData("ILSpyAssemblies", nodes.OfType()); + dataObject.SetData(DataFormat, nodes.OfType().Select(n => n.fileName).ToArray()); return dataObject; } } diff --git a/SharpTreeView/SharpTreeNode.cs b/SharpTreeView/SharpTreeNode.cs index ad7c15c30..21b79c7e6 100644 --- a/SharpTreeView/SharpTreeNode.cs +++ b/SharpTreeView/SharpTreeNode.cs @@ -558,6 +558,7 @@ namespace ICSharpCode.TreeView public virtual void Drop(IDataObject data, int index, DropEffect finalEffect) { + throw new NotSupportedException(GetType().Name + " does not support Drop()"); } #endregion diff --git a/SharpTreeView/SharpTreeView.cs b/SharpTreeView/SharpTreeView.cs index 2dc84d692..fd6d41a3d 100644 --- a/SharpTreeView/SharpTreeView.cs +++ b/SharpTreeView/SharpTreeView.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Windows.Controls; @@ -251,12 +252,17 @@ namespace ICSharpCode.TreeView internal void HandleDrop(SharpTreeViewItem item, DragEventArgs e) { - HidePreview(); - e.Handled = true; + try { + HidePreview(); + e.Handled = true; - var target = GetDropTarget(item, e); - if (target != null) { - target.Node.InternalDrop(e, target.Index); + var target = GetDropTarget(item, e); + if (target != null) { + target.Node.InternalDrop(e, target.Index); + } + } catch (Exception ex) { + Debug.WriteLine(ex.ToString()); + throw; } }