Index: Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/CategoryTreeFolderNodePresenter.cs =================================================================== diff -u -r61161720b379645f400606e868e2a1286c17348d -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f --- Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/CategoryTreeFolderNodePresenter.cs (.../CategoryTreeFolderNodePresenter.cs) (revision 61161720b379645f400606e868e2a1286c17348d) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/NodePresenters/CategoryTreeFolderNodePresenter.cs (.../CategoryTreeFolderNodePresenter.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) @@ -1,9 +1,10 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Drawing; - +using System.Windows.Forms; using Core.Common.Controls; - +using Core.Common.Gui; using Ringtoets.Common.Forms.PresentationObjects; using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; @@ -15,6 +16,11 @@ /// public class CategoryTreeFolderNodePresenter : RingtoetsNodePresenterBase { + /// + /// Sets the to be used for creating the . + /// + public IContextMenuBuilderProvider ContextMenuBuilderProvider { private get; set; } + protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, CategoryTreeFolder nodeData) { node.Text = nodeData.Name; @@ -27,6 +33,15 @@ return nodeData.Contents; } + protected override ContextMenuStrip GetContextMenu(ITreeNode sender, CategoryTreeFolder nodeData) + { + return ContextMenuBuilderProvider + .Get(sender) + .AddExpandAllItem() + .AddCollapseAllItem() + .Build(); + } + private Image GetFolderIcon(TreeFolderCategory category) { switch (category) Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Ringtoets.Common.Forms.csproj =================================================================== diff -u -re6e92cb42b1e4983add2406300958b6b116ba781 -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f --- Ringtoets/Common/src/Ringtoets.Common.Forms/Ringtoets.Common.Forms.csproj (.../Ringtoets.Common.Forms.csproj) (revision e6e92cb42b1e4983add2406300958b6b116ba781) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Ringtoets.Common.Forms.csproj (.../Ringtoets.Common.Forms.csproj) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) @@ -73,6 +73,10 @@ {9a2d67e6-26ac-4d17-b11a-2b4372f2f572} Core.Common.Controls + + {30E4C2AE-719E-4D70-9FA9-668A9767FBFA} + Core.Common.Gui + {f49bd8b2-332a-4c91-a196-8cce0a2c7d98} Core.Common.Utils Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/NodePresenters/CategoryTreeFolderNodePresenterTest.cs =================================================================== diff -u -r61161720b379645f400606e868e2a1286c17348d -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/NodePresenters/CategoryTreeFolderNodePresenterTest.cs (.../CategoryTreeFolderNodePresenterTest.cs) (revision 61161720b379645f400606e868e2a1286c17348d) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/NodePresenters/CategoryTreeFolderNodePresenterTest.cs (.../CategoryTreeFolderNodePresenterTest.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) @@ -1,8 +1,11 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Drawing; using Core.Common.Controls; +using Core.Common.Gui; +using Core.Common.Gui.ContextMenu; using Core.Common.TestUtils; using NUnit.Framework; @@ -120,6 +123,43 @@ mocks.VerifyAll(); } + [Test] + public void GetContextMenu_ContextMenuBuilderProviderSet_HaveImportSurfaceLinesItemInContextMenu() + { + // Setup + var folder = new CategoryTreeFolder("", new object[0]); + var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); + var menuBuilderProviderMock = mocks.StrictMock(); + menuBuilderProviderMock.Expect(mbp => mbp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(null, nodeMock)); + + mocks.ReplayAll(); + + var nodePresenter = new CategoryTreeFolderNodePresenter + { + ContextMenuBuilderProvider = menuBuilderProviderMock + }; + + // Call + var returnedContextMenu = nodePresenter.GetContextMenu(nodeMock, folder); + + // Assert + Assert.AreEqual(2, returnedContextMenu.Items.Count); + var expandAllItem = returnedContextMenu.Items[0]; + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Expand_all, expandAllItem.Text); + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Expand_all_ToolTip, expandAllItem.ToolTipText); + TestHelper.AssertImagesAreEqual(Core.Common.Gui.Properties.Resources.ExpandAllIcon, expandAllItem.Image); + Assert.IsTrue(expandAllItem.Enabled); + + var collapseAllItem = returnedContextMenu.Items[1]; + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Collapse_all, collapseAllItem.Text); + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Collapse_all_ToolTip, collapseAllItem.ToolTipText); + TestHelper.AssertImagesAreEqual(Core.Common.Gui.Properties.Resources.CollapseAllIcon, collapseAllItem.Image); + Assert.IsTrue(collapseAllItem.Enabled); + + mocks.VerifyAll(); + } + private Image GetExpectedIconForCategory(TreeFolderCategory category) { switch (category) Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Ringtoets.Common.Forms.Test.csproj =================================================================== diff -u -r2f3973a8a6122be9d4c0a0db7a27dc3ca68580e3 -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Ringtoets.Common.Forms.Test.csproj (.../Ringtoets.Common.Forms.Test.csproj) (revision 2f3973a8a6122be9d4c0a0db7a27dc3ca68580e3) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Ringtoets.Common.Forms.Test.csproj (.../Ringtoets.Common.Forms.Test.csproj) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) @@ -65,6 +65,10 @@ {9a2d67e6-26ac-4d17-b11a-2b4372f2f572} Core.Common.Controls + + {30E4C2AE-719E-4D70-9FA9-668A9767FBFA} + Core.Common.Gui + {f49bd8b2-332a-4c91-a196-8cce0a2c7d98} Core.Common.Utils Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs =================================================================== diff -u -r97989f272e0b9aadccf3a444a90e61879616a0ab -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs (.../RingtoetsGuiPlugin.cs) (revision 97989f272e0b9aadccf3a444a90e61879616a0ab) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsGuiPlugin.cs (.../RingtoetsGuiPlugin.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) @@ -34,7 +34,10 @@ yield return new AssessmentSectionBaseNodePresenter(); yield return new FailureMechanismNodePresenter((IContextMenuBuilderProvider)Gui); yield return new PlaceholderWithReadonlyNameNodePresenter((IContextMenuBuilderProvider)Gui); - yield return new CategoryTreeFolderNodePresenter(); + yield return new CategoryTreeFolderNodePresenter + { + ContextMenuBuilderProvider = (IContextMenuBuilderProvider)Gui + }; } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSoilProfileCollectionNodePresenter.cs =================================================================== diff -u -r61161720b379645f400606e868e2a1286c17348d -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSoilProfileCollectionNodePresenter.cs (.../PipingSoilProfileCollectionNodePresenter.cs) (revision 61161720b379645f400606e868e2a1286c17348d) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSoilProfileCollectionNodePresenter.cs (.../PipingSoilProfileCollectionNodePresenter.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) @@ -5,7 +5,7 @@ using System.Linq; using System.Windows.Forms; using Core.Common.Controls; - +using Core.Common.Gui; using Ringtoets.Common.Forms.Extensions; using Ringtoets.Common.Forms.NodePresenters; using Ringtoets.Piping.Data; @@ -20,17 +20,16 @@ public class PipingSoilProfileCollectionNodePresenter : RingtoetsNodePresenterBase> { /// - /// Sets the action to be performed when importing instances - /// to . + /// Sets the to be used for creating the . /// - public Action ImportSoilProfilesAction { private get; set; } + public IContextMenuBuilderProvider ContextMenuBuilderProvider { private get; set; } protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, IEnumerable pipingSoilProfiles) { node.Text = Resources.PipingSoilProfilesCollection_DisplayName; node.Image = Resources.FolderIcon; - node.ForegroundColor = GetTextColor(pipingSoilProfiles); + node.ForegroundColor = Color.FromKnownColor(pipingSoilProfiles.Any() ? KnownColor.ControlText : KnownColor.GrayText); } protected override IEnumerable GetChildNodeObjects(IEnumerable pipingSoilProfiles) @@ -43,36 +42,18 @@ protected override ContextMenuStrip GetContextMenu(ITreeNode sender, IEnumerable nodeData) { - if (ImportSoilProfilesAction != null) + if (ContextMenuBuilderProvider == null) { - return CreateContextMenu(); + return null; } - return null; + return ContextMenuBuilderProvider + .Get(sender) + .AddExpandAllItem() + .AddCollapseAllItem() + .AddSeparator() + .AddImportItem() + .AddExportItem() + .Build(); } - - private static Color GetTextColor(object nodeData) - { - var pipingSoilProfiles = (IEnumerable) nodeData; - return Color.FromKnownColor(pipingSoilProfiles.Any() ? KnownColor.ControlText : KnownColor.GrayText); - } - - private ContextMenuStrip CreateContextMenu() - { - var strip = new ContextMenuStrip(); - if (ImportSoilProfilesAction != null) - { - strip.AddMenuItem( - Resources.Import_SoilProfiles, - Resources.Import_SoilProfiles_Tooltip, - Resources.ImportIcon, - ImportSoilProfilesOnClick); - } - return strip; - } - - private void ImportSoilProfilesOnClick(object sender, EventArgs e) - { - ImportSoilProfilesAction(); - } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSurfaceLineCollectionNodePresenter.cs =================================================================== diff -u -r5bdfe106fefb36f7e677da7e75afec1eba7eedd3 -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSurfaceLineCollectionNodePresenter.cs (.../PipingSurfaceLineCollectionNodePresenter.cs) (revision 5bdfe106fefb36f7e677da7e75afec1eba7eedd3) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingSurfaceLineCollectionNodePresenter.cs (.../PipingSurfaceLineCollectionNodePresenter.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) @@ -18,6 +18,9 @@ /// public class PipingSurfaceLineCollectionNodePresenter : RingtoetsNodePresenterBase> { + /// + /// Sets the to be used for creating the . + /// public IContextMenuBuilderProvider ContextMenuBuilderProvider { private get; set; } protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, IEnumerable nodeData) Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs =================================================================== diff -u -r5bdfe106fefb36f7e677da7e75afec1eba7eedd3 -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision 5bdfe106fefb36f7e677da7e75afec1eba7eedd3) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) @@ -51,7 +51,7 @@ yield return new PipingSurfaceLineNodePresenter(); yield return new PipingSoilProfileCollectionNodePresenter { - ImportSoilProfilesAction = Gui.CommandHandler.ImportToGuiSelection + ContextMenuBuilderProvider = Gui.ContextMenuProvider }; yield return new PipingSoilProfileNodePresenter(); yield return new PipingOutputNodePresenter(); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingSoilProfileCollectionNodePresenterTest.cs =================================================================== diff -u -r61161720b379645f400606e868e2a1286c17348d -rf9a6da5a0a62e484e46775cc57ee6f8fe412694f --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingSoilProfileCollectionNodePresenterTest.cs (.../PipingSoilProfileCollectionNodePresenterTest.cs) (revision 61161720b379645f400606e868e2a1286c17348d) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingSoilProfileCollectionNodePresenterTest.cs (.../PipingSoilProfileCollectionNodePresenterTest.cs) (revision f9a6da5a0a62e484e46775cc57ee6f8fe412694f) @@ -1,7 +1,9 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Drawing; +using System.Windows.Forms; using Core.Common.Controls; +using Core.Common.Gui; +using Core.Common.Gui.ContextMenu; using Core.Common.TestUtils; using NUnit.Framework; @@ -117,31 +119,80 @@ } [Test] - public void GetContextMenu_SurfaceLinesImportActionSet_HaveImportSurfaceLinesItemInContextMenu() + public void GetContextMenu_NoContextMenuBuilderProviderSet_ReturnsNull() { // Setup var mocks = new MockRepository(); var nodeMock = mocks.StrictMock(); var dataMock = mocks.StrictMock>(); - var actionStub = mocks.Stub(); mocks.ReplayAll(); + var nodePresenter = new PipingSoilProfileCollectionNodePresenter(); + + // Call + var returnedContextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock); + + // Assert + Assert.IsNull(returnedContextMenu); + + mocks.VerifyAll(); // Expect no calls on arguments + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void GetContextMenu_ContextMenuBuilderProviderSet_HaveImportSurfaceLinesItemInContextMenu(bool importExportEnabled) + { + // Setup + var mocks = new MockRepository(); + var nodeMock = mocks.StrictMock(); + var dataMock = mocks.StrictMock>(); + var menuBuilderProviderMock = mocks.StrictMock(); + var commandHandlerMock = mocks.StrictMock(); + menuBuilderProviderMock.Expect(mbp => mbp.Get(null)).IgnoreArguments().Return(new ContextMenuBuilder(commandHandlerMock, nodeMock)); + + commandHandlerMock.Expect(ch => ch.CanExportFromGuiSelection()).Return(importExportEnabled); + commandHandlerMock.Expect(ch => ch.CanImportToGuiSelection()).Return(importExportEnabled); + + mocks.ReplayAll(); + var nodePresenter = new PipingSoilProfileCollectionNodePresenter { - ImportSoilProfilesAction = actionStub + ContextMenuBuilderProvider = menuBuilderProviderMock }; // Call var returnedContextMenu = nodePresenter.GetContextMenu(nodeMock, dataMock); // Assert - Assert.AreEqual(1, returnedContextMenu.Items.Count); - var importItem = returnedContextMenu.Items[0]; - Assert.AreEqual("Importeer ondergrondschematiseringen", importItem.Text); - Assert.AreEqual("Importeer nieuwe ondergrondschematiseringen van een *.soil bestand.", importItem.ToolTipText); - Assert.AreEqual(16, importItem.Image.Width); - Assert.AreEqual(16, importItem.Image.Height); - mocks.VerifyAll(); // Expect no calls on arguments + Assert.AreEqual(5, returnedContextMenu.Items.Count); + var expandAllItem = returnedContextMenu.Items[0]; + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Expand_all, expandAllItem.Text); + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Expand_all_ToolTip, expandAllItem.ToolTipText); + TestHelper.AssertImagesAreEqual(Core.Common.Gui.Properties.Resources.ExpandAllIcon, expandAllItem.Image); + Assert.IsTrue(expandAllItem.Enabled); + + var collapseAllItem = returnedContextMenu.Items[1]; + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Collapse_all, collapseAllItem.Text); + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Collapse_all_ToolTip, collapseAllItem.ToolTipText); + TestHelper.AssertImagesAreEqual(Core.Common.Gui.Properties.Resources.CollapseAllIcon, collapseAllItem.Image); + Assert.IsTrue(collapseAllItem.Enabled); + + var importItem = returnedContextMenu.Items[3]; + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Import, importItem.Text); + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Import_ToolTip, importItem.ToolTipText); + TestHelper.AssertImagesAreEqual(Core.Common.Gui.Properties.Resources.ImportIcon, importItem.Image); + Assert.AreEqual(importExportEnabled, importItem.Enabled); + + var exportItem = returnedContextMenu.Items[4]; + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Export, exportItem.Text); + Assert.AreEqual(Core.Common.Gui.Properties.Resources.Export_ToolTip, exportItem.ToolTipText); + TestHelper.AssertImagesAreEqual(Core.Common.Gui.Properties.Resources.ExportIcon, exportItem.Image); + Assert.AreEqual(importExportEnabled, exportItem.Enabled); + + Assert.IsInstanceOf(returnedContextMenu.Items[2]); + + mocks.VerifyAll(); } } } \ No newline at end of file