using System;
using System.Collections;
using System.Drawing;
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.NodePresenters;
using Ringtoets.Piping.Data;
using Ringtoets.Piping.Forms.PresentationObjects;
using Ringtoets.Piping.Forms.Properties;
using Ringtoets.Piping.Service;
using RingtoetsFormsResources = Ringtoets.Common.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 PipingCalculationContextNodePresenter : RingtoetsNodePresenterBase
{
public PipingCalculationContextNodePresenter(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 true;
}
public override bool CanRenameNodeTo(ITreeNode node, string newName)
{
return true;
}
protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, PipingCalculationContext pipingCalculationContext)
{
node.Text = pipingCalculationContext.WrappedData.Name;
node.Image = Resources.PipingIcon;
node.ForegroundColor = Color.FromKnownColor(KnownColor.ControlText);
}
protected override IEnumerable GetChildNodeObjects(PipingCalculationContext pipingCalculationContext)
{
yield return pipingCalculationContext.WrappedData.Comments;
yield return new PipingInputContext
{
WrappedPipingInput = pipingCalculationContext.WrappedData.InputParameters,
AvailablePipingSurfaceLines = pipingCalculationContext.AvailablePipingSurfaceLines,
AvailablePipingSoilProfiles = pipingCalculationContext.AvailablePipingSoilProfiles
};
if (pipingCalculationContext.WrappedData.HasOutput)
{
yield return pipingCalculationContext.WrappedData.Output;
yield return pipingCalculationContext.WrappedData.CalculationReport;
}
else
{
yield return new EmptyPipingOutput();
yield return new EmptyPipingCalculationReport();
}
}
protected override bool CanRemove(object parentNodeData, PipingCalculationContext nodeData)
{
var calculationGroupContext = parentNodeData as PipingCalculationGroupContext;
if (calculationGroupContext != null)
{
return calculationGroupContext.WrappedData.Children.Contains(nodeData.WrappedData);
}
return base.CanRemove(parentNodeData, nodeData);
}
protected override bool RemoveNodeData(object parentNodeData, PipingCalculationContext nodeData)
{
var calculationGroupContext = parentNodeData as PipingCalculationGroupContext;
if (calculationGroupContext != null)
{
var succesfullyRemovedData = calculationGroupContext.WrappedData.Children.Remove(nodeData.WrappedData);
if (succesfullyRemovedData)
{
calculationGroupContext.NotifyObservers();
}
return succesfullyRemovedData;
}
return base.RemoveNodeData(parentNodeData, nodeData);
}
protected override void OnNodeRenamed(PipingCalculationContext pipingCalculationContext, string newName)
{
pipingCalculationContext.WrappedData.Name = newName;
pipingCalculationContext.WrappedData.NotifyObservers();
}
protected override ContextMenuStrip GetContextMenu(ITreeNode sender, PipingCalculationContext nodeData)
{
PipingCalculation calculation = nodeData.WrappedData;
var validateItem = new StrictContextMenuItem(Resources.Validate,
null,
Resources.ValidationIcon,
(o, args) => { PipingCalculationService.Validate(calculation); });
var calculateItem = new StrictContextMenuItem(Resources.Calculate,
null,
Resources.Play,
(o, args) => { RunActivityAction(new PipingCalculationActivity(calculation)); });
var clearOutputItem = new StrictContextMenuItem(Resources.Clear_output,
null,
RingtoetsFormsResources.ClearIcon,
(o, args) =>
{
calculation.ClearOutput();
calculation.NotifyObservers();
});
if (!calculation.HasOutput)
{
clearOutputItem.Enabled = false;
clearOutputItem.ToolTipText = Resources.ClearOutput_No_output_to_clear;
}
return contextMenuBuilderProvider
.Get(sender)
.AddCustomItem(validateItem)
.AddCustomItem(calculateItem)
.AddCustomItem(clearOutputItem)
.AddSeparator()
.AddDeleteItem()
.AddSeparator()
.AddExpandAllItem()
.AddCollapseAllItem()
.AddSeparator()
.AddImportItem()
.AddExportItem()
.AddSeparator()
.AddPropertiesItem()
.Build();
}
}
}