using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using Core.Common.Base.Service;
using Core.Common.Controls;
using Core.Common.Gui;
using Core.Common.Gui.ContextMenu;
using Ringtoets.Common.Forms.Helpers;
using Ringtoets.Common.Forms.NodePresenters;
using Ringtoets.Common.Forms.PresentationObjects;
using Ringtoets.Piping.Data;
using Ringtoets.Piping.Forms.PresentationObjects;
using Ringtoets.Piping.Service;
using PipingDataResources = Ringtoets.Piping.Data.Properties.Resources;
using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources;
using PipingFormsResources = Ringtoets.Piping.Forms.Properties.Resources;
namespace Ringtoets.Piping.Forms.NodePresenters
{
///
/// This class presents the data on as a node in a
/// and implements the way the user can interact with the node.
///
public class PipingFailureMechanismNodePresenter : RingtoetsNodePresenterBase
{
public PipingFailureMechanismNodePresenter(IContextMenuBuilderProvider contextMenuBuilderProvider) : base(contextMenuBuilderProvider) {}
///
/// Injection points for a method to cause a collection of to be scheduled for execution.
///
public Action> RunActivitiesAction { private get; set; }
protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, PipingFailureMechanism nodeData)
{
node.Text = PipingFormsResources.PipingFailureMechanism_DisplayName;
node.Image = PipingFormsResources.PipingIcon;
node.ForegroundColor = Color.FromKnownColor(KnownColor.ControlText);
}
protected override IEnumerable GetChildNodeObjects(PipingFailureMechanism failureMechanism)
{
yield return new CategoryTreeFolder(RingtoetsCommonFormsResources.FailureMechanism_Inputs_DisplayName, GetInputs(failureMechanism), TreeFolderCategory.Input);
yield return new PipingCalculationGroupContext(failureMechanism.CalculationsGroup, failureMechanism.SurfaceLines, failureMechanism.SoilProfiles);
yield return new CategoryTreeFolder(RingtoetsCommonFormsResources.FailureMechanism_Outputs_DisplayName, GetOutputs(failureMechanism), TreeFolderCategory.Output);
}
protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingFailureMechanism failureMechanism)
{
var addCalculationGroupItem = new StrictContextMenuItem(
PipingFormsResources.PipingCalculationGroup_Add_PipingCalculationGroup,
PipingFormsResources.PipingFailureMechanism_Add_PipingCalculationGroup_Tooltip,
PipingFormsResources.AddFolderIcon,
(o, args) => AddCalculationGroup(failureMechanism)
);
var addCalculationItem = new StrictContextMenuItem(
PipingFormsResources.PipingCalculationGroup_Add_PipingCalculation,
PipingFormsResources.PipingFailureMechanism_Add_PipingCalculation_Tooltip,
PipingFormsResources.PipingIcon,
(s, e) => AddCalculation(failureMechanism)
);
var validateAllItem = new StrictContextMenuItem(
PipingFormsResources.PipingCalculationItem_Validate,
PipingFormsResources.PipingFailureMechanism_ValidateAll_Tooltip,
PipingFormsResources.ValidationIcon,
(o, args) => ValidateAll(failureMechanism)
);
var calculateAllItem = new StrictContextMenuItem(
RingtoetsCommonFormsResources.Calculate_all,
RingtoetsCommonFormsResources.Calculate_all_ToolTip,
RingtoetsCommonFormsResources.CalculateAllIcon,
(o, args) => CalculateAll(failureMechanism)
);
var clearAllItem = new StrictContextMenuItem(
RingtoetsCommonFormsResources.Clear_all_output,
RingtoetsCommonFormsResources.Clear_all_output_ToolTip,
RingtoetsCommonFormsResources.ClearIcon,
(o, args) => ClearAll(failureMechanism)
);
if (!GetAllPipingCalculationsResursively(failureMechanism).Any(c => c.HasOutput))
{
clearAllItem.Enabled = false;
clearAllItem.ToolTipText = PipingFormsResources.PipingCalculationGroup_ClearOutput_No_calculation_with_output_to_clear;
}
return contextMenuBuilderProvider.Get(sender)
.AddCustomItem(addCalculationGroupItem)
.AddCustomItem(addCalculationItem)
.AddSeparator()
.AddCustomItem(validateAllItem)
.AddCustomItem(calculateAllItem)
.AddCustomItem(clearAllItem)
.AddSeparator()
.AddExpandAllItem()
.AddCollapseAllItem()
.AddSeparator()
.AddImportItem()
.AddExportItem()
.Build();
}
private static void ClearAll(PipingFailureMechanism failureMechanism)
{
foreach (PipingCalculation calc in GetAllPipingCalculationsResursively(failureMechanism))
{
calc.ClearOutput();
calc.NotifyObservers();
}
}
private void ValidateAll(PipingFailureMechanism failureMechanism)
{
foreach (PipingCalculation calculation in GetAllPipingCalculationsResursively(failureMechanism))
{
PipingCalculationService.Validate(calculation);
}
}
private void CalculateAll(PipingFailureMechanism failureMechanism)
{
RunActivitiesAction(GetAllPipingCalculationsResursively(failureMechanism).Select(calc => new PipingCalculationActivity(calc)));
}
private static void AddCalculationGroup(PipingFailureMechanism failureMechanism)
{
var calculation = new PipingCalculationGroup
{
Name = NamingHelper.GetUniqueName(failureMechanism.CalculationsGroup.Children, PipingDataResources.PipingCalculationGroup_DefaultName, c => c.Name)
};
failureMechanism.CalculationsGroup.Children.Add(calculation);
failureMechanism.NotifyObservers();
}
private static void AddCalculation(PipingFailureMechanism failureMechanism)
{
var calculation = new PipingCalculation
{
Name = NamingHelper.GetUniqueName(failureMechanism.CalculationsGroup.Children, PipingDataResources.PipingCalculation_DefaultName, c => c.Name)
};
failureMechanism.CalculationsGroup.Children.Add(calculation);
failureMechanism.NotifyObservers();
}
private static IEnumerable GetInputs(PipingFailureMechanism failureMechanism)
{
yield return failureMechanism.SectionDivisions;
yield return failureMechanism.SurfaceLines;
yield return failureMechanism.SoilProfiles;
yield return failureMechanism.BoundaryConditions;
}
private IEnumerable GetOutputs(PipingFailureMechanism failureMechanism)
{
yield return failureMechanism.AssessmentResult;
}
private static IEnumerable GetAllPipingCalculationsResursively(PipingFailureMechanism failureMechanism)
{
return failureMechanism.CalculationsGroup.GetPipingCalculations().ToArray();
}
}
}