Browse Source

Allow drag'n'drop reordering of assembly tree nodes.

pull/1/head
Daniel Grunwald 15 years ago
parent
commit
3de637c632
  1. 30
      ILSpy/AssemblyListTreeNode.cs
  2. 4
      ILSpy/AssemblyTreeNode.cs
  3. 1
      SharpTreeView/SharpTreeNode.cs
  4. 16
      SharpTreeView/SharpTreeView.cs

30
ILSpy/AssemblyListTreeNode.cs

@ -7,6 +7,8 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Windows;
using ICSharpCode.TreeView; using ICSharpCode.TreeView;
using Mono.Cecil; using Mono.Cecil;
@ -33,9 +35,33 @@ namespace ICSharpCode.ILSpy
this.Children.Remove(node); 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) public AssemblyTreeNode OpenAssembly(string file)

4
ILSpy/AssemblyTreeNode.cs

@ -152,10 +152,12 @@ namespace ICSharpCode.ILSpy
Parent.DeleteCore(nodes); // handle deletion in the AssemblyListTreeNode Parent.DeleteCore(nodes); // handle deletion in the AssemblyListTreeNode
} }
internal const string DataFormat = "ILSpyAssemblies";
public override IDataObject Copy(SharpTreeNode[] nodes) public override IDataObject Copy(SharpTreeNode[] nodes)
{ {
DataObject dataObject = new DataObject(); DataObject dataObject = new DataObject();
dataObject.SetData("ILSpyAssemblies", nodes.OfType<AssemblyTreeNode>()); dataObject.SetData(DataFormat, nodes.OfType<AssemblyTreeNode>().Select(n => n.fileName).ToArray());
return dataObject; return dataObject;
} }
} }

1
SharpTreeView/SharpTreeNode.cs

@ -558,6 +558,7 @@ namespace ICSharpCode.TreeView
public virtual void Drop(IDataObject data, int index, DropEffect finalEffect) public virtual void Drop(IDataObject data, int index, DropEffect finalEffect)
{ {
throw new NotSupportedException(GetType().Name + " does not support Drop()");
} }
#endregion #endregion

16
SharpTreeView/SharpTreeView.cs

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Windows.Controls; using System.Windows.Controls;
@ -251,12 +252,17 @@ namespace ICSharpCode.TreeView
internal void HandleDrop(SharpTreeViewItem item, DragEventArgs e) internal void HandleDrop(SharpTreeViewItem item, DragEventArgs e)
{ {
HidePreview(); try {
e.Handled = true; HidePreview();
e.Handled = true;
var target = GetDropTarget(item, e); var target = GetDropTarget(item, e);
if (target != null) { if (target != null) {
target.Node.InternalDrop(e, target.Index); target.Node.InternalDrop(e, target.Index);
}
} catch (Exception ex) {
Debug.WriteLine(ex.ToString());
throw;
} }
} }

Loading…
Cancel
Save