public void CalculateComponentsAndMargin()
{
var curSize = new CoreRectangle(0, 0, ControlSize.Width, ControlSize.Height);
curSize = PlaceLegend(curSize);
const double padding = 4;
for (int index = 0; index < AxisY.Count; index++)
{
var yi = AxisY[index];
var titleSize = yi.View.UpdateTitle(this, -90d);
var biggest = yi.PrepareChart(AxisOrientation.Y, this);
var x = curSize.Left;
if (yi.Position == AxisPosition.LeftBottom)
{
yi.View.SetTitleLeft(x);
curSize.Left += titleSize.Height + biggest.Width + padding;
curSize.Width -= (titleSize.Height + biggest.Width + padding);
yi.Tab = curSize.Left;
}
else
{
yi.View.SetTitleLeft(x + curSize.Width - titleSize.Height);
curSize.Width -= (titleSize.Height + biggest.Width + padding);
yi.Tab = curSize.Left + curSize.Width;
}
var uw = yi.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.Y, this, index)/2 : 0;
var topE = biggest.Top - uw;
if (topE> curSize.Top)
{
var dif = topE - curSize.Top;
curSize.Top += dif;
curSize.Height -= dif;
}
var botE = biggest.Bottom - uw;
if (botE > ControlSize.Height - (curSize.Top + curSize.Height))
{
var dif = botE - (ControlSize.Height - (curSize.Top + curSize.Height));
curSize.Height -= dif;
}
}
for (var index = 0; index < AxisX.Count; index++)
{
var xi = AxisX[index];
var titleSize = xi.View.UpdateTitle(this);
var biggest = xi.PrepareChart(AxisOrientation.X, this);
var top = curSize.Top;
if (xi.Position == AxisPosition.LeftBottom)
{
xi.View.SetTitleTop(top + curSize.Height - titleSize.Height);
curSize.Height -= (titleSize.Height + biggest.Height);
xi.Tab = curSize.Top + curSize.Height;
}
else
{
xi.View.SetTitleTop(top);
curSize.Top += titleSize.Height + biggest.Height;
curSize.Height -= (titleSize.Height + biggest.Height);
xi.Tab = curSize.Top;
}
//Notice the unit width is not exact at this point...
var uw = xi.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.X, this, index)/2 : 0;
var leftE = biggest.Left - uw > 0 ? biggest.Left - uw : 0;
if (leftE > curSize.Left)
{
var dif = leftE - curSize.Left;
curSize.Left += dif;
curSize.Width -= dif;
foreach (var correctedAxis in AxisY
.Where(correctedAxis => correctedAxis.Position == AxisPosition.LeftBottom))
{
correctedAxis.Tab += dif;
}
}
var rightE = biggest.Right - uw > 0 ? biggest.Right - uw : 0;
if (rightE > ControlSize.Width - (curSize.Left + curSize.Width))
{
var dif = rightE - (ControlSize.Width - (curSize.Left + curSize.Width));
curSize.Width -= dif;
foreach (var correctedAxis in AxisY
.Where(correctedAxis => correctedAxis.Position == AxisPosition.RightTop))
{
correctedAxis.Tab -= dif;
}
}
}
DrawMargin.Top = curSize.Top;
DrawMargin.Left = curSize.Left;
DrawMargin.Width = curSize.Width;
DrawMargin.Height = curSize.Height;
for (var index = 0; index < AxisY.Count; index++)
{
var yi = AxisY[index];
yi.UpdateSeparators(AxisOrientation.Y, this, index);
yi.View.SetTitleTop(curSize.Top + curSize.Height*.5 + yi.View.GetLabelSize().Width*.5);
}
for (var index = 0; index < AxisX.Count; index++)
{
var xi = AxisX[index];
xi.UpdateSeparators(AxisOrientation.X, this, index);
xi.View.SetTitleLeft(curSize.Left + curSize.Width*.5 - xi.View.GetLabelSize().Width*.5);
}
}