Added Index/Position method to DynamicNode for when it's contained within a DynamicNodeList and you're iterating

Added bool IsHelper(Func<DynamicNode,bool>), string IsHelper(Func<DynamicNode,bool>, string valueIfTrue), string IsHelper(Func<DynamicNode,bool>, string valueIfTrue, string valueIfFlase)
Added IsFirst/IsLast/IsOdd/IsEven helpers for checking position in current context/list
Added IsEqual for checking if the current node matches another by Id
Added IsDescendant/IsDescendantOrSelf/IsAncestor/IsAncestorOrSelf for checking relationships between two nodes
This commit is contained in:
agrath@gmail.com
2011-03-22 18:48:57 -13:00
parent 93d65ced40
commit 3d396d2b63

View File

@@ -1007,5 +1007,169 @@ namespace umbraco.MacroEngines
{
return true;
}
public int Position()
{
return this.Index();
}
public int Index()
{
if (this.ownerList == null && this.Parent != null)
{
var list = this.Parent.ChildrenAsList.ConvertAll(n => new DynamicNode(n));
this.ownerList = new DynamicNodeList(list);
}
if (this.ownerList != null)
{
List<DynamicNode> container = this.ownerList.Items.ToList();
int currentIndex = container.FindIndex(n => n.Id == this.Id);
if (currentIndex != -1)
{
return currentIndex;
}
else
{
throw new IndexOutOfRangeException(string.Format("Node {0} belongs to a DynamicNodeList but could not retrieve the index for it's position in the list", this.Id));
}
}
else
{
throw new ArgumentNullException(string.Format("Node {0} has been orphaned and doesn't belong to a DynamicNodeList", this.Id));
}
}
public bool IsFirst()
{
return IsHelper(n => n.Index() == 0);
}
public string IsFirst(string valueIfTrue)
{
return IsHelper(n => n.Index() == 0, valueIfTrue);
}
public string IsFirst(string valueIfTrue, string valueIfFalse)
{
return IsHelper(n => n.Index() == 0, valueIfTrue, valueIfFalse);
}
public bool IsLast()
{
int count = this.Parent.ChildrenAsList.Count;
return IsHelper(n => n.Index() == count - 1);
}
public string IsLast(string valueIfTrue)
{
int count = this.Parent.ChildrenAsList.Count;
return IsHelper(n => n.Index() == count - 1, valueIfTrue);
}
public string IsLast(string valueIfTrue, string valueIfFalse)
{
int count = this.Parent.ChildrenAsList.Count;
return IsHelper(n => n.Index() == count - 1, valueIfTrue, valueIfFalse);
}
public bool IsEven()
{
return IsHelper(n => n.Index() % 2 == 0);
}
public string IsEven(string valueIfTrue)
{
return IsHelper(n => n.Index() % 2 == 0, valueIfTrue);
}
public string IsEven(string valueIfTrue, string valueIfFalse)
{
return IsHelper(n => n.Index() % 2 == 0, valueIfTrue, valueIfFalse);
}
public bool IsOdd()
{
return IsHelper(n => n.Index() % 2 == 1);
}
public string IsOdd(string valueIfTrue)
{
return IsHelper(n => n.Index() % 2 == 1, valueIfTrue);
}
public string IsOdd(string valueIfTrue, string valueIfFalse)
{
return IsHelper(n => n.Index() % 2 == 1, valueIfTrue, valueIfFalse);
}
public bool IsEqual(DynamicNode other)
{
return IsHelper(n => n.Id == other.Id);
}
public string IsEqual(DynamicNode other, string valueIfTrue)
{
return IsHelper(n => n.Id == other.Id, valueIfTrue);
}
public string IsEqual(DynamicNode other, string valueIfTrue, string valueIfFalse)
{
return IsHelper(n => n.Id == other.Id, valueIfTrue, valueIfFalse);
}
public bool IsDescendant(DynamicNode other)
{
var ancestors = this.Ancestors();
return IsHelper(n => ancestors.Items.Find(ancestor => ancestor.Id == other.Id) != null);
}
public string IsDescendant(DynamicNode other, string valueIfTrue)
{
var ancestors = this.Ancestors();
return IsHelper(n => ancestors.Items.Find(ancestor => ancestor.Id == other.Id) != null, valueIfTrue);
}
public string IsDescendant(DynamicNode other, string valueIfTrue, string valueIfFalse)
{
var ancestors = this.Ancestors();
return IsHelper(n => ancestors.Items.Find(ancestor => ancestor.Id == other.Id) != null, valueIfTrue, valueIfFalse);
}
public bool IsDescendantOrSelf(DynamicNode other)
{
var ancestors = this.AncestorsOrSelf();
return IsHelper(n => ancestors.Items.Find(ancestor => ancestor.Id == other.Id) != null);
}
public string IsDescendantOrSelf(DynamicNode other, string valueIfTrue)
{
var ancestors = this.AncestorsOrSelf();
return IsHelper(n => ancestors.Items.Find(ancestor => ancestor.Id == other.Id) != null, valueIfTrue);
}
public string IsDescendantOrSelf(DynamicNode other, string valueIfTrue, string valueIfFalse)
{
var ancestors = this.AncestorsOrSelf();
return IsHelper(n => ancestors.Items.Find(ancestor => ancestor.Id == other.Id) != null, valueIfTrue, valueIfFalse);
}
public bool IsAncestor(DynamicNode other)
{
var descendants = this.Descendants();
return IsHelper(n => descendants.Items.Find(descendant => descendant.Id == other.Id) != null);
}
public string IsAncestor(DynamicNode other, string valueIfTrue)
{
var descendants = this.Descendants();
return IsHelper(n => descendants.Items.Find(descendant => descendant.Id == other.Id) != null, valueIfTrue);
}
public string IsAncestor(DynamicNode other, string valueIfTrue, string valueIfFalse)
{
var descendants = this.Descendants();
return IsHelper(n => descendants.Items.Find(descendant => descendant.Id == other.Id) != null, valueIfTrue, valueIfFalse);
}
public bool IsAncestorOrSelf(DynamicNode other)
{
var descendants = this.DescendantsOrSelf();
return IsHelper(n => descendants.Items.Find(descendant => descendant.Id == other.Id) != null);
}
public string IsAncestorOrSelf(DynamicNode other, string valueIfTrue)
{
var descendants = this.DescendantsOrSelf();
return IsHelper(n => descendants.Items.Find(descendant => descendant.Id == other.Id) != null, valueIfTrue);
}
public string IsAncestorOrSelf(DynamicNode other, string valueIfTrue, string valueIfFalse)
{
var descendants = this.DescendantsOrSelf();
return IsHelper(n => descendants.Items.Find(descendant => descendant.Id == other.Id) != null, valueIfTrue, valueIfFalse);
}
public bool IsHelper(Func<DynamicNode, bool> test)
{
return test(this);
}
public string IsHelper(Func<DynamicNode, bool> test, string valueIfTrue)
{
return IsHelper(test, valueIfTrue, null);
}
public string IsHelper(Func<DynamicNode, bool> test, string valueIfTrue, string valueIfFalse)
{
return test(this) ? valueIfTrue : valueIfFalse;
}
}
}