Index: Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs =================================================================== diff -u -r07256b6a9cc4abaff600e7c9a266cef54295b3c3 -rbe5e60e24b140eafaaacf21aa926df7f35e146a7 --- Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs (.../GrassCoverErosionInwardsPlugin.cs) (revision 07256b6a9cc4abaff600e7c9a266cef54295b3c3) +++ Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs (.../GrassCoverErosionInwardsPlugin.cs) (revision be5e60e24b140eafaaacf21aa926df7f35e146a7) @@ -273,9 +273,11 @@ CalculationsChildNodeObjects, CalculationsContextMenuStrip); - yield return RiskeerTreeNodeInfoFactory.CreateFailureMechanismStateContextTreeNodeInfo( - FailurePathChildNodeObjects, - FailurePathContextMenuStrip); + yield return RiskeerTreeNodeInfoFactory.CreateFailureMechanismContextTreeNodeInfo( + FailurePathEnabledChildNodeObjects, + FailurePathDisabledChildNodeObjects, + FailurePathEnabledContextMenuStrip, + FailurePathDisabledContextMenuStrip); yield return new TreeNodeInfo { @@ -577,7 +579,7 @@ #region GrassCoverErosionInwardsFailurePathContext TreeNodeInfo - private static object[] FailurePathChildNodeObjects(GrassCoverErosionInwardsFailurePathContext context) + private static object[] FailurePathEnabledChildNodeObjects(GrassCoverErosionInwardsFailurePathContext context) { GrassCoverErosionInwardsFailureMechanism failureMechanism = context.WrappedData; IAssessmentSection assessmentSection = context.Parent; @@ -591,6 +593,14 @@ }; } + private static object[] FailurePathDisabledChildNodeObjects(GrassCoverErosionInwardsFailurePathContext context) + { + return new object[] + { + context.WrappedData.NotRelevantComments + }; + } + private static IEnumerable GetFailurePathInputs(GrassCoverErosionInwardsFailureMechanism failureMechanism, IAssessmentSection assessmentSection) { return new object[] @@ -612,21 +622,43 @@ }; } - private ContextMenuStrip FailurePathContextMenuStrip(GrassCoverErosionInwardsFailurePathContext context, - object parentData, - TreeViewControl treeViewControl) + private ContextMenuStrip FailurePathEnabledContextMenuStrip(GrassCoverErosionInwardsFailurePathContext context, + object parentData, + TreeViewControl treeViewControl) { var builder = new RiskeerContextMenuBuilder(Gui.Get(context, treeViewControl)); return builder.AddOpenItem() .AddSeparator() + .AddToggleRelevancyOfFailureMechanismItem(context, RemoveAllViewsForItem) + .AddSeparator() .AddCollapseAllItem() .AddExpandAllItem() .AddSeparator() .AddPropertiesItem() .Build(); } + private ContextMenuStrip FailurePathDisabledContextMenuStrip(GrassCoverErosionInwardsFailurePathContext context, + object parentData, + TreeViewControl treeViewControl) + { + var builder = new RiskeerContextMenuBuilder(Gui.Get(context, treeViewControl)); + + return builder.AddToggleRelevancyOfFailureMechanismItem(context, RemoveAllViewsForItem) + .AddSeparator() + .AddCollapseAllItem() + .AddExpandAllItem() + .AddSeparator() + .AddPropertiesItem() + .Build(); + } + + private void RemoveAllViewsForItem(GrassCoverErosionInwardsFailurePathContext context) + { + Gui.ViewCommands.RemoveAllViewsForItem(context); + } + #endregion #region GrassCoverErosionInwardsCalculationGroupContext TreeNodeInfo Index: Riskeer/GrassCoverErosionInwards/test/Riskeer.GrassCoverErosionInwards.Plugin.Test/TreeNodeInfos/GrassCoverErosionInwardsFailurePathContextTreeNodeInfoTest.cs =================================================================== diff -u -r886b86a66f072735567285a3489923186c236c32 -rbe5e60e24b140eafaaacf21aa926df7f35e146a7 --- Riskeer/GrassCoverErosionInwards/test/Riskeer.GrassCoverErosionInwards.Plugin.Test/TreeNodeInfos/GrassCoverErosionInwardsFailurePathContextTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsFailurePathContextTreeNodeInfoTest.cs) (revision 886b86a66f072735567285a3489923186c236c32) +++ Riskeer/GrassCoverErosionInwards/test/Riskeer.GrassCoverErosionInwards.Plugin.Test/TreeNodeInfos/GrassCoverErosionInwardsFailurePathContextTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsFailurePathContextTreeNodeInfoTest.cs) (revision be5e60e24b140eafaaacf21aa926df7f35e146a7) @@ -21,11 +21,14 @@ using System.Drawing; using System.Linq; +using System.Windows.Forms; using Core.Common.Controls.TreeView; using Core.Common.TestUtil; using Core.Gui; +using Core.Gui.Commands; using Core.Gui.ContextMenu; using Core.Gui.Forms.Main; +using Core.Gui.TestUtil.ContextMenu; using NUnit.Framework; using Rhino.Mocks; using Riskeer.AssemblyTool.KernelWrapper.Calculators; @@ -44,6 +47,9 @@ [TestFixture] public class GrassCoverErosionInwardsFailurePathContextTreeNodeInfoTest { + private const int contextMenuRelevancyIndexWhenNotRelevant = 0; + private const int contextMenuRelevancyIndexWhenRelevant = 2; + private GrassCoverErosionInwardsPlugin plugin; private TreeNodeInfo info; @@ -113,7 +119,7 @@ } [Test] - public void ChildNodeObjects_WithContext_ReturnChildDataNodes() + public void ChildNodeObjects_FailureMechanismIsRelevant_ReturnChildDataNodes() { // Setup var assessmentSection = new AssessmentSectionStub(); @@ -168,9 +174,30 @@ } [Test] - public void ContextMenuStrip_WithContext_CallsContextMenuBuilderMethods() + public void ChildNodeObjects_FailureMechanismIsNotRelevant_ReturnChildDataNodes() { // Setup + var assessmentSection = new AssessmentSectionStub(); + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism + { + IsRelevant = false + }; + var context = new GrassCoverErosionInwardsFailurePathContext(failureMechanism, assessmentSection); + + // Call + object[] children = info.ChildNodeObjects(context).ToArray(); + + // Assert + Assert.AreEqual(1, children.Length); + + var comment = (Comment) children[0]; + Assert.AreSame(failureMechanism.NotRelevantComments, comment); + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsRelevant_CallsContextMenuBuilderMethods() + { + // Setup var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); @@ -184,6 +211,8 @@ { 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.AddCollapseAllItem()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddExpandAllItem()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); @@ -205,5 +234,193 @@ // Assert mocks.VerifyAll(); } + + [Test] + public void ContextMenuStrip_FailureMechanismIsNotRelevant_CallsContextMenuBuilderMethods() + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + + using (var treeViewControl = new TreeViewControl()) + { + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism + { + IsRelevant = false + }; + var context = new GrassCoverErosionInwardsFailurePathContext(failureMechanism, assessmentSection); + + var menuBuilder = mocks.StrictMock(); + using (mocks.Ordered()) + { + menuBuilder.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddCollapseAllItem()).Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddExpandAllItem()).Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddPropertiesItem()).Return(menuBuilder); + menuBuilder.Expect(mb => mb.Build()).Return(null); + } + + var gui = mocks.Stub(); + gui.Stub(cmp => cmp.Get(context, treeViewControl)).Return(menuBuilder); + gui.Stub(cmp => cmp.MainWindow).Return(mocks.Stub()); + mocks.ReplayAll(); + + plugin.Gui = gui; + + // Call + info.ContextMenuStrip(context, null, treeViewControl); + } + + // Assert + mocks.VerifyAll(); + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsRelevantAndClickOnIsRelevantItem_MakeFailureMechanismNotRelevantAndRemovesAllViewsForItem() + { + // Setup + var mocks = new MockRepository(); + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + var assessmentSection = mocks.Stub(); + var context = new GrassCoverErosionInwardsFailurePathContext(failureMechanism, assessmentSection); + var viewCommands = mocks.StrictMock(); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + viewCommands.Expect(vs => vs.RemoveAllViewsForItem(context)); + + using (var treeViewControl = new TreeViewControl()) + { + var gui = mocks.Stub(); + gui.Stub(g => g.ViewCommands).Return(viewCommands); + gui.Stub(g => g.Get(context, treeViewControl)).Return(menuBuilder); + mocks.ReplayAll(); + + plugin.Gui = gui; + + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(context, null, treeViewControl)) + { + // Call + contextMenu.Items[contextMenuRelevancyIndexWhenRelevant].PerformClick(); + + // Assert + Assert.IsFalse(failureMechanism.IsRelevant); + } + } + + mocks.VerifyAll(); + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsNotRelevantAndClickOnIsRelevantItem_MakeFailureMechanismRelevantAndRemovesAllViewsForItem() + { + // Setup + var mocks = new MockRepository(); + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism + { + IsRelevant = false + }; + var assessmentSection = mocks.Stub(); + var context = new GrassCoverErosionInwardsFailurePathContext(failureMechanism, assessmentSection); + var viewCommands = mocks.StrictMock(); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + viewCommands.Expect(vs => vs.RemoveAllViewsForItem(context)); + + using (var treeViewControl = new TreeViewControl()) + { + var gui = mocks.Stub(); + gui.Stub(g => g.ViewCommands).Return(viewCommands); + gui.Stub(g => g.Get(context, treeViewControl)).Return(menuBuilder); + mocks.ReplayAll(); + + plugin.Gui = gui; + + using (ContextMenuStrip contextMenu = info.ContextMenuStrip(context, null, treeViewControl)) + { + // Call + contextMenu.Items[contextMenuRelevancyIndexWhenNotRelevant].PerformClick(); + + // Assert + Assert.IsTrue(failureMechanism.IsRelevant); + } + } + + mocks.VerifyAll(); + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsRelevant_AddCustomItems() + { + // Setup + var mocks = new MockRepository(); + using (var treeView = new TreeViewControl()) + { + var assessmentSection = mocks.Stub(); + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + var context = new GrassCoverErosionInwardsFailurePathContext(failureMechanism, assessmentSection); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.Stub(); + gui.Stub(cmp => cmp.Get(context, treeView)).Return(menuBuilder); + mocks.ReplayAll(); + + plugin.Gui = gui; + + // Call + using (ContextMenuStrip menu = info.ContextMenuStrip(context, assessmentSection, treeView)) + { + // Assert + Assert.AreEqual(8, menu.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuRelevancyIndexWhenRelevant, + "I&s relevant", + "Geeft aan of dit toetsspoor relevant is of niet.", + RiskeerCommonFormsResources.Checkbox_ticked); + } + } + + mocks.VerifyAll(); + } + + [Test] + public void ContextMenuStrip_FailureMechanismIsNotRelevant_AddCustomItems() + { + // Setup + var mocks = new MockRepository(); + using (var treeView = new TreeViewControl()) + { + var assessmentSection = mocks.Stub(); + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism + { + IsRelevant = false + }; + var context = new GrassCoverErosionInwardsFailurePathContext(failureMechanism, assessmentSection); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var gui = mocks.Stub(); + gui.Stub(cmp => cmp.Get(context, treeView)).Return(menuBuilder); + mocks.ReplayAll(); + + plugin.Gui = gui; + + // Call + using (ContextMenuStrip menu = info.ContextMenuStrip(context, assessmentSection, treeView)) + { + // Assert + Assert.AreEqual(6, menu.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuRelevancyIndexWhenNotRelevant, + "I&s relevant", + "Geeft aan of dit toetsspoor relevant is of niet.", + RiskeerCommonFormsResources.Checkbox_empty); + } + } + + mocks.VerifyAll(); + } } } \ No newline at end of file