Index: Ringtoets/Common/src/Ringtoets.Common.Data/Commentable.cs =================================================================== diff -u --- Ringtoets/Common/src/Ringtoets.Common.Data/Commentable.cs (revision 0) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Commentable.cs (revision 306b732e03a09bf7dcd66e37dc1db8fa281b1480) @@ -0,0 +1,31 @@ +// Copyright (C) Stichting Deltares 2016. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +namespace Ringtoets.Common.Data +{ + /// + /// This class represents a simple property. + /// + public class Commentable : ICommentable + { + public string Comments { get; set; } + } +} \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismBase.cs =================================================================== diff -u -re1e06d9c01df6f4855fef96316760e7e82d62e70 -r306b732e03a09bf7dcd66e37dc1db8fa281b1480 --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismBase.cs (.../FailureMechanismBase.cs) (revision e1e06d9c01df6f4855fef96316760e7e82d62e70) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismBase.cs (.../FailureMechanismBase.cs) (revision 306b732e03a09bf7dcd66e37dc1db8fa281b1480) @@ -57,6 +57,9 @@ Code = failureMechanismCode; sections = new List(); IsRelevant = true; + InputComments = new Commentable(); + OutputComments = new Commentable(); + NotRelevantComments = new Commentable(); } public double Contribution @@ -91,8 +94,12 @@ public string Comments { get; set; } - public string OutputComments { get; set; } + public Commentable InputComments { get; private set; } + public Commentable OutputComments { get; private set; } + + public Commentable NotRelevantComments { get; private set; } + public bool IsRelevant { get; set; } public virtual void AddSection(FailureMechanismSection section) Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/IFailureMechanism.cs =================================================================== diff -u -re1e06d9c01df6f4855fef96316760e7e82d62e70 -r306b732e03a09bf7dcd66e37dc1db8fa281b1480 --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/IFailureMechanism.cs (.../IFailureMechanism.cs) (revision e1e06d9c01df6f4855fef96316760e7e82d62e70) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/IFailureMechanism.cs (.../IFailureMechanism.cs) (revision 306b732e03a09bf7dcd66e37dc1db8fa281b1480) @@ -49,11 +49,21 @@ string Code { get; } /// - /// Gets or sets the comments associated with the output of the data object. + /// Gets the comments associated with the input of the data object. /// - string OutputComments { get; set; } + Commentable InputComments { get; } + + /// + /// Gets the comments associated with the output of the data object. + /// + Commentable OutputComments { get; } /// + /// Gets the comments associated when the failure mechanism is set to be not relevant. + /// + Commentable NotRelevantComments { get; } + + /// /// Gets or sets a value indicating whether this failure mechanism is relevant. /// bool IsRelevant { get; set; } Index: Ringtoets/Common/src/Ringtoets.Common.Data/Ringtoets.Common.Data.csproj =================================================================== diff -u -re38a7c2baca2872af6319d535c6468133ea31fbc -r306b732e03a09bf7dcd66e37dc1db8fa281b1480 --- Ringtoets/Common/src/Ringtoets.Common.Data/Ringtoets.Common.Data.csproj (.../Ringtoets.Common.Data.csproj) (revision e38a7c2baca2872af6319d535c6468133ea31fbc) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Ringtoets.Common.Data.csproj (.../Ringtoets.Common.Data.csproj) (revision 306b732e03a09bf7dcd66e37dc1db8fa281b1480) @@ -42,6 +42,7 @@ + Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Views/CommentView.cs =================================================================== diff -u -rda4ca78323eaccee879c224875a506aa3b9fdf54 -r306b732e03a09bf7dcd66e37dc1db8fa281b1480 --- Ringtoets/Common/src/Ringtoets.Common.Forms/Views/CommentView.cs (.../CommentView.cs) (revision da4ca78323eaccee879c224875a506aa3b9fdf54) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Views/CommentView.cs (.../CommentView.cs) (revision 306b732e03a09bf7dcd66e37dc1db8fa281b1480) @@ -27,7 +27,7 @@ namespace Ringtoets.Common.Forms.Views { /// - /// This class represents a simple view with a rich text editor, to which data can be added. + /// This class represents a simple view with a rich text editor, to which data can be added. /// public partial class CommentView : UserControl, IView { Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismBaseTest.cs =================================================================== diff -u -re1e06d9c01df6f4855fef96316760e7e82d62e70 -r306b732e03a09bf7dcd66e37dc1db8fa281b1480 --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismBaseTest.cs (.../FailureMechanismBaseTest.cs) (revision e1e06d9c01df6f4855fef96316760e7e82d62e70) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismBaseTest.cs (.../FailureMechanismBaseTest.cs) (revision 306b732e03a09bf7dcd66e37dc1db8fa281b1480) @@ -78,7 +78,9 @@ Assert.AreEqual(name, failureMechanism.Name); Assert.AreEqual(code, failureMechanism.Code); Assert.IsNull(failureMechanism.Comments); - Assert.IsNull(failureMechanism.OutputComments); + Assert.IsNotNull(failureMechanism.InputComments); + Assert.IsNotNull(failureMechanism.OutputComments); + Assert.IsNotNull(failureMechanism.NotRelevantComments); Assert.IsTrue(failureMechanism.IsRelevant); CollectionAssert.IsEmpty(failureMechanism.Sections); } Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs =================================================================== diff -u -r52cdf6d3134a95bad594aa61c9ef062a97b1a2ab -r306b732e03a09bf7dcd66e37dc1db8fa281b1480 --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs (.../RingtoetsPlugin.cs) (revision 52cdf6d3134a95bad594aa61c9ef062a97b1a2ab) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/RingtoetsPlugin.cs (.../RingtoetsPlugin.cs) (revision 306b732e03a09bf7dcd66e37dc1db8fa281b1480) @@ -1027,6 +1027,9 @@ private static IEnumerable GetCommentableElements(IFailureMechanism failureMechanism) { yield return failureMechanism; + yield return failureMechanism.InputComments; + yield return failureMechanism.OutputComments; + yield return failureMechanism.NotRelevantComments; foreach (ICalculation commentableCalculation in failureMechanism.Calculations) { yield return commentableCalculation; @@ -1113,7 +1116,7 @@ { return new object[] { - new CommentContext(nodeData.WrappedData) + new CommentContext(nodeData.WrappedData.NotRelevantComments) }; } @@ -1122,7 +1125,7 @@ return new ArrayList { new FailureMechanismSectionsContext(nodeData, assessmentSection), - new CommentContext(nodeData) + new CommentContext(nodeData.InputComments) }; } @@ -1143,7 +1146,7 @@ var macrostabilityOutwards = nodeData as IHasSectionResults; var stabilityPointConstruction = nodeData as IHasSectionResults; - var failureMechanismSectionResultContexts = new object[1]; + var failureMechanismSectionResultContexts = new object[2]; if (duneErosion != null) { failureMechanismSectionResultContexts[0] = @@ -1214,6 +1217,7 @@ failureMechanismSectionResultContexts[0] = new FailureMechanismSectionResultContext(stabilityPointConstruction.SectionResults, nodeData); } + failureMechanismSectionResultContexts[1] = new CommentContext(nodeData.OutputComments); return failureMechanismSectionResultContexts; } @@ -1241,7 +1245,7 @@ { var builder = new RingtoetsContextMenuBuilder(Gui.Get(nodeData, treeViewControl)); - return builder.AddToggleRelevancyOfFailureMechanismItem(nodeData, null) + return builder.AddToggleRelevancyOfFailureMechanismItem(nodeData, RemoveAllViewsForItem) .AddSeparator() .AddExpandAllItem() .AddCollapseAllItem() Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/TreeNodeInfos/FailureMechanismContextTreeNodeInfoTest.cs =================================================================== diff -u -r267dd861d69e6952235fb997a426aec5efdbf432 -r306b732e03a09bf7dcd66e37dc1db8fa281b1480 --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/TreeNodeInfos/FailureMechanismContextTreeNodeInfoTest.cs (.../FailureMechanismContextTreeNodeInfoTest.cs) (revision 267dd861d69e6952235fb997a426aec5efdbf432) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/TreeNodeInfos/FailureMechanismContextTreeNodeInfoTest.cs (.../FailureMechanismContextTreeNodeInfoTest.cs) (revision 306b732e03a09bf7dcd66e37dc1db8fa281b1480) @@ -183,13 +183,17 @@ Assert.AreSame(failureMechanism, failureMechanismSectionsContext.WrappedData); Assert.AreSame(assessmentSection, failureMechanismSectionsContext.ParentAssessmentSection); - var commentContext = (CommentContext) inputFolder.Contents[1]; - Assert.IsNotNull(commentContext); - Assert.AreSame(failureMechanism, commentContext.WrappedData); + var inputCommentContext = (CommentContext) inputFolder.Contents[1]; + Assert.IsNotNull(inputCommentContext); + Assert.AreSame(failureMechanism.InputComments, inputCommentContext.WrappedData); var outputFolder = (CategoryTreeFolder) children[1]; Assert.AreEqual("Oordeel", outputFolder.Name); Assert.AreEqual(TreeFolderCategory.Output, outputFolder.Category); + + var outputCommentContext = (CommentContext) outputFolder.Contents[0]; + Assert.IsNotNull(outputCommentContext); + Assert.AreSame(failureMechanism.OutputComments, outputCommentContext.WrappedData); } mocks.VerifyAll(); } @@ -256,7 +260,7 @@ // Assert Assert.AreEqual(1, children.Length); var commentContext = (CommentContext) children[0]; - Assert.AreSame(failureMechanism, commentContext.WrappedData); + Assert.AreSame(failureMechanism.NotRelevantComments, commentContext.WrappedData); } mocks.VerifyAll(); } @@ -452,9 +456,13 @@ var assessmentSection = mocks.Stub(); var failureMechanismContext = new FailureMechanismContext(failureMechanism, assessmentSection); + var viewCommands = mocks.StrictMock(); + viewCommands.Expect(vs => vs.RemoveAllViewsForItem(failureMechanismContext)); + 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(); @@ -498,6 +506,8 @@ var failureMechanism = mocks.StrictMultiMock>(typeof(IFailureMechanism)); failureMechanism.Expect(fm => ((IFailureMechanism) fm).IsRelevant).Return(true); failureMechanism.Expect(fm => fm.SectionResults).Return(new List()).Repeat.Any(); + failureMechanism.Expect(fm => ((IFailureMechanism) fm).InputComments).Return(new Commentable()); + failureMechanism.Expect(fm => ((IFailureMechanism) fm).OutputComments).Return(new Commentable()); var failureMechanismContext = mocks.Stub>(failureMechanism, assessmentSection); mocks.ReplayAll(); Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/CommentViewInfoTest.cs =================================================================== diff -u -rf64dceaa32788bad28dcf09f4a1c3150595f1327 -r306b732e03a09bf7dcd66e37dc1db8fa281b1480 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/CommentViewInfoTest.cs (.../CommentViewInfoTest.cs) (revision f64dceaa32788bad28dcf09f4a1c3150595f1327) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/CommentViewInfoTest.cs (.../CommentViewInfoTest.cs) (revision 306b732e03a09bf7dcd66e37dc1db8fa281b1480) @@ -179,7 +179,7 @@ } [Test] - public void CloseForData_ViewDataIsOtherInstanceThenDeletedAssessmentSection_ReturnFalse() + public void CloseForData_ViewDataIsOtherInstanceThanDeletedAssessmentSection_ReturnFalse() { // Setup var deletedAssessmentSection = mocks.Stub(); @@ -240,6 +240,9 @@ var deletedFailureMechanism = mocks.Stub(); deletedFailureMechanism.Stub(fm => fm.Calculations).Return(Enumerable.Empty()); + deletedFailureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + deletedFailureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + deletedFailureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); var deletedAssessmentSection = mocks.Stub(); deletedAssessmentSection.Stub(s => s.GetFailureMechanisms()).Return(new[] @@ -273,6 +276,9 @@ { calculation }); + failureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); var assessmentSection = mocks.Stub(); assessmentSection.Stub(s => s.GetFailureMechanisms()).Return(new[] @@ -308,6 +314,9 @@ { deletedCalculation }); + deletedfailureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + deletedfailureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + deletedfailureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); var deletedAssessmentSection = mocks.Stub(); deletedAssessmentSection.Stub(s => s.GetFailureMechanisms()).Return(new[] @@ -331,6 +340,142 @@ } [Test] + public void CloseForData_ViewDataIsInputCommentableOfDeletedAssessmentSection_ReturnTrue() + { + // Setup + var commentable = new Commentable(); + + var failureMechanism = mocks.Stub(); + failureMechanism.Stub(fm => fm.Calculations).Return(Enumerable.Empty()); + failureMechanism.Stub(fm => fm.InputComments).Return(commentable); + failureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); + + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(s => s.GetFailureMechanisms()).Return(new[] + { + failureMechanism + }); + + mocks.ReplayAll(); + + using (var view = new CommentView + { + Data = commentable + }) + { + // Call + var closeForData = info.CloseForData(view, assessmentSection); + + // Assert + Assert.IsTrue(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewDataIsCommentableButNotOfDeletedAssessmentSection_ReturnFalse() + { + // Setup + var viewDataCommentable = new Commentable(); + + var failureMechanism = mocks.Stub(); + failureMechanism.Stub(fm => fm.Calculations).Return(Enumerable.Empty()); + failureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); + + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(s => s.GetFailureMechanisms()).Return(new[] + { + failureMechanism + }); + + mocks.ReplayAll(); + + using (var view = new CommentView + { + Data = viewDataCommentable + }) + { + // Call + var closeForData = info.CloseForData(view, assessmentSection); + + // Assert + Assert.IsFalse(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewDataIsOutputCommentableOfDeletedAssessmentSection_ReturnTrue() + { + // Setup + var commentable = new Commentable(); + + var failureMechanism = mocks.Stub(); + failureMechanism.Stub(fm => fm.Calculations).Return(Enumerable.Empty()); + failureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.OutputComments).Return(commentable); + failureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); + + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(s => s.GetFailureMechanisms()).Return(new[] + { + failureMechanism + }); + + mocks.ReplayAll(); + + using (var view = new CommentView + { + Data = commentable + }) + { + // Call + var closeForData = info.CloseForData(view, assessmentSection); + + // Assert + Assert.IsTrue(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewDataIsNotRelevantCommentableOfDeletedAssessmentSection_ReturnTrue() + { + // Setup + var commentable = new Commentable(); + + var failureMechanism = mocks.Stub(); + failureMechanism.Stub(fm => fm.Calculations).Return(Enumerable.Empty()); + failureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.NotRelevantComments).Return(commentable); + + var assessmentSection = mocks.Stub(); + assessmentSection.Stub(s => s.GetFailureMechanisms()).Return(new[] + { + failureMechanism + }); + + mocks.ReplayAll(); + + using (var view = new CommentView + { + Data = commentable + }) + { + // Call + var closeForData = info.CloseForData(view, assessmentSection); + + // Assert + Assert.IsTrue(closeForData); + } + mocks.VerifyAll(); + } + + [Test] public void CloseForData_ViewDataIsCalculationOfDeletedFailureMechanismContext_ReturnTrue() { // Setup @@ -343,6 +488,9 @@ { calculation }); + failureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); mocks.ReplayAll(); @@ -375,6 +523,9 @@ { deletedCalculation }); + deletedfailureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + deletedfailureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + deletedfailureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); mocks.ReplayAll(); @@ -403,6 +554,9 @@ { calculation }); + failureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); mocks.ReplayAll(); @@ -433,6 +587,9 @@ { deletedCalculation }); + failureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); mocks.ReplayAll(); @@ -451,6 +608,34 @@ } [Test] + public void CloseForData_ViewDataIsCommentableButNotOfDeletedFailureMechanism_ReturnFalse() + { + // Setup + var viewDataCommentable = new Commentable(); + + var failureMechanism = mocks.Stub(); + failureMechanism.Stub(fm => fm.Calculations).Return(Enumerable.Empty()); + failureMechanism.Stub(fm => fm.InputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.OutputComments).Return(new Commentable()); + failureMechanism.Stub(fm => fm.NotRelevantComments).Return(new Commentable()); + + mocks.ReplayAll(); + + using (var view = new CommentView + { + Data = viewDataCommentable + }) + { + // Call + var closeForData = info.CloseForData(view, failureMechanism); + + // Assert + Assert.IsFalse(closeForData); + } + mocks.VerifyAll(); + } + + [Test] public void CloseForData_ViewCorrespondingToRemovedCalculationItem_ReturnsTrue() { // Setup