Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / Documents / Table.cs / 1305600 / Table.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: Table implementation // // See spec at http://avalon/layout/Tables/WPP%20TableOM.doc // // History: // 05/19/2003 : olego - created // //--------------------------------------------------------------------------- using MS.Internal; using MS.Internal.PtsHost; using MS.Internal.PtsTable; using MS.Utility; using System; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Windows.Threading; using System.Windows; using System.Windows.Automation.Peers; using System.Windows.Media; using System.Windows.Markup; using MS.Internal.PtsHost.UnsafeNativeMethods; using MS.Internal.Documents; #pragma warning disable 1634, 1691 // suppressing PreSharp warnings namespace System.Windows.Documents { ////// Table implements /// [ContentProperty("RowGroups")] public class Table : Block, IAddChild, IAcceptInsertion { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors ////// Static ctor. Initializes property metadata. /// static Table() { MarginProperty.OverrideMetadata(typeof(Table), new FrameworkPropertyMetadata(new Thickness(Double.NaN))); } ////// Table constructor. /// public Table() { PrivateInitialize(); } #endregion Constructors //------------------------------------------------------ // // Public Methods // //----------------------------------------------------- #region Public Methods ////// void IAddChild.AddChild(object value) { if (value == null) { throw new ArgumentNullException("value"); } TableRowGroup rowGroup = value as TableRowGroup; if (rowGroup != null) { RowGroups.Add(rowGroup); return; } throw (new ArgumentException(SR.Get(SRID.UnexpectedParameterType, value.GetType(), typeof(TableRowGroup)), "value")); } ////// /// void IAddChild.AddText(string text) { XamlSerializerUtil.ThrowIfNonWhiteSpaceInAddText(text, this); } ////// /// Initialization of this element is about to begin /// public override void BeginInit() { base.BeginInit(); _initializing = true; } ////// Initialization of this element has completed /// public override void EndInit() { _initializing = false; OnStructureChanged(); base.EndInit(); } ////// ////// /// children enumerated in the following order: /// * columns /// * rowgroups /// protected internal override IEnumerator LogicalChildren { get { return (new TableChildrenCollectionEnumeratorSimple(this)); } } #endregion Public Methods //------------------------------------------------------ // // Public Properties // //------------------------------------------------------ #region Public Properties ////// Returns table column collection. /// [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TableColumnCollection Columns { get { return (_columns); } } ////// This method is used by TypeDescriptor to determine if this property should /// be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeColumns() { return (Columns.Count > 0); } ////// Returns table row group. /// [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TableRowGroupCollection RowGroups { get { return (_rowGroups); } } ////// Cell spacing property. /// [TypeConverter(typeof(LengthConverter))] public double CellSpacing { get { return (double) GetValue(CellSpacingProperty); } set { SetValue(CellSpacingProperty, value); } } #endregion Public Properties //----------------------------------------------------- // // Protected Methods // //------------------------------------------------------ #region Protected Methods ////// Creates AutomationPeer ( protected override AutomationPeer OnCreateAutomationPeer() { return new TableAutomationPeer(this); } #endregion Protected Methods //----------------------------------------------------- // // Internal Properties // //----------------------------------------------------- #region Internal Properties ///) /// /// Internal cell spacing getter /// internal double InternalCellSpacing { get { return Math.Max(CellSpacing, 0); } } int IAcceptInsertion.InsertionIndex { get { return this.InsertionIndex; } set { this.InsertionIndex = value; } } ////// Stores temporary data for where to insert a new row group /// internal int InsertionIndex { get { return _rowGroupInsertionIndex; } set { _rowGroupInsertionIndex = value; } } ////// Count of columns in the table /// internal int ColumnCount { get { return (_columnCount); } } #endregion Internal Properties //----------------------------------------------------- // // Internal Methods // //------------------------------------------------------ #region Internal Methods ////// Updates table actual column count /// /// Count of column to account for internal void EnsureColumnCount(int columnCount) { if (_columnCount < columnCount) _columnCount = columnCount; } ////// OnStructureChanged - Called to rebuild structure. /// internal void OnStructureChanged() { if (!_initializing) { if (TableStructureChanged != null) { TableStructureChanged(this, EventArgs.Empty); } ValidateStructure(); // Table structure changes affect number of rows and colums. Need to notify peer about it. TableAutomationPeer peer = ContentElementAutomationPeer.FromElement(this) as TableAutomationPeer; if (peer != null) { peer.OnStructureInvalidated(); } } } ////// ValidateStructure /// internal void ValidateStructure() { if (!_initializing) { // // validate row groups structural cache // _columnCount = 0; for (int i = 0; i < _rowGroups.Count; ++i) { _rowGroups[i].ValidateStructure(); } _version++; } } ////// Notifies the text container that some property change has occurred, requiring a revalidation of table. /// internal void InvalidateColumns() { NotifyTypographicPropertyChanged(true /* affectsMeasureOrArrange */, true /* localValueChanged */, null); } ////// Returns true if the given rowGroupIndex is the first non-empty one /// internal bool IsFirstNonEmptyRowGroup(int rowGroupIndex) { rowGroupIndex--; while(rowGroupIndex >= 0) { if(RowGroups[rowGroupIndex].Rows.Count > 0) { return false; } rowGroupIndex--; } return true; } ////// Returns true if the given rowGroupIndex is the last non-empty one /// internal bool IsLastNonEmptyRowGroup(int rowGroupIndex) { rowGroupIndex++; while(rowGroupIndex < RowGroups.Count) { if(RowGroups[rowGroupIndex].Rows.Count > 0) { return false; } rowGroupIndex++; } return true; } #endregion Internal Methods //----------------------------------------------------- // // Internal Events // //------------------------------------------------------ #region Internal Events ////// Fired when the table changes structurally /// internal event EventHandler TableStructureChanged; #endregion //------------------------------------------------------ // // Private Methods // //----------------------------------------------------- #region Private Methods ////// Private ctor time initialization. /// private void PrivateInitialize() { // Acquire new PTS Context. _columns = new TableColumnCollection(this); _rowGroups = new TableRowGroupCollection(this); _rowGroupInsertionIndex = -1; } private static bool IsValidCellSpacing(object o) { double spacing = (double)o; double maxSpacing = Math.Min(1000000, PTS.MaxPageSize); if (Double.IsNaN(spacing)) { return false; } if (spacing < 0 || spacing > maxSpacing) { return false; } return true; } #endregion Private Methods //------------------------------------------------------ // // Private Fields // //----------------------------------------------------- #region Private Fields private TableColumnCollection _columns; // collection of columns private TableRowGroupCollection _rowGroups; // collection of row groups private int _rowGroupInsertionIndex; // insertion index used by row group collection private const double c_defaultCellSpacing = 2; // default value of cell spacing private int _columnCount; private int _version = 0; private bool _initializing; // True if the table is being initialized #endregion Private Fields //----------------------------------------------------- // // Private Structures / Classes // //----------------------------------------------------- #region Private Structures Classes ////// Implementation of a simple enumerator of table's children /// private class TableChildrenCollectionEnumeratorSimple : IEnumerator, ICloneable { internal TableChildrenCollectionEnumeratorSimple(Table table) { Debug.Assert(table != null); _table = table; _version = _table._version; _columns = ((IEnumerable)_table._columns).GetEnumerator(); _rowGroups = ((IEnumerable)_table._rowGroups).GetEnumerator(); } public Object Clone() { return (MemberwiseClone()); } public bool MoveNext() { if (_version != _table._version) { throw new InvalidOperationException(SR.Get(SRID.EnumeratorVersionChanged)); } // Strange design, but iterator must spin on contained column iterator if ((_currentChildType != ChildrenTypes.Columns) && (_currentChildType != ChildrenTypes.RowGroups)) _currentChildType++; Object currentChild = null; while (_currentChildType < ChildrenTypes.AfterLast) { switch (_currentChildType) { case (ChildrenTypes.Columns): if (_columns.MoveNext()) { currentChild = _columns.Current; } break; case (ChildrenTypes.RowGroups): if (_rowGroups.MoveNext()) { currentChild = _rowGroups.Current; } break; } if (currentChild != null) { _currentChild = currentChild; break; } _currentChildType++; } Debug.Assert(_currentChildType != ChildrenTypes.BeforeFirst); return (_currentChildType != ChildrenTypes.AfterLast); } public Object Current { get { if (_currentChildType == ChildrenTypes.BeforeFirst) { #pragma warning suppress 6503 // IEnumerator.Current is documented to throw this exception throw new InvalidOperationException(SR.Get(SRID.EnumeratorNotStarted)); } if (_currentChildType == ChildrenTypes.AfterLast) { #pragma warning suppress 6503 // IEnumerator.Current is documented to throw this exception throw new InvalidOperationException(SR.Get(SRID.EnumeratorReachedEnd)); } return (_currentChild); } } public void Reset() { if (_version != _table._version) { throw new InvalidOperationException(SR.Get(SRID.EnumeratorVersionChanged)); } _columns.Reset(); _rowGroups.Reset(); _currentChildType = ChildrenTypes.BeforeFirst; _currentChild = null; } private Table _table; private int _version; private IEnumerator _columns; private IEnumerator _rowGroups; private ChildrenTypes _currentChildType; private Object _currentChild; private enum ChildrenTypes : int { BeforeFirst = 0, Columns = 1, RowGroups = 2, AfterLast = 3, } } #endregion Private Structures Classes //------------------------------------------------------ // // Properties // //----------------------------------------------------- #region Properties ////// Cell spacing property. /// public static readonly DependencyProperty CellSpacingProperty = DependencyProperty.Register( "CellSpacing", typeof(double), typeof(Table), new FrameworkPropertyMetadata( c_defaultCellSpacing, FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(IsValidCellSpacing)); #endregion Properties //------------------------------------------------------ // // Debug / Performance // //------------------------------------------------------ #if TABLEPARANOIA internal int ParanoiaVersion = 0; #endif // TABLEPARANOIA } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: Table implementation // // See spec at http://avalon/layout/Tables/WPP%20TableOM.doc // // History: // 05/19/2003 : olego - created // //--------------------------------------------------------------------------- using MS.Internal; using MS.Internal.PtsHost; using MS.Internal.PtsTable; using MS.Utility; using System; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Windows.Threading; using System.Windows; using System.Windows.Automation.Peers; using System.Windows.Media; using System.Windows.Markup; using MS.Internal.PtsHost.UnsafeNativeMethods; using MS.Internal.Documents; #pragma warning disable 1634, 1691 // suppressing PreSharp warnings namespace System.Windows.Documents { ////// Table implements /// [ContentProperty("RowGroups")] public class Table : Block, IAddChild, IAcceptInsertion { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors ////// Static ctor. Initializes property metadata. /// static Table() { MarginProperty.OverrideMetadata(typeof(Table), new FrameworkPropertyMetadata(new Thickness(Double.NaN))); } ////// Table constructor. /// public Table() { PrivateInitialize(); } #endregion Constructors //------------------------------------------------------ // // Public Methods // //----------------------------------------------------- #region Public Methods ////// void IAddChild.AddChild(object value) { if (value == null) { throw new ArgumentNullException("value"); } TableRowGroup rowGroup = value as TableRowGroup; if (rowGroup != null) { RowGroups.Add(rowGroup); return; } throw (new ArgumentException(SR.Get(SRID.UnexpectedParameterType, value.GetType(), typeof(TableRowGroup)), "value")); } ////// /// void IAddChild.AddText(string text) { XamlSerializerUtil.ThrowIfNonWhiteSpaceInAddText(text, this); } ////// /// Initialization of this element is about to begin /// public override void BeginInit() { base.BeginInit(); _initializing = true; } ////// Initialization of this element has completed /// public override void EndInit() { _initializing = false; OnStructureChanged(); base.EndInit(); } ////// ////// /// children enumerated in the following order: /// * columns /// * rowgroups /// protected internal override IEnumerator LogicalChildren { get { return (new TableChildrenCollectionEnumeratorSimple(this)); } } #endregion Public Methods //------------------------------------------------------ // // Public Properties // //------------------------------------------------------ #region Public Properties ////// Returns table column collection. /// [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TableColumnCollection Columns { get { return (_columns); } } ////// This method is used by TypeDescriptor to determine if this property should /// be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeColumns() { return (Columns.Count > 0); } ////// Returns table row group. /// [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TableRowGroupCollection RowGroups { get { return (_rowGroups); } } ////// Cell spacing property. /// [TypeConverter(typeof(LengthConverter))] public double CellSpacing { get { return (double) GetValue(CellSpacingProperty); } set { SetValue(CellSpacingProperty, value); } } #endregion Public Properties //----------------------------------------------------- // // Protected Methods // //------------------------------------------------------ #region Protected Methods ////// Creates AutomationPeer ( protected override AutomationPeer OnCreateAutomationPeer() { return new TableAutomationPeer(this); } #endregion Protected Methods //----------------------------------------------------- // // Internal Properties // //----------------------------------------------------- #region Internal Properties ///) /// /// Internal cell spacing getter /// internal double InternalCellSpacing { get { return Math.Max(CellSpacing, 0); } } int IAcceptInsertion.InsertionIndex { get { return this.InsertionIndex; } set { this.InsertionIndex = value; } } ////// Stores temporary data for where to insert a new row group /// internal int InsertionIndex { get { return _rowGroupInsertionIndex; } set { _rowGroupInsertionIndex = value; } } ////// Count of columns in the table /// internal int ColumnCount { get { return (_columnCount); } } #endregion Internal Properties //----------------------------------------------------- // // Internal Methods // //------------------------------------------------------ #region Internal Methods ////// Updates table actual column count /// /// Count of column to account for internal void EnsureColumnCount(int columnCount) { if (_columnCount < columnCount) _columnCount = columnCount; } ////// OnStructureChanged - Called to rebuild structure. /// internal void OnStructureChanged() { if (!_initializing) { if (TableStructureChanged != null) { TableStructureChanged(this, EventArgs.Empty); } ValidateStructure(); // Table structure changes affect number of rows and colums. Need to notify peer about it. TableAutomationPeer peer = ContentElementAutomationPeer.FromElement(this) as TableAutomationPeer; if (peer != null) { peer.OnStructureInvalidated(); } } } ////// ValidateStructure /// internal void ValidateStructure() { if (!_initializing) { // // validate row groups structural cache // _columnCount = 0; for (int i = 0; i < _rowGroups.Count; ++i) { _rowGroups[i].ValidateStructure(); } _version++; } } ////// Notifies the text container that some property change has occurred, requiring a revalidation of table. /// internal void InvalidateColumns() { NotifyTypographicPropertyChanged(true /* affectsMeasureOrArrange */, true /* localValueChanged */, null); } ////// Returns true if the given rowGroupIndex is the first non-empty one /// internal bool IsFirstNonEmptyRowGroup(int rowGroupIndex) { rowGroupIndex--; while(rowGroupIndex >= 0) { if(RowGroups[rowGroupIndex].Rows.Count > 0) { return false; } rowGroupIndex--; } return true; } ////// Returns true if the given rowGroupIndex is the last non-empty one /// internal bool IsLastNonEmptyRowGroup(int rowGroupIndex) { rowGroupIndex++; while(rowGroupIndex < RowGroups.Count) { if(RowGroups[rowGroupIndex].Rows.Count > 0) { return false; } rowGroupIndex++; } return true; } #endregion Internal Methods //----------------------------------------------------- // // Internal Events // //------------------------------------------------------ #region Internal Events ////// Fired when the table changes structurally /// internal event EventHandler TableStructureChanged; #endregion //------------------------------------------------------ // // Private Methods // //----------------------------------------------------- #region Private Methods ////// Private ctor time initialization. /// private void PrivateInitialize() { // Acquire new PTS Context. _columns = new TableColumnCollection(this); _rowGroups = new TableRowGroupCollection(this); _rowGroupInsertionIndex = -1; } private static bool IsValidCellSpacing(object o) { double spacing = (double)o; double maxSpacing = Math.Min(1000000, PTS.MaxPageSize); if (Double.IsNaN(spacing)) { return false; } if (spacing < 0 || spacing > maxSpacing) { return false; } return true; } #endregion Private Methods //------------------------------------------------------ // // Private Fields // //----------------------------------------------------- #region Private Fields private TableColumnCollection _columns; // collection of columns private TableRowGroupCollection _rowGroups; // collection of row groups private int _rowGroupInsertionIndex; // insertion index used by row group collection private const double c_defaultCellSpacing = 2; // default value of cell spacing private int _columnCount; private int _version = 0; private bool _initializing; // True if the table is being initialized #endregion Private Fields //----------------------------------------------------- // // Private Structures / Classes // //----------------------------------------------------- #region Private Structures Classes ////// Implementation of a simple enumerator of table's children /// private class TableChildrenCollectionEnumeratorSimple : IEnumerator, ICloneable { internal TableChildrenCollectionEnumeratorSimple(Table table) { Debug.Assert(table != null); _table = table; _version = _table._version; _columns = ((IEnumerable)_table._columns).GetEnumerator(); _rowGroups = ((IEnumerable)_table._rowGroups).GetEnumerator(); } public Object Clone() { return (MemberwiseClone()); } public bool MoveNext() { if (_version != _table._version) { throw new InvalidOperationException(SR.Get(SRID.EnumeratorVersionChanged)); } // Strange design, but iterator must spin on contained column iterator if ((_currentChildType != ChildrenTypes.Columns) && (_currentChildType != ChildrenTypes.RowGroups)) _currentChildType++; Object currentChild = null; while (_currentChildType < ChildrenTypes.AfterLast) { switch (_currentChildType) { case (ChildrenTypes.Columns): if (_columns.MoveNext()) { currentChild = _columns.Current; } break; case (ChildrenTypes.RowGroups): if (_rowGroups.MoveNext()) { currentChild = _rowGroups.Current; } break; } if (currentChild != null) { _currentChild = currentChild; break; } _currentChildType++; } Debug.Assert(_currentChildType != ChildrenTypes.BeforeFirst); return (_currentChildType != ChildrenTypes.AfterLast); } public Object Current { get { if (_currentChildType == ChildrenTypes.BeforeFirst) { #pragma warning suppress 6503 // IEnumerator.Current is documented to throw this exception throw new InvalidOperationException(SR.Get(SRID.EnumeratorNotStarted)); } if (_currentChildType == ChildrenTypes.AfterLast) { #pragma warning suppress 6503 // IEnumerator.Current is documented to throw this exception throw new InvalidOperationException(SR.Get(SRID.EnumeratorReachedEnd)); } return (_currentChild); } } public void Reset() { if (_version != _table._version) { throw new InvalidOperationException(SR.Get(SRID.EnumeratorVersionChanged)); } _columns.Reset(); _rowGroups.Reset(); _currentChildType = ChildrenTypes.BeforeFirst; _currentChild = null; } private Table _table; private int _version; private IEnumerator _columns; private IEnumerator _rowGroups; private ChildrenTypes _currentChildType; private Object _currentChild; private enum ChildrenTypes : int { BeforeFirst = 0, Columns = 1, RowGroups = 2, AfterLast = 3, } } #endregion Private Structures Classes //------------------------------------------------------ // // Properties // //----------------------------------------------------- #region Properties ////// Cell spacing property. /// public static readonly DependencyProperty CellSpacingProperty = DependencyProperty.Register( "CellSpacing", typeof(double), typeof(Table), new FrameworkPropertyMetadata( c_defaultCellSpacing, FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(IsValidCellSpacing)); #endregion Properties //------------------------------------------------------ // // Debug / Performance // //------------------------------------------------------ #if TABLEPARANOIA internal int ParanoiaVersion = 0; #endif // TABLEPARANOIA } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MediaElementAutomationPeer.cs
- ContainerParaClient.cs
- BooleanFunctions.cs
- XPathChildIterator.cs
- WarningException.cs
- PersonalizationProvider.cs
- ColumnMapProcessor.cs
- XmlToDatasetMap.cs
- SiteMapNodeItemEventArgs.cs
- Selector.cs
- DataContractJsonSerializer.cs
- PropertyReference.cs
- Double.cs
- EventWaitHandleSecurity.cs
- DNS.cs
- HttpProfileGroupBase.cs
- LinkLabelLinkClickedEvent.cs
- SerializationInfoEnumerator.cs
- TableRow.cs
- XamlBrushSerializer.cs
- SspiNegotiationTokenAuthenticatorState.cs
- MonthChangedEventArgs.cs
- ListItemsPage.cs
- UnsafeNativeMethods.cs
- SecurityKeyEntropyMode.cs
- DBCommandBuilder.cs
- NullEntityWrapper.cs
- CompilerResults.cs
- DesignerCategoryAttribute.cs
- CapabilitiesUse.cs
- ListViewTableCell.cs
- TraceEventCache.cs
- ValueExpressions.cs
- Pen.cs
- FactoryGenerator.cs
- FontConverter.cs
- DataGridViewCellPaintingEventArgs.cs
- HttpHeaderCollection.cs
- DataTableClearEvent.cs
- Region.cs
- CommonProperties.cs
- followingsibling.cs
- NameValueFileSectionHandler.cs
- SrgsElementList.cs
- DurableOperationAttribute.cs
- XmlQueryRuntime.cs
- AuthenticationService.cs
- ArgIterator.cs
- RootBrowserWindowAutomationPeer.cs
- WebScriptServiceHost.cs
- ReversePositionQuery.cs
- HtmlLink.cs
- DoubleAnimationBase.cs
- RegexParser.cs
- UnsafeNativeMethods.cs
- HashAlgorithm.cs
- Events.cs
- WebResponse.cs
- PositiveTimeSpanValidator.cs
- XamlVector3DCollectionSerializer.cs
- ToolStripItemRenderEventArgs.cs
- ArithmeticException.cs
- EncodingStreamWrapper.cs
- JsonReaderDelegator.cs
- Interfaces.cs
- BamlMapTable.cs
- DynamicILGenerator.cs
- TreeNodeSelectionProcessor.cs
- DependencyPropertyKind.cs
- ClientSettingsStore.cs
- MgmtResManager.cs
- Message.cs
- DocumentXmlWriter.cs
- MainMenu.cs
- RedistVersionInfo.cs
- SafeNativeMethods.cs
- Menu.cs
- SplineKeyFrames.cs
- FormsAuthenticationCredentials.cs
- CompositeScriptReferenceEventArgs.cs
- CacheChildrenQuery.cs
- WebSysDisplayNameAttribute.cs
- LocalizableResourceBuilder.cs
- CodeTypeOfExpression.cs
- SqlBuilder.cs
- SafeCryptoHandles.cs
- Int64Animation.cs
- BamlWriter.cs
- BamlLocalizationDictionary.cs
- XPathCompiler.cs
- XamlTypeMapper.cs
- ClientApiGenerator.cs
- ErrorItem.cs
- XmlStringTable.cs
- ModuleBuilder.cs
- DataTemplate.cs
- DataGridViewToolTip.cs
- TextEditorLists.cs
- DateTimeStorage.cs
- ProxyDataContractResolver.cs