Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.Designer.cs =================================================================== diff -u -reaba38093f5f76350766303e83e497fd4af07227 -rb57739d9a5fbeef38a55020b0839d444d39cdbf7 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.Designer.cs (.../FailureMechanismContributionView.Designer.cs) (revision eaba38093f5f76350766303e83e497fd4af07227) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.Designer.cs (.../FailureMechanismContributionView.Designer.cs) (revision b57739d9a5fbeef38a55020b0839d444d39cdbf7) @@ -29,6 +29,8 @@ this.normInput = new System.Windows.Forms.NumericUpDown(); this.perYearLabel = new System.Windows.Forms.Label(); this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.label1 = new System.Windows.Forms.Label(); + this.assessmentSectionCompositionComboBox = new System.Windows.Forms.ComboBox(); ((System.ComponentModel.ISupportInitialize)(this.probabilityDistributionGrid)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.normInput)).BeginInit(); this.tableLayoutPanel.SuspendLayout(); @@ -43,9 +45,9 @@ // this.probabilityDistributionGrid.AllowUserToResizeColumns = false; this.probabilityDistributionGrid.AllowUserToResizeRows = false; - resources.ApplyResources(this.probabilityDistributionGrid, "probabilityDistributionGrid"); this.probabilityDistributionGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.tableLayoutPanel.SetColumnSpan(this.probabilityDistributionGrid, 3); + resources.ApplyResources(this.probabilityDistributionGrid, "probabilityDistributionGrid"); this.probabilityDistributionGrid.Name = "probabilityDistributionGrid"; this.probabilityDistributionGrid.ReadOnly = true; this.probabilityDistributionGrid.RowHeadersVisible = false; @@ -79,13 +81,26 @@ // // tableLayoutPanel // - this.tableLayoutPanel.Controls.Add(this.probabilityDistributionGrid, 0, 1); - this.tableLayoutPanel.Controls.Add(this.normInput, 1, 0); - this.tableLayoutPanel.Controls.Add(this.normLabel, 0, 0); - this.tableLayoutPanel.Controls.Add(this.perYearLabel, 2, 0); + this.tableLayoutPanel.Controls.Add(this.label1, 0, 0); + this.tableLayoutPanel.Controls.Add(this.normInput, 1, 1); + this.tableLayoutPanel.Controls.Add(this.normLabel, 0, 1); + this.tableLayoutPanel.Controls.Add(this.perYearLabel, 2, 1); + this.tableLayoutPanel.Controls.Add(this.probabilityDistributionGrid, 0, 2); + this.tableLayoutPanel.Controls.Add(this.assessmentSectionCompositionComboBox, 1, 0); resources.ApplyResources(this.tableLayoutPanel, "tableLayoutPanel"); this.tableLayoutPanel.Name = "tableLayoutPanel"; // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // assessmentSectionCompositionComboBox + // + resources.ApplyResources(this.assessmentSectionCompositionComboBox, "assessmentSectionCompositionComboBox"); + this.assessmentSectionCompositionComboBox.FormattingEnabled = true; + this.assessmentSectionCompositionComboBox.Name = "assessmentSectionCompositionComboBox"; + // // FailureMechanismContributionView // this.Controls.Add(this.tableLayoutPanel); @@ -94,11 +109,15 @@ ((System.ComponentModel.ISupportInitialize)(this.probabilityDistributionGrid)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.normInput)).EndInit(); this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); this.ResumeLayout(false); } #endregion + private Label label1; + private ComboBox assessmentSectionCompositionComboBox; + } } Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.cs =================================================================== diff -u -rc8eb333514adae8495778ed16c71c41a6eb4251b -rb57739d9a5fbeef38a55020b0839d444d39cdbf7 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.cs (.../FailureMechanismContributionView.cs) (revision c8eb333514adae8495778ed16c71c41a6eb4251b) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.cs (.../FailureMechanismContributionView.cs) (revision b57739d9a5fbeef38a55020b0839d444d39cdbf7) @@ -27,6 +27,7 @@ using Core.Common.Controls.Views; using Core.Common.Utils.Reflection; +using Ringtoets.Common.Data; using Ringtoets.Common.Data.Contribution; using Ringtoets.Common.Forms.PresentationObjects; @@ -52,6 +53,7 @@ { InitializeComponent(); InitializeGridColumns(); + InitializeAssessmentSectionCompositionComboBox(); BindNormChange(); BindNormInputLeave(); SubscribeEvents(); @@ -89,6 +91,18 @@ base.Dispose(disposing); } + private void InitializeAssessmentSectionCompositionComboBox() + { + assessmentSectionCompositionComboBox.DataSource = new[] + { + Tuple.Create(AssessmentSectionComposition.Dike, "Dijk"), + Tuple.Create(AssessmentSectionComposition.Dune, "Duin"), + Tuple.Create(AssessmentSectionComposition.DikeAndDune, "Dijk / Duin") + }; + assessmentSectionCompositionComboBox.ValueMember = TypeUtils.GetMemberName>(t => t.Item1); + assessmentSectionCompositionComboBox.DisplayMember = TypeUtils.GetMemberName>(t => t.Item2); + } + private void SubscribeEvents() { probabilityDistributionGrid.CellFormatting += ProbabilityDistributionGridOnCellFormatting; @@ -114,23 +128,27 @@ private void HandleNewDataSet(FailureMechanismContributionContext value) { + UnbindAssessmentSectionCompositionChange(); UnbindNormChange(); DetachFromData(); data = value; SetGridDataSource(); SetNormText(); + SetAssessmentSectionComposition(); AttachToData(); BindNormChange(); + BindAssessmentSectionCompositionChange(); } private void SetGridDataSource() { if (data != null) { probabilityDistributionGrid.DataSource = data.WrappedData.Distribution; + probabilityDistributionGrid.Invalidate(); } } @@ -150,6 +168,16 @@ } } + private void BindAssessmentSectionCompositionChange() + { + assessmentSectionCompositionComboBox.SelectedIndexChanged += AssessmentSectionCompositionComboBoxSelectedIndexChanged; + } + + private void UnbindAssessmentSectionCompositionChange() + { + assessmentSectionCompositionComboBox.SelectedIndexChanged -= AssessmentSectionCompositionComboBoxSelectedIndexChanged; + } + private void BindNormChange() { normInput.ValueChanged += NormValueChanged; @@ -194,6 +222,14 @@ } } + private void SetAssessmentSectionComposition() + { + if (data != null) + { + assessmentSectionCompositionComboBox.SelectedValue = data.Parent.Composition; + } + } + private void InitializeGridColumns() { var assessmentName = TypeUtils.GetMemberName(fmci => fmci.Assessment); @@ -228,5 +264,14 @@ probabilityDistributionGrid.AutoGenerateColumns = false; probabilityDistributionGrid.Columns.AddRange(assessmentColumn, probabilityColumn, probabilityPerYearColumn); } + + private void AssessmentSectionCompositionComboBoxSelectedIndexChanged(object sender, EventArgs e) + { + IAssessmentSection assessmentSection = data.Parent; + + assessmentSection.ChangeComposition((AssessmentSectionComposition)assessmentSectionCompositionComboBox.SelectedValue); + SetGridDataSource(); + assessmentSection.NotifyObservers(); + } } } \ No newline at end of file Index: Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.resx =================================================================== diff -u -ra9a8404155745054ae98ccfeec456b820b05b2bf -rb57739d9a5fbeef38a55020b0839d444d39cdbf7 --- Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.resx (.../FailureMechanismContributionView.resx) (revision a9a8404155745054ae98ccfeec456b820b05b2bf) +++ Ringtoets/Integration/src/Ringtoets.Integration.Forms/Views/FailureMechanismContributionView.resx (.../FailureMechanismContributionView.resx) (revision b57739d9a5fbeef38a55020b0839d444d39cdbf7) @@ -118,19 +118,19 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Top, Bottom, Right + + Fill - 3, 0 + 3, 26 - 59, 26 + 66, 26 - 4 + 3 Norm: 1/ @@ -150,20 +150,50 @@ 2 - - Top, Bottom, Left, Right + + True + + Fill + + + 3, 0 + + + 66, 26 + + + 1 + + + Traject type: + + + MiddleRight + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel + + + 0 + Top, Left, Right - 68, 3 + 75, 29 - 74, 20 + 121, 20 - 0 + 4 normInput @@ -184,13 +214,13 @@ NoControl - 148, 0 + 202, 26 50, 26 - 1 + 5 per jaar @@ -210,14 +240,41 @@ 3 + + Fill + + + 75, 3 + + + 121, 21 + + + 2 + + + assessmentSectionCompositionComboBox + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel + + + 5 + Fill 0, 0 + + 2 + - 201, 144 + 272, 190 0 @@ -235,16 +292,19 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="probabilityDistributionGrid" Row="1" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="normInput" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="normLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="perYearLabel" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /></Controls><Columns Styles="Absolute,65,Absolute,80,AutoSize,0" /><Rows Styles="Absolute,26,AutoSize,0" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="label1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="normInput" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="normLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="perYearLabel" Row="1" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="probabilityDistributionGrid" Row="2" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="assessmentSectionCompositionComboBox" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,AutoSize,0,AutoSize,0" /><Rows Styles="Absolute,26,Absolute,26,AutoSize,0" /></TableLayoutSettings> + + Fill + - 3, 29 + 3, 55 - 195, 112 + 266, 132 - 1 + 6 probabilityDistributionGrid @@ -256,13 +316,13 @@ tableLayoutPanel - 0 + 4 True - 201, 144 + 272, 190 FailureMechanismContributionView Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/FailureMechanismContributionViewTest.cs =================================================================== diff -u -rc8eb333514adae8495778ed16c71c41a6eb4251b -rb57739d9a5fbeef38a55020b0839d444d39cdbf7 --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/FailureMechanismContributionViewTest.cs (.../FailureMechanismContributionViewTest.cs) (revision c8eb333514adae8495778ed16c71c41a6eb4251b) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Views/FailureMechanismContributionViewTest.cs (.../FailureMechanismContributionViewTest.cs) (revision b57739d9a5fbeef38a55020b0839d444d39cdbf7) @@ -7,6 +7,7 @@ using Ringtoets.Common.Data; using Ringtoets.Common.Data.Contribution; using Ringtoets.Common.Forms.PresentationObjects; +using Ringtoets.Integration.Data; using Ringtoets.Integration.Forms.Views; namespace Ringtoets.Integration.Forms.Test.Views @@ -16,6 +17,7 @@ { private const string normInputTextBoxName = "normInput"; private const string dataGridViewControlName = "probabilityDistributionGrid"; + private const string assessmentSectionCompositionComboBoxName = "assessmentSectionCompositionComboBox"; private Form testForm; @@ -279,6 +281,113 @@ } } + [Test] + [TestCase(AssessmentSectionComposition.Dike, "Dijk")] + [TestCase(AssessmentSectionComposition.Dune, "Duin")] + [TestCase(AssessmentSectionComposition.DikeAndDune, "Dijk / Duin")] + public void CompositionComboBox_WithDataSet_SelectedDisplayTextAndValueCorrect(AssessmentSectionComposition composition, string expectedDisplayText) + { + // Setup + using (var view = new FailureMechanismContributionView()) + { + var assessmentSection = new AssessmentSection(); + assessmentSection.ChangeComposition(composition); + + var context = new FailureMechanismContributionContext(assessmentSection.FailureMechanismContribution, assessmentSection); + + view.Data = context; + ShowFormWithView(view); + + // Call + var compositionComboBox = (ComboBox)new ControlTester(assessmentSectionCompositionComboBoxName).TheObject; + + // Assert + Assert.AreEqual(expectedDisplayText, compositionComboBox.SelectedText); + Assert.AreEqual(composition, compositionComboBox.SelectedValue); + } + } + + [Test] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.Dune)] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dune)] + public void CompositionComboBox_ChangeComposition_UpdateAssessmentSectionContributionAndView(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) + { + // Setup + using (var view = new FailureMechanismContributionView()) + { + var assessmentSection = new AssessmentSection(); + assessmentSection.ChangeComposition(initialComposition); + + var context = new FailureMechanismContributionContext(assessmentSection.FailureMechanismContribution, assessmentSection); + + view.Data = context; + ShowFormWithView(view); + + // Precondition + Assert.AreNotEqual(assessmentSection.Composition, newComposition); + + var compositionComboBox = (ComboBox)new ControlTester(assessmentSectionCompositionComboBoxName).TheObject; + + int dataGridInvalidatedCallCount = 0; + var contributionGridView = (DataGridView)new ControlTester(dataGridViewControlName).TheObject; + contributionGridView.Invalidated += (sender, args) => dataGridInvalidatedCallCount++; + + // Call + compositionComboBox.SelectedValue = newComposition; + + // Assert + Assert.AreEqual(newComposition, compositionComboBox.SelectedValue); + Assert.AreEqual(newComposition, assessmentSection.Composition); + + Assert.AreEqual(1, dataGridInvalidatedCallCount); + Assert.AreEqual(assessmentSection.FailureMechanismContribution.Distribution, contributionGridView.DataSource); + } + } + + [Test] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.Dune)] + [TestCase(AssessmentSectionComposition.Dike, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.Dune, AssessmentSectionComposition.DikeAndDune)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dike)] + [TestCase(AssessmentSectionComposition.DikeAndDune, AssessmentSectionComposition.Dune)] + public void CompositionComboBox_ChangeComposition_NotifyAssessmentSectionObservers(AssessmentSectionComposition initialComposition, AssessmentSectionComposition newComposition) + { + // Setup + using (var view = new FailureMechanismContributionView()) + { + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var assessmentSection = new AssessmentSection(); + assessmentSection.ChangeComposition(initialComposition); + assessmentSection.Attach(observer); + + var context = new FailureMechanismContributionContext(assessmentSection.FailureMechanismContribution, assessmentSection); + + view.Data = context; + ShowFormWithView(view); + + // Precondition + Assert.AreNotEqual(assessmentSection.Composition, newComposition); + + var compositionComboBox = (ComboBox)new ControlTester(assessmentSectionCompositionComboBoxName).TheObject; + + // Call + compositionComboBox.SelectedValue = newComposition; + + // Assert + mocks.VerifyAll(); // Expect UpdateObserver call + } + + } + private void ShowFormWithView(FailureMechanismContributionView distributionView) { testForm.Controls.Add(distributionView); Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/FailureMechanismContributionViewInfoTest.cs =================================================================== diff -u -rc8eb333514adae8495778ed16c71c41a6eb4251b -rb57739d9a5fbeef38a55020b0839d444d39cdbf7 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/FailureMechanismContributionViewInfoTest.cs (.../FailureMechanismContributionViewInfoTest.cs) (revision c8eb333514adae8495778ed16c71c41a6eb4251b) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/ViewInfos/FailureMechanismContributionViewInfoTest.cs (.../FailureMechanismContributionViewInfoTest.cs) (revision b57739d9a5fbeef38a55020b0839d444d39cdbf7) @@ -92,6 +92,8 @@ var assessmentSection = mocks.Stub(); assessmentSection.Stub(section => section.FailureMechanismContribution) .Return(contribution); + assessmentSection.Stub(section => section.Composition) + .Return(AssessmentSectionComposition.Dike); mocks.ReplayAll(); var context = new FailureMechanismContributionContext(contribution, assessmentSection); @@ -118,9 +120,13 @@ var assessmentSection1 = mocks.Stub(); assessmentSection1.Stub(section => section.FailureMechanismContribution) .Return(contribution1); + assessmentSection1.Stub(section => section.Composition) + .Return(AssessmentSectionComposition.DikeAndDune); var assessmentSection2 = mocks.Stub(); assessmentSection2.Stub(section => section.FailureMechanismContribution) .Return(contribution2); + assessmentSection2.Stub(section => section.Composition) + .Return(AssessmentSectionComposition.DikeAndDune); mocks.ReplayAll();