Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -r23a37b025a5d0358c1f30fb31de41a2c284519a5 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.17929 +// Runtime Version:4.0.30319.18444 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -154,6 +154,26 @@ } /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap Checkbox_empty { + get { + object obj = ResourceManager.GetObject("Checkbox_empty", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap Checkbox_ticked { + get { + object obj = ResourceManager.GetObject("Checkbox_ticked", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// /// Looks up a localized string similar to &Wis alle uitvoer.... /// public static string Clear_all_output { @@ -275,6 +295,24 @@ } /// + /// Looks up a localized string similar to Is relevant. + /// + public static string FailureMechanismContextMenuStrip_Is_relevant { + get { + return ResourceManager.GetString("FailureMechanismContextMenuStrip_Is_relevant", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Geeft aan of dit faalmechanisme relevant is of niet.. + /// + public static string FailureMechanismContextMenuStrip_Is_relevant_Tooltip { + get { + return ResourceManager.GetString("FailureMechanismContextMenuStrip_Is_relevant_Tooltip", resourceCulture); + } + } + + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// public static System.Drawing.Bitmap FailureMechanismContributionIcon { Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx =================================================================== diff -u -r23a37b025a5d0358c1f30fb31de41a2c284519a5 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -271,4 +271,16 @@ &Berekening toevoegen + + ..\Resources\Checkbox_empty.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Checkbox_ticked.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Is relevant + + + Geeft aan of dit faalmechanisme relevant is of niet. + \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Resources/Checkbox_empty.png =================================================================== diff -u Binary files differ Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Resources/Checkbox_ticked.png =================================================================== diff -u Binary files differ Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Ringtoets.Common.Forms.csproj =================================================================== diff -u -rabb2667229e96d5b8158981c890a5c7046e9ca66 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/Common/src/Ringtoets.Common.Forms/Ringtoets.Common.Forms.csproj (.../Ringtoets.Common.Forms.csproj) (revision abb2667229e96d5b8158981c890a5c7046e9ca66) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Ringtoets.Common.Forms.csproj (.../Ringtoets.Common.Forms.csproj) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -149,6 +149,8 @@ + + Index: Ringtoets/Common/src/Ringtoets.Common.Forms/TreeNodeInfos/DefaultFailureMechanismTreeNodeInfo.cs =================================================================== diff -u -rd09b94cdc3d7c18ffa7ce53b727c34d189f588a9 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/Common/src/Ringtoets.Common.Forms/TreeNodeInfos/DefaultFailureMechanismTreeNodeInfo.cs (.../DefaultFailureMechanismTreeNodeInfo.cs) (revision d09b94cdc3d7c18ffa7ce53b727c34d189f588a9) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/TreeNodeInfos/DefaultFailureMechanismTreeNodeInfo.cs (.../DefaultFailureMechanismTreeNodeInfo.cs) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -75,10 +75,25 @@ { return getEnabledFailureMechanismContextMenuStrip(context, parent, treeView); } + + var changeRelevancyItem = new StrictContextMenuItem( + Resources.FailureMechanismContextMenuStrip_Is_relevant, + Resources.FailureMechanismContextMenuStrip_Is_relevant_Tooltip, + Resources.Checkbox_empty, + (sender, args) => + { + context.WrappedData.IsRelevant = true; + context.WrappedData.NotifyObservers(); + } + ); + return contextMenuBuilderProvider.Get(context, treeView) + .AddCustomItem(changeRelevancyItem) + .AddSeparator() .AddExpandAllItem() .AddCollapseAllItem() .Build(); + } private object[] GetChildNodeObjects(TContext failureMechanismContext) Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/TreeNodeInfos/DefaultFailureMechanismTreeNodeInfoTest.cs =================================================================== diff -u -r684b8c0ca681ea2da3cc988bd60e9223037e5a16 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/TreeNodeInfos/DefaultFailureMechanismTreeNodeInfoTest.cs (.../DefaultFailureMechanismTreeNodeInfoTest.cs) (revision 684b8c0ca681ea2da3cc988bd60e9223037e5a16) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/TreeNodeInfos/DefaultFailureMechanismTreeNodeInfoTest.cs (.../DefaultFailureMechanismTreeNodeInfoTest.cs) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -2,7 +2,9 @@ using System.Windows.Forms; using Core.Common.Controls.TreeView; +using Core.Common.Gui.Commands; using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.TestUtil.ContextMenu; using Core.Common.TestUtil; using NUnit.Framework; @@ -16,12 +18,15 @@ using Ringtoets.Common.Forms.TreeNodeInfos; using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; +using CoreCommonGuiResources = Core.Common.Gui.Properties.Resources; namespace Ringtoets.Common.Forms.Test.TreeNodeInfos { [TestFixture] public class DefaultFailureMechanismTreeNodeInfoTest { + private const int contextMenuRelevancyIndex = 0; + [Test] public void Constructor_DefaultImplementationsForSomeMethods() { @@ -215,7 +220,7 @@ } [Test] - public void ContextMenuStrip_FailureMechanismIsNotRelevant_ReturnStripWithOnlyExpandAndCollapseAllNodes() + public void ContextMenuStrip_FailureMechanismIsNotRelevant_ReturnStripWithOnlyRelevancyExpandAndCollapseAllNodes() { // Setup using (var treeView = new TreeViewControl()) @@ -230,6 +235,8 @@ var context = new SimpleFailureMechanismContext(failureMechanism, assessmentSection); var builder = mocks.Stub(); + builder.Expect(b => b.AddCustomItem(null)).IgnoreArguments().Return(builder); + builder.Expect(b => b.AddSeparator()).Return(builder); builder.Expect(b => b.AddExpandAllItem()).Return(builder); builder.Expect(b => b.AddCollapseAllItem()).Return(builder); builder.Expect(b => b.Build()).Return(contextMenuStrip); @@ -286,7 +293,7 @@ } [Test] - public void ChildNodeObjects_FailureMechanismIsRelevantButMethodIsNull_ReturnStripWithOnlyExpandAndCollapseAllNodes() + public void ChildNodeObjects_FailureMechanismIsRelevantButMethodIsNull_ReturnStripWithOnlyRelevancyExpandAndCollapseAllNodes() { // Setup using (var treeView = new TreeViewControl()) @@ -301,6 +308,8 @@ var context = new SimpleFailureMechanismContext(failureMechanism, assessmentSection); var builder = mocks.Stub(); + builder.Expect(b => b.AddCustomItem(null)).IgnoreArguments().Return(builder); + builder.Expect(b => b.AddSeparator()).Return(builder); builder.Expect(b => b.AddExpandAllItem()).Return(builder); builder.Expect(b => b.AddCollapseAllItem()).Return(builder); builder.Expect(b => b.Build()).Return(contextMenuStrip); @@ -321,6 +330,88 @@ } } + [Test] + public void ContextMenuStrip_FailureMechanismNotRelevant_ReturnsContextMenuWithCommonItems() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + failureMechanism.IsRelevant = false; + + var assessmentSection = mocks.Stub(); + var context = new SimpleFailureMechanismContext(failureMechanism, assessmentSection); + + using (var treeViewControl = new TreeViewControl()) + { + var applicationFeatureCommandHandler = mocks.Stub(); + var exportImportHandler = mocks.Stub(); + var viewCommandsHandler = mocks.Stub(); + var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, + exportImportHandler, viewCommandsHandler, + context, treeViewControl); + + var provider = mocks.Stub(); + provider.Stub(p => p.Get(context, treeViewControl)).Return(menuBuilder); + + mocks.ReplayAll(); + + var treeNodeInfo = new DefaultFailureMechanismTreeNodeInfo( + null, null, provider); + + // Call + var menu = treeNodeInfo.ContextMenuStrip(context, null, treeViewControl); + + // Assert + Assert.AreEqual(4, menu.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(menu, 0, RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant, RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant_Tooltip, RingtoetsCommonFormsResources.Checkbox_empty); + + TestHelper.AssertContextMenuStripContainsItem(menu, 2, CoreCommonGuiResources.Expand_all, CoreCommonGuiResources.Expand_all_ToolTip, CoreCommonGuiResources.ExpandAllIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 3, CoreCommonGuiResources.Collapse_all, CoreCommonGuiResources.Collapse_all_ToolTip, CoreCommonGuiResources.CollapseAllIcon, false); + + CollectionAssert.AllItemsAreInstancesOfType(new[] + { + menu.Items[1], + }, typeof(ToolStripSeparator)); + } + mocks.VerifyAll(); + } + + [Test] + public void ContextMenuStrip_ClickOnIsRelevantItem_MakeFailureMechanismRelevant() + { + // Setup + var mocks = new MockRepository(); + + var failureMechanism = mocks.Stub(); + failureMechanism.Expect(fm => fm.NotifyObservers()); + failureMechanism.IsRelevant = false; + + var assessmentSection = mocks.Stub(); + var context = new SimpleFailureMechanismContext(failureMechanism, assessmentSection); + + using (var treeViewControl = new TreeViewControl()) + { + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + var provider = mocks.Stub(); + provider.Stub(p => p.Get(context, treeViewControl)).Return(menuBuilder); + + mocks.ReplayAll(); + + var treeNodeInfo = new DefaultFailureMechanismTreeNodeInfo( + null, null, provider); + + var contextMenu = treeNodeInfo.ContextMenuStrip(context, null, treeViewControl); + + // Call + contextMenu.Items[contextMenuRelevancyIndex].PerformClick(); + + // Assert + Assert.IsTrue(failureMechanism.IsRelevant); + } + mocks.VerifyAll(); + } + private class SimpleFailureMechanismContext : FailureMechanismContext { public SimpleFailureMechanismContext(IFailureMechanism wrappedFailureMechanism, IAssessmentSection parent) : base(wrappedFailureMechanism, parent) {} Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs =================================================================== diff -u -rfff12e249602fb700b2854c14a3b7cdd0b73c023 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision fff12e249602fb700b2854c14a3b7cdd0b73c023) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -243,6 +243,18 @@ private ContextMenuStrip FailureMechanismContextMenuStrip(GrassCoverErosionInwardsFailureMechanismContext grassCoverErosionInwardsFailureMechanismContext, object parentData, TreeViewControl treeViewControl) { + var changeRelevancyItem = new StrictContextMenuItem( + RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant, + RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant_Tooltip, + RingtoetsCommonFormsResources.Checkbox_ticked, + (sender, args) => + { + Gui.ViewCommands.RemoveAllViewsForItem(grassCoverErosionInwardsFailureMechanismContext); + grassCoverErosionInwardsFailureMechanismContext.WrappedData.IsRelevant = false; + grassCoverErosionInwardsFailureMechanismContext.WrappedData.NotifyObservers(); + } + ); + var addCalculationGroupItem = new StrictContextMenuItem( RingtoetsCommonFormsResources.CalculationGroup_Add_CalculationGroup, RingtoetsCommonFormsResources.FailureMechanism_Add_CalculationGroup_Tooltip, @@ -266,6 +278,8 @@ return Gui.Get(grassCoverErosionInwardsFailureMechanismContext, treeViewControl) .AddOpenItem() .AddSeparator() + .AddCustomItem(changeRelevancyItem) + .AddSeparator() .AddCustomItem(addCalculationGroupItem) .AddCustomItem(addCalculationItem) .AddSeparator() Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/TreeNodeInfos/GrassCoverErosionInwardsFailureMechanismTreeNodeInfoTest.cs =================================================================== diff -u -rbbe2a3488b33585ad13bebdaa7439f5c5bbfe079 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/TreeNodeInfos/GrassCoverErosionInwardsFailureMechanismTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsFailureMechanismTreeNodeInfoTest.cs) (revision bbe2a3488b33585ad13bebdaa7439f5c5bbfe079) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/TreeNodeInfos/GrassCoverErosionInwardsFailureMechanismTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsFailureMechanismTreeNodeInfoTest.cs) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -20,9 +20,13 @@ // All rights reserved. using System.Linq; + +using Core.Common.Base; using Core.Common.Controls.TreeView; using Core.Common.Gui; +using Core.Common.Gui.Commands; using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.TestUtil.ContextMenu; using Core.Common.TestUtil; using NUnit.Extensions.Forms; using NUnit.Framework; @@ -32,7 +36,6 @@ using Ringtoets.Common.Forms.PresentationObjects; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionInwards.Forms.PresentationObjects; -using Ringtoets.GrassCoverErosionInwards.Forms.Properties; using Ringtoets.GrassCoverErosionInwards.Plugin; using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; @@ -45,6 +48,8 @@ private GrassCoverErosionInwardsGuiPlugin plugin; private TreeNodeInfo info; + private const int contextMenuRelevancyIndex = 1; + [SetUp] public void SetUp() { @@ -160,7 +165,9 @@ menuBuilderMock.Expect(mb => mb.AddOpenItem()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddImportItem()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddExportItem()).Return(menuBuilderMock); @@ -180,5 +187,45 @@ // Assert mocksRepository.VerifyAll(); } + + [Test] + public void ContextMenuStrip_ClickOnIsRelevantItem_MakeFailureMechanismNotRelevant() + { + // Setup + var failureMechanismObserver = mocksRepository.Stub(); + failureMechanismObserver.Expect(o => o.UpdateObserver()); + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism + { + IsRelevant = true + }; + failureMechanism.Attach(failureMechanismObserver); + + var assessmentSection = mocksRepository.Stub(); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, assessmentSection); + + var viewCommands = mocksRepository.StrictMock(); + viewCommands.Expect(vs => vs.RemoveAllViewsForItem(failureMechanismContext)); + + var treeViewControl = mocksRepository.StrictMock(); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocksRepository.StrictMock(); + gui.Stub(g => g.ViewCommands).Return(viewCommands); + gui.Expect(g => g.Get(failureMechanismContext, treeViewControl)).Return(menuBuilder); + + mocksRepository.ReplayAll(); + + plugin.Gui = gui; + + var contextMenu = info.ContextMenuStrip(failureMechanismContext, null, treeViewControl); + + // Call + contextMenu.Items[contextMenuRelevancyIndex].PerformClick(); + + // Assert + Assert.IsFalse(failureMechanism.IsRelevant); + mocksRepository.VerifyAll(); + } } } \ No newline at end of file Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs =================================================================== diff -u -r23a37b025a5d0358c1f30fb31de41a2c284519a5 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs (.../RingtoetsGuiPlugin.cs) (revision 23a37b025a5d0358c1f30fb31de41a2c284519a5) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs (.../RingtoetsGuiPlugin.cs) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -489,6 +489,18 @@ private ContextMenuStrip FailureMechanismPlaceholderContextMenuStrip(FailureMechanismPlaceholderContext nodeData, object parentData, TreeViewControl treeViewControl) { + var changeRelevancyItem = new StrictContextMenuItem( + RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant, + RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant_Tooltip, + RingtoetsCommonFormsResources.Checkbox_ticked, + (sender, args) => + { + Gui.ViewCommands.RemoveAllViewsForItem(nodeData); + nodeData.WrappedData.IsRelevant = false; + nodeData.WrappedData.NotifyObservers(); + } + ); + var calculateItem = new StrictContextMenuItem( RingtoetsCommonFormsResources.Calculate_all, RingtoetsCommonFormsResources.Calculate_all_ToolTip, @@ -507,6 +519,8 @@ }; return Gui.Get(nodeData, treeViewControl) + .AddCustomItem(changeRelevancyItem) + .AddSeparator() .AddCustomItem(calculateItem) .AddCustomItem(clearOutputItem) .AddSeparator() Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/TreeNodeInfos/FailureMechanismPlaceholderTreeNodeInfoTest.cs =================================================================== diff -u -rfec99b77571cc0cf37b60f5ca257394714fde1d7 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/TreeNodeInfos/FailureMechanismPlaceholderTreeNodeInfoTest.cs (.../FailureMechanismPlaceholderTreeNodeInfoTest.cs) (revision fec99b77571cc0cf37b60f5ca257394714fde1d7) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/TreeNodeInfos/FailureMechanismPlaceholderTreeNodeInfoTest.cs (.../FailureMechanismPlaceholderTreeNodeInfoTest.cs) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -21,9 +21,12 @@ using System.Drawing; using System.Linq; + +using Core.Common.Base; using Core.Common.Base.Geometry; using Core.Common.Controls.TreeView; using Core.Common.Gui; +using Core.Common.Gui.Commands; using Core.Common.Gui.ContextMenu; using Core.Common.Gui.TestUtil.ContextMenu; using Core.Common.TestUtil; @@ -45,6 +48,7 @@ public class FailureMechanismPlaceholderTreeNodeInfoTest { private MockRepository mocks; + private const int contextMenuRelevancyIndex = 0; [SetUp] public void SetUp() @@ -205,7 +209,9 @@ var menuBuilderMock = mocks.StrictMock(); menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddImportItem()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddExportItem()).Return(menuBuilderMock); @@ -264,12 +270,12 @@ // Call var menu = info.ContextMenuStrip(context, assessmentSection, treeView); - TestHelper.AssertContextMenuStripContainsItem(menu, 0, + TestHelper.AssertContextMenuStripContainsItem(menu, 2, RingtoetsCommonFormsResources.Calculate_all, RingtoetsCommonFormsResources.Calculate_all_ToolTip, RingtoetsCommonFormsResources.CalculateAllIcon, false); - TestHelper.AssertContextMenuStripContainsItem(menu, 1, + TestHelper.AssertContextMenuStripContainsItem(menu, 3, RingtoetsCommonFormsResources.Clear_all_output, RingtoetsCommonFormsResources.Clear_all_output_ToolTip, RingtoetsCommonFormsResources.ClearIcon, @@ -281,6 +287,53 @@ } } + [Test] + public void ContextMenuStrip_ClickOnIsRelevantItem_MakeFailureMechanismNotRelevant() + { + // Setup + var failureMechanismObserver = mocks.Stub(); + failureMechanismObserver.Expect(o => o.UpdateObserver()); + + var failureMechanism = new FailureMechanismPlaceholder("A") + { + IsRelevant = true + }; + failureMechanism.Attach(failureMechanismObserver); + + var assessmentSection = mocks.Stub(); + var failureMechanismContext = new FailureMechanismPlaceholderContext(failureMechanism, assessmentSection); + + var viewCommands = mocks.StrictMock(); + viewCommands.Expect(vs => vs.RemoveAllViewsForItem(failureMechanismContext)); + + var treeViewControl = mocks.StrictMock(); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.StrictMock(); + gui.Stub(g => g.ViewCommands).Return(viewCommands); + gui.Stub(g => g.ProjectOpened += null).IgnoreArguments(); + gui.Stub(g => g.ProjectOpened -= null).IgnoreArguments(); + gui.Expect(g => g.Get(failureMechanismContext, treeViewControl)).Return(menuBuilder); + + mocks.ReplayAll(); + + using (var guiPlugin = new RingtoetsGuiPlugin()) + { + guiPlugin.Gui = gui; + + var info = GetInfo(guiPlugin); + + var contextMenu = info.ContextMenuStrip(failureMechanismContext, null, treeViewControl); + + // Call + contextMenu.Items[contextMenuRelevancyIndex].PerformClick(); + + // Assert + Assert.IsFalse(failureMechanism.IsRelevant); + } + mocks.VerifyAll(); + } + private TreeNodeInfo GetInfo(RingtoetsGuiPlugin guiPlugin) { return guiPlugin.GetTreeNodeInfos().First(tni => tni.TagType == typeof(FailureMechanismPlaceholderContext)); Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs =================================================================== diff -u -rfff12e249602fb700b2854c14a3b7cdd0b73c023 -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision fff12e249602fb700b2854c14a3b7cdd0b73c023) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -283,6 +283,18 @@ private ContextMenuStrip FailureMechanismContextMenuStrip(PipingFailureMechanismContext pipingFailureMechanismContext, object parentData, TreeViewControl treeViewControl) { + var changeRelevancyItem = new StrictContextMenuItem( + RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant, + RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant_Tooltip, + RingtoetsCommonFormsResources.Checkbox_ticked, + (sender, args) => + { + Gui.ViewCommands.RemoveAllViewsForItem(pipingFailureMechanismContext); + pipingFailureMechanismContext.WrappedData.IsRelevant = false; + pipingFailureMechanismContext.WrappedData.NotifyObservers(); + } + ); + var addCalculationGroupItem = new StrictContextMenuItem( RingtoetsCommonFormsResources.CalculationGroup_Add_CalculationGroup, RingtoetsCommonFormsResources.FailureMechanism_Add_CalculationGroup_Tooltip, @@ -317,6 +329,8 @@ return Gui.Get(pipingFailureMechanismContext, treeViewControl) .AddOpenItem() .AddSeparator() + .AddCustomItem(changeRelevancyItem) + .AddSeparator() .AddCustomItem(addCalculationGroupItem) .AddCustomItem(addCalculationItem) .AddSeparator() Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingFailureMechanismTreeNodeInfoTest.cs =================================================================== diff -u -rf5e1194ee412e86277cee388a75c39db189f2b3e -r3ba42e2c8b6380227f4b2e1d1897135ec962beab --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingFailureMechanismTreeNodeInfoTest.cs (.../PipingFailureMechanismTreeNodeInfoTest.cs) (revision f5e1194ee412e86277cee388a75c39db189f2b3e) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingFailureMechanismTreeNodeInfoTest.cs (.../PipingFailureMechanismTreeNodeInfoTest.cs) (revision 3ba42e2c8b6380227f4b2e1d1897135ec962beab) @@ -283,29 +283,32 @@ ContextMenuStrip menu = info.ContextMenuStrip(failureMechanismContext, null, treeViewControl); // Assert - Assert.AreEqual(14, menu.Items.Count); + Assert.AreEqual(16, menu.Items.Count); TestHelper.AssertContextMenuStripContainsItem(menu, 0, CoreCommonGuiResources.Open, CoreCommonGuiResources.Open_ToolTip, CoreCommonGuiResources.OpenIcon, false); - TestHelper.AssertContextMenuStripContainsItem(menu, 2, RingtoetsCommonFormsResources.CalculationGroup_Add_CalculationGroup, RingtoetsCommonFormsResources.FailureMechanism_Add_CalculationGroup_Tooltip, RingtoetsCommonFormsResources.AddFolderIcon); - TestHelper.AssertContextMenuStripContainsItem(menu, 3, RingtoetsFormsResources.CalculationGroup_Add_Calculation, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculation_Tooltip, PipingFormsResources.PipingIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 2, RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant, RingtoetsCommonFormsResources.FailureMechanismContextMenuStrip_Is_relevant_Tooltip, RingtoetsCommonFormsResources.Checkbox_ticked); - TestHelper.AssertContextMenuStripContainsItem(menu, 5, RingtoetsFormsResources.Validate_all, RingtoetsFormsResources.Validate_all_ToolTip, RingtoetsFormsResources.ValidateAllIcon); - TestHelper.AssertContextMenuStripContainsItem(menu, 6, RingtoetsFormsResources.Calculate_all, RingtoetsFormsResources.Calculate_all_ToolTip, RingtoetsFormsResources.CalculateAllIcon); - TestHelper.AssertContextMenuStripContainsItem(menu, 7, RingtoetsFormsResources.Clear_all_output, RingtoetsFormsResources.Clear_all_output_ToolTip, RingtoetsFormsResources.ClearIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 4, RingtoetsCommonFormsResources.CalculationGroup_Add_CalculationGroup, RingtoetsCommonFormsResources.FailureMechanism_Add_CalculationGroup_Tooltip, RingtoetsCommonFormsResources.AddFolderIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 5, RingtoetsFormsResources.CalculationGroup_Add_Calculation, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculation_Tooltip, PipingFormsResources.PipingIcon); - TestHelper.AssertContextMenuStripContainsItem(menu, 9, CoreCommonGuiResources.Import, CoreCommonGuiResources.Import_ToolTip, CoreCommonGuiResources.ImportIcon, false); - TestHelper.AssertContextMenuStripContainsItem(menu, 10, CoreCommonGuiResources.Export, CoreCommonGuiResources.Export_ToolTip, CoreCommonGuiResources.ExportIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 7, RingtoetsFormsResources.Validate_all, RingtoetsFormsResources.Validate_all_ToolTip, RingtoetsFormsResources.ValidateAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 8, RingtoetsFormsResources.Calculate_all, RingtoetsFormsResources.Calculate_all_ToolTip, RingtoetsFormsResources.CalculateAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 9, RingtoetsFormsResources.Clear_all_output, RingtoetsFormsResources.Clear_all_output_ToolTip, RingtoetsFormsResources.ClearIcon); - TestHelper.AssertContextMenuStripContainsItem(menu, 12, CoreCommonGuiResources.Expand_all, CoreCommonGuiResources.Expand_all_ToolTip, CoreCommonGuiResources.ExpandAllIcon, false); - TestHelper.AssertContextMenuStripContainsItem(menu, 13, CoreCommonGuiResources.Collapse_all, CoreCommonGuiResources.Collapse_all_ToolTip, CoreCommonGuiResources.CollapseAllIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 11, CoreCommonGuiResources.Import, CoreCommonGuiResources.Import_ToolTip, CoreCommonGuiResources.ImportIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 12, CoreCommonGuiResources.Export, CoreCommonGuiResources.Export_ToolTip, CoreCommonGuiResources.ExportIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 14, CoreCommonGuiResources.Expand_all, CoreCommonGuiResources.Expand_all_ToolTip, CoreCommonGuiResources.ExpandAllIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 15, CoreCommonGuiResources.Collapse_all, CoreCommonGuiResources.Collapse_all_ToolTip, CoreCommonGuiResources.CollapseAllIcon, false); + CollectionAssert.AllItemsAreInstancesOfType(new[] { menu.Items[1], - menu.Items[4], - menu.Items[8], - menu.Items[11] + menu.Items[3], + menu.Items[6], + menu.Items[10], + menu.Items[13] }, typeof(ToolStripSeparator)); mocks.VerifyAll(); @@ -429,7 +432,9 @@ menuBuilder.Expect(mb => mb.AddOpenItem()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilder); menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilder); menuBuilder.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilder); @@ -638,10 +643,51 @@ mocks.VerifyAll(); } - private const int contextMenuAddFolderIndex = 1; - private const int contextMenuAddCalculationIndex = 2; - private const int contextMenuValidateAllIndex = 4; - private const int contextMenuCalculateAllIndex = 5; - private const int contextMenuClearIndex = 6; + [Test] + public void ContextMenuStrip_ClickOnIsRelevantItem_MakeFailureMechanismNotRelevant() + { + // Setup + var failureMechanismObserver = mocks.Stub(); + failureMechanismObserver.Expect(o => o.UpdateObserver()); + + var failureMechanism = new PipingFailureMechanism + { + IsRelevant = true + }; + failureMechanism.Attach(failureMechanismObserver); + + var assessmentSection = mocks.Stub(); + var failureMechanismContext = new PipingFailureMechanismContext(failureMechanism, assessmentSection); + + var viewCommands = mocks.StrictMock(); + viewCommands.Expect(vs => vs.RemoveAllViewsForItem(failureMechanismContext)); + + var treeViewControl = mocks.StrictMock(); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.StrictMock(); + gui.Stub(g => g.ViewCommands).Return(viewCommands); + gui.Expect(g => g.Get(failureMechanismContext, treeViewControl)).Return(menuBuilder); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + var contextMenu = info.ContextMenuStrip(failureMechanismContext, null, treeViewControl); + + // Call + contextMenu.Items[contextMenuRelevancyIndex].PerformClick(); + + // Assert + Assert.IsFalse(failureMechanism.IsRelevant); + mocks.VerifyAll(); + } + + private const int contextMenuRelevancyIndex = 1; + private const int contextMenuAddFolderIndex = 3; + private const int contextMenuAddCalculationIndex = 4; + private const int contextMenuValidateAllIndex = 6; + private const int contextMenuCalculateAllIndex = 7; + private const int contextMenuClearIndex = 8; } } \ No newline at end of file