/Main/src/DynamicDataDisplay/Common/IndividualArrangePanel.cs
C# | 114 lines | 60 code | 13 blank | 41 comment | 2 complexity | 3f02cd8104f92168e28ab3848b92c74c MD5 | raw file
Possible License(s): CC-BY-SA-3.0
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}