using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Collections;
using Microsoft.Research.DynamicDataDisplay.Charts;
namespace Microsoft.Research.DynamicDataDisplay.Common
{
///
/// Collection of UI children of .
///
internal sealed class UIChildrenCollection : UIElementCollection
{
IndividualArrangePanel hostPanel;
///
/// Initializes a new instance of the class.
///
internal UIChildrenCollection(UIElement visualParent, FrameworkElement logicalParent)
: base(visualParent, logicalParent)
{
hostPanel = (IndividualArrangePanel)visualParent;
visualChildren = new VisualCollection(visualParent);
}
private readonly VisualCollection visualChildren;
private bool isAddingMany = false;
public bool IsAddingMany
{
get { return isAddingMany; }
set { isAddingMany = value; }
}
public override int Add(UIElement element)
{
if (element == null)
throw new ArgumentNullException("element");
SetLogicalParent(element);
var index = visualChildren.Add(element);
if (!isAddingMany)
{
hostPanel.InvalidateMeasure();
}
else
{
hostPanel.OnChildAdded((FrameworkElement)element);
}
return index;
}
public override void Clear()
{
if (visualChildren.Count > 0)
{
Visual[] visualArray = new Visual[visualChildren.Count];
for (int i = 0; i < visualChildren.Count; i++)
{
visualArray[i] = visualChildren[i];
}
visualChildren.Clear();
for (int i = 0; i < visualArray.Length; i++)
{
UIElement element = visualArray[i] as UIElement;
if (element != null)
{
ClearLogicalParent(element);
}
}
}
}
public override bool Contains(UIElement element)
{
return visualChildren.Contains(element);
}
public override void CopyTo(Array array, int index)
{
visualChildren.CopyTo(array, index);
}
public override void CopyTo(UIElement[] array, int index)
{
visualChildren.CopyTo(array, index);
}
public override IEnumerator GetEnumerator()
{
return visualChildren.GetEnumerator();
}
public override int IndexOf(UIElement element)
{
return visualChildren.IndexOf(element);
}
public override void Insert(int index, UIElement element)
{
if (element == null)
throw new ArgumentNullException("element");
hostPanel.OnChildAdded((FrameworkElement)element);
SetLogicalParent(element);
visualChildren.Insert(index, element);
}
public override void Remove(UIElement element)
{
visualChildren.Remove(element);
ClearLogicalParent(element);
}
public override void RemoveAt(int index)
{
UIElement element = visualChildren[index] as UIElement;
visualChildren.RemoveAt(index);
if (element != null)
{
ClearLogicalParent(element);
}
}
public override void RemoveRange(int index, int count)
{
int actualCount = visualChildren.Count;
if (count > (actualCount - index))
{
count = actualCount - index;
}
if (count > 0)
{
Visual[] visualArray = new Visual[count];
int copyIndex = index;
for (int i = 0; i < count; i++)
{
visualArray[i] = visualChildren[copyIndex];
copyIndex++;
}
visualChildren.RemoveRange(index, count);
for (int i = 0; i < count; i++)
{
UIElement element = visualArray[i] as UIElement;
if (element != null)
{
ClearLogicalParent(element);
}
}
}
}
public override UIElement this[int index]
{
get
{
return visualChildren[index] as UIElement;
}
set
{
if (value == null)
throw new ArgumentNullException("value");
if (visualChildren[index] != value)
{
UIElement element = visualChildren[index] as UIElement;
if (element != null)
{
ClearLogicalParent(element);
}
hostPanel.OnChildAdded((FrameworkElement)value);
visualChildren[index] = value;
SetLogicalParent(value);
}
}
}
public override int Capacity
{
get { return visualChildren.Capacity; }
set { visualChildren.Capacity = value; }
}
public override int Count
{
get { return visualChildren.Count; }
}
public override bool IsSynchronized
{
get { return visualChildren.IsSynchronized; }
}
public override object SyncRoot
{
get { return visualChildren.SyncRoot; }
}
}
}