Index: Core/Common/src/Core.Common.Controls.Swf/TreeViewControls/ITreeNodePresenter.cs =================================================================== diff -u -r528577e7cac9c86626794fafc6c6c147146c5e84 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Core/Common/src/Core.Common.Controls.Swf/TreeViewControls/ITreeNodePresenter.cs (.../ITreeNodePresenter.cs) (revision 528577e7cac9c86626794fafc6c6c147146c5e84) +++ Core/Common/src/Core.Common.Controls.Swf/TreeViewControls/ITreeNodePresenter.cs (.../ITreeNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -131,7 +131,7 @@ /// /// Returns context menu based on current data /// - ContextMenuStrip GetContextMenu(ITreeNode sender, object nodeData); + ContextMenuStrip GetContextMenu(ITreeNode node, object nodeData); /// /// Updates node due to it's property change. Index: Core/Common/src/Core.Common.Controls.Swf/TreeViewControls/TreeViewNodePresenterBase.cs =================================================================== diff -u -r528577e7cac9c86626794fafc6c6c147146c5e84 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Core/Common/src/Core.Common.Controls.Swf/TreeViewControls/TreeViewNodePresenterBase.cs (.../TreeViewNodePresenterBase.cs) (revision 528577e7cac9c86626794fafc6c6c147146c5e84) +++ Core/Common/src/Core.Common.Controls.Swf/TreeViewControls/TreeViewNodePresenterBase.cs (.../TreeViewNodePresenterBase.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -151,7 +151,7 @@ throw new NotImplementedException(); } - public virtual ContextMenuStrip GetContextMenu(ITreeNode sender, object nodeData) + public virtual ContextMenuStrip GetContextMenu(ITreeNode node, object nodeData) { return null; } Index: Core/Common/src/Core.Common.Gui.Swf/TreeViewNodePresenterBaseForPluginGui.cs =================================================================== diff -u -ra950714ad9510756331d862aa35695fa0b2ed03b -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Core/Common/src/Core.Common.Gui.Swf/TreeViewNodePresenterBaseForPluginGui.cs (.../TreeViewNodePresenterBaseForPluginGui.cs) (revision a950714ad9510756331d862aa35695fa0b2ed03b) +++ Core/Common/src/Core.Common.Gui.Swf/TreeViewNodePresenterBaseForPluginGui.cs (.../TreeViewNodePresenterBaseForPluginGui.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -20,13 +20,13 @@ public GuiPlugin GuiPlugin { get; set; } - public override ContextMenuStrip GetContextMenu(ITreeNode sender, object nodeData) + public override ContextMenuStrip GetContextMenu(ITreeNode node, object nodeData) { if (GuiPlugin == null) { return null; } - var x = GuiPlugin.GetContextMenu(sender, nodeData); + var x = GuiPlugin.GetContextMenu(node, nodeData); return x; } Index: Core/Plugins/src/Core.Plugins.ProjectExplorer/NodePresenters/ProjectNodePresenter.cs =================================================================== diff -u -r528577e7cac9c86626794fafc6c6c147146c5e84 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Core/Plugins/src/Core.Plugins.ProjectExplorer/NodePresenters/ProjectNodePresenter.cs (.../ProjectNodePresenter.cs) (revision 528577e7cac9c86626794fafc6c6c147146c5e84) +++ Core/Plugins/src/Core.Plugins.ProjectExplorer/NodePresenters/ProjectNodePresenter.cs (.../ProjectNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -54,7 +54,7 @@ node.Tag = project; } - public override ContextMenuStrip GetContextMenu(ITreeNode sender, object nodeData) + public override ContextMenuStrip GetContextMenu(ITreeNode node, object nodeData) { var addItem = new StrictContextMenuItem( Resources.AddItem, @@ -63,7 +63,7 @@ (s, e) => commandHandler.AddNewItem(nodeData)); return contextMenuBuilderProvider - .Get(sender) + .Get(node) .AddCustomItem(addItem) .AddSeparator() .AddExpandAllItem() Index: Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/CategoryTreeFolderNodePresenter.cs =================================================================== diff -u -r074232b001ecb5ae110c0b95c05264d4372cbfb5 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/CategoryTreeFolderNodePresenter.cs (.../CategoryTreeFolderNodePresenter.cs) (revision 074232b001ecb5ae110c0b95c05264d4372cbfb5) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/CategoryTreeFolderNodePresenter.cs (.../CategoryTreeFolderNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -36,10 +36,10 @@ return nodeData.Contents; } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, CategoryTreeFolder nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, CategoryTreeFolder nodeData) { return contextMenuBuilderProvider - .Get(sender) + .Get(node) .AddExpandAllItem() .AddCollapseAllItem() .Build(); Index: Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/RingtoetsNodePresenterBase.cs =================================================================== diff -u -r528577e7cac9c86626794fafc6c6c147146c5e84 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/RingtoetsNodePresenterBase.cs (.../RingtoetsNodePresenterBase.cs) (revision 528577e7cac9c86626794fafc6c6c147146c5e84) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/RingtoetsNodePresenterBase.cs (.../RingtoetsNodePresenterBase.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -104,9 +104,9 @@ OnNodeSelected((T)nodeData); } - public ContextMenuStrip GetContextMenu(ITreeNode sender, object nodeData) + public ContextMenuStrip GetContextMenu(ITreeNode node, object nodeData) { - return GetContextMenu(sender, (T)nodeData); + return GetContextMenu(node, (T)nodeData); } public void OnPropertyChanged(object sender, ITreeNode node, PropertyChangedEventArgs e) @@ -184,7 +184,7 @@ /// Typed implementation of method . /// /// - protected virtual ContextMenuStrip GetContextMenu(ITreeNode sender, T nodeData) + protected virtual ContextMenuStrip GetContextMenu(ITreeNode node, T nodeData) { return null; } Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/AssessmentSectionBaseNodePresenter.cs =================================================================== diff -u -r074232b001ecb5ae110c0b95c05264d4372cbfb5 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/AssessmentSectionBaseNodePresenter.cs (.../AssessmentSectionBaseNodePresenter.cs) (revision 074232b001ecb5ae110c0b95c05264d4372cbfb5) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/AssessmentSectionBaseNodePresenter.cs (.../AssessmentSectionBaseNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -75,10 +75,10 @@ return true; } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, AssessmentSectionBase nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, AssessmentSectionBase nodeData) { return contextMenuBuilderProvider - .Get(sender) + .Get(node) .AddDeleteItem() .AddSeparator() .AddExpandAllItem() Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismContributionNodePresenter.cs =================================================================== diff -u -r6fc99be8198e5795ca4be54719dab3d1be3c6299 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismContributionNodePresenter.cs (.../FailureMechanismContributionNodePresenter.cs) (revision 6fc99be8198e5795ca4be54719dab3d1be3c6299) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismContributionNodePresenter.cs (.../FailureMechanismContributionNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -17,10 +17,10 @@ node.Image = Resources.GenericInputOutputIcon; } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, FailureMechanismContribution nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, FailureMechanismContribution nodeData) { return contextMenuBuilderProvider - .Get(sender) + .Get(node) .AddOpenItem() .Build(); } Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismNodePresenter.cs =================================================================== diff -u -r074232b001ecb5ae110c0b95c05264d4372cbfb5 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismNodePresenter.cs (.../FailureMechanismNodePresenter.cs) (revision 074232b001ecb5ae110c0b95c05264d4372cbfb5) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismNodePresenter.cs (.../FailureMechanismNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -39,7 +39,7 @@ yield return new CategoryTreeFolder(RingtoetsCommonFormsResources.FailureMechanism_Outputs_DisplayName, GetOutputs(nodeData), TreeFolderCategory.Output); } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, FailureMechanismPlaceholder nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, FailureMechanismPlaceholder nodeData) { var calculateItem = new StrictContextMenuItem( RingtoetsCommonFormsResources.Calculate_all, @@ -58,7 +58,7 @@ Enabled = false }; - return contextMenuBuilderProvider.Get(sender) + return contextMenuBuilderProvider.Get(node) .AddCustomItem(calculateItem) .AddCustomItem(clearOutputItem) .AddSeparator() Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/PlaceholderWithReadonlyNameNodePresenter.cs =================================================================== diff -u -r6fc99be8198e5795ca4be54719dab3d1be3c6299 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/PlaceholderWithReadonlyNameNodePresenter.cs (.../PlaceholderWithReadonlyNameNodePresenter.cs) (revision 6fc99be8198e5795ca4be54719dab3d1be3c6299) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/PlaceholderWithReadonlyNameNodePresenter.cs (.../PlaceholderWithReadonlyNameNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -32,9 +32,9 @@ node.Image = GetIconForPlaceholder(nodeData); } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PlaceholderWithReadonlyName nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, PlaceholderWithReadonlyName nodeData) { - IContextMenuBuilder menuBuilder = contextMenuBuilderProvider.Get(sender); + IContextMenuBuilder menuBuilder = contextMenuBuilderProvider.Get(node); if (nodeData is InputPlaceholder || nodeData is OutputPlaceholder) { Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationContextNodePresenter.cs =================================================================== diff -u -r528577e7cac9c86626794fafc6c6c147146c5e84 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationContextNodePresenter.cs (.../PipingCalculationContextNodePresenter.cs) (revision 528577e7cac9c86626794fafc6c6c147146c5e84) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationContextNodePresenter.cs (.../PipingCalculationContextNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -110,7 +110,7 @@ pipingCalculationContext.WrappedData.NotifyObservers(); } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingCalculationContext nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, PipingCalculationContext nodeData) { PipingCalculation calculation = nodeData.WrappedData; var validateItem = new StrictContextMenuItem(Resources.PipingCalculationItem_Validate, @@ -138,7 +138,7 @@ } return contextMenuBuilderProvider - .Get(sender) + .Get(node) .AddCustomItem(validateItem) .AddCustomItem(calculateItem) .AddCustomItem(clearOutputItem) Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationGroupContextNodePresenter.cs =================================================================== diff -u -r90e159562efbe49fe2c2e348ee04b6a75b4eec13 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationGroupContextNodePresenter.cs (.../PipingCalculationGroupContextNodePresenter.cs) (revision 90e159562efbe49fe2c2e348ee04b6a75b4eec13) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationGroupContextNodePresenter.cs (.../PipingCalculationGroupContextNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -65,10 +65,14 @@ { PipingFailureMechanism sourceFailureMechanism; var node = sourceNode; - while ((sourceFailureMechanism = node.Parent.Tag as PipingFailureMechanism) == null) + while ((sourceFailureMechanism = node.Tag as PipingFailureMechanism) == null) { // No parent found, go search higher up hierarchy! node = node.Parent; + if (node == null) + { + break; + } } return sourceFailureMechanism; } @@ -120,7 +124,7 @@ return base.RemoveNodeData(parentNodeData, nodeData); } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingCalculationGroupContext nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, PipingCalculationGroupContext nodeData) { var group = nodeData.WrappedData; var addCalculationGroupItem = new StrictContextMenuItem(PipingFormsResources.PipingCalculationGroup_Add_PipingCalculationGroup, @@ -131,8 +135,11 @@ { Name = NamingHelper.GetUniqueName(group.Children, Resources.PipingCalculationGroup_DefaultName, c => c.Name) }; + group.Children.Add(newGroup); nodeData.NotifyObservers(); + + SelectNewlyAddedItemInTreeView(node); }); var addCalculationItem = new StrictContextMenuItem(PipingFormsResources.PipingCalculationGroup_Add_PipingCalculation, PipingFormsResources.PipingCalculationGroup_Add_PipingCalculation_ToolTip, @@ -142,8 +149,11 @@ { Name = NamingHelper.GetUniqueName(group.Children, Resources.PipingCalculation_DefaultName, c => c.Name) }; + group.Children.Add(calculation); nodeData.NotifyObservers(); + + SelectNewlyAddedItemInTreeView(node); }); var validateAllItem = new StrictContextMenuItem(PipingFormsResources.PipingCalculationItem_Validate, PipingFormsResources.PipingCalculationGroup_Validate_ToolTip, @@ -177,7 +187,7 @@ clearAllItem.ToolTipText = PipingFormsResources.PipingCalculationGroup_ClearOutput_No_calculation_with_output_to_clear; } - return contextMenuBuilderProvider.Get(sender) + return contextMenuBuilderProvider.Get(node) .AddCustomItem(addCalculationGroupItem) .AddCustomItem(addCalculationItem) .AddSeparator() @@ -195,6 +205,17 @@ .Build(); } + private void SelectNewlyAddedItemInTreeView(ITreeNode node) + { + // Expand parent of 'newItem' to ensure its selected state is visible. + if (!node.IsExpanded) + { + node.Expand(); + } + ITreeNode newlyAppendedNodeForNewItem = node.Nodes.Last(); + TreeView.SelectedNode = newlyAppendedNodeForNewItem; + } + protected override IEnumerable GetChildNodeObjects(PipingCalculationGroupContext nodeData) { foreach (IPipingCalculationItem item in nodeData.WrappedData.Children) @@ -243,13 +264,14 @@ originalOwnerContext.NotifyObservers(); target.NotifyObservers(); + // Expand parent of 'draggedNode' to ensure its selected state is visible. ITreeNode draggedNode = TreeView.GetNodeByTag(item); - TreeView.SelectedNode = draggedNode; ITreeNode newParentOfDraggedNode = draggedNode.Parent; if (!newParentOfDraggedNode.IsExpanded) { newParentOfDraggedNode.Expand(); } + TreeView.SelectedNode = draggedNode; } else { Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs =================================================================== diff -u -r074232b001ecb5ae110c0b95c05264d4372cbfb5 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision 074232b001ecb5ae110c0b95c05264d4372cbfb5) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -55,20 +55,20 @@ yield return new CategoryTreeFolder(RingtoetsCommonFormsResources.FailureMechanism_Outputs_DisplayName, GetOutputs(failureMechanism), TreeFolderCategory.Output); } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingFailureMechanism failureMechanism) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, PipingFailureMechanism failureMechanism) { var addCalculationGroupItem = new StrictContextMenuItem( PipingFormsResources.PipingCalculationGroup_Add_PipingCalculationGroup, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculationGroup_Tooltip, PipingFormsResources.AddFolderIcon, - (o, args) => AddCalculationGroup(failureMechanism) + (o, args) => AddCalculationGroup(failureMechanism, node) ); var addCalculationItem = new StrictContextMenuItem( PipingFormsResources.PipingCalculationGroup_Add_PipingCalculation, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculation_Tooltip, PipingFormsResources.PipingIcon, - (s, e) => AddCalculation(failureMechanism) + (s, e) => AddCalculation(failureMechanism, node) ); var validateAllItem = new StrictContextMenuItem( @@ -98,7 +98,7 @@ clearAllItem.ToolTipText = PipingFormsResources.PipingCalculationGroup_ClearOutput_No_calculation_with_output_to_clear; } - return contextMenuBuilderProvider.Get(sender) + return contextMenuBuilderProvider.Get(node) .AddCustomItem(addCalculationGroupItem) .AddCustomItem(addCalculationItem) .AddSeparator() @@ -136,26 +136,49 @@ RunActivitiesAction(GetAllPipingCalculationsResursively(failureMechanism).Select(calc => new PipingCalculationActivity(calc))); } - private static void AddCalculationGroup(PipingFailureMechanism failureMechanism) + private void AddCalculationGroup(PipingFailureMechanism failureMechanism, ITreeNode failureMechanismNode) { var calculation = new PipingCalculationGroup { Name = NamingHelper.GetUniqueName(failureMechanism.CalculationsGroup.Children, PipingDataResources.PipingCalculationGroup_DefaultName, c => c.Name) }; failureMechanism.CalculationsGroup.Children.Add(calculation); failureMechanism.NotifyObservers(); + + SelectNewlyAddedItemInTreeView(failureMechanismNode); } - private static void AddCalculation(PipingFailureMechanism failureMechanism) + private void AddCalculation(PipingFailureMechanism failureMechanism, ITreeNode failureMechanismNode) { var calculation = new PipingCalculation { Name = NamingHelper.GetUniqueName(failureMechanism.CalculationsGroup.Children, PipingDataResources.PipingCalculation_DefaultName, c => c.Name) }; failureMechanism.CalculationsGroup.Children.Add(calculation); failureMechanism.NotifyObservers(); + + SelectNewlyAddedItemInTreeView(failureMechanismNode); } + private void SelectNewlyAddedItemInTreeView(ITreeNode failureMechanismNode) + { + if (!failureMechanismNode.IsExpanded) + { + failureMechanismNode.Expand(); + } + + // Childnode at index 1 is the PipingCalculationGroup where the new item has been added: + ITreeNode failureMechanismsCalculationsNode = failureMechanismNode.Nodes[1]; + + // New childnode is appended at the end of PipingCalculationGroup: + ITreeNode newlyAddedGroupNode = failureMechanismsCalculationsNode.Nodes.Last(); + if (!failureMechanismsCalculationsNode.IsExpanded) + { + failureMechanismsCalculationsNode.Expand(); + } + TreeView.SelectedNode = newlyAddedGroupNode; + } + private static IEnumerable GetInputs(PipingFailureMechanism failureMechanism) { yield return failureMechanism.SectionDivisions; Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingInputContextNodePresenter.cs =================================================================== diff -u -r074232b001ecb5ae110c0b95c05264d4372cbfb5 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingInputContextNodePresenter.cs (.../PipingInputContextNodePresenter.cs) (revision 074232b001ecb5ae110c0b95c05264d4372cbfb5) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingInputContextNodePresenter.cs (.../PipingInputContextNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -31,10 +31,10 @@ node.ForegroundColor = Color.FromKnownColor(KnownColor.ControlText); } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingInputContext nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, PipingInputContext nodeData) { return contextMenuBuilderProvider - .Get(sender) + .Get(node) .AddImportItem() .AddExportItem() .AddSeparator() Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingOutputNodePresenter.cs =================================================================== diff -u -r074232b001ecb5ae110c0b95c05264d4372cbfb5 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingOutputNodePresenter.cs (.../PipingOutputNodePresenter.cs) (revision 074232b001ecb5ae110c0b95c05264d4372cbfb5) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingOutputNodePresenter.cs (.../PipingOutputNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -44,17 +44,17 @@ return true; } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingOutput nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, PipingOutput nodeData) { StrictContextMenuItem clearItem = new StrictContextMenuItem( Resources.Clear_output, null, RingtoestFormsResources.ClearIcon, - (s, e) => sender.TreeView.TryDeleteSelectedNodeData() + (s, e) => node.TreeView.TryDeleteSelectedNodeData() ); return contextMenuBuilderProvider - .Get(sender) + .Get(node) .AddCustomItem(clearItem) .AddSeparator() .AddExportItem() Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSoilProfileCollectionNodePresenter.cs =================================================================== diff -u -r074232b001ecb5ae110c0b95c05264d4372cbfb5 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSoilProfileCollectionNodePresenter.cs (.../PipingSoilProfileCollectionNodePresenter.cs) (revision 074232b001ecb5ae110c0b95c05264d4372cbfb5) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSoilProfileCollectionNodePresenter.cs (.../PipingSoilProfileCollectionNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -44,10 +44,10 @@ } } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, IEnumerable nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, IEnumerable nodeData) { return contextMenuBuilderProvider - .Get(sender) + .Get(node) .AddExpandAllItem() .AddCollapseAllItem() .AddSeparator() Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSurfaceLineCollectionNodePresenter.cs =================================================================== diff -u -r074232b001ecb5ae110c0b95c05264d4372cbfb5 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSurfaceLineCollectionNodePresenter.cs (.../PipingSurfaceLineCollectionNodePresenter.cs) (revision 074232b001ecb5ae110c0b95c05264d4372cbfb5) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSurfaceLineCollectionNodePresenter.cs (.../PipingSurfaceLineCollectionNodePresenter.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -40,10 +40,10 @@ return nodeData; } - protected override ContextMenuStrip GetContextMenu(ITreeNode sender, IEnumerable nodeData) + protected override ContextMenuStrip GetContextMenu(ITreeNode node, IEnumerable nodeData) { return contextMenuBuilderProvider - .Get(sender) + .Get(node) .AddExpandAllItem() .AddCollapseAllItem() .AddSeparator() Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingCalculationGroupContextNodePresenterTest.cs =================================================================== diff -u -r90e159562efbe49fe2c2e348ee04b6a75b4eec13 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingCalculationGroupContextNodePresenterTest.cs (.../PipingCalculationGroupContextNodePresenterTest.cs) (revision 90e159562efbe49fe2c2e348ee04b6a75b4eec13) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingCalculationGroupContextNodePresenterTest.cs (.../PipingCalculationGroupContextNodePresenterTest.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -936,25 +936,47 @@ public void GetContextMenu_ClickOnAddGroupItem_AddGroupToCalculationGroupAndNotifyObservers() { // Setup + var group = new PipingCalculationGroup(); + var nodeData = new PipingCalculationGroupContext(group, + Enumerable.Empty(), + Enumerable.Empty()); + var calculationItem = mockRepository.Stub(); calculationItem.Expect(ci => ci.Name).Return("Nieuwe map"); var observer = mockRepository.StrictMock(); observer.Expect(o => o.UpdateObserver()); - var node = mockRepository.StrictMock(); - mockRepository.ReplayAll(); + var newCalculationGroupContextNode = mockRepository.Stub(); - var builderProvider = new SimpleContextMenuBuilderProvder(new CustomItemsOnlyContextMenuBuilder()); + // Parent node of newly added item, should be expanded from collapsed state to show selected node: + var node = mockRepository.Stub(); + node.Tag = nodeData; + node.Expect(n => n.IsExpanded).Return(false); + node.Expect(n => n.Expand()); + node.Expect(n => n.Nodes).WhenCalled(invocation => + { + if (group.Children.Last() is PipingCalculationGroup) + { + invocation.ReturnValue = new List + { + newCalculationGroupContextNode + }; + } + }).Return(null); - var group = new PipingCalculationGroup(); + var treeView = mockRepository.Stub(); + mockRepository.ReplayAll(); + group.Children.Add(calculationItem); - var nodeData = new PipingCalculationGroupContext(group, - Enumerable.Empty(), - Enumerable.Empty()); + nodeData.Attach(observer); - var nodePresenter = new PipingCalculationGroupContextNodePresenter(builderProvider); + var builderProvider = new SimpleContextMenuBuilderProvder(new CustomItemsOnlyContextMenuBuilder()); + var nodePresenter = new PipingCalculationGroupContextNodePresenter(builderProvider) + { + TreeView = treeView + }; var contextMenu = nodePresenter.GetContextMenu(node, nodeData); @@ -968,35 +990,60 @@ Assert.AreEqual(2, group.Children.Count); var newlyAddedItem = group.Children.Last(); Assert.IsInstanceOf(newlyAddedItem); - Assert.AreEqual("Nieuwe map (1)", newlyAddedItem.Name); + Assert.AreEqual("Nieuwe map (1)", newlyAddedItem.Name, + "An item with the same name default name already exists, therefore '(1)' needs to be appended."); + + Assert.AreSame(newCalculationGroupContextNode, treeView.SelectedNode, + "The node of the newly added item should be selected."); + mockRepository.VerifyAll(); } [Test] public void GetContextMenu_ClickOnAddCalculationItem_AddCalculationToCalculationGroupAndNotifyObservers() { // Setup + var group = new PipingCalculationGroup(); + var nodeData = new PipingCalculationGroupContext(group, + Enumerable.Empty(), + Enumerable.Empty()); + var calculationItem = mockRepository.Stub(); calculationItem.Expect(ci => ci.Name).Return("Nieuwe berekening"); var observer = mockRepository.StrictMock(); observer.Expect(o => o.UpdateObserver()); - var node = mockRepository.StrictMock(); + var newCalculationContextNode = mockRepository.Stub(); + // Parent node of newly added item, should be expanded from collapsed state to show selected node: + var node = mockRepository.Stub(); + node.Tag = nodeData; + node.Expect(n => n.IsExpanded).Return(false); + node.Expect(n => n.Expand()); + node.Expect(n => n.Nodes).WhenCalled(invocation => + { + if (group.Children.Last() is PipingCalculation) + { + invocation.ReturnValue = new List + { + newCalculationContextNode + }; + } + }).Return(null); + + var treeView = mockRepository.Stub(); mockRepository.ReplayAll(); - var contextMenuProvider = new SimpleContextMenuBuilderProvder(new CustomItemsOnlyContextMenuBuilder()); - - var group = new PipingCalculationGroup(); group.Children.Add(calculationItem); - var nodeData = new PipingCalculationGroupContext(group, - Enumerable.Empty(), - Enumerable.Empty()); nodeData.Attach(observer); - var nodePresenter = new PipingCalculationGroupContextNodePresenter(contextMenuProvider); + var builderProvider = new SimpleContextMenuBuilderProvder(new CustomItemsOnlyContextMenuBuilder()); + var nodePresenter = new PipingCalculationGroupContextNodePresenter(builderProvider) + { + TreeView = treeView + }; var contextMenu = nodePresenter.GetContextMenu(node, nodeData); @@ -1010,7 +1057,12 @@ Assert.AreEqual(2, group.Children.Count); var newlyAddedItem = group.Children.Last(); Assert.IsInstanceOf(newlyAddedItem); - Assert.AreEqual("Nieuwe berekening (1)", newlyAddedItem.Name); + Assert.AreEqual("Nieuwe berekening (1)", newlyAddedItem.Name, + "An item with the same name default name already exists, therefore '(1)' needs to be appended."); + + Assert.AreSame(newCalculationContextNode, treeView.SelectedNode, + "The node of the newly added item should be selected."); + mockRepository.VerifyAll(); } Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs =================================================================== diff -u -r528577e7cac9c86626794fafc6c6c147146c5e84 -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs (.../PipingFailureMechanismNodePresenterTest.cs) (revision 528577e7cac9c86626794fafc6c6c147146c5e84) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs (.../PipingFailureMechanismNodePresenterTest.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; @@ -564,72 +565,143 @@ public void GetContextMenu_ClickOnAddCalculationItem_NewPipingCalculationInstanceAddedToFailureMechanismAndNotifyObservers() { // Setup - var contextMenuBuilderProviderMock = mockRepository.StrictMock(); + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.CalculationsGroup.Children.Clear(); + failureMechanism.CalculationsGroup.Children.Add(new PipingCalculation()); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); - var nodeMock = mockRepository.StrictMock(); + + var newCalculationContextNode = mockRepository.StrictMock(); + + var failureMechanismCalculationsNode = mockRepository.StrictMock(); + failureMechanismCalculationsNode.Expect(n => n.IsExpanded).Return(false); + failureMechanismCalculationsNode.Expect(n => n.Expand()); + failureMechanismCalculationsNode.Expect(n => n.Nodes).WhenCalled(invocation => + { + if (failureMechanism.CalculationsGroup.Children.Count == 2) + { + invocation.ReturnValue = new List + { + newCalculationContextNode + }; + } + }).Return(null); + + var failureMechanismNode = mockRepository.StrictMock(); + failureMechanismNode.Expect(n => n.IsExpanded).Return(false); + failureMechanismNode.Expect(n => n.Expand()); + failureMechanismNode.Expect(n => n.Nodes).Return(new List + { + null, + failureMechanismCalculationsNode, + null + }); + var observerMock = mockRepository.StrictMock(); observerMock.Expect(o => o.UpdateObserver()); - contextMenuBuilderProviderMock.Expect(cmp => cmp.Get(nodeMock)).Return(menuBuilder); + var contextMenuBuilderProviderMock = mockRepository.StrictMock(); + contextMenuBuilderProviderMock.Expect(cmp => cmp.Get(failureMechanismNode)).Return(menuBuilder); + var treeView = mockRepository.Stub(); + mockRepository.ReplayAll(); - var failureMechanism = new PipingFailureMechanism(); failureMechanism.Attach(observerMock); - var nodePresenter = new PipingFailureMechanismNodePresenter(contextMenuBuilderProviderMock); + var nodePresenter = new PipingFailureMechanismNodePresenter(contextMenuBuilderProviderMock) + { + TreeView = treeView + }; // Precondition Assert.AreEqual(1, failureMechanism.CalculationsGroup.Children.Count); // Call - ContextMenuStrip contextMenu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); + ContextMenuStrip contextMenu = nodePresenter.GetContextMenu(failureMechanismNode, failureMechanism); ToolStripItem addCalculationItem = contextMenu.Items[contextMenuAddCalculationIndex]; addCalculationItem.PerformClick(); // Assert Assert.AreEqual(2, failureMechanism.CalculationsGroup.Children.Count); IPipingCalculationItem addedItem = failureMechanism.CalculationsGroup.Children.ElementAt(1); - Assert.AreEqual("Nieuwe berekening (1)", addedItem.Name); + Assert.AreEqual("Nieuwe berekening (1)", addedItem.Name, + "Because there is already an item with the same default name, '(1)' should be appended."); Assert.IsInstanceOf(addedItem); + + Assert.AreSame(newCalculationContextNode, treeView.SelectedNode); mockRepository.VerifyAll(); } [Test] public void GetContextMenu_ClickOnAddFolderItem_NewPipingCalculationGroupInstanceAddedToFailureMechanismAndNotifyObservers() { // Setup - var contextMenuBuilderProviderMock = mockRepository.StrictMock(); + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.CalculationsGroup.Children.Clear(); + failureMechanism.CalculationsGroup.Children.Add(new PipingCalculationGroup()); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); - var nodeMock = mockRepository.StrictMock(); - var observerMock = mockRepository.StrictMock(); - contextMenuBuilderProviderMock.Expect(cmp => cmp.Get(nodeMock)).Return(menuBuilder); + var newCalculationGroupContextNode = mockRepository.StrictMock(); + var failureMechanismCalculationsNode = mockRepository.StrictMock(); + failureMechanismCalculationsNode.Expect(n => n.IsExpanded).Return(false); + failureMechanismCalculationsNode.Expect(n => n.Expand()); + failureMechanismCalculationsNode.Expect(n => n.Nodes).WhenCalled(invocation => + { + if (failureMechanism.CalculationsGroup.Children.Count == 2) + { + invocation.ReturnValue = new List + { + newCalculationGroupContextNode + }; + } + }).Return(null); + + var failureMechanismNode = mockRepository.StrictMock(); + failureMechanismNode.Expect(n => n.IsExpanded).Return(false); + failureMechanismNode.Expect(n => n.Expand()); + failureMechanismNode.Expect(n => n.Nodes).Return(new List + { + null, + failureMechanismCalculationsNode, + null + }); + + var observerMock = mockRepository.StrictMock(); observerMock.Expect(o => o.UpdateObserver()); + var contextMenuBuilderProviderMock = mockRepository.StrictMock(); + contextMenuBuilderProviderMock.Expect(cmp => cmp.Get(failureMechanismNode)).Return(menuBuilder); + + var treeView = mockRepository.Stub(); + mockRepository.ReplayAll(); - var failureMechanism = new PipingFailureMechanism(); failureMechanism.Attach(observerMock); - failureMechanism.CalculationsGroup.Children.Clear(); - failureMechanism.CalculationsGroup.Children.Add(new PipingCalculationGroup()); - var nodePresenter = new PipingFailureMechanismNodePresenter(contextMenuBuilderProviderMock); + var nodePresenter = new PipingFailureMechanismNodePresenter(contextMenuBuilderProviderMock) + { + TreeView = treeView + }; // Precondition Assert.AreEqual(1, failureMechanism.CalculationsGroup.Children.Count); // Call - ContextMenuStrip contextMenu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); + ContextMenuStrip contextMenu = nodePresenter.GetContextMenu(failureMechanismNode, failureMechanism); ToolStripItem addCalculationItem = contextMenu.Items[contextMenuAddFolderIndex]; addCalculationItem.PerformClick(); // Assert Assert.AreEqual(2, failureMechanism.CalculationsGroup.Children.Count); IPipingCalculationItem addedItem = failureMechanism.CalculationsGroup.Children.ElementAt(1); - Assert.AreEqual("Nieuwe map (1)", addedItem.Name); + Assert.AreEqual("Nieuwe map (1)", addedItem.Name, + "Because there is already an item with the same default name, '(1)' should be appended."); Assert.IsInstanceOf(addedItem); + + Assert.AreSame(newCalculationGroupContextNode, treeView.SelectedNode); mockRepository.VerifyAll(); } } Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingContextTest.cs =================================================================== diff -u -r495647ee1c652fecc15eea7fefeab29ae01347fe -r0a222f4f3c0054ec9cc70f94480c0dc504fea411 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingContextTest.cs (.../PipingContextTest.cs) (revision 495647ee1c652fecc15eea7fefeab29ae01347fe) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PresentationObjects/PipingContextTest.cs (.../PipingContextTest.cs) (revision 0a222f4f3c0054ec9cc70f94480c0dc504fea411) @@ -160,6 +160,66 @@ mocks.VerifyAll(); } + [Test] + public void Equals_ToItself_ReturnTrue() + { + // Setup + var observableObject = new ObserveableObject(); + var context = new SimplePipingContext(observableObject, + Enumerable.Empty(), + Enumerable.Empty()); + + // Call + bool isEqual = context.Equals(context); + + // Assert + Assert.IsTrue(isEqual); + } + + [Test] + public void Equals_ToNull_ReturnFalse() + { + // Setup + var observableObject = new ObserveableObject(); + var context = new SimplePipingContext(observableObject, + Enumerable.Empty(), + Enumerable.Empty()); + + // Call + bool isEqual = context.Equals(null); + + // Assert + Assert.IsFalse(isEqual); + } + + [Test] + public void Equals_ToEqualOtherInstance_ReturnTrue() + { + // Setup + var observableObject = new ObserveableObject(); + var context = new SimplePipingContext(observableObject, + Enumerable.Empty(), + Enumerable.Empty()); + + var otherContext = new SimplePipingContext(observableObject, + new[] + { + new RingtoetsPipingSurfaceLine() + }, + new[] + { + new TestPipingSoilProfile() + }); + + // Call + bool isEqual = context.Equals(otherContext); + bool isEqual2 = otherContext.Equals(context); + + // Assert + Assert.IsTrue(isEqual); + Assert.IsTrue(isEqual2); + } + private class SimplePipingContext : PipingContext where T : IObservable { public SimplePipingContext(T target, IEnumerable surfaceLines, IEnumerable soilProfiles)