PageRenderTime 58ms CodeModel.GetById 49ms app.highlight 5ms RepoModel.GetById 1ms app.codeStats 0ms

/Main/src/DynamicDataDisplay/Common/IndividualArrangePanel.cs

#
C# | 114 lines | 60 code | 13 blank | 41 comment | 2 complexity | 3f02cd8104f92168e28ab3848b92c74c MD5 | raw file
  1using System;
  2using System.Collections.Generic;
  3using System.Linq;
  4using System.Text;
  5using System.Windows;
  6using System.Windows.Media;
  7using System.Collections.Specialized;
  8using System.Collections;
  9using System.ComponentModel;
 10using System.Windows.Controls;
 11
 12namespace Microsoft.Research.DynamicDataDisplay.Common
 13{
 14	/// <summary>
 15	/// Represents a custom Panel, which performs Arrange of its children independently, and does not remeasure or rearrange itself or all children when one child is
 16	/// added or removed.
 17	/// Is intended to be a base class for special layout panels, in which each childr is arranged independently from each other child,
 18	/// e.g. panel with child's position viewport bound to a rectangle in viewport coordinates.
 19	/// </summary>
 20	public abstract class IndividualArrangePanel : Panel
 21	{
 22		private bool inBatchAdd = false;
 23
 24		/// <summary>
 25		/// Initializes a new instance of the <see cref="IndependentArrangePanel"/> class.
 26		/// </summary>
 27		protected IndividualArrangePanel() { }
 28
 29		private UIChildrenCollection children;
 30		/// <summary>
 31		/// Creates a new <see cref="T:System.Windows.Controls.UIElementCollection"/>.
 32		/// </summary>
 33		/// <param name="logicalParent">The logical parent element of the collection to be created.</param>
 34		/// <returns>
 35		/// An ordered collection of elements that have the specified logical parent.
 36		/// </returns>
 37		protected sealed override UIElementCollection CreateUIElementCollection(FrameworkElement logicalParent)
 38		{
 39			children = new UIChildrenCollection(this, logicalParent);
 40			children.IsAddingMany = inBatchAdd;
 41			return children;
 42		}
 43
 44		public bool InBatchAdd
 45		{
 46			get { return children.IsAddingMany; }
 47		}
 48
 49		public virtual void BeginBatchAdd()
 50		{
 51			if (children == null)
 52			{
 53				inBatchAdd = true;
 54				return;
 55			}
 56
 57			children.IsAddingMany = true;
 58		}
 59
 60		public virtual void EndBatchAdd()
 61		{
 62			children.IsAddingMany = false;
 63		}
 64
 65		/// <summary>
 66		/// Called when child is added.
 67		/// </summary>
 68		/// <param name="child">The added child.</param>
 69		protected internal virtual void OnChildAdded(FrameworkElement child) { }
 70
 71		#region Overrides
 72
 73		/// <summary>
 74		/// Overrides <see cref="M:System.Windows.Media.Visual.GetVisualChild(System.Int32)"/>, and returns a child at the specified index from a collection of child elements.
 75		/// </summary>
 76		/// <param name="index">The zero-based index of the requested child element in the collection.</param>
 77		/// <returns>
 78		/// The requested child element. This should not return null; if the provided index is out of range, an exception is thrown.
 79		/// </returns>
 80		protected sealed override Visual GetVisualChild(int index)
 81		{
 82			return Children[index];
 83		}
 84
 85		/// <summary>
 86		/// Gets the number of visual child elements within this element.
 87		/// </summary>
 88		/// <value></value>
 89		/// <returns>
 90		/// The number of visual child elements for this element.
 91		/// </returns>
 92		protected sealed override int VisualChildrenCount
 93		{
 94			get { return Children.Count; }
 95		}
 96
 97		/// <summary>
 98		/// Gets an enumerator for logical child elements of this element.
 99		/// </summary>
100		/// <value></value>
101		/// <returns>
102		/// An enumerator for logical child elements of this element.
103		/// </returns>
104		protected sealed override IEnumerator LogicalChildren
105		{
106			get
107			{
108				return Children.GetEnumerator();
109			}
110		}
111
112		#endregion
113	}
114}