Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs =================================================================== diff -u -r032deeba1408fb0841a63623cae9c0ad999a11c7 -ra7344a227d40381dd9f5f2559a3402250e97a5f3 --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision 032deeba1408fb0841a63623cae9c0ad999a11c7) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision a7344a227d40381dd9f5f2559a3402250e97a5f3) @@ -123,11 +123,23 @@ tagTypeTreeNodeInfoLookup[treeNodeInfo.TagType] = treeNodeInfo; } - public void DeleteNode(TreeNode node) + public bool CanRename(TreeNode node) { var treeNodeInfo = GetTreeNodeInfoForData(node.Tag); - if (treeNodeInfo.CanRemove == null || !treeNodeInfo.CanRemove(node.Tag, node.Parent != null ? node.Parent.Tag : null)) + return treeNodeInfo.CanRename != null && treeNodeInfo.CanRename(node); + } + + public bool CanRemove(TreeNode node) + { + var treeNodeInfo = GetTreeNodeInfoForData(node.Tag); + + return treeNodeInfo.CanRemove != null && treeNodeInfo.CanRemove(node.Tag, node.Parent != null ? node.Parent.Tag : null); + } + + public void DeleteNode(TreeNode node) + { + if (!CanRemove(node)) { MessageBox.Show(Resources.TreeView_DeleteNodeData_The_selected_item_cannot_be_removed, BaseResources.Confirm, MessageBoxButtons.OK); return; @@ -139,6 +151,8 @@ return; } + var treeNodeInfo = GetTreeNodeInfoForData(node.Tag); + if (treeNodeInfo.OnNodeRemoved != null) { treeNodeInfo.OnNodeRemoved(node.Tag, node.Parent != null ? node.Parent.Tag : null); @@ -449,8 +463,7 @@ private void TreeViewBeforeLabelEdit(object sender, NodeLabelEditEventArgs e) { - var treeNodeInfo = GetTreeNodeInfoForData(e.Node.Tag); - if (treeNodeInfo.CanRename == null || !treeNodeInfo.CanRename(e.Node)) + if (!CanRename(e.Node)) { e.CancelEdit = true; } Index: Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuBuilder.cs =================================================================== diff -u -rb3db013105d10992eeefea39f5ecbdacdd57b4d4 -ra7344a227d40381dd9f5f2559a3402250e97a5f3 --- Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuBuilder.cs (.../ContextMenuBuilder.cs) (revision b3db013105d10992eeefea39f5ecbdacdd57b4d4) +++ Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuBuilder.cs (.../ContextMenuBuilder.cs) (revision a7344a227d40381dd9f5f2559a3402250e97a5f3) @@ -61,7 +61,7 @@ try { guiItemsFactory = new GuiContextMenuItemFactory(featureCommandHandler, importExportHandler, viewsCommandsHandler, treeNode); - treeViewItemsFactory = new TreeViewContextMenuItemFactory(treeNode, treeNodeInfo, treeViewControl); + treeViewItemsFactory = new TreeViewContextMenuItemFactory(treeNode, treeViewControl); } catch (ArgumentNullException e) { Index: Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs =================================================================== diff -u -r032deeba1408fb0841a63623cae9c0ad999a11c7 -ra7344a227d40381dd9f5f2559a3402250e97a5f3 --- Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs (.../TreeViewContextMenuItemFactory.cs) (revision 032deeba1408fb0841a63623cae9c0ad999a11c7) +++ Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs (.../TreeViewContextMenuItemFactory.cs) (revision a7344a227d40381dd9f5f2559a3402250e97a5f3) @@ -33,35 +33,27 @@ internal class TreeViewContextMenuItemFactory { private readonly TreeNode treeNode; - private readonly TreeNodeInfo treeNodeInfo; private readonly TreeViewControl treeViewControl; /// /// Creates a new instance of for the given . /// /// The for which to create the objects. - /// The to use while creating the objects. /// The to use while executing the actions. /// Thrown when is null. - public TreeViewContextMenuItemFactory(TreeNode treeNode, TreeNodeInfo treeNodeInfo, TreeViewControl treeViewControl) + public TreeViewContextMenuItemFactory(TreeNode treeNode, TreeViewControl treeViewControl) { if (treeNode == null) { throw new ArgumentNullException("treeNode", Resources.ContextMenuItemFactory_Can_not_create_context_menu_items_without_tree_node); } - if (treeNodeInfo == null) - { - throw new ArgumentNullException("treeNodeInfo", Resources.ContextMenuItemFactory_Can_not_create_context_menu_items_without_tree_node_info); - } - if (treeViewControl == null) { throw new ArgumentNullException("treeViewControl", Resources.ContextMenuItemFactory_Can_not_create_context_menu_items_without_tree_view_control); } this.treeNode = treeNode; - this.treeNodeInfo = treeNodeInfo; this.treeViewControl = treeViewControl; } @@ -76,7 +68,7 @@ { ToolTipText = Resources.Rename_ToolTip, Image = Resources.RenameIcon, - Enabled = treeNodeInfo.CanRename != null && treeNodeInfo.CanRename(treeNode) + Enabled = treeViewControl.CanRename(treeNode) }; toolStripMenuItem.Click += (s, e) => treeNode.BeginEdit(); return toolStripMenuItem; @@ -93,7 +85,7 @@ { ToolTipText = Resources.Delete_ToolTip, Image = Resources.DeleteIcon, - Enabled = treeNodeInfo.CanRemove != null && treeNodeInfo.CanRemove(treeNode.Tag, treeNode.Parent != null ? treeNode.Parent.Tag : null) + Enabled = treeViewControl.CanRemove(treeNode) }; toolStripMenuItem.Click += (s, e) => treeViewControl.DeleteNode(treeNode); return toolStripMenuItem; Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs =================================================================== diff -u -r5f53f2f23d0c4145d79823c5443966ff4a5a830f -ra7344a227d40381dd9f5f2559a3402250e97a5f3 --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs (.../ContextMenuBuilderTest.cs) (revision 5f53f2f23d0c4145d79823c5443966ff4a5a830f) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs (.../ContextMenuBuilderTest.cs) (revision a7344a227d40381dd9f5f2559a3402250e97a5f3) @@ -102,24 +102,6 @@ } [Test] - public void Constructor_NoTreeNodeInfo_ThrowsContextMenuBuilderException() - { - // Setup - var applicationFeatureCommandsMock = mocks.StrictMock(); - var treeNodeMock = mocks.StrictMock(); - var importExportHandlerMock = mocks.StrictMock(); - var viewCommandsMock = mocks.StrictMock(); - var treeViewControlMock = mocks.StrictMock(); - - // Call - TestDelegate test = () => new ContextMenuBuilder(applicationFeatureCommandsMock, importExportHandlerMock, viewCommandsMock, treeNodeMock, null, treeViewControlMock); - - // Assert - var message = Assert.Throws(test).Message; - Assert.AreEqual(Resources.ContextMenuBuilder_ContextMenuBuilder_Cannot_create_instances_of_factories, message); - } - - [Test] public void Constructor_NoTreeViewControl_ThrowsContextMenuBuilderException() { // Setup @@ -186,18 +168,21 @@ public void AddRenameItem_WhenBuild_ItemAddedToContextMenu() { // Setup + var treeViewControl = new TreeViewControl(); var applicationFeatureCommandsMock = mocks.StrictMock(); var exportImportHandlerMock = mocks.StrictMock(); var viewCommandsMock = mocks.StrictMock(); var treeNodeMock = mocks.StrictMock(); - var treeNodeInfoMock = mocks.StrictMock(); - var treeViewControlMock = mocks.StrictMock(); + var treeNodeInfoMock = mocks.StrictMock>(); + treeNodeMock.Expect(tn => tn.Tag).Return(new object()); treeNodeInfoMock.CanRename = treeNode => treeNode == treeNodeMock; + treeViewControl.RegisterTreeNodeInfo(treeNodeInfoMock); + mocks.ReplayAll(); - var builder = new ContextMenuBuilder(applicationFeatureCommandsMock, exportImportHandlerMock, viewCommandsMock, treeNodeMock, treeNodeInfoMock, treeViewControlMock); + var builder = new ContextMenuBuilder(applicationFeatureCommandsMock, exportImportHandlerMock, viewCommandsMock, treeNodeMock, treeNodeInfoMock, treeViewControl); // Call var result = builder.AddRenameItem().Build(); @@ -215,26 +200,28 @@ public void AddDeleteItem_WhenBuild_ItemAddedToContextMenu() { // Setup + var treeViewControl = new TreeViewControl(); var applicationFeatureCommandsMock = mocks.StrictMock(); var exportImportHandlerMock = mocks.StrictMock(); var viewCommandsMock = mocks.StrictMock(); - var treeViewControlMock = mocks.StrictMock(); var treeParentNodeMock = mocks.StrictMock(); var treeNodeMock = mocks.StrictMock(); - var treeNodeInfoMock = mocks.StrictMock(); + var treeNodeInfoMock = mocks.StrictMock>(); treeNodeMock.Stub(tn => tn.Parent).Return(treeParentNodeMock); var nodeData = new object(); var parentData = new object(); - treeNodeMock.Expect(tn => tn.Tag).Return(nodeData); + treeNodeMock.Stub(tn => tn.Tag).Return(nodeData); treeParentNodeMock.Expect(tn => tn.Tag).Return(parentData); treeNodeInfoMock.CanRemove = (nd, pnd) => nd == nodeData && pnd == parentData; + treeViewControl.RegisterTreeNodeInfo(treeNodeInfoMock); + mocks.ReplayAll(); - var builder = new ContextMenuBuilder(applicationFeatureCommandsMock, exportImportHandlerMock, viewCommandsMock, treeNodeMock, treeNodeInfoMock, treeViewControlMock); + var builder = new ContextMenuBuilder(applicationFeatureCommandsMock, exportImportHandlerMock, viewCommandsMock, treeNodeMock, treeNodeInfoMock, treeViewControl); // Call var result = builder.AddDeleteItem().Build(); Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs =================================================================== diff -u -r032deeba1408fb0841a63623cae9c0ad999a11c7 -ra7344a227d40381dd9f5f2559a3402250e97a5f3 --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs (.../TreeViewContextMenuItemFactoryTest.cs) (revision 032deeba1408fb0841a63623cae9c0ad999a11c7) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs (.../TreeViewContextMenuItemFactoryTest.cs) (revision a7344a227d40381dd9f5f2559a3402250e97a5f3) @@ -25,11 +25,10 @@ public void Constructor_WithoutTreeNode_ThrowsArgumentNullException() { // Setup - var treeNodeInfoMock = mocks.StrictMock(); var treeViewControlMock = mocks.StrictMock(); // Call - TestDelegate test = () => new TreeViewContextMenuItemFactory(null, treeNodeInfoMock, treeViewControlMock); + TestDelegate test = () => new TreeViewContextMenuItemFactory(null, treeViewControlMock); // Assert var message = Assert.Throws(test).Message; @@ -38,34 +37,15 @@ } [Test] - public void Constructor_WithoutTreeNodeInfo_ThrowsArgumentNullException() - { - // Setup - var treeNodeMock = mocks.StrictMock(); - var treeViewControlMock = mocks.StrictMock(); - - mocks.ReplayAll(); - - // Call - TestDelegate test = () => new TreeViewContextMenuItemFactory(treeNodeMock, null, treeViewControlMock); - - // Assert - var message = Assert.Throws(test).Message; - StringAssert.StartsWith(Resources.ContextMenuItemFactory_Can_not_create_context_menu_items_without_tree_node_info, message); - StringAssert.EndsWith("treeNodeInfo", message); - } - - [Test] public void Constructor_WithoutTreeViewControl_ThrowsArgumentNullException() { // Setup var treeNodeMock = mocks.StrictMock(); - var treeNodeInfoMock = mocks.StrictMock(); mocks.ReplayAll(); // Call - TestDelegate test = () => new TreeViewContextMenuItemFactory(treeNodeMock, treeNodeInfoMock, null); + TestDelegate test = () => new TreeViewContextMenuItemFactory(treeNodeMock, null); // Assert var message = Assert.Throws(test).Message; @@ -78,13 +58,12 @@ { // Setup var treeNodeMock = mocks.StrictMock(); - var treeNodeInfoMock = mocks.StrictMock(); var treeViewControlMock = mocks.StrictMock(); mocks.ReplayAll(); // Call - TestDelegate test = () => new TreeViewContextMenuItemFactory(treeNodeMock, treeNodeInfoMock, treeViewControlMock); + TestDelegate test = () => new TreeViewContextMenuItemFactory(treeNodeMock, treeViewControlMock); // Assert Assert.DoesNotThrow(test); @@ -121,14 +100,16 @@ return !canDelete; }; + treeViewControlMock.Expect(tvc => tvc.CanRemove(treeNodeMock)).Return(canDelete); + if (canDelete) { treeViewControlMock.Expect(tvc => tvc.DeleteNode(treeNodeMock)); } mocks.ReplayAll(); - var factory = new TreeViewContextMenuItemFactory(treeNodeMock, treeNodeInfoMock, treeViewControlMock); + var factory = new TreeViewContextMenuItemFactory(treeNodeMock, treeViewControlMock); // Call var item = factory.CreateDeleteItem(); @@ -163,14 +144,16 @@ return !canRename; }; + treeViewControlMock.Expect(tvc => tvc.CanRename(treeNodeMock)).Return(canRename); + if (canRename) { treeNodeMock.Expect(tv => tv.BeginEdit()); } mocks.ReplayAll(); - var factory = new TreeViewContextMenuItemFactory(treeNodeMock, treeNodeInfoMock, treeViewControlMock); + var factory = new TreeViewContextMenuItemFactory(treeNodeMock, treeViewControlMock); // Call var item = factory.CreateRenameItem(); @@ -201,7 +184,7 @@ treeNodeInfo.ChildNodeObjects = o => new object[] { new TreeNode() }; } - var factory = new TreeViewContextMenuItemFactory(treeNode, treeNodeInfo, treeViewControl); + var factory = new TreeViewContextMenuItemFactory(treeNode, treeViewControl); // Precondition Assert.IsFalse(treeNode.IsExpanded); @@ -240,7 +223,7 @@ Assert.IsTrue(treeNode.IsExpanded); } - var factory = new TreeViewContextMenuItemFactory(treeNode, treeNodeInfo, treeViewControl); + var factory = new TreeViewContextMenuItemFactory(treeNode, treeViewControl); // Call var item = factory.CreateCollapseAllItem(); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -r5f53f2f23d0c4145d79823c5443966ff4a5a830f -ra7344a227d40381dd9f5f2559a3402250e97a5f3 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs (.../PipingCalculationGroupContextTreeNodeInfoTest.cs) (revision 5f53f2f23d0c4145d79823c5443966ff4a5a830f) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs (.../PipingCalculationGroupContextTreeNodeInfoTest.cs) (revision a7344a227d40381dd9f5f2559a3402250e97a5f3) @@ -747,6 +747,9 @@ var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, node, info, treeViewControl); gui.Expect(g => g.Get(node, info, treeViewControl)).Return(menuBuilder); + treeViewControl.Expect(tvc => tvc.CanRename(node)).Return(true); + treeViewControl.Expect(tvc => tvc.CanRemove(node)).Return(true); + mocks.ReplayAll(); plugin.Gui = gui; @@ -862,6 +865,8 @@ var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, node, info, treeViewControl); gui.Expect(g => g.Get(node, info, treeViewControl)).Return(menuBuilder); + treeViewControl.Expect(tvc => tvc.CanRename(node)).Return(true); + mocks.ReplayAll(); plugin.Gui = gui;