Index: Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuBuilder.cs =================================================================== diff -u -re6e92cb42b1e4983add2406300958b6b116ba781 -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuBuilder.cs (.../ContextMenuBuilder.cs) (revision e6e92cb42b1e4983add2406300958b6b116ba781) +++ Core/Common/src/Core.Common.Gui/ContextMenu/ContextMenuBuilder.cs (.../ContextMenuBuilder.cs) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -14,7 +14,6 @@ private readonly GuiContextMenuItemFactory guiItemsFactory; private readonly TreeViewContextMenuItemFactory treeViewItemsFactory; private readonly ContextMenuStrip contextMenu; - private readonly ITreeNode treeNode; /// /// Creates a new instance of , which uses the given to @@ -33,7 +32,6 @@ } treeViewItemsFactory = new TreeViewContextMenuItemFactory(treeNode); contextMenu = new ContextMenuStrip(); - this.treeNode = treeNode; } /// @@ -130,9 +128,9 @@ /// /// Adds a custom item to the . /// - /// The custom to add to the . + /// The custom to add to the . /// The itself, so that operations can be easily chained. - public ContextMenuBuilder AddCustomItem(ToolStripMenuItem item) + public ContextMenuBuilder AddCustomItem(StrictContextMenuItem item) { AddItem(item); return this; Index: Core/Common/src/Core.Common.Gui/ContextMenu/StrictContextMenuItem.cs =================================================================== diff -u --- Core/Common/src/Core.Common.Gui/ContextMenu/StrictContextMenuItem.cs (revision 0) +++ Core/Common/src/Core.Common.Gui/ContextMenu/StrictContextMenuItem.cs (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -0,0 +1,34 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Core.Common.Gui.ContextMenu +{ + /// + /// Class used by the to enforce instantiation the following properties. + /// + /// + /// + /// + /// + /// + /// + public sealed class StrictContextMenuItem : ToolStripMenuItem + { + /// + /// Creates a new instance of . + /// + /// The text of the . + /// The tooltip of the . + /// The icon used for the . + /// The handler for a mouse click on the + /// . + public StrictContextMenuItem(string text, string toolTip, Image image, EventHandler clickHandler) + { + Text = text; + ToolTipText = toolTip; + Image = image; + Click += clickHandler; + } + } +} \ No newline at end of file Index: Core/Common/src/Core.Common.Gui/Core.Common.Gui.csproj =================================================================== diff -u -re6e92cb42b1e4983add2406300958b6b116ba781 -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Core/Common/src/Core.Common.Gui/Core.Common.Gui.csproj (.../Core.Common.Gui.csproj) (revision e6e92cb42b1e4983add2406300958b6b116ba781) +++ Core/Common/src/Core.Common.Gui/Core.Common.Gui.csproj (.../Core.Common.Gui.csproj) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -131,6 +131,9 @@ + + Component + Index: Core/Common/src/Core.Common.Gui/IGui.cs =================================================================== diff -u -rbc238ea43fae81b8a49aa2bdb2c8349815c46039 -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Core/Common/src/Core.Common.Gui/IGui.cs (.../IGui.cs) (revision bc238ea43fae81b8a49aa2bdb2c8349815c46039) +++ Core/Common/src/Core.Common.Gui/IGui.cs (.../IGui.cs) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -105,6 +105,11 @@ /// object Selection { get; set; } + /// + /// Gets the of the + /// + IContextMenuBuilderProvider ContextMenuProvider { get; } + #endregion #region Public Methods Index: Core/Common/src/Core.Common.Gui/RingtoetsGui.cs =================================================================== diff -u -ra80efa8773c3efec54ba44940945b03bc3f3ff7e -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Core/Common/src/Core.Common.Gui/RingtoetsGui.cs (.../RingtoetsGui.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) +++ Core/Common/src/Core.Common.Gui/RingtoetsGui.cs (.../RingtoetsGui.cs) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -45,9 +45,9 @@ private static string instanceCreationStackTrace; private readonly IList commands = new List(); + private readonly ApplicationCore applicationCore; private MainWindow mainWindow; - private readonly ApplicationCore applicationCore; private object selection; @@ -279,6 +279,19 @@ public bool IsViewRemoveOnItemDeleteSuspended { get; set; } + public IContextMenuBuilderProvider ContextMenuProvider + { + get + { + return this; + } + } + + public ContextMenuBuilder Get(ITreeNode treeNode) + { + return new ContextMenuBuilder(this, treeNode); + } + public void Dispose() { Dispose(true); @@ -381,6 +394,17 @@ return null; } + public void UpdateTitle() + { + if (mainWindow != null) + { + mainWindow.Title = string.Format("{0} - {1} {2}", + Project != null ? Project.Name : Resources.RingtoetsGui_UpdateTitle_Unknown, + FixedSettings.MainWindowTitle, + SettingsHelper.ApplicationVersion); + } + } + protected virtual void Dispose(bool disposing) { if (disposing) @@ -849,17 +873,6 @@ log.Info(Resources.RingtoetsGui_InitializeWindows_All_windows_are_created); } - public void UpdateTitle() - { - if (mainWindow != null) - { - mainWindow.Title = string.Format("{0} - {1} {2}", - Project != null ? Project.Name : Resources.RingtoetsGui_UpdateTitle_Unknown, - FixedSettings.MainWindowTitle, - SettingsHelper.ApplicationVersion); - } - } - private void ActiveViewChanging(object sender, ActiveViewChangeEventArgs e) { if (e.View == null || mainWindow == null || mainWindow.IsWindowDisposed) @@ -1071,10 +1084,5 @@ { Dispose(false); } - - public ContextMenuBuilder Get(ITreeNode treeNode) - { - return new ContextMenuBuilder(this, treeNode); - } } } \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs =================================================================== diff -u -r41c77f9f36ae74a406fd382187426cc06d2b0200 -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs (.../ContextMenuBuilderTest.cs) (revision 41c77f9f36ae74a406fd382187426cc06d2b0200) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs (.../ContextMenuBuilderTest.cs) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -280,7 +280,7 @@ { // Setup var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); - var item = new ToolStripMenuItem(); + var item = new StrictContextMenuItem(null,null,null,null); // Call var result = builder.AddCustomItem(item).Build(); @@ -310,9 +310,9 @@ { // Setup var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); - - builder.AddCustomItem(new ToolStripMenuItem()); + builder.AddCustomItem(new StrictContextMenuItem(null, null, null, null)); + // Call var result = builder.AddSeparator().Build(); @@ -329,7 +329,7 @@ // Setup var builder = new ContextMenuBuilder(null, MockRepository.GenerateMock()); - builder.AddCustomItem(new ToolStripMenuItem()).AddSeparator(); + builder.AddCustomItem(new StrictContextMenuItem(null, null, null, null)).AddSeparator(); // Call var result = builder.AddSeparator().Build(); Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/StrictContextMenuItemTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/StrictContextMenuItemTest.cs (revision 0) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/StrictContextMenuItemTest.cs (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -0,0 +1,42 @@ +using System; +using System.Drawing; +using System.IO; +using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.Properties; +using Core.Common.TestUtils; +using NUnit.Framework; +using Rhino.Mocks; + +namespace Core.Common.Gui.Tests.ContextMenu +{ + [TestFixture] + public class StrictContextMenuItemTest + { + public interface IClick + { + void Click(); + } + + [Test] + public void Constructor_WithParameters_PropertiesSet() + { + // Setup + var text = "text"; + var toolTip = "tooltip"; + var image = Resources.ImportIcon; + var mock = MockRepository.GenerateStrictMock(); + mock.Expect(m => m.Click()); + EventHandler handler = (s,e) => mock.Click(); + + // Call + var result = new StrictContextMenuItem(text,toolTip,image,handler); + result.PerformClick(); + + // Assert + Assert.IsInstanceOf(result); + Assert.AreEqual(text, result.Text); + Assert.AreEqual(toolTip, result.ToolTipText); + TestHelper.AssertImagesAreEqual(image, result.Image); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.Test/Core.Common.Gui.Test.csproj =================================================================== diff -u -r41c77f9f36ae74a406fd382187426cc06d2b0200 -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Core/Common/test/Core.Common.Gui.Test/Core.Common.Gui.Test.csproj (.../Core.Common.Gui.Test.csproj) (revision 41c77f9f36ae74a406fd382187426cc06d2b0200) +++ Core/Common/test/Core.Common.Gui.Test/Core.Common.Gui.Test.csproj (.../Core.Common.Gui.Test.csproj) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -55,6 +55,7 @@ + Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismNodePresenter.cs =================================================================== diff -u -ra80efa8773c3efec54ba44940945b03bc3f3ff7e -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismNodePresenter.cs (.../FailureMechanismNodePresenter.cs) (revision a80efa8773c3efec54ba44940945b03bc3f3ff7e) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/FailureMechanismNodePresenter.cs (.../FailureMechanismNodePresenter.cs) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -38,19 +38,21 @@ protected override ContextMenuStrip GetContextMenu(ITreeNode sender, FailureMechanismPlaceholder nodeData) { ContextMenuBuilder menuBuilder = contextMenuBuilderProvider.Get(sender); - - var calculateItem = new ToolStripMenuItem + + var calculateItem = new StrictContextMenuItem( + RingtoetsCommonFormsResources.Calculate_all, + RingtoetsCommonFormsResources.Calculate_all_ToolTip, + RingtoetsCommonFormsResources.CalculateAllIcon, + null) { - Text = RingtoetsCommonFormsResources.Calculate_all, - ToolTipText = RingtoetsCommonFormsResources.Calculate_all_ToolTip, - Image = RingtoetsCommonFormsResources.CalculateAllIcon, Enabled = false }; - var clearOutputItem = new ToolStripMenuItem + var clearOutputItem = new StrictContextMenuItem( + RingtoetsCommonFormsResources.Clear_all_output, + RingtoetsCommonFormsResources.Clear_all_output_ToolTip, + RingtoetsCommonFormsResources.ClearIcon, null + ) { - Text = RingtoetsCommonFormsResources.Clear_all_output, - ToolTipText = RingtoetsCommonFormsResources.Clear_all_output_ToolTip, - Image = RingtoetsCommonFormsResources.ClearIcon, Enabled = false }; var contextMenu = menuBuilder.AddCustomItem(calculateItem) Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/PlaceholderWithReadonlyNameNodePresenter.cs =================================================================== diff -u -re6e92cb42b1e4983add2406300958b6b116ba781 -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/PlaceholderWithReadonlyNameNodePresenter.cs (.../PlaceholderWithReadonlyNameNodePresenter.cs) (revision e6e92cb42b1e4983add2406300958b6b116ba781) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/NodePresenters/PlaceholderWithReadonlyNameNodePresenter.cs (.../PlaceholderWithReadonlyNameNodePresenter.cs) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -45,11 +45,12 @@ if (nodeData is InputPlaceholder || nodeData is OutputPlaceholder) { - var clearItem = new ToolStripMenuItem + var clearItem = new StrictContextMenuItem( + RingtoetsCommonFormsResources.FailureMechanism_InputsOutputs_Erase, + RingtoetsCommonFormsResources.FailureMechanism_InputsOutputs_Erase_ToolTip, + RingtoetsCommonFormsResources.ClearIcon, + null) { - Text = RingtoetsCommonFormsResources.FailureMechanism_InputsOutputs_Erase, - ToolTipText = RingtoetsCommonFormsResources.FailureMechanism_InputsOutputs_Erase_ToolTip, - Image = RingtoetsCommonFormsResources.ClearIcon, Enabled = false }; Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs =================================================================== diff -u -r61161720b379645f400606e868e2a1286c17348d -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision 61161720b379645f400606e868e2a1286c17348d) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -7,8 +7,8 @@ using Core.Common.Base.Workflow; using Core.Common.Controls; - -using Ringtoets.Common.Forms.Extensions; +using Core.Common.Gui; +using Core.Common.Gui.ContextMenu; using Ringtoets.Common.Forms.NodePresenters; using Ringtoets.Common.Forms.PresentationObjects; using Ringtoets.Piping.Data; @@ -28,6 +28,8 @@ /// public class PipingFailureMechanismNodePresenter : RingtoetsNodePresenterBase { + public IContextMenuBuilderProvider ContextMenuBuilderProvider { get; set; } + /// /// Injection points for a method to cause an to be scheduled for execution. /// @@ -49,60 +51,97 @@ protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingFailureMechanism failureMechanism) { - var rootMenu = new ContextMenuStrip(); + if (ContextMenuBuilderProvider == null) + { + return null; + } - rootMenu.AddMenuItem(Resources.PipingFailureMechanism_Add_PipingCalculation, - Resources.PipingFailureMechanism_Add_PipingCalculation_Tooltip, - Resources.PipingIcon, (o, args) => - { - var calculation = new PipingCalculation - { - Name = NamingHelper.GetUniqueName(failureMechanism.Calculations, PipingDataResources.PipingCalculation_DefaultName, c => c.Name) - }; - failureMechanism.Calculations.Add(calculation); - failureMechanism.NotifyObservers(); - }); - rootMenu.AddMenuItem(Resources.PipingFailureMechanism_Add_PipingCalculationGroup, - Resources.PipingFailureMechanism_Add_PipingCalculationGroup_Tooltip, - Resources.AddFolderIcon, (o, args) => - { - var calculation = new PipingCalculationGroup - { - Name = NamingHelper.GetUniqueName(failureMechanism.Calculations, PipingDataResources.PipingCalculationGroup_DefaultName, c => c.Name) - }; - failureMechanism.Calculations.Add(calculation); - failureMechanism.NotifyObservers(); - }); - rootMenu.AddMenuItem(RingtoetsCommonFormsResources.Calculate_all, - Resources.PipingFailureMechanism_Calculate_Tooltip, - RingtoetsCommonFormsResources.CalculateAllIcon, (o, args) => - { - foreach (PipingCalculation calc in GetAllPipingCalculationsResursively(failureMechanism)) - { - RunActivityAction(new PipingCalculationActivity(calc)); - } - }); + var addCalculationItem = new StrictContextMenuItem( + Resources.PipingFailureMechanism_Add_PipingCalculation, + Resources.PipingFailureMechanism_Add_PipingCalculation_Tooltip, + Resources.PipingIcon, + (s, e) => AddCalculation(failureMechanism) + ); - var clearOutputNode = rootMenu.AddMenuItem(RingtoetsCommonFormsResources.Clear_all_output, - RingtoetsCommonFormsResources.Clear_all_output_ToolTip, - RingtoetsCommonFormsResources.ClearIcon, (o, args) => - { - foreach (PipingCalculation calc in GetAllPipingCalculationsResursively(failureMechanism)) - { - calc.ClearOutput(); - calc.NotifyObservers(); - } - }); + var addCalculationGroupItem = new StrictContextMenuItem( + Resources.PipingFailureMechanism_Add_PipingCalculationGroup, + Resources.PipingFailureMechanism_Add_PipingCalculationGroup_Tooltip, + Resources.AddFolderIcon, + (o, args) => AddCalculationGroup(failureMechanism) + ); + var calculateAllItem = new StrictContextMenuItem( + RingtoetsCommonFormsResources.Calculate_all, + Resources.PipingFailureMechanism_Calculate_Tooltip, + RingtoetsCommonFormsResources.CalculateAllIcon, + (o, args) => CalculateAll(failureMechanism) + ); + + var clearAllItem = new StrictContextMenuItem( + RingtoetsCommonFormsResources.Clear_all_output, + RingtoetsCommonFormsResources.Clear_all_output_ToolTip, + RingtoetsCommonFormsResources.ClearIcon, + (o, args) => ClearAll(failureMechanism) + ); + if (!GetAllPipingCalculationsResursively(failureMechanism).Any(c => c.HasOutput)) { - clearOutputNode.Enabled = false; - clearOutputNode.ToolTipText = Resources.ClearOutput_No_calculation_with_output_to_clear; + clearAllItem.Enabled = false; + clearAllItem.ToolTipText = Resources.ClearOutput_No_calculation_with_output_to_clear; } - return rootMenu; + return ContextMenuBuilderProvider.Get(sender) + .AddCustomItem(addCalculationItem) + .AddCustomItem(addCalculationGroupItem) + .AddSeparator() + .AddCustomItem(calculateAllItem) + .AddCustomItem(clearAllItem) + .AddSeparator() + .AddExpandAllItem() + .AddCollapseAllItem() + .AddSeparator() + .AddImportItem() + .AddExportItem() + .Build(); } + private static void ClearAll(PipingFailureMechanism failureMechanism) + { + foreach (PipingCalculation calc in GetAllPipingCalculationsResursively(failureMechanism)) + { + calc.ClearOutput(); + calc.NotifyObservers(); + } + } + + private void CalculateAll(PipingFailureMechanism failureMechanism) + { + foreach (PipingCalculation calc in GetAllPipingCalculationsResursively(failureMechanism)) + { + RunActivityAction(new PipingCalculationActivity(calc)); + } + } + + private static void AddCalculationGroup(PipingFailureMechanism failureMechanism) + { + var calculation = new PipingCalculationGroup + { + Name = NamingHelper.GetUniqueName(failureMechanism.Calculations, PipingDataResources.PipingCalculationGroup_DefaultName, c => c.Name) + }; + failureMechanism.Calculations.Add(calculation); + failureMechanism.NotifyObservers(); + } + + private static void AddCalculation(PipingFailureMechanism failureMechanism) + { + var calculation = new PipingCalculation + { + Name = NamingHelper.GetUniqueName(failureMechanism.Calculations, PipingDataResources.PipingCalculation_DefaultName, c => c.Name) + }; + failureMechanism.Calculations.Add(calculation); + failureMechanism.NotifyObservers(); + } + private static IEnumerable GetInputs(PipingFailureMechanism failureMechanism) { yield return failureMechanism.SectionDivisions; Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs =================================================================== diff -u -r495647ee1c652fecc15eea7fefeab29ae01347fe -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision 495647ee1c652fecc15eea7fefeab29ae01347fe) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -39,9 +39,10 @@ }; yield return new PipingCalculationGroupContextNodePresenter(); yield return new PipingInputContextNodePresenter(); - yield return new PipingFailureMechanismNodePresenter + yield return new PipingFailureMechanismNodePresenter() { - RunActivityAction = Gui.ActivityRunner.Enqueue + RunActivityAction = Gui.ActivityRunner.Enqueue, + ContextMenuBuilderProvider = Gui.ContextMenuProvider }; yield return new PipingSurfaceLineCollectionNodePresenter { Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs =================================================================== diff -u -r61161720b379645f400606e868e2a1286c17348d -reb7f8fe1e85f00faf16a1cddef014728d60a2b19 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs (.../PipingFailureMechanismNodePresenterTest.cs) (revision 61161720b379645f400606e868e2a1286c17348d) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingFailureMechanismNodePresenterTest.cs (.../PipingFailureMechanismNodePresenterTest.cs) (revision eb7f8fe1e85f00faf16a1cddef014728d60a2b19) @@ -2,8 +2,11 @@ using System.ComponentModel; using System.Drawing; using System.Linq; +using System.Windows.Forms; using Core.Common.Base; using Core.Common.Controls; +using Core.Common.Gui; +using Core.Common.Gui.ContextMenu; using Core.Common.TestUtils; using Core.Common.Utils.Collections; using NUnit.Framework; @@ -18,6 +21,7 @@ using RingtoetsFormsResources = Ringtoets.Common.Forms.Properties.Resources; using PipingFormsResources = Ringtoets.Piping.Forms.Properties.Resources; +using CommonGuiResources = Core.Common.Gui.Properties.Resources; namespace Ringtoets.Piping.Forms.Test.NodePresenters { @@ -26,8 +30,7 @@ private const int contextMenuAddCalculationIndex = 0; private const int contextMenuAddFolderIndex = 1; - private const int contextMenuCalculateIndex = 2; - private const int contextMenuClearIndex = 3; + private const int contextMenuClearIndex = 4; [Test] public void DefaultConstructor_ExpectedValues() @@ -284,263 +287,347 @@ } [Test] - public void GetContextMenu_PipingFailureMechanism_ReturnsContextMenuWithFourItems() + public void OnPropertyChange_Always_DoNothing() { // Setup var mocks = new MockRepository(); + var dataMock = mocks.StrictMock(); var nodeMock = mocks.StrictMock(); + var eventArgsMock = mocks.StrictMock(""); mocks.ReplayAll(); - var nodeData = new PipingFailureMechanism(); - ((PipingCalculation)nodeData.Calculations.First()).Output = new TestPipingOutput(); - var nodePresenter = new PipingFailureMechanismNodePresenter(); // Call - var contextMenu = nodePresenter.GetContextMenu(nodeMock, nodeData); + nodePresenter.OnPropertyChanged(dataMock, nodeMock, eventArgsMock); // Assert - Assert.AreEqual(4, contextMenu.Items.Count); - var addCalculationItem = contextMenu.Items[contextMenuAddCalculationIndex]; - Assert.AreEqual("Berekening toevoegen", addCalculationItem.Text); - Assert.AreEqual("Voeg een nieuwe piping berekening toe aan het faalmechanisme.", addCalculationItem.ToolTipText); - Assert.AreEqual(16, addCalculationItem.Image.Width); - Assert.AreEqual(16, addCalculationItem.Image.Height); + mocks.VerifyAll(); // Expect no calls on arguments + } - var addFolderItem = contextMenu.Items[contextMenuAddFolderIndex]; - Assert.AreEqual("Map toevoegen", addFolderItem.Text); - Assert.AreEqual("Voeg een nieuwe berekeningsmap toe aan het faalmechanisme.", addFolderItem.ToolTipText); - TestHelper.AssertImagesAreEqual(PipingFormsResources.AddFolderIcon, addFolderItem.Image); + [Test] + public void OnCollectionChange_Always_DoNothing() + { + // Setup + var mocks = new MockRepository(); + var dataMock = mocks.StrictMock(); + var eventArgsMock = mocks.StrictMock(); + mocks.ReplayAll(); - var runAllItem = contextMenu.Items[contextMenuCalculateIndex]; - Assert.AreEqual("Alles be&rekenen", runAllItem.Text); - Assert.AreEqual("Valideer en voer alle berekeningen binnen het piping faalmechanisme uit.", runAllItem.ToolTipText); - TestHelper.AssertImagesAreEqual(RingtoetsFormsResources.CalculateAllIcon, runAllItem.Image); + var nodePresenter = new PipingFailureMechanismNodePresenter(); - var clearOutputItem = contextMenu.Items[contextMenuClearIndex]; - Assert.AreEqual("&Wis alle uitvoer", clearOutputItem.Text); - Assert.AreEqual("Wis de uitvoer van alle berekeningen binnen het faalmechanisme.", clearOutputItem.ToolTipText); - TestHelper.AssertImagesAreEqual(RingtoetsFormsResources.ClearIcon, clearOutputItem.Image); + // Call + nodePresenter.OnCollectionChanged(dataMock, eventArgsMock); + // Assert mocks.VerifyAll(); // Expect no calls on arguments } [Test] - public void GetContextMenu_PipingFailureMechanismNoOutput_ClearAllOutputDisabled() + public void CanRemove_Always_ReturnFalse() { // Setup var mocks = new MockRepository(); - var nodeMock = mocks.StrictMock(); - var dataMock = mocks.StrictMock(); + var parentNodeDataMock = mocks.StrictMock(); + var nodeMock = mocks.StrictMock(); + mocks.ReplayAll(); var nodePresenter = new PipingFailureMechanismNodePresenter(); - mocks.ReplayAll(); - // Call - var contextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock); + bool removalAllowed = nodePresenter.CanRemove(parentNodeDataMock, nodeMock); // Assert - Assert.AreEqual(4, contextMenu.Items.Count); - - var clearOutputItem = contextMenu.Items[contextMenuClearIndex]; - Assert.IsFalse(clearOutputItem.Enabled); - Assert.AreEqual("Er zijn geen berekeningen met uitvoer om te wissen.", clearOutputItem.ToolTipText); - + Assert.IsFalse(removalAllowed); mocks.VerifyAll(); // Expect no calls on arguments } - + [Test] - public void GetContextMenu_PipingFailureMechanismWithOutput_ClearAllOutputEnabled() + public void RemoveNodeData_PipingFailureMechanism_PipingFailureMechanismRemovedFromAssessmentSection() { // Setup + var nodePresenter = new PipingFailureMechanismNodePresenter(); + + // Call + TestDelegate call = () => nodePresenter.RemoveNodeData(new object(), new PipingFailureMechanism()); + + // Assert + Assert.Throws(call); + } + + [Test] + public void GivenMultiplePipingCalculationsWithOutput_WhenClearingOutputFromContextMenu_ThenPipingOutputCleared() + { + // Given var mocks = new MockRepository(); - var nodeMock = mocks.StrictMock(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()).Repeat.Twice(); + + var nodeMock = mocks.Stub(); + var guiMock = mocks.StrictMock(); + guiMock.Expect(g => g.ApplicationCore).Return(new ApplicationCore()).Repeat.Twice(); + + var contextMenuProvider = mocks.StrictMock(); + contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(guiMock, nodeMock)); + var dataMock = mocks.StrictMock(); dataMock.Calculations.Add(new PipingCalculation { Output = new TestPipingOutput() }); + dataMock.Calculations.Add(new PipingCalculation + { + Output = new TestPipingOutput() + }); + dataMock.Calculations.ElementAt(0).Attach(observer); + dataMock.Calculations.ElementAt(1).Attach(observer); - var nodePresenter = new PipingFailureMechanismNodePresenter(); + var nodePresenter = new PipingFailureMechanismNodePresenter + { + ContextMenuBuilderProvider = contextMenuProvider + }; mocks.ReplayAll(); - // Call - var contextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock); + var contextMenuAdapter = nodePresenter.GetContextMenu(nodeMock, dataMock); - // Assert - Assert.AreEqual(4, contextMenu.Items.Count); + // When + contextMenuAdapter.Items[contextMenuClearIndex].PerformClick(); - var clearOutputItem = contextMenu.Items[contextMenuClearIndex]; - Assert.IsTrue(clearOutputItem.Enabled); - Assert.AreEqual(RingtoetsFormsResources.Clear_all_output_ToolTip, clearOutputItem.ToolTipText); + // Then + CollectionAssert.IsEmpty(dataMock.Calculations.Where(c => c.HasOutput)); - mocks.VerifyAll(); // Expect no calls on arguments + mocks.VerifyAll(); } [Test] - public void GetContextMenu_ClickOnAddCalculationItem_NewPipingCalculationInstanceAddedToFailureMechanismAndNotifyObservers() + public void GetContextMenu_NullGui_ReturnsNull() { // Setup var mocks = new MockRepository(); var nodeMock = mocks.StrictMock(); - var observerMock = mocks.StrictMock(); - observerMock.Expect(o => o.UpdateObserver()); - mocks.ReplayAll(); - var failureMechanism = new PipingFailureMechanism(); - failureMechanism.Attach(observerMock); var nodePresenter = new PipingFailureMechanismNodePresenter(); + var failureMechanism = mocks.StrictMock(); - // Precondition - Assert.AreEqual(1, failureMechanism.Calculations.Count); + mocks.ReplayAll(); // Call - var contextMenu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); - var addCalculationItem = contextMenu.Items[contextMenuAddCalculationIndex]; - addCalculationItem.PerformClick(); + var menu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); // Assert - Assert.AreEqual(2, failureMechanism.Calculations.Count); - IPipingCalculationItem addedItem = failureMechanism.Calculations.ElementAt(1); - Assert.AreEqual("Nieuwe berekening (1)", addedItem.Name); - Assert.IsInstanceOf(addedItem); - mocks.VerifyAll(); + Assert.IsNull(menu); } [Test] - public void GetContextMenu_ClickOnAddFolderItem_NewPipingCalculationGroupInstanceAddedToFailureMechanismAndNotifyObservers() + public void GetContextMenu_NoGui_ReturnsEmptyContextMenu() { // Setup var mocks = new MockRepository(); var nodeMock = mocks.StrictMock(); - var observerMock = mocks.StrictMock(); - observerMock.Expect(o => o.UpdateObserver()); - mocks.ReplayAll(); + var contextMenuProvider = mocks.StrictMock(); + contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); - var failureMechanism = new PipingFailureMechanism(); - failureMechanism.Attach(observerMock); - failureMechanism.Calculations.Clear(); - failureMechanism.Calculations.Add(new PipingCalculationGroup()); - var nodePresenter = new PipingFailureMechanismNodePresenter(); + var nodePresenter = new PipingFailureMechanismNodePresenter { + ContextMenuBuilderProvider = contextMenuProvider + }; + var failureMechanism = mocks.StrictMock(); - // Precondition - Assert.AreEqual(1, failureMechanism.Calculations.Count); + mocks.ReplayAll(); // Call - var contextMenu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); - var addCalculationItem = contextMenu.Items[contextMenuAddFolderIndex]; - addCalculationItem.PerformClick(); + var menu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); // Assert - Assert.AreEqual(2, failureMechanism.Calculations.Count); - IPipingCalculationItem addedItem = failureMechanism.Calculations.ElementAt(1); - Assert.AreEqual("Nieuwe map (1)", addedItem.Name); - Assert.IsInstanceOf(addedItem); + Assert.AreEqual(9, menu.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(menu, 0, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculation, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculation_Tooltip, PipingFormsResources.PipingIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 1, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculationGroup, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculationGroup_Tooltip, PipingFormsResources.AddFolderIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 3, RingtoetsFormsResources.Calculate_all, PipingFormsResources.PipingFailureMechanism_Calculate_Tooltip, RingtoetsFormsResources.CalculateAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 6, CommonGuiResources.Expand_all, CommonGuiResources.Expand_all_ToolTip, CommonGuiResources.ExpandAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 7, CommonGuiResources.Collapse_all, CommonGuiResources.Collapse_all_ToolTip, CommonGuiResources.CollapseAllIcon); + + CollectionAssert.AllItemsAreInstancesOfType(new[] { menu.Items[2], menu.Items[5], menu.Items[8] }, typeof(ToolStripSeparator)); + mocks.VerifyAll(); } [Test] - public void OnPropertyChange_Always_DoNothing() + public void GetContextMenu_WithGui_ReturnsContextMenuWithCommonItems() { // Setup var mocks = new MockRepository(); - var dataMock = mocks.StrictMock(); - var nodeMock = mocks.StrictMock(); - var eventArgsMock = mocks.StrictMock(""); - mocks.ReplayAll(); + var nodeMock = mocks.Stub(); + var guiMock = mocks.StrictMock(); + guiMock.Expect(g => g.ApplicationCore).Return(new ApplicationCore()).Repeat.Twice(); - var nodePresenter = new PipingFailureMechanismNodePresenter(); + var contextMenuProvider = mocks.StrictMock(); + contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(guiMock, nodeMock)); + var nodePresenter = new PipingFailureMechanismNodePresenter + { + ContextMenuBuilderProvider = contextMenuProvider + }; + var failureMechanism = mocks.StrictMock(); + nodeMock.Tag = failureMechanism; + + mocks.ReplayAll(); + // Call - nodePresenter.OnPropertyChanged(dataMock, nodeMock, eventArgsMock); + var menu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); // Assert - mocks.VerifyAll(); // Expect no calls on arguments + Assert.AreEqual(11, menu.Items.Count); + + TestHelper.AssertContextMenuStripContainsItem(menu, 0, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculation, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculation_Tooltip, PipingFormsResources.PipingIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 1, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculationGroup, PipingFormsResources.PipingFailureMechanism_Add_PipingCalculationGroup_Tooltip, PipingFormsResources.AddFolderIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 3, RingtoetsFormsResources.Calculate_all, PipingFormsResources.PipingFailureMechanism_Calculate_Tooltip, RingtoetsFormsResources.CalculateAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 6, CommonGuiResources.Expand_all, CommonGuiResources.Expand_all_ToolTip, CommonGuiResources.ExpandAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 7, CommonGuiResources.Collapse_all, CommonGuiResources.Collapse_all_ToolTip, CommonGuiResources.CollapseAllIcon); + TestHelper.AssertContextMenuStripContainsItem(menu, 9, CommonGuiResources.Import, CommonGuiResources.Import_ToolTip, CommonGuiResources.ImportIcon, false); + TestHelper.AssertContextMenuStripContainsItem(menu, 10, CommonGuiResources.Export, CommonGuiResources.Export_ToolTip, CommonGuiResources.ExportIcon, false); + + CollectionAssert.AllItemsAreInstancesOfType(new[] { menu.Items[2], menu.Items[5], menu.Items[8] }, typeof(ToolStripSeparator)); + + mocks.VerifyAll(); } [Test] - public void OnCollectionChange_Always_DoNothing() + public void GetContextMenu_PipingFailureMechanismNoOutput_ClearAllOutputDisabled() { // Setup var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); var dataMock = mocks.StrictMock(); - var eventArgsMock = mocks.StrictMock(); - mocks.ReplayAll(); + var contextMenuProvider = mocks.StrictMock(); + contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); - var nodePresenter = new PipingFailureMechanismNodePresenter(); + var nodePresenter = new PipingFailureMechanismNodePresenter + { + ContextMenuBuilderProvider = contextMenuProvider + }; + mocks.ReplayAll(); + // Call - nodePresenter.OnCollectionChanged(dataMock, eventArgsMock); + var contextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock); // Assert + Assert.AreEqual(9, contextMenu.Items.Count); + + var clearOutputItem = contextMenu.Items[contextMenuClearIndex]; + Assert.IsFalse(clearOutputItem.Enabled); + Assert.AreEqual("Er zijn geen berekeningen met uitvoer om te wissen.", clearOutputItem.ToolTipText); + mocks.VerifyAll(); // Expect no calls on arguments } - + [Test] - public void CanRemove_Always_ReturnFalse() + public void GetContextMenu_PipingFailureMechanismWithOutput_ClearAllOutputEnabled() { // Setup var mocks = new MockRepository(); - var parentNodeDataMock = mocks.StrictMock(); - var nodeMock = mocks.StrictMock(); - mocks.ReplayAll(); + var nodeMock = mocks.StrictMock(); + var dataMock = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); + contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); - var nodePresenter = new PipingFailureMechanismNodePresenter(); + dataMock.Calculations.Add(new PipingCalculation + { + Output = new TestPipingOutput() + }); + var nodePresenter = new PipingFailureMechanismNodePresenter + { + ContextMenuBuilderProvider = contextMenuProvider + }; + + mocks.ReplayAll(); + // Call - bool removalAllowed = nodePresenter.CanRemove(parentNodeDataMock, nodeMock); + var contextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock); // Assert - Assert.IsFalse(removalAllowed); + Assert.AreEqual(9, contextMenu.Items.Count); + + var clearOutputItem = contextMenu.Items[contextMenuClearIndex]; + Assert.IsTrue(clearOutputItem.Enabled); + Assert.AreEqual(RingtoetsFormsResources.Clear_all_output_ToolTip, clearOutputItem.ToolTipText); + mocks.VerifyAll(); // Expect no calls on arguments } [Test] - public void RemoveNodeData_PipingFailureMechanism_PipingFailureMechanismRemovedFromAssessmentSection() + public void GetContextMenu_ClickOnAddCalculationItem_NewPipingCalculationInstanceAddedToFailureMechanismAndNotifyObservers() { // Setup - var nodePresenter = new PipingFailureMechanismNodePresenter(); + var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); + var observerMock = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); + mocks.ReplayAll(); + + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.Attach(observerMock); + var nodePresenter = new PipingFailureMechanismNodePresenter + { + ContextMenuBuilderProvider = contextMenuProvider + }; + + // Precondition + Assert.AreEqual(1, failureMechanism.Calculations.Count); + // Call - TestDelegate call = () => nodePresenter.RemoveNodeData(new object(), new PipingFailureMechanism()); + var contextMenu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); + var addCalculationItem = contextMenu.Items[contextMenuAddCalculationIndex]; + addCalculationItem.PerformClick(); // Assert - Assert.Throws(call); + Assert.AreEqual(2, failureMechanism.Calculations.Count); + IPipingCalculationItem addedItem = failureMechanism.Calculations.ElementAt(1); + Assert.AreEqual("Nieuwe berekening (1)", addedItem.Name); + Assert.IsInstanceOf(addedItem); + mocks.VerifyAll(); } [Test] - public void GivenMultiplePipingCalculationsWithOutput_WhenClearingOutputFromContextMenu_ThenPipingOutputCleared() + public void GetContextMenu_ClickOnAddFolderItem_NewPipingCalculationGroupInstanceAddedToFailureMechanismAndNotifyObservers() { - // Given + // Setup var mocks = new MockRepository(); - var observer = mocks.StrictMock(); - observer.Expect(o => o.UpdateObserver()).Repeat.Twice(); + var nodeMock = mocks.StrictMock(); + var observerMock = mocks.StrictMock(); + var contextMenuProvider = mocks.StrictMock(); - var dataMock = mocks.StrictMock(); - dataMock.Calculations.Add(new PipingCalculation - { - Output = new TestPipingOutput() - }); - dataMock.Calculations.Add(new PipingCalculation - { - Output = new TestPipingOutput() - }); - dataMock.Calculations.ElementAt(0).Attach(observer); - dataMock.Calculations.ElementAt(1).Attach(observer); - - var nodePresenter = new PipingFailureMechanismNodePresenter(); - var contextMenuAdapter = nodePresenter.GetContextMenu(null, dataMock); - + observerMock.Expect(o => o.UpdateObserver()); + contextMenuProvider.Expect(cmp => cmp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); mocks.ReplayAll(); - // When - contextMenuAdapter.Items[contextMenuClearIndex].PerformClick(); + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.Attach(observerMock); + failureMechanism.Calculations.Clear(); + failureMechanism.Calculations.Add(new PipingCalculationGroup()); + var nodePresenter = new PipingFailureMechanismNodePresenter + { + ContextMenuBuilderProvider = contextMenuProvider + }; - // Then - CollectionAssert.IsEmpty(dataMock.Calculations.Where(c => c.HasOutput)); + // Precondition + Assert.AreEqual(1, failureMechanism.Calculations.Count); + // Call + var contextMenu = nodePresenter.GetContextMenu(nodeMock, failureMechanism); + var addCalculationItem = contextMenu.Items[contextMenuAddFolderIndex]; + addCalculationItem.PerformClick(); + + // Assert + Assert.AreEqual(2, failureMechanism.Calculations.Count); + IPipingCalculationItem addedItem = failureMechanism.Calculations.ElementAt(1); + Assert.AreEqual("Nieuwe map (1)", addedItem.Name); + Assert.IsInstanceOf(addedItem); mocks.VerifyAll(); } }