using System;
using System.Collections.Generic;
using System.Reflection;
using DiagramUI;
using CategoryTheory;
using DataPerformer.Attributes;
using DataPerformer.Interfaces;
using DiagramUI.Interfaces;
namespace DataPerformer
{
/// <summary>
/// Post load of data desktop
/// </summary>
public class DataDesktopPostLoad
{
#region Fields
/// <summary>
/// Singleton
/// </summary>
public static DataDesktopPostLoad Object = new DataDesktopPostLoad();
private static int completionLevel = 3;
#endregion
#region Ctor
/// <summary>
/// Default constructor
/// </summary>
protected DataDesktopPostLoad()
{
}
#endregion
#region IDesktopPostLoad Members
/// <summary>
/// Post load operation
/// </summary>
/// <param name="desktop">The desktop for post load</param>
public virtual void PostLoad(IDesktop desktop)
{
object[] o = PureDesktop.GetIntersectObjects(desktop, new Type[] { typeof(IDataConsumer), typeof(IMeasurements) });
int i = 0;
while (!Complete(o))
{
++i;
if (i >= completionLevel)
{
break;
}
}
}
#endregion
bool Complete(object[] objs)
{
bool b = true;
foreach (object o in objs)
{
Type t = o.GetType();
PropertyInfo pi = t.GetProperty("IsComplete");
if (pi == null)
{
continue;
}
bool bi = (bool)pi.GetValue(o, null);
if (!bi)
{
Complete(o);
b = false;
}
}
return b;
}
void Complete(object o)
{
if (o is IDataConsumer)
{
IDataConsumer dc = o as IDataConsumer;
for (int i = 0; i < dc.Count; i++)
{
IMeasurements m = dc[i];
CompletePost(m);
}
}
CompletePost(o);
CompleteSource(o as ICategoryObject);
}
void CompleteSource(ICategoryObject obj)
{
ICategoryArrow[] arr = obj.GetTargetArrows<DataLink>();
foreach (ICategoryArrow a in arr)
{
ICategoryObject o = a.Source;
CompletePost(o);
CompleteSource(o);
}
}
static void CompletePost(object obj)
{
Type type = obj.GetType();
object[] attr = type.GetCustomAttributes(typeof(ShouldCompleteAttribute), true);
//bool isComplete = false;
if (attr.Length > 0)
{
ShouldCompleteAttribute at = attr[0] as ShouldCompleteAttribute;
if (at.ShouldComplete)
{
MethodInfo mi = type.GetMethod("Complete", new Type[0]);
if (mi != null)
{
mi.Invoke(obj, new object[0]);
//isComplete = true;
return;
}
}
}
if (obj is IPostSetArrow)
{
IPostSetArrow ps = obj as IPostSetArrow;
ps.PostSetArrow();
}
}
}
}