using System;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using Core.Common.Base.Service;
using Core.Common.Controls;
using Core.Common.Gui;
using Ringtoets.Common.Forms.Extensions;
using Ringtoets.Common.Forms.Helpers;
using Ringtoets.Common.Forms.NodePresenters;
using Ringtoets.Piping.Data;
using Ringtoets.Piping.Data.Properties;
using Ringtoets.Piping.Forms.PresentationObjects;
using Ringtoets.Piping.Service;
using RingtoetsFormsResources = Ringtoets.Common.Forms.Properties.Resources;
using PipingFormsResources = Ringtoets.Piping.Forms.Properties.Resources;
namespace Ringtoets.Piping.Forms.NodePresenters
{
///
/// Node presenter class for instances.
///
public class PipingCalculationGroupContextNodePresenter : RingtoetsNodePresenterBase
{
public PipingCalculationGroupContextNodePresenter(IContextMenuBuilderProvider contextMenuBuilderProvider) : base(contextMenuBuilderProvider) {}
///
/// Injection points for a method to cause an to be scheduled for execution.
///
public Action RunActivityAction { private get; set; }
public override bool CanRenameNode(ITreeNode node)
{
return node.Parent == null || !(node.Parent.Tag is PipingFailureMechanism);
}
public override bool CanRenameNodeTo(ITreeNode node, string newName)
{
return true;
}
protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, PipingCalculationGroupContext nodeData)
{
node.Text = nodeData.WrappedData.Name;
node.Image = PipingFormsResources.FolderIcon;
node.ForegroundColor = Color.FromKnownColor(KnownColor.ControlText);
}
protected override void OnNodeRenamed(PipingCalculationGroupContext nodeData, string newName)
{
nodeData.WrappedData.Name = newName;
nodeData.NotifyObservers();
}
protected override bool CanRemove(object parentNodeData, PipingCalculationGroupContext nodeData)
{
var group = parentNodeData as PipingCalculationGroupContext;
if (group != null)
{
return group.WrappedData.Children.Contains(nodeData.WrappedData);
}
return base.CanRemove(parentNodeData, nodeData);
}
protected override bool RemoveNodeData(object parentNodeData, PipingCalculationGroupContext nodeData)
{
var group = parentNodeData as PipingCalculationGroupContext;
if (group != null)
{
var removeNodeData = group.WrappedData.Children.Remove(nodeData.WrappedData);
group.NotifyObservers();
return removeNodeData;
}
return base.RemoveNodeData(parentNodeData, nodeData);
}
protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingCalculationGroupContext nodeData)
{
var rootMenu = new ContextMenuStrip();
var group = nodeData.WrappedData;
rootMenu.AddMenuItem("Map toevoegen",
"Voeg een nieuwe berekeningsmap toe aan deze berekeningsmap.",
PipingFormsResources.AddFolderIcon, (o, args) =>
{
var newGroup = new PipingCalculationGroup
{
Name = NamingHelper.GetUniqueName(group.Children, Resources.PipingCalculationGroup_DefaultName, c => c.Name)
};
group.Children.Add(newGroup);
nodeData.NotifyObservers();
});
rootMenu.AddMenuItem("Berekening toevoegen",
"Voeg een nieuwe berekening toe aan deze berekeningsmap.",
PipingFormsResources.PipingIcon, (o, args) =>
{
var calculation = new PipingCalculation
{
Name = NamingHelper.GetUniqueName(group.Children, Resources.PipingCalculation_DefaultName, c => c.Name)
};
group.Children.Add(calculation);
nodeData.NotifyObservers();
});
rootMenu.AddMenuItem("Valideren",
"Valideer alle berekeningen binnen deze berekeningsmap.",
PipingFormsResources.ValidationIcon, (o, args) =>
{
foreach (PipingCalculation calculation in group.Children.GetPipingCalculations())
{
PipingCalculationService.Validate(calculation);
}
});
rootMenu.AddMenuItem("Alles be&rekenen",
"Valideer en voer alle berekeningen binnen deze berekeningsmap uit.",
RingtoetsFormsResources.CalculateAllIcon, (o, args) =>
{
foreach (PipingCalculation calc in group.GetPipingCalculations())
{
RunActivityAction(new PipingCalculationActivity(calc));
}
});
rootMenu.AddMenuItem("&Wis alle uitvoer",
"Wis de uitvoer van alle berekeningen binnen deze berekeningsmap.",
RingtoetsFormsResources.ClearIcon, (o, args) =>
{
foreach (PipingCalculation calc in group.GetPipingCalculations().Where(c => c.HasOutput))
{
calc.ClearOutput();
calc.NotifyObservers();
}
});
return rootMenu;
}
protected override IEnumerable GetChildNodeObjects(PipingCalculationGroupContext nodeData)
{
foreach (IPipingCalculationItem item in nodeData.WrappedData.Children)
{
var calculation = item as PipingCalculation;
var group = item as PipingCalculationGroup;
if (calculation != null)
{
yield return new PipingCalculationContext(calculation,
nodeData.AvailablePipingSurfaceLines,
nodeData.AvailablePipingSoilProfiles);
}
else if (group != null)
{
yield return new PipingCalculationGroupContext(group,
nodeData.AvailablePipingSurfaceLines,
nodeData.AvailablePipingSoilProfiles);
}
else
{
yield return item;
}
}
}
}
}