using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Controls;
using glue.HotValue;
using glue.Extensions.Array;
namespace glue.WpfUtil
{
public partial class DagLayoutPanel : Panel
{
internal class RailSet : List<Rail>
{
internal RailSet(LayoutDag _dag)
{
this.AddRange(_dag.GroupBy(n => n.Level)
.OrderBy(g => g.Key)
.Select((grp, ix) =>
{
Rail r = new Rail(this, ix);
foreach (var node in grp)
{
node.railpos = r.AppendNew(new HvdConst(node.DesiredSize.Width), node);
}
return r;
}));
var h = RailsLoaded;
if (h != null)
h(this, new EventArgs());
}
public double MaxWidth { get { return this.Max(r => r.RailWidth); } }
public event EventHandler RailsLoaded;
public void SetRailCount(int c)
{
while (this.Count > c)
this.RemoveAt(this.Count - 1);
while (this.Count < c)
this.Add(new Rail(this, this.Count));
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
internal partial class Rail
{
//double NodeHorizontalPadding = 10.0;
public HvdStatic bvHorzPad = new HvdStatic(10);
List<PosBase> rg = new List<PosBase>();
RailSet rs;
int index;
HvdStatic left_start;
public Rail(RailSet rs, int index)
{
this.rs = rs;
this.index = index;
this.left_start = new HvdStatic(0);
}
public RailSet RailSet { get { return rs; } }
public int RailIndex { get { return index; } }
//public void OnDagLoaded()
//{
// foreach (PosBase pos in rg)
// pos.OnDagLoaded();
//}
public IHvDouble GetRailStart(int iPos)
{
return iPos == 0 ? left_start : rg[iPos - 1].RailCalcs(index).RightPadded;
}
public int Count { get { return rg.Count; } }
public SingleNodePos AppendNew(IHvDouble bvWidth, LayoutDag.Node node)
{
return InsertNew(rg.Count, bvWidth, node);
}
public SingleNodePos InsertNew(int iPos, IHvDouble bvWidth, LayoutDag.Node node)
{
if (iPos > rg.Count)
throw new Exception();
return new SingleNodePos(this, bvWidth, new HvdConst(node.DesiredSize.Height), iPos, node);
}
//public Pos RemoveAt(int iPos)
//{
// Pos pOld = GetItem(iPos);
// if (pOld == null)
// throw new Exception();
// pOld.Remove();
// return pOld;
//}
public double MaxHeight { get { return rg.Max(p => p.RailCalcs(index).Height.Value); } }
public PosBase GetItem(int iPos)
{
return iPos < 0 || iPos >= rg.Count ? null : rg[iPos];
}
public int FindIndex(PosBase item)
{
return rg.IndexOf(item);
}
public int FindIndex(Double xPos)
{
int ix = rg.BinarySearch(xPos, p => p.RailCalcs(index).Center.Value);
if (ix < 0)
ix = ~ix;
return ix;
}
public RailCalcSet FirstItemCalcs { get { return rg[0].RailCalcs(index); } }
public RailCalcSet LastItemCalcs { get { return rg[rg.Count - 1].RailCalcs(index); } }
public Double RailWidth { get { return LastItemCalcs.Right.Value - FirstItemCalcs.Left.Value; } }
};
};
}