using System;
using System.Collections;
using System.Linq;
using System.Windows.Forms;
using Core.Common.Base.Workflow;
using Core.Common.Controls;
using Ringtoets.Common.Forms.Extensions;
using Ringtoets.Common.Forms.NodePresenters;
using Ringtoets.Piping.Data;
using Ringtoets.Piping.Service;
using Ringtoets.Piping.Forms.PresentationObjects;
using Ringtoets.Piping.Forms.Properties;
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
{
///
/// Injection points for a method to cause an to be scheduled for execution.
///
public Action RunActivityAction { private get; set; }
protected override void UpdateNode(ITreeNode parentNode, ITreeNode node, PipingCalculationContext pipingCalculationContext)
{
node.Text = pipingCalculationContext.WrappedData.Name;
node.Image = Resources.PipingIcon;
}
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();
}
}
public override bool CanRenameNode(ITreeNode node)
{
return true;
}
public override bool CanRenameNodeTo(ITreeNode node, string newName)
{
return true;
}
protected override bool CanRemove(object parentNodeData, PipingCalculationContext nodeData)
{
var calculationsFolder = parentNodeData as PipingCalculationsTreeFolder;
if (calculationsFolder != null)
{
return calculationsFolder.Contents.OfType().Contains(nodeData);
}
return base.CanRemove(parentNodeData, nodeData);
}
protected override bool RemoveNodeData(object parentNodeData, PipingCalculationContext nodeData)
{
var calculationsFolder = parentNodeData as PipingCalculationsTreeFolder;
if (calculationsFolder != null)
{
var succesfullyRemovedData = calculationsFolder.ParentFailureMechanism.Calculations.Remove(nodeData.WrappedData);
calculationsFolder.ParentFailureMechanism.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 contextMenu = new ContextMenuStrip();
contextMenu.AddMenuItem(Resources.Validate,
null,
Resources.ValidationIcon,
(o, args) =>
{
PipingCalculationService.Validate(calculation);
});
contextMenu.AddMenuItem(Resources.Calculate,
null,
Resources.Play,
(o, args) =>
{
RunActivityAction(new PipingCalculationActivity(calculation));
});
var clearOutputItem = contextMenu.AddMenuItem(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 contextMenu;
}
}
}