using System.Collections.Generic;
using System.Drawing;
using System.Linq;
namespace Kaleida.ServiceMonitor.Model.Layout
{
class StatusWindowLayoutStrategy
{
private readonly IScriptNode rootNode;
public StatusWindowLayoutStrategy(IScriptNode rootNode)
{
this.rootNode = rootNode;
}
public IList<ScriptArea> CalculateLayout(Rectangle availableSpace)
{
return CalculateLayout(rootNode, availableSpace, true);
}
private static IList<ScriptArea> CalculateLayout(IScriptNode node, Rectangle availableSpace, bool splitHorizontally)
{
if (!node.Children.Any())
return new List<ScriptArea> {new ScriptArea(node, availableSpace)};
var rectangles = new List<ScriptArea>();
for (int i = 0; i < node.Children.Count; i++)
{
var child = node.Children[i];
var allocation = CalculateShare(availableSpace, node.Children.Count, i, splitHorizontally);
rectangles.AddRange(CalculateLayout(child, allocation, !splitHorizontally));
}
return rectangles;
}
private static Rectangle CalculateShare(Rectangle availableSpace, int total, int index, bool splitHorizontally)
{
return splitHorizontally
? CalculateHorizontalShare(availableSpace, total, index)
: CalculateVerticalShare(availableSpace, total, index);
}
private static Rectangle CalculateHorizontalShare(Rectangle availableSpace, int total, int index)
{
var heightOfArea = availableSpace.Height / total;
return new Rectangle(availableSpace.Left, availableSpace.Top + heightOfArea * index, availableSpace.Width, heightOfArea);
}
private static Rectangle CalculateVerticalShare(Rectangle availableSpace, int total, int index)
{
var widthOfArea = availableSpace.Width / total;
return new Rectangle(availableSpace.Left + widthOfArea * index, availableSpace.Top, widthOfArea, availableSpace.Height);
}
}
}