diff --git a/ILSpy/TreeNodes/AssemblyListTreeNode.cs b/ILSpy/TreeNodes/AssemblyListTreeNode.cs index 4e83f93d0..0b88d4624 100644 --- a/ILSpy/TreeNodes/AssemblyListTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyListTreeNode.cs @@ -44,22 +44,6 @@ namespace ICSharpCode.ILSpy.TreeNodes this.assemblyList = assemblyList; } - public override bool CanDelete(SharpTreeNode[] nodes) - { - return nodes.All(n => n is AssemblyTreeNode); - } - - public override void Delete(SharpTreeNode[] nodes) - { - DeleteCore(nodes); - } - - public override void DeleteCore(SharpTreeNode[] nodes) - { - foreach (AssemblyTreeNode node in nodes) - assemblyList.Assemblies.Remove(node); - } - public override DropEffect CanDrop(IDataObject data, DropEffect requestedEffect) { if (data.GetDataPresent(AssemblyTreeNode.DataFormat)) diff --git a/ILSpy/TreeNodes/AssemblyTreeNode.cs b/ILSpy/TreeNodes/AssemblyTreeNode.cs index 8a248935d..1a6d642b5 100644 --- a/ILSpy/TreeNodes/AssemblyTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyTreeNode.cs @@ -160,19 +160,19 @@ namespace ICSharpCode.ILSpy.TreeNodes return nodes.All(n => n is AssemblyTreeNode); } - public override bool CanDelete(SharpTreeNode[] nodes) + public override bool CanDelete() { - return Parent != null && Parent.CanDelete(nodes); // handle deletion in the AssemblyListTreeNode + return true; } - public override void Delete(SharpTreeNode[] nodes) + public override void Delete() { - Parent.Delete(nodes); // handle deletion in the AssemblyListTreeNode + DeleteCore(); } - public override void DeleteCore(SharpTreeNode[] nodes) + public override void DeleteCore() { - Parent.DeleteCore(nodes); // handle deletion in the AssemblyListTreeNode + assemblyList.Assemblies.Remove(this); } internal const string DataFormat = "ILSpyAssemblies"; diff --git a/SharpTreeView/SharpTreeNode.cs b/SharpTreeView/SharpTreeNode.cs index 08e18cc32..3eede3b6d 100644 --- a/SharpTreeView/SharpTreeNode.cs +++ b/SharpTreeView/SharpTreeNode.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.TreeView { SelectedNodes = new HashSet(); ActiveNodes = new HashSet(); - StartCuttedDataWatcher(); + //StartCuttedDataWatcher(); } public static HashSet SelectedNodes { get; private set; } @@ -325,7 +325,7 @@ namespace ICSharpCode.TreeView #endregion #region Cut / Copy / Paste / Delete - +/* static List cuttedNodes = new List(); static IDataObject cuttedData; static EventHandler requerySuggestedHandler; // for weak event @@ -419,40 +419,32 @@ namespace ICSharpCode.TreeView ClearCuttedData(); } } + */ - internal bool InternalCanDelete() - { - return CanDelete(ActiveNodesArray); - } - - internal void InternalDelete() - { - Delete(ActiveNodesArray); - } - - public virtual bool CanDelete(SharpTreeNode[] nodes) + public virtual bool CanDelete() { return false; } - public virtual void Delete(SharpTreeNode[] nodes) + public virtual void Delete() { throw new NotSupportedException(GetType().Name + " does not support deletion"); } - public virtual void DeleteCore(SharpTreeNode[] nodes) + public virtual void DeleteCore() { throw new NotSupportedException(GetType().Name + " does not support deletion"); } - public virtual bool CanCopy(SharpTreeNode[] nodes) + public virtual IDataObject Copy(SharpTreeNode[] nodes) { - return false; + throw new NotSupportedException(GetType().Name + " does not support copy/paste or drag'n'drop"); } - public virtual IDataObject Copy(SharpTreeNode[] nodes) + /* + public virtual bool CanCopy(SharpTreeNode[] nodes) { - throw new NotSupportedException(GetType().Name + " does not support copy/paste or drag'n'drop"); + return false; } public virtual bool CanPaste(IDataObject data) @@ -465,7 +457,7 @@ namespace ICSharpCode.TreeView EnsureLazyChildren(); Drop(data, Children.Count, DropEffect.Copy); } - +*/ #endregion #region Drag and Drop @@ -498,7 +490,8 @@ namespace ICSharpCode.TreeView Drop(e.Data, index, finalEffect); if (finalEffect == DropEffect.Move) { - DeleteCore(ActiveNodesArray); + foreach (SharpTreeNode node in ActiveNodesArray) + node.DeleteCore(); } } @@ -507,7 +500,7 @@ namespace ICSharpCode.TreeView var requestedEffect = GetDropEffect(e); var result = CanDrop(e.Data, requestedEffect); if (result == DropEffect.Move) { - if (!CanDelete(ActiveNodesArray)) { + if (!ActiveNodesArray.All(n => n.CanDelete())) { return DropEffect.None; } } diff --git a/SharpTreeView/SharpTreeView.cs b/SharpTreeView/SharpTreeView.cs index e465e88cf..fa3661215 100644 --- a/SharpTreeView/SharpTreeView.cs +++ b/SharpTreeView/SharpTreeView.cs @@ -35,6 +35,8 @@ namespace ICSharpCode.TreeView VirtualizingStackPanel.VirtualizationModeProperty.OverrideMetadata(typeof(SharpTreeView), new FrameworkPropertyMetadata(VirtualizationMode.Recycling)); + + RegisterCommands(); } public static ResourceKey DefaultItemContainerStyleKey { get; private set; } @@ -518,5 +520,73 @@ namespace ICSharpCode.TreeView } #endregion + + #region Cut / Copy / Paste / Delete Commands + + static void RegisterCommands() + { + CommandManager.RegisterClassCommandBinding(typeof(SharpTreeView), + new CommandBinding(ApplicationCommands.Cut, HandleExecuted_Cut, HandleCanExecute_Cut)); + + CommandManager.RegisterClassCommandBinding(typeof(SharpTreeView), + new CommandBinding(ApplicationCommands.Copy, HandleExecuted_Copy, HandleCanExecute_Copy)); + + CommandManager.RegisterClassCommandBinding(typeof(SharpTreeView), + new CommandBinding(ApplicationCommands.Paste, HandleExecuted_Paste, HandleCanExecute_Paste)); + + CommandManager.RegisterClassCommandBinding(typeof(SharpTreeView), + new CommandBinding(ApplicationCommands.Delete, HandleExecuted_Delete, HandleCanExecute_Delete)); + } + + static void HandleExecuted_Cut(object sender, ExecutedRoutedEventArgs e) + { + + } + + static void HandleCanExecute_Cut(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = false; + } + + static void HandleExecuted_Copy(object sender, ExecutedRoutedEventArgs e) + { + + } + + static void HandleCanExecute_Copy(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = false; + } + + static void HandleExecuted_Paste(object sender, ExecutedRoutedEventArgs e) + { + + } + + static void HandleCanExecute_Paste(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = false; + } + + static void HandleExecuted_Delete(object sender, ExecutedRoutedEventArgs e) + { + SharpTreeView treeView = (SharpTreeView)sender; + foreach (SharpTreeNode node in treeView.GetTopLevelSelection()) + node.Delete(); + } + + static void HandleCanExecute_Delete(object sender, CanExecuteRoutedEventArgs e) + { + SharpTreeView treeView = (SharpTreeView)sender; + e.CanExecute = treeView.GetTopLevelSelection().All(node => node.CanDelete()); + } + + IEnumerable GetTopLevelSelection() + { + // TODO: return only top-level selection + return this.SelectedItems.OfType().ToList(); + } + + #endregion } } diff --git a/SharpTreeView/SharpTreeViewItem.cs b/SharpTreeView/SharpTreeViewItem.cs index 93c3efc9c..292826eeb 100644 --- a/SharpTreeView/SharpTreeViewItem.cs +++ b/SharpTreeView/SharpTreeViewItem.cs @@ -19,8 +19,6 @@ namespace ICSharpCode.TreeView { DefaultStyleKeyProperty.OverrideMetadata(typeof(SharpTreeViewItem), new FrameworkPropertyMetadata(typeof(SharpTreeViewItem))); - - RegisterCommands(); } public SharpTreeNode Node @@ -136,64 +134,5 @@ namespace ICSharpCode.TreeView } #endregion - - #region Cut / Copy / Paste / Delete Commands - - static void RegisterCommands() - { - CommandManager.RegisterClassCommandBinding(typeof(SharpTreeViewItem), - new CommandBinding(ApplicationCommands.Cut, HandleExecuted_Cut, HandleCanExecute_Cut)); - - CommandManager.RegisterClassCommandBinding(typeof(SharpTreeViewItem), - new CommandBinding(ApplicationCommands.Copy, HandleExecuted_Copy, HandleCanExecute_Copy)); - - CommandManager.RegisterClassCommandBinding(typeof(SharpTreeViewItem), - new CommandBinding(ApplicationCommands.Paste, HandleExecuted_Paste, HandleCanExecute_Paste)); - - CommandManager.RegisterClassCommandBinding(typeof(SharpTreeViewItem), - new CommandBinding(ApplicationCommands.Delete, HandleExecuted_Delete, HandleCanExecute_Delete)); - } - - static void HandleExecuted_Cut(object sender, ExecutedRoutedEventArgs e) - { - (sender as SharpTreeViewItem).Node.InternalCut(); - } - - static void HandleCanExecute_Cut(object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = (sender as SharpTreeViewItem).Node.InternalCanCut(); - } - - static void HandleExecuted_Copy(object sender, ExecutedRoutedEventArgs e) - { - (sender as SharpTreeViewItem).Node.InternalCopy(); - } - - static void HandleCanExecute_Copy(object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = (sender as SharpTreeViewItem).Node.InternalCanCopy(); - } - - static void HandleExecuted_Paste(object sender, ExecutedRoutedEventArgs e) - { - (sender as SharpTreeViewItem).Node.InternalPaste(); - } - - static void HandleCanExecute_Paste(object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = (sender as SharpTreeViewItem).Node.InternalCanPaste(); - } - - static void HandleExecuted_Delete(object sender, ExecutedRoutedEventArgs e) - { - (sender as SharpTreeViewItem).Node.InternalDelete(); - } - - static void HandleCanExecute_Delete(object sender, CanExecuteRoutedEventArgs e) - { - e.CanExecute = (sender as SharpTreeViewItem).Node.InternalCanDelete(); - } - - #endregion } }