Since you're using C#, you can make your initializers a bit nicer:
Grid g = new Grid()
{
Width = 50,
Height = 50,
Tag = focus,
}
//Canvas.SetZIndex(g, 100);
The last part of your code (or rather, the second half) does very similar things multiple times: code duplication is a sign your code can be made clearer. For instance (note that your code almost surely contains a bug! The statement inside all the loops invokes s2 and not s3):
foreach (SourceFile s in list)
{
foreach (SourceFile source in s.getInvocations())
{
foreach (SourceFile s1 in source.getInvocations())
{
foreach (SourceFile s2 in s1.getInvocations())
{
foreach (SourceFile s3 in s2.getInvocations())
{
invoCount = invoCount + s2.getInvocations().Count;
}
}
}
}
}
can be changed into
list.CountRecursive(t => t.getInvocations(), t => t.getInvocations().Count, 5);
(...)
public static int CountRecursive<T>(this IEnumerable<T> x, Func<T, IEnumerable<T>> f, Func<T, int> c, int depth)
{
int counter = 0;
foreach (T t in x)
{
if (depth > 1)
{
counter += f(t).CountRecursive(f, c, depth - 1);
}
else
{
counter += c(t);
}
}
return counter;
}
which also makes it a lot easier to do it for different recursion levels.