Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs =================================================================== diff -u -rb3883ecc0719d5df114cacc849796c0ca420507d -r032deeba1408fb0841a63623cae9c0ad999a11c7 --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision b3883ecc0719d5df114cacc849796c0ca420507d) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision 032deeba1408fb0841a63623cae9c0ad999a11c7) @@ -123,20 +123,28 @@ tagTypeTreeNodeInfoLookup[treeNodeInfo.TagType] = treeNodeInfo; } - public void DeleteNode(TreeNode selectedNode, TreeNodeInfo treeNodeInfo) + public void DeleteNode(TreeNode node) { - var message = string.Format(Resources.TreeView_DeleteNodeData_Are_you_sure_you_want_to_delete_the_following_item_0_, selectedNode.Text); + var treeNodeInfo = GetTreeNodeInfoForData(node.Tag); + + if (treeNodeInfo.CanRemove == null || !treeNodeInfo.CanRemove(node.Tag, node.Parent != null ? node.Parent.Tag : null)) + { + MessageBox.Show(Resources.TreeView_DeleteNodeData_The_selected_item_cannot_be_removed, BaseResources.Confirm, MessageBoxButtons.OK); + return; + } + + var message = string.Format(Resources.TreeView_DeleteNodeData_Are_you_sure_you_want_to_delete_the_following_item_0_, node.Text); if (MessageBox.Show(message, BaseResources.Confirm, MessageBoxButtons.OKCancel) != DialogResult.OK) { return; } if (treeNodeInfo.OnNodeRemoved != null) { - treeNodeInfo.OnNodeRemoved(selectedNode.Tag, selectedNode.Parent != null ? selectedNode.Parent.Tag : null); + treeNodeInfo.OnNodeRemoved(node.Tag, node.Parent != null ? node.Parent.Tag : null); } - OnNodeDataDeleted(selectedNode); + OnNodeDataDeleted(node); } public void CollapseAll(TreeNode node) @@ -519,18 +527,10 @@ break; } - case Keys.Delete: // If allowed, delete the selected node + case Keys.Delete: // Try to delete the selected node { - var treeNodeInfo = GetTreeNodeInfoForData(selectedNode.Tag); + DeleteNode(selectedNode); - if (treeNodeInfo.CanRemove == null || !treeNodeInfo.CanRemove(selectedNode.Tag, selectedNode.Parent != null ? selectedNode.Parent.Tag : null)) - { - MessageBox.Show(Resources.TreeView_DeleteNodeData_The_selected_item_cannot_be_removed, BaseResources.Confirm, MessageBoxButtons.OK); - break; - } - - DeleteNode(selectedNode, treeNodeInfo); - break; } case Keys.Space: // If applicable, change the checked state of the selected node Index: Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs =================================================================== diff -u -rd5c5751c7eee70e25699a1a03a7d78aa56dbe2ea -r032deeba1408fb0841a63623cae9c0ad999a11c7 --- Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs (.../TreeViewContextMenuItemFactory.cs) (revision d5c5751c7eee70e25699a1a03a7d78aa56dbe2ea) +++ Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs (.../TreeViewContextMenuItemFactory.cs) (revision 032deeba1408fb0841a63623cae9c0ad999a11c7) @@ -95,7 +95,7 @@ Image = Resources.DeleteIcon, Enabled = treeNodeInfo.CanRemove != null && treeNodeInfo.CanRemove(treeNode.Tag, treeNode.Parent != null ? treeNode.Parent.Tag : null) }; - toolStripMenuItem.Click += (s, e) => treeViewControl.DeleteNode(treeNode, treeNodeInfo); + toolStripMenuItem.Click += (s, e) => treeViewControl.DeleteNode(treeNode); return toolStripMenuItem; } Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs =================================================================== diff -u -rd5c5751c7eee70e25699a1a03a7d78aa56dbe2ea -r032deeba1408fb0841a63623cae9c0ad999a11c7 --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs (.../TreeViewContextMenuItemFactoryTest.cs) (revision d5c5751c7eee70e25699a1a03a7d78aa56dbe2ea) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs (.../TreeViewContextMenuItemFactoryTest.cs) (revision 032deeba1408fb0841a63623cae9c0ad999a11c7) @@ -123,7 +123,7 @@ if (canDelete) { - treeViewControlMock.Expect(tvc => tvc.DeleteNode(treeNodeMock, treeNodeInfoMock)); + treeViewControlMock.Expect(tvc => tvc.DeleteNode(treeNodeMock)); } mocks.ReplayAll(); Index: Core/Plugins/test/Core.Plugins.ProjectExplorer.Test/ProjectExplorerTest.cs =================================================================== diff -u -rc37787efa31f4a9aa6df2ace311109ccd21d96fd -r032deeba1408fb0841a63623cae9c0ad999a11c7 --- Core/Plugins/test/Core.Plugins.ProjectExplorer.Test/ProjectExplorerTest.cs (.../ProjectExplorerTest.cs) (revision c37787efa31f4a9aa6df2ace311109ccd21d96fd) +++ Core/Plugins/test/Core.Plugins.ProjectExplorer.Test/ProjectExplorerTest.cs (.../ProjectExplorerTest.cs) (revision 032deeba1408fb0841a63623cae9c0ad999a11c7) @@ -146,7 +146,8 @@ { new TreeNodeInfo { - TagType = typeof(Project) + TagType = typeof(Project), + CanRemove = (item, parent) => true } }; @@ -170,7 +171,7 @@ }) { // Call - explorer.TreeViewControl.DeleteNode(explorer.TreeViewControl.GetNodeByTag(project), new TreeNodeInfo()); + explorer.TreeViewControl.DeleteNode(explorer.TreeViewControl.GetNodeByTag(project)); } // Assert mocks.VerifyAll();