Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / Documents / TableRow.cs / 1305600 / TableRow.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: Table row 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.Internal.Text;
using MS.Utility;
using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;
using System.Windows.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Markup;
using System.Collections.Generic;
using MS.Internal.Documents;
using MS.Internal.PtsHost.UnsafeNativeMethods;
namespace System.Windows.Documents
{
///
/// Table row
///
[ContentProperty("Cells")]
public class TableRow : TextElement, IAddChild, IIndexedChild, IAcceptInsertion
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
///
/// Creates an instance of a Row
///
public TableRow()
: base()
{
PrivateInitialize();
}
#endregion
//------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------
#region Public Methods
///
///
///
void IAddChild.AddChild(object value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
TableCell cell = value as TableCell;
if (cell != null)
{
Cells.Add(cell);
return;
}
throw (new ArgumentException(SR.Get(SRID.UnexpectedParameterType, value.GetType(), typeof(TableCell)), "value"));
}
///
///
///
void IAddChild.AddText(string text)
{
XamlSerializerUtil.ThrowIfNonWhiteSpaceInAddText(text, this);
}
///
/// Called when tablerow gets new parent
///
///
/// New parent of cell
///
internal override void OnNewParent(DependencyObject newParent)
{
DependencyObject oldParent = this.Parent;
if (newParent != null && !(newParent is TableRowGroup))
{
throw new InvalidOperationException(SR.Get(SRID.TableInvalidParentNodeType, newParent.GetType().ToString()));
}
if (oldParent != null)
{
((TableRowGroup)oldParent).Rows.InternalRemove(this);
}
base.OnNewParent(newParent);
if (newParent != null)
{
((TableRowGroup)newParent).Rows.InternalAdd(this);
}
}
#endregion Public Methods
//------------------------------------------------------
//
// Protected Methods
//
//------------------------------------------------------
#region Protected Methods
#endregion Protected Methods
//-----------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
#region IIndexedChild implementation
///
/// Callback used to notify about entering model tree.
///
void IIndexedChild.OnEnterParentTree()
{
this.OnEnterParentTree();
}
///
/// Callback used to notify about exitting model tree.
///
void IIndexedChild.OnExitParentTree()
{
this.OnExitParentTree();
}
void IIndexedChild.OnAfterExitParentTree(TableRowGroup parent)
{
this.OnAfterExitParentTree(parent);
}
int IIndexedChild.Index
{
get { return this.Index; }
set { this.Index = value; }
}
#endregion IIndexedChild implementation
///
/// Callback used to notify the Row about entering model tree.
///
internal void OnEnterParentTree()
{
if (Table != null)
{
Table.OnStructureChanged();
}
}
///
/// Callback used to notify the RowGroup about exitting model tree.
///
internal void OnExitParentTree()
{
}
///
/// Callback used to notify the Row about exitting model tree.
///
internal void OnAfterExitParentTree(TableRowGroup rowGroup)
{
if (rowGroup.Table != null)
{
Table.OnStructureChanged();
}
}
///
/// ValidateStructure
///
internal void ValidateStructure(RowSpanVector rowSpanVector)
{
Debug.Assert(rowSpanVector != null);
SetFlags(!rowSpanVector.Empty(), Flags.HasForeignCells);
SetFlags(false, Flags.HasRealCells);
_formatCellCount = 0;
_columnCount = 0;
int firstAvailableIndex;
int firstOccupiedIndex;
rowSpanVector.GetFirstAvailableRange(out firstAvailableIndex, out firstOccupiedIndex);
for (int i = 0; i < _cells.Count; ++i)
{
TableCell cell = _cells[i];
// Get cloumn span and row span. Row span is limited to the number of rows in the row group.
// Since we do not know the number of columns in the table at this point, column span is limited only
// by internal constants
int columnSpan = cell.ColumnSpan;
int rowSpan = cell.RowSpan;
while (firstAvailableIndex + columnSpan > firstOccupiedIndex)
{
rowSpanVector.GetNextAvailableRange(out firstAvailableIndex, out firstOccupiedIndex);
}
Debug.Assert(i <= firstAvailableIndex);
cell.ValidateStructure(firstAvailableIndex);
if (rowSpan > 1)
{
rowSpanVector.Register(cell);
}
else
{
_formatCellCount++;
}
firstAvailableIndex += columnSpan;
}
_columnCount = firstAvailableIndex;
bool isLastRowOfAnySpan = false;
rowSpanVector.GetSpanCells(out _spannedCells, out isLastRowOfAnySpan);
Debug.Assert(_spannedCells != null);
if ((_formatCellCount > 0) ||
isLastRowOfAnySpan == true)
{
SetFlags(true, Flags.HasRealCells);
}
_formatCellCount += _spannedCells.Length;
Debug.Assert(_cells.Count <= _formatCellCount);
}
#endregion Internal Methods
//-----------------------------------------------------
//
// Internal Properties
//
//-----------------------------------------------------
#region Internal Properties
///
/// RowGroup owner accessor
///
internal TableRowGroup RowGroup
{
get
{
return (Parent as TableRowGroup);
}
}
///
/// Table owner accessor
///
internal Table Table { get { return (RowGroup != null ? RowGroup.Table : null); } }
///
/// Returns the row's cell collection
///
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public TableCellCollection Cells { get { return (_cells); } }
///
/// This method is used by TypeDescriptor to determine if this property should
/// be serialized.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeCells()
{
return (Cells.Count > 0);
}
///
/// Row's index in the parents collection.
///
internal int Index
{
get
{
return (_parentIndex);
}
set
{
Debug.Assert(value >= -1 && _parentIndex != value);
_parentIndex = value;
}
}
int IAcceptInsertion.InsertionIndex
{
get { return this.InsertionIndex; }
set { this.InsertionIndex = value; }
}
///
/// Stores temporary data for where to insert a new cell
///
internal int InsertionIndex
{
get { return _cellInsertionIndex; }
set { _cellInsertionIndex = value; }
}
///
/// Returns span cells vector
///
internal TableCell[] SpannedCells
{
get { return (_spannedCells); }
}
///
/// Count of columns in the table
///
internal int ColumnCount
{
get
{
return (_columnCount);
}
}
///
/// Returns "true" if there are row spanned cells belonging to previous rows
///
internal bool HasForeignCells
{
get { return (CheckFlags(Flags.HasForeignCells)); }
}
///
/// Returns "true" if there are row spanned cells belonging to previous rows
///
internal bool HasRealCells
{
get { return (CheckFlags(Flags.HasRealCells)); }
}
///
/// Count of columns in the table
///
internal int FormatCellCount
{
get
{
return (_formatCellCount);
}
}
///
/// Marks this element's left edge as visible to IMEs.
/// This means element boundaries will act as word breaks.
///
internal override bool IsIMEStructuralElement
{
get
{
return true;
}
}
#endregion Internal Properties
//-----------------------------------------------------
//
// Private Methods
//
//------------------------------------------------------
#region Private Methods
///
/// Private ctor time initialization.
///
private void PrivateInitialize()
{
_cells = new TableCellCollection(this);
_parentIndex = -1;
_cellInsertionIndex = -1;
}
///
/// SetFlags is used to set or unset one or multiple flags on the row.
///
private void SetFlags(bool value, Flags flags)
{
_flags = value ? (_flags | flags) : (_flags & (~flags));
}
///
/// CheckFlags returns true if all flags in the bitmask flags are set.
///
private bool CheckFlags(Flags flags)
{
return ((_flags & flags) == flags);
}
#endregion Private Methods
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
private TableCellCollection _cells; // collection of cells belonging to the row
private TableCell[] _spannedCells; // row spanned cell storage
private int _parentIndex; // row's index in parent's children collection
private int _cellInsertionIndex; // Insertion index a cell
private int _columnCount;
private Flags _flags; // flags reflecting various aspects of row's state
private int _formatCellCount; // count of the cell to be formatted in this row
#endregion Private Fields
//------------------------------------------------------
//
// Private Structures / Classes
//
//-----------------------------------------------------
#region Private Structures Classes
[System.Flags]
private enum Flags
{
//
// state flags
//
HasForeignCells = 0x00000010, // there are hanging cells from the previous rows
HasRealCells = 0x00000020, // real cells in row (not just spanning) (Only known by validation, not format)
}
#endregion Private Structures Classes
}
}
// 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
- ImageConverter.cs
- HtmlControl.cs
- HScrollProperties.cs
- DatePickerDateValidationErrorEventArgs.cs
- formatter.cs
- CatalogPartChrome.cs
- Grid.cs
- RepeaterDataBoundAdapter.cs
- CodeGeneratorOptions.cs
- OutputCacheSettings.cs
- ImageField.cs
- BinaryMethodMessage.cs
- Rect3DValueSerializer.cs
- SpecialNameAttribute.cs
- FixedBufferAttribute.cs
- DiscardableAttribute.cs
- EntityCollectionChangedParams.cs
- Util.cs
- DataGridColumnStyleMappingNameEditor.cs
- XPathChildIterator.cs
- _TimerThread.cs
- ButtonBaseAutomationPeer.cs
- MimeWriter.cs
- FastEncoder.cs
- StringUtil.cs
- RsaSecurityTokenParameters.cs
- SmtpAuthenticationManager.cs
- BigInt.cs
- AspCompat.cs
- ControlBindingsCollection.cs
- VirtualizingPanel.cs
- EditingMode.cs
- Misc.cs
- CoordinationService.cs
- DrawingContextDrawingContextWalker.cs
- NavigationHelper.cs
- NGCSerializationManagerAsync.cs
- InputReferenceExpression.cs
- TextRunCache.cs
- XAMLParseException.cs
- DeclarativeCatalogPart.cs
- TakeQueryOptionExpression.cs
- SimpleHandlerBuildProvider.cs
- TcpChannelHelper.cs
- mansign.cs
- AttachmentCollection.cs
- KeyInterop.cs
- StoragePropertyMapping.cs
- Pointer.cs
- LicenseProviderAttribute.cs
- AsyncCompletedEventArgs.cs
- StorageComplexTypeMapping.cs
- TreeNodeStyle.cs
- ZipIOLocalFileBlock.cs
- Size.cs
- DataServiceResponse.cs
- StickyNoteHelper.cs
- XPathNodePointer.cs
- SqlDependencyUtils.cs
- TypeSystem.cs
- StylusEditingBehavior.cs
- SemaphoreSecurity.cs
- Soap12FormatExtensions.cs
- ImageKeyConverter.cs
- UTF7Encoding.cs
- SourceFileBuildProvider.cs
- ListViewCancelEventArgs.cs
- EventMappingSettingsCollection.cs
- Accessors.cs
- AutomationAttributeInfo.cs
- AgileSafeNativeMemoryHandle.cs
- AdCreatedEventArgs.cs
- EntityDataSourceState.cs
- TransformCryptoHandle.cs
- ObjectQueryExecutionPlan.cs
- IndexedGlyphRun.cs
- GridPattern.cs
- UpdateRecord.cs
- BaseCollection.cs
- TextOutput.cs
- SchemaImporterExtensionElementCollection.cs
- ApplicationManager.cs
- RadioButtonAutomationPeer.cs
- DocumentXmlWriter.cs
- AdornerPresentationContext.cs
- FrameworkElementFactory.cs
- SymmetricAlgorithm.cs
- ActivityTrace.cs
- _FixedSizeReader.cs
- HttpVersion.cs
- PrivilegedConfigurationManager.cs
- DirectionalLight.cs
- TableCell.cs
- Wrapper.cs
- Evaluator.cs
- DataBoundControl.cs
- SqlStream.cs
- MsmqNonTransactedPoisonHandler.cs
- WebOperationContext.cs
- TabControlEvent.cs