Index: Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs =================================================================== diff -u -rff8a088931e6af2e46f6f4f09b633bcdd0b84ecd -r0d98073e4ba2bdc6b69b7f875508488d1fa0148a --- Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs (.../StabilityStoneCoverPlugin.cs) (revision ff8a088931e6af2e46f6f4f09b633bcdd0b84ecd) +++ Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs (.../StabilityStoneCoverPlugin.cs) (revision 0d98073e4ba2bdc6b69b7f875508488d1fa0148a) @@ -21,23 +21,32 @@ using System.Collections; using System.Collections.Generic; +using System.Drawing; +using System.IO; using System.Linq; using System.Windows.Forms; using Core.Common.Controls.TreeView; using Core.Common.Gui.ContextMenu; +using Core.Common.Gui.Forms.ProgressDialog; using Core.Common.Gui.Plugin; using Ringtoets.Common.Data; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Calculation; +using Ringtoets.Common.Forms.Helpers; using Ringtoets.Common.Forms.PresentationObjects; using Ringtoets.Common.Forms.TreeNodeInfos; +using Ringtoets.HydraRing.IO; using Ringtoets.StabilityStoneCover.Data; using Ringtoets.StabilityStoneCover.Forms.PresentationObjects; using Ringtoets.StabilityStoneCover.Forms.PropertyClasses; using Ringtoets.StabilityStoneCover.Forms.Views; using Ringtoets.StabilityStoneCover.Plugin.Properties; +using Ringtoets.StabilityStoneCover.Service; using RingtoetsCommonDataResources = Ringtoets.Common.Data.Properties.Resources; using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; +using StabilityStoneCoverDataResources = Ringtoets.StabilityStoneCover.Data.Properties.Resources; +using StabilityStoneCoverFormsResources = Ringtoets.StabilityStoneCover.Forms.Properties.Resources; +using RingtoetsCommonServiceResources = Ringtoets.Common.Service.Properties.Resources; namespace Ringtoets.StabilityStoneCover.Plugin { @@ -73,11 +82,36 @@ FailureMechanismEnabledContextMenuStrip, FailureMechanismDisabledContextMenuStrip); - yield return RingtoetsTreeNodeInfoFactory.CreateCalculationGroupContextTreeNodeInfo( - HydraulicBoundariesCalculationGroupContextChildNodeObjects, - HydraulicBoundariesCalculationGroupContextContextMenuStrip, - HydraulicBoundariesCalculationGroupContextOnNodeRemoved); + yield return RingtoetsTreeNodeInfoFactory.CreateCalculationGroupContextTreeNodeInfo( + WaveConditionsCalculationGroupContextChildNodeObjects, + WaveConditionsCalculationGroupContextContextMenuStrip, + WaveConditionsCalculationGroupContextOnNodeRemoved); + yield return RingtoetsTreeNodeInfoFactory.CreateCalculationContextTreeNodeInfo( + StabilityStoneCoverFormsResources.CalculationIcon, + WaveConditionsCalculationContextChildNodeObjects, + WaveConditionsCalculationContextContextMenuStrip, + WaveConditionsCalculationContextOnNodeRemoved); + + yield return new TreeNodeInfo + { + Text = context => RingtoetsCommonFormsResources.Calculation_Input, + Image = context => RingtoetsCommonFormsResources.GenericInputOutputIcon, + ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) + .AddPropertiesItem() + .Build() + }; + + yield return new TreeNodeInfo + { + Text = emptyPipingOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, + Image = emptyPipingOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, + ForeColor = emptyPipingOutput => Color.FromKnownColor(KnownColor.GrayText), + ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) + .AddPropertiesItem() + .Build() + }; + yield return new TreeNodeInfo> { Text = context => RingtoetsCommonFormsResources.FailureMechanism_AssessmentResult_DisplayName, @@ -127,7 +161,7 @@ return new object[] { new CategoryTreeFolder(RingtoetsCommonFormsResources.FailureMechanism_Inputs_DisplayName, GetInputs(wrappedData, failureMechanismContext.Parent), TreeFolderCategory.Input), - new StabilityStoneCoverHydraulicBoundariesCalculationGroupContext(wrappedData.HydraulicBoundariesCalculationGroup, wrappedData), + new StabilityStoneCoverWaveConditionsCalculationGroupContext(wrappedData.WaveConditionsCalculationGroup, wrappedData, failureMechanismContext.Parent), new CategoryTreeFolder(RingtoetsCommonFormsResources.FailureMechanism_Outputs_DisplayName, GetOutputs(wrappedData), TreeFolderCategory.Output) }; } @@ -189,25 +223,28 @@ #endregion - #region StabilityStoneCoverHydraulicBoundariesCalculationGroupContext + #region StabilityStoneCoverWaveCibdutuibsCalculationGroupContext - private object[] HydraulicBoundariesCalculationGroupContextChildNodeObjects(StabilityStoneCoverHydraulicBoundariesCalculationGroupContext nodeData) + private object[] WaveConditionsCalculationGroupContextChildNodeObjects(StabilityStoneCoverWaveConditionsCalculationGroupContext nodeData) { var childNodeObjects = new List(); foreach (ICalculationBase item in nodeData.WrappedData.Children) { - var calculation = item as ICalculation; // TODO: Change cast to HydraulicBoundaryCalculation; Implementation part of WTI-724 + var calculation = item as StabilityStoneCoverWaveConditionsCalculation; var group = item as CalculationGroup; if (calculation != null) { - // TODO: Implementation part of WTI-724 + childNodeObjects.Add(new StabilityStoneCoverWaveConditionsCalculationContext(calculation, + nodeData.FailureMechanism, + nodeData.AssessmentSection)); } else if (group != null) { - childNodeObjects.Add(new StabilityStoneCoverHydraulicBoundariesCalculationGroupContext(group, - nodeData.FailureMechanism)); + childNodeObjects.Add(new StabilityStoneCoverWaveConditionsCalculationGroupContext(group, + nodeData.FailureMechanism, + nodeData.AssessmentSection)); } else { @@ -218,25 +255,22 @@ return childNodeObjects.ToArray(); } - private ContextMenuStrip HydraulicBoundariesCalculationGroupContextContextMenuStrip(StabilityStoneCoverHydraulicBoundariesCalculationGroupContext nodeData, object parentData, TreeViewControl treeViewControl) + private ContextMenuStrip WaveConditionsCalculationGroupContextContextMenuStrip(StabilityStoneCoverWaveConditionsCalculationGroupContext nodeData, object parentData, TreeViewControl treeViewControl) { var group = nodeData.WrappedData; var builder = new RingtoetsContextMenuBuilder(Gui.Get(nodeData, treeViewControl)); - var isNestedGroup = parentData is StabilityStoneCoverHydraulicBoundariesCalculationGroupContext; + var isNestedGroup = parentData is StabilityStoneCoverWaveConditionsCalculationGroupContext; - StrictContextMenuItem generateCalculationsItem = CreateGenerateHydraulicBoundaryCalculationsItem(nodeData); + StrictContextMenuItem generateCalculationsItem = CreateGenerateWaveConditionsCalculationsItem(nodeData); if (!isNestedGroup) { builder.AddCustomItem(generateCalculationsItem) .AddSeparator(); } - StrictContextMenuItem addCalculationItem = RingtoetsContextMenuItemFactory.CreateAddCalculationItem(nodeData, AddHydraulicBoundaryCalculation); - addCalculationItem.Enabled = false; builder.AddCreateCalculationGroupItem(group) - .AddCustomItem(addCalculationItem); - //.AddCreateCalculationItem(nodeData, AddHydraulicBoundaryCalculation); // TODO: Replace the AddCustomItem(addCalculationItem) call with this; Implemented in WTI-427 + .AddCreateCalculationItem(nodeData, AddWaveConditionsCalculation); if (!isNestedGroup) { @@ -245,7 +279,9 @@ } builder.AddSeparator() - .AddValidateAllCalculationsInGroupItem(nodeData, c => ValidateAll(c.WrappedData.GetCalculations().OfType())) // TODO: Replace ICalculation with concrete type; Implemented in WTI-427 + .AddValidateAllCalculationsInGroupItem(nodeData, + c => ValidateAll(c.WrappedData.GetCalculations().OfType()), + ValidateAllDataAvailableAndGetErrorMessageForCalculationGroup) .AddPerformAllCalculationsInGroupItem(group, nodeData, CalculateAll) .AddClearAllCalculationOutputInGroupItem(group) .AddSeparator(); @@ -264,8 +300,39 @@ .Build(); } - private StrictContextMenuItem CreateGenerateHydraulicBoundaryCalculationsItem(StabilityStoneCoverHydraulicBoundariesCalculationGroupContext nodeData) + private string ValidateAllDataAvailableAndGetErrorMessageForCalculationGroup(StabilityStoneCoverWaveConditionsCalculationGroupContext context) { + return ValidateAllDataAvailableAndGetErrorMessage(context.AssessmentSection, context.FailureMechanism); + } + + private string ValidateAllDataAvailableAndGetErrorMessageForCalculation(StabilityStoneCoverWaveConditionsCalculationContext context) + { + return ValidateAllDataAvailableAndGetErrorMessage(context.AssessmentSection, context.FailureMechanism); + } + + private string ValidateAllDataAvailableAndGetErrorMessage(IAssessmentSection assessmentSection, StabilityStoneCoverFailureMechanism failureMechanism) + { + if (!failureMechanism.Sections.Any()) + { + return RingtoetsCommonFormsResources.Plugin_AllDataAvailable_No_failure_mechanism_sections_imported; + } + + if (assessmentSection.HydraulicBoundaryDatabase == null) + { + return RingtoetsCommonFormsResources.Plugin_AllDataAvailable_No_hydraulic_boundary_database_imported; + } + + var validationProblem = HydraulicDatabaseHelper.ValidatePathForCalculation(assessmentSection.HydraulicBoundaryDatabase.FilePath); + if (!string.IsNullOrEmpty(validationProblem)) + { + return string.Format(RingtoetsCommonServiceResources.Hydraulic_boundary_database_connection_failed_0_, validationProblem); + } + + return null; + } + + private StrictContextMenuItem CreateGenerateWaveConditionsCalculationsItem(StabilityStoneCoverWaveConditionsCalculationGroupContext nodeData) + { return new StrictContextMenuItem(RingtoetsCommonFormsResources.CalculationsGroup_Generate_calculations, Resources.StabilityStoneCoverPlugin_CreateGenerateHydraulicBoundaryCalculationsItem_ToolTip, RingtoetsCommonFormsResources.GenerateScenariosIcon, @@ -278,32 +345,129 @@ }; } - private void AddHydraulicBoundaryCalculation(StabilityStoneCoverHydraulicBoundariesCalculationGroupContext stabilityStoneCoverHydraulicBoundariesCalculationGroupContext) + private void AddWaveConditionsCalculation(StabilityStoneCoverWaveConditionsCalculationGroupContext nodeData) { - // TODO: Implemented in WTI-427 + var calculation = new StabilityStoneCoverWaveConditionsCalculation + { + Name = NamingHelper.GetUniqueName(nodeData.WrappedData.Children, + StabilityStoneCoverDataResources.StabilityStoneCoverWaveConditionsCalculation_DefaultName, + c => c.Name) + }; + nodeData.WrappedData.Children.Add(calculation); + nodeData.WrappedData.NotifyObservers(); } - private void ValidateAll(IEnumerable calculations) + private void ValidateAll(IEnumerable calculations) { - // TODO: Implemented in WTI-427 + foreach (StabilityStoneCoverWaveConditionsCalculation calculation in calculations) + { + StabilityStoneCoverCalculationService.Validate(calculation); + } } - private void CalculateAll(CalculationGroup group, StabilityStoneCoverHydraulicBoundariesCalculationGroupContext context) + private void CalculateAll(CalculationGroup group, StabilityStoneCoverWaveConditionsCalculationGroupContext context) { - // TODO: Implemented in WTI-427 + var calculations = group.GetCalculations().OfType().ToArray(); + + CalculateAll(calculations, context.FailureMechanism, context.AssessmentSection); } - private void HydraulicBoundariesCalculationGroupContextOnNodeRemoved(StabilityStoneCoverHydraulicBoundariesCalculationGroupContext nodeData, object parentNodeData) + private void CalculateAll(IEnumerable calculations, + StabilityStoneCoverFailureMechanism failureMechanism, + IAssessmentSection assessmentSection) { - var parentGroupContext = (StabilityStoneCoverHydraulicBoundariesCalculationGroupContext) parentNodeData; + ActivityProgressDialogRunner.Run( + Gui.MainWindow, + calculations + .Select(calculation => new StabilityStoneCoverWaveConditionsCalculationActivity(calculation, + Path.GetDirectoryName(assessmentSection.HydraulicBoundaryDatabase.FilePath), + failureMechanism, + assessmentSection)) + .ToList()); + } + private void WaveConditionsCalculationGroupContextOnNodeRemoved(StabilityStoneCoverWaveConditionsCalculationGroupContext nodeData, object parentNodeData) + { + var parentGroupContext = (StabilityStoneCoverWaveConditionsCalculationGroupContext) parentNodeData; + parentGroupContext.WrappedData.Children.Remove(nodeData.WrappedData); parentGroupContext.NotifyObservers(); } #endregion + #region StabilityStoneCoverWaveConditionsCalculationContext + + private object[] WaveConditionsCalculationContextChildNodeObjects(StabilityStoneCoverWaveConditionsCalculationContext context) + { + var childNodes = new List + { + new CommentContext(context.WrappedData), + new StabilityStoneCoverWaveConditionsCalculationInputContext(context.WrappedData.InputParameters, + context.FailureMechanism, + context.AssessmentSection) + }; + + if (context.WrappedData.HasOutput) + { + childNodes.Add(context.WrappedData.Output); + } + else + { + childNodes.Add(new EmptyStabilityStoneCoverOutput()); + } + + return childNodes.ToArray(); + } + + private ContextMenuStrip WaveConditionsCalculationContextContextMenuStrip(StabilityStoneCoverWaveConditionsCalculationContext nodeData, object parentData, TreeViewControl treeViewControl) + { + var builder = new RingtoetsContextMenuBuilder(Gui.Get(nodeData, treeViewControl)); + + StabilityStoneCoverWaveConditionsCalculation calculation = nodeData.WrappedData; + + return builder.AddValidateCalculationItem(nodeData, + c => StabilityStoneCoverCalculationService.Validate(c.WrappedData), + ValidateAllDataAvailableAndGetErrorMessageForCalculation) + .AddPerformCalculationItem(calculation, nodeData, PerformCalculation) + .AddClearCalculationOutputItem(calculation) + .AddSeparator() + .AddRenameItem() + .AddDeleteItem() + .AddSeparator() + .AddExpandAllItem() + .AddCollapseAllItem() + .AddSeparator() + .AddPropertiesItem() + .Build(); + } + + private void PerformCalculation(StabilityStoneCoverWaveConditionsCalculation calculation, + StabilityStoneCoverWaveConditionsCalculationContext context) + { + ActivityProgressDialogRunner.Run(Gui.MainWindow, + new StabilityStoneCoverWaveConditionsCalculationActivity(calculation, + Path.GetDirectoryName(context.AssessmentSection.HydraulicBoundaryDatabase.FilePath), + context.FailureMechanism, + context.AssessmentSection)); + } + + private void WaveConditionsCalculationContextOnNodeRemoved(StabilityStoneCoverWaveConditionsCalculationContext nodeData, object parentNodeData) + { + var calculationGroupContext = parentNodeData as StabilityStoneCoverWaveConditionsCalculationGroupContext; + if (calculationGroupContext != null) + { + bool successfullyRemovedData = calculationGroupContext.WrappedData.Children.Remove(nodeData.WrappedData); + if (successfullyRemovedData) + { + calculationGroupContext.NotifyObservers(); + } + } + } + #endregion + + #endregion } } \ No newline at end of file