Browse Source

Simplify SharpTreeView's CanDelete() calls.

pull/1/head
Daniel Grunwald 14 years ago
parent
commit
8fd9c3c312
  1. 16
      ILSpy/TreeNodes/AssemblyListTreeNode.cs
  2. 12
      ILSpy/TreeNodes/AssemblyTreeNode.cs
  3. 37
      SharpTreeView/SharpTreeNode.cs
  4. 70
      SharpTreeView/SharpTreeView.cs
  5. 61
      SharpTreeView/SharpTreeViewItem.cs

16
ILSpy/TreeNodes/AssemblyListTreeNode.cs

@ -44,22 +44,6 @@ namespace ICSharpCode.ILSpy.TreeNodes
this.assemblyList = assemblyList; 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) public override DropEffect CanDrop(IDataObject data, DropEffect requestedEffect)
{ {
if (data.GetDataPresent(AssemblyTreeNode.DataFormat)) if (data.GetDataPresent(AssemblyTreeNode.DataFormat))

12
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -160,19 +160,19 @@ namespace ICSharpCode.ILSpy.TreeNodes
return nodes.All(n => n is AssemblyTreeNode); 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"; internal const string DataFormat = "ILSpyAssemblies";

37
SharpTreeView/SharpTreeNode.cs

@ -22,7 +22,7 @@ namespace ICSharpCode.TreeView
{ {
SelectedNodes = new HashSet<SharpTreeNode>(); SelectedNodes = new HashSet<SharpTreeNode>();
ActiveNodes = new HashSet<SharpTreeNode>(); ActiveNodes = new HashSet<SharpTreeNode>();
StartCuttedDataWatcher(); //StartCuttedDataWatcher();
} }
public static HashSet<SharpTreeNode> SelectedNodes { get; private set; } public static HashSet<SharpTreeNode> SelectedNodes { get; private set; }
@ -325,7 +325,7 @@ namespace ICSharpCode.TreeView
#endregion #endregion
#region Cut / Copy / Paste / Delete #region Cut / Copy / Paste / Delete
/*
static List<SharpTreeNode> cuttedNodes = new List<SharpTreeNode>(); static List<SharpTreeNode> cuttedNodes = new List<SharpTreeNode>();
static IDataObject cuttedData; static IDataObject cuttedData;
static EventHandler requerySuggestedHandler; // for weak event static EventHandler requerySuggestedHandler; // for weak event
@ -419,40 +419,32 @@ namespace ICSharpCode.TreeView
ClearCuttedData(); ClearCuttedData();
} }
} }
*/
internal bool InternalCanDelete() public virtual bool CanDelete()
{
return CanDelete(ActiveNodesArray);
}
internal void InternalDelete()
{
Delete(ActiveNodesArray);
}
public virtual bool CanDelete(SharpTreeNode[] nodes)
{ {
return false; return false;
} }
public virtual void Delete(SharpTreeNode[] nodes) public virtual void Delete()
{ {
throw new NotSupportedException(GetType().Name + " does not support deletion"); 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"); 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) public virtual bool CanPaste(IDataObject data)
@ -465,7 +457,7 @@ namespace ICSharpCode.TreeView
EnsureLazyChildren(); EnsureLazyChildren();
Drop(data, Children.Count, DropEffect.Copy); Drop(data, Children.Count, DropEffect.Copy);
} }
*/
#endregion #endregion
#region Drag and Drop #region Drag and Drop
@ -498,7 +490,8 @@ namespace ICSharpCode.TreeView
Drop(e.Data, index, finalEffect); Drop(e.Data, index, finalEffect);
if (finalEffect == DropEffect.Move) { 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 requestedEffect = GetDropEffect(e);
var result = CanDrop(e.Data, requestedEffect); var result = CanDrop(e.Data, requestedEffect);
if (result == DropEffect.Move) { if (result == DropEffect.Move) {
if (!CanDelete(ActiveNodesArray)) { if (!ActiveNodesArray.All(n => n.CanDelete())) {
return DropEffect.None; return DropEffect.None;
} }
} }

70
SharpTreeView/SharpTreeView.cs

@ -35,6 +35,8 @@ namespace ICSharpCode.TreeView
VirtualizingStackPanel.VirtualizationModeProperty.OverrideMetadata(typeof(SharpTreeView), VirtualizingStackPanel.VirtualizationModeProperty.OverrideMetadata(typeof(SharpTreeView),
new FrameworkPropertyMetadata(VirtualizationMode.Recycling)); new FrameworkPropertyMetadata(VirtualizationMode.Recycling));
RegisterCommands();
} }
public static ResourceKey DefaultItemContainerStyleKey { get; private set; } public static ResourceKey DefaultItemContainerStyleKey { get; private set; }
@ -518,5 +520,73 @@ namespace ICSharpCode.TreeView
} }
#endregion #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<SharpTreeNode> GetTopLevelSelection()
{
// TODO: return only top-level selection
return this.SelectedItems.OfType<SharpTreeNode>().ToList();
}
#endregion
} }
} }

61
SharpTreeView/SharpTreeViewItem.cs

@ -19,8 +19,6 @@ namespace ICSharpCode.TreeView
{ {
DefaultStyleKeyProperty.OverrideMetadata(typeof(SharpTreeViewItem), DefaultStyleKeyProperty.OverrideMetadata(typeof(SharpTreeViewItem),
new FrameworkPropertyMetadata(typeof(SharpTreeViewItem))); new FrameworkPropertyMetadata(typeof(SharpTreeViewItem)));
RegisterCommands();
} }
public SharpTreeNode Node public SharpTreeNode Node
@ -136,64 +134,5 @@ namespace ICSharpCode.TreeView
} }
#endregion #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
} }
} }

Loading…
Cancel
Save