Index: Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsCalculationsView.Designer.cs =================================================================== diff -u -ra61a8c6b3b7dcf4126ad67dd8ca79ba514839a08 -r3fba7629ec6d261d59417ddc5775fda727d75511 --- Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsCalculationsView.Designer.cs (.../GrassCoverErosionInwardsCalculationsView.Designer.cs) (revision a61a8c6b3b7dcf4126ad67dd8ca79ba514839a08) +++ Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsCalculationsView.Designer.cs (.../GrassCoverErosionInwardsCalculationsView.Designer.cs) (revision 3fba7629ec6d261d59417ddc5775fda727d75511) @@ -45,7 +45,7 @@ this.tableLayoutPanelDataGrid = new System.Windows.Forms.TableLayoutPanel(); this.labelCalculations = new System.Windows.Forms.Label(); this.dataGridViewControl = new Core.Common.Controls.DataGrid.DataGridViewControl(); - this.buttonGenerateScenarios = new System.Windows.Forms.Button(); + this.buttonGenerateCalculations = new System.Windows.Forms.Button(); this.tableLayoutPanelUserControl.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); this.splitContainer.Panel1.SuspendLayout(); @@ -59,7 +59,7 @@ // resources.ApplyResources(this.tableLayoutPanelUserControl, "tableLayoutPanelUserControl"); this.tableLayoutPanelUserControl.Controls.Add(this.splitContainer, 0, 0); - this.tableLayoutPanelUserControl.Controls.Add(this.buttonGenerateScenarios, 0, 1); + this.tableLayoutPanelUserControl.Controls.Add(this.buttonGenerateCalculations, 0, 1); this.tableLayoutPanelUserControl.Name = "tableLayoutPanelUserControl"; // // splitContainer @@ -113,11 +113,11 @@ this.dataGridViewControl.Name = "dataGridViewControl"; this.dataGridViewControl.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.RowHeaderSelect; // - // buttonGenerateScenarios + // buttonGenerateCalculations // - resources.ApplyResources(this.buttonGenerateScenarios, "buttonGenerateScenarios"); - this.buttonGenerateScenarios.Name = "buttonGenerateScenarios"; - this.buttonGenerateScenarios.UseVisualStyleBackColor = true; + resources.ApplyResources(this.buttonGenerateCalculations, "buttonGenerateCalculations"); + this.buttonGenerateCalculations.Name = "buttonGenerateCalculations"; + this.buttonGenerateCalculations.UseVisualStyleBackColor = true; // // GrassCoverErosionInwardsCalculationsView // @@ -149,6 +149,6 @@ private System.Windows.Forms.TableLayoutPanel tableLayoutPanelDataGrid; private System.Windows.Forms.Label labelCalculations; private Core.Common.Controls.DataGrid.DataGridViewControl dataGridViewControl; - private System.Windows.Forms.Button buttonGenerateScenarios; + private System.Windows.Forms.Button buttonGenerateCalculations; } } Index: Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsCalculationsView.cs =================================================================== diff -u -ra61a8c6b3b7dcf4126ad67dd8ca79ba514839a08 -r3fba7629ec6d261d59417ddc5775fda727d75511 --- Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsCalculationsView.cs (.../GrassCoverErosionInwardsCalculationsView.cs) (revision a61a8c6b3b7dcf4126ad67dd8ca79ba514839a08) +++ Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsCalculationsView.cs (.../GrassCoverErosionInwardsCalculationsView.cs) (revision 3fba7629ec6d261d59417ddc5775fda727d75511) @@ -28,8 +28,11 @@ using Core.Common.Controls.DataGrid; using Core.Common.Controls.Views; using Riskeer.Common.Data.AssessmentSection; +using Riskeer.Common.Data.Calculation; using Riskeer.Common.Data.DikeProfiles; +using Riskeer.Common.Data.FailureMechanism; using Riskeer.Common.Data.Hydraulics; +using Riskeer.Common.Forms.ChangeHandlers; using Riskeer.Common.Forms.Helpers; using Riskeer.Common.Forms.PresentationObjects; using Riskeer.Common.IO.DikeProfiles; @@ -45,9 +48,15 @@ public partial class GrassCoverErosionInwardsCalculationsView : UserControl, ISelectionProvider, IView { private const int selectableHydraulicBoundaryLocationColumnIndex = 1; - + private readonly Observer grassCoverErosionInwardsFailureMechanismObserver; private readonly Observer hydraulicBoundaryLocationsObserver; + private readonly RecursiveObserver grassCoverErosionInwardsInputObserver; + private readonly RecursiveObserver grassCoverErosionInwardsCalculationScenarioObserver; + private readonly RecursiveObserver grassCoverErosionInwardsCalculationGroupObserver; + + private CalculationGroup calculationGroup; private IAssessmentSection assessmentSection; + private GrassCoverErosionInwardsFailureMechanism grassCoverErosionInwardsFailureMechanism; public event EventHandler SelectionChanged; @@ -58,11 +67,38 @@ { InitializeComponent(); InitializeDataGridView(); + InitializeListBox(); + grassCoverErosionInwardsFailureMechanismObserver = new Observer(OnGrassCoverErosionInwardsFailureMechanismUpdate); hydraulicBoundaryLocationsObserver = new Observer(UpdateSelectableHydraulicBoundaryLocationsColumn); + + // The concat is needed to observe the input of calculations in child groups. + grassCoverErosionInwardsInputObserver = new RecursiveObserver(UpdateDataGridViewDataSource, pcg => pcg.Children.Concat(pcg.Children.OfType().Select(pc => pc.InputParameters))); + grassCoverErosionInwardsCalculationScenarioObserver = new RecursiveObserver(() => dataGridViewControl.RefreshDataGridView(), pcg => pcg.Children); + grassCoverErosionInwardsCalculationGroupObserver = new RecursiveObserver(UpdateDataGridViewDataSource, pcg => pcg.Children); } /// + /// Gets or sets the grass cover erosion inwards failure mechanism. + /// + public GrassCoverErosionInwardsFailureMechanism GrassCoverErosionInwardsFailureMechanism + { + get + { + return grassCoverErosionInwardsFailureMechanism; + } + set + { + grassCoverErosionInwardsFailureMechanism = value; + grassCoverErosionInwardsFailureMechanismObserver.Observable = grassCoverErosionInwardsFailureMechanism; + + UpdateSectionsListBox(); + + UpdateGenerateCalculationsButtonState(); + } + } + + /// /// Gets or sets the assessment section. /// public IAssessmentSection AssessmentSection @@ -79,12 +115,41 @@ } } - public GrassCoverErosionInwardsFailureMechanism GrassCoverErosionInwardsFailureMechanism { get; set; } - public object Selection { get; } - public object Data { get; set; } + public object Data + { + get + { + return calculationGroup; + } + set + { + calculationGroup = value as CalculationGroup; + if (calculationGroup != null) + { + UpdateDataGridViewDataSource(); + grassCoverErosionInwardsInputObserver.Observable = calculationGroup; + grassCoverErosionInwardsCalculationScenarioObserver.Observable = calculationGroup; + grassCoverErosionInwardsCalculationGroupObserver.Observable = calculationGroup; + } + else + { + dataGridViewControl.SetDataSource(null); + grassCoverErosionInwardsInputObserver.Observable = null; + grassCoverErosionInwardsCalculationScenarioObserver.Observable = null; + grassCoverErosionInwardsCalculationGroupObserver.Observable = null; + } + } + } + + private void InitializeListBox() + { + listBox.DisplayMember = nameof(FailureMechanismSection.Name); + listBox.SelectedValueChanged += ListBoxOnSelectedValueChanged; + } + private void InitializeDataGridView() { dataGridViewControl.AddTextBoxColumn( @@ -133,6 +198,11 @@ Resources.GrassCoverErosionInwardsCalculation_StandardDeviation_Critical_OvertoppingRate); } + private void UpdateGenerateCalculationsButtonState() + { + buttonGenerateCalculations.Enabled = grassCoverErosionInwardsFailureMechanism != null; + } + private void UpdateSelectableHydraulicBoundaryLocationsColumn() { var column = (DataGridViewComboBoxColumn) dataGridViewControl.GetColumnFromIndex(selectableHydraulicBoundaryLocationColumnIndex); @@ -191,5 +261,89 @@ return dataGridViewComboBoxItemWrappers; } + + #region Data sources + + private void UpdateDataGridViewDataSource() + { + // Skip changes coming from the view itself + if (dataGridViewControl.IsCurrentCellInEditMode) + { + dataGridViewControl.AutoResizeColumns(); + } + + var failureMechanismSection = listBox.SelectedItem as FailureMechanismSection; + if (failureMechanismSection == null || calculationGroup == null) + { + dataGridViewControl.SetDataSource(null); + return; + } + + IEnumerable grassCoverErosionInwardsCalculationScenarios = calculationGroup + .GetCalculations() + .OfType(); + + PrefillComboBoxListItemsAtColumnLevel(); + + List dataSource = grassCoverErosionInwardsCalculationScenarios.Select(pc => new GrassCoverErosionInwardsCalculationRow(pc, new ObservablePropertyChangeHandler(pc, pc.InputParameters))).ToList(); + dataGridViewControl.SetDataSource(dataSource); + dataGridViewControl.ClearCurrentCell(); + + UpdateSelectableHydraulicBoundaryLocationsColumn(); + } + + #endregion + + #region Prefill combo box list items + + private void PrefillComboBoxListItemsAtColumnLevel() + { + var selectableHydraulicBoundaryLocationColumn = (DataGridViewComboBoxColumn) dataGridViewControl.GetColumnFromIndex(selectableHydraulicBoundaryLocationColumnIndex); + + using (new SuspendDataGridViewColumnResizes(selectableHydraulicBoundaryLocationColumn)) + { + SetItemsOnObjectCollection(selectableHydraulicBoundaryLocationColumn.Items, + GetSelectableHydraulicBoundaryLocationsDataSource(GetSelectableHydraulicBoundaryLocationsFromFailureMechanism()).ToArray()); + } + } + + private IEnumerable GetSelectableHydraulicBoundaryLocationsFromFailureMechanism() + { + if (assessmentSection == null) + { + return null; + } + + List hydraulicBoundaryLocations = assessmentSection.HydraulicBoundaryDatabase.Locations; + + return hydraulicBoundaryLocations.Select(hbl => new SelectableHydraulicBoundaryLocation(hbl, null)).ToList(); + } + + #endregion + + #region Event handling + + private void ListBoxOnSelectedValueChanged(object sender, EventArgs e) + { + UpdateDataGridViewDataSource(); + } + + private void OnGrassCoverErosionInwardsFailureMechanismUpdate() + { + UpdateSectionsListBox(); + } + + private void UpdateSectionsListBox() + { + listBox.Items.Clear(); + + if (grassCoverErosionInwardsFailureMechanism != null && grassCoverErosionInwardsFailureMechanism.Sections.Any()) + { + listBox.Items.AddRange(grassCoverErosionInwardsFailureMechanism.Sections.Cast().ToArray()); + listBox.SelectedItem = grassCoverErosionInwardsFailureMechanism.Sections.First(); + } + } + + #endregion } } \ No newline at end of file Index: Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsCalculationsView.resx =================================================================== diff -u -ra61a8c6b3b7dcf4126ad67dd8ca79ba514839a08 -r3fba7629ec6d261d59417ddc5775fda727d75511 --- Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsCalculationsView.resx (.../GrassCoverErosionInwardsCalculationsView.resx) (revision a61a8c6b3b7dcf4126ad67dd8ca79ba514839a08) +++ Riskeer/GrassCoverErosionInwards/src/Riskeer.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsCalculationsView.resx (.../GrassCoverErosionInwardsCalculationsView.resx) (revision 3fba7629ec6d261d59417ddc5775fda727d75511) @@ -378,43 +378,43 @@ 0 - + True - + Left - + False - + NoControl - + 4, 271 - + 4, 4, 4, 4 - + 212, 33 - + 0 - + Genereer &berekeningen... - - buttonGenerateScenarios + + buttonGenerateCalculations - + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tableLayoutPanelUserControl - + 1 Index: Riskeer/GrassCoverErosionInwards/test/Riskeer.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsCalculationsViewTest.cs =================================================================== diff -u -ra61a8c6b3b7dcf4126ad67dd8ca79ba514839a08 -r3fba7629ec6d261d59417ddc5775fda727d75511 --- Riskeer/GrassCoverErosionInwards/test/Riskeer.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsCalculationsViewTest.cs (.../GrassCoverErosionInwardsCalculationsViewTest.cs) (revision a61a8c6b3b7dcf4126ad67dd8ca79ba514839a08) +++ Riskeer/GrassCoverErosionInwards/test/Riskeer.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsCalculationsViewTest.cs (.../GrassCoverErosionInwardsCalculationsViewTest.cs) (revision 3fba7629ec6d261d59417ddc5775fda727d75511) @@ -21,9 +21,13 @@ using System.Linq; using System.Windows.Forms; +using Core.Common.Base.Geometry; using Core.Common.Controls.Views; using NUnit.Extensions.Forms; using NUnit.Framework; +using Riskeer.Common.Data.FailureMechanism; +using Riskeer.Common.Data.TestUtil; +using Riskeer.GrassCoverErosionInwards.Data; using Riskeer.GrassCoverErosionInwards.Forms.Views; namespace Riskeer.GrassCoverErosionInwards.Forms.Test.Views @@ -100,6 +104,113 @@ } } + [Test] + public void Constructor_ListBoxCorrectlyInitialized() + { + // Call + using (ShowGrassCoverErosionInwardsCalculationsView()) + { + var listBox = (ListBox) new ControlTester("listBox").TheObject; + + // Assert + Assert.AreEqual(0, listBox.Items.Count); + } + } + + [Test] + public void Data_SetToNull_DoesNotThrow() + { + // Setup + using (GrassCoverErosionInwardsCalculationsView grassCoverErosionInwardsCalculationsView = ShowGrassCoverErosionInwardsCalculationsView()) + { + // Call + var testDelegate = new TestDelegate(() => grassCoverErosionInwardsCalculationsView.Data = null); + + // Assert + Assert.DoesNotThrow(testDelegate); + } + } + + [Test] + public void GrassCoverErosionInwardsFailureMechanism_FailureMechanismWithSections_SectionsListBoxCorrectlyInitialized() + { + // Setup + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + var failureMechanismSection1 = new FailureMechanismSection("Section 1", new[] + { + new Point2D(0.0, 0.0), + new Point2D(5.0, 0.0) + }); + var failureMechanismSection2 = new FailureMechanismSection("Section 2", new[] + { + new Point2D(5.0, 0.0), + new Point2D(10.0, 0.0) + }); + var failureMechanismSection3 = new FailureMechanismSection("Section 3", new[] + { + new Point2D(10.0, 0.0), + new Point2D(15.0, 0.0) + }); + + FailureMechanismTestHelper.SetSections(failureMechanism, new[] + { + failureMechanismSection1, + failureMechanismSection2, + failureMechanismSection3 + }); + + using (GrassCoverErosionInwardsCalculationsView pipingCalculationsView = ShowGrassCoverErosionInwardsCalculationsView()) + { + // Call + pipingCalculationsView.GrassCoverErosionInwardsFailureMechanism = failureMechanism; + + // Assert + var listBox = (ListBox) new ControlTester("listBox").TheObject; + Assert.AreEqual(3, listBox.Items.Count); + Assert.AreSame(failureMechanismSection1, listBox.Items[0]); + Assert.AreSame(failureMechanismSection2, listBox.Items[1]); + Assert.AreSame(failureMechanismSection3, listBox.Items[2]); + } + } + + [Test] + public void ButtonGenerateCalculations_WithoutGrassCoverErosionInwardsFailureMechanism_ButtonDisabled() + { + // Setup + GrassCoverErosionInwardsFailureMechanism grassCoverErosionInwardsFailureMechanism = null; + + using (GrassCoverErosionInwardsCalculationsView grassCoverErosionInwardsCalculationsView = ShowGrassCoverErosionInwardsCalculationsView()) + { + grassCoverErosionInwardsCalculationsView.GrassCoverErosionInwardsFailureMechanism = grassCoverErosionInwardsFailureMechanism; + var button = (Button) grassCoverErosionInwardsCalculationsView.Controls.Find("buttonGenerateCalculations", true)[0]; + + // Call + bool state = button.Enabled; + + // Assert + Assert.IsFalse(state); + } + } + + [Test] + public void ButtonGenerateCalculations_WithGrassCoverErosionInwardsFailureMechanism_ButtonDisabled() + { + // Setup + var grassCoverErosionInwardsFailureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + + using (GrassCoverErosionInwardsCalculationsView grassCoverErosionInwardsCalculationsView = ShowGrassCoverErosionInwardsCalculationsView()) + { + grassCoverErosionInwardsCalculationsView.GrassCoverErosionInwardsFailureMechanism = grassCoverErosionInwardsFailureMechanism; + var button = (Button) grassCoverErosionInwardsCalculationsView.Controls.Find("buttonGenerateCalculations", true)[0]; + + // Call + bool state = button.Enabled; + + // Assert + Assert.IsTrue(state); + } + } + public override void Setup() { base.Setup();