Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / PtsHost / TableParagraph.cs / 1305600 / TableParagraph.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: Implementation of the PTS paragraph corresponding to table.
//
// History:
// 05/30/2003 : olego - Created
//
//---------------------------------------------------------------------------
#pragma warning disable 1634, 1691 // avoid generating warnings about unknown
// message numbers and unknown pragmas for PRESharp contol
using MS.Internal.Documents;
using MS.Internal.PtsTable;
using MS.Internal.Text;
using MS.Utility;
using System;
using System.Collections;
using System.Diagnostics;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;
using MS.Internal.PtsHost.UnsafeNativeMethods;
namespace MS.Internal.PtsHost
{
///
/// Table paragraph PTS object implementation
///
internal sealed class TableParagraph : BaseParagraph
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
internal TableParagraph(DependencyObject element, StructuralCache structuralCache)
: base(element, structuralCache)
{
Table.TableStructureChanged += new System.EventHandler(TableStructureChanged);
}
// ------------------------------------------------------------------
// IDisposable.Dispose
// -----------------------------------------------------------------
public override void Dispose()
{
Table.TableStructureChanged -= new System.EventHandler(TableStructureChanged);
BaseParagraph paraChild = _firstChild;
while (paraChild != null)
{
BaseParagraph para = paraChild;
paraChild = paraChild.Next;
para.Dispose();
para.Next = null;
para.Previous = null;
}
_firstChild = null;
base.Dispose();
}
#endregion Constructors
//------------------------------------------------------
//
// Protected Methods
//
//------------------------------------------------------
#region Protected Methods
#endregion Protected Methods
//-----------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
///
/// Collapse Margins
///
/// Para client
/// input margin collapsing state
/// current direction (of the track, in which margin collapsing is happening)
/// suppress empty space at the top of page
/// dvr, calculated based on margin collapsing state
internal override void CollapseMargin(
BaseParaClient paraClient, // IN:
MarginCollapsingState mcs, // IN: input margin collapsing state
uint fswdir, // IN: current direction (of the track, in which margin collapsing is happening)
bool suppressTopSpace, // IN: suppress empty space at the top of page
out int dvr) // OUT: dvr, calculated based on margin collapsing state
{
if (suppressTopSpace && (StructuralCache.CurrentFormatContext.FinitePage || mcs == null))
dvr = 0;
else
{
MbpInfo mbp = MbpInfo.FromElement(Table);
MarginCollapsingState mcsOut = null;
MarginCollapsingState.CollapseTopMargin(PtsContext, mbp, mcs, out mcsOut, out dvr);
if (mcsOut != null)
{
dvr = mcsOut.Margin;
mcsOut.Dispose();
mcsOut = null;
}
}
}
///
/// GetParaProperties.
///
/// paragraph properties
internal override void GetParaProperties(
ref PTS.FSPAP fspap) // OUT: paragraph properties
{
fspap.idobj = PtsHost.TableParagraphId;
//
fspap.fKeepWithNext = PTS.False;
fspap.fBreakPageBefore = PTS.False;
fspap.fBreakColumnBefore = PTS.False;
}
///
/// CreateParaclient
///
/// Opaque to PTS paragraph client
internal override void CreateParaclient(
out IntPtr pfsparaclient) // OUT: opaque to PTS paragraph client
{
#pragma warning disable 6518
// Disable PRESharp warning 6518. TableParaClient is an UnmamangedHandle, that adds itself
// to HandleMapper that holds a reference to it. PTS manages lifetime of this object, and
// calls DestroyParaclient to get rid of it. DestroyParaclient will call Dispose() on the object
// and remove it from HandleMapper.
TableParaClient paraClient = new TableParaClient(this);
pfsparaclient = paraClient.Handle;
#pragma warning restore 6518
}
///
/// GetTableProperties
///
/// Direction of Track
/// Properties of the table
internal void GetTableProperties(
uint fswdirTrack, // IN: direction of Track
out PTS.FSTABLEOBJPROPS fstableobjprops)// OUT: properties of the table
{
fstableobjprops = new PTS.FSTABLEOBJPROPS();
fstableobjprops.fskclear = PTS.FSKCLEAR.fskclearNone;
fstableobjprops.ktablealignment = PTS.FSKTABLEOBJALIGNMENT.fsktableobjAlignLeft;
fstableobjprops.fFloat = PTS.False;
fstableobjprops.fskwr = PTS.FSKWRAP.fskwrBoth;
fstableobjprops.fDelayNoProgress = PTS.False;
fstableobjprops.dvrCaptionTop = 0;
fstableobjprops.dvrCaptionBottom = 0;
fstableobjprops.durCaptionLeft = 0;
fstableobjprops.durCaptionRight = 0;
fstableobjprops.fswdirTable = PTS.FlowDirectionToFswdir((FlowDirection)Element.GetValue(FrameworkElement.FlowDirectionProperty));
}
///
/// GetMCSClientAfterTable
///
/// Direction of Track
/// Margin collapsing state
/// Margin collapsing state
internal void GetMCSClientAfterTable(
uint fswdirTrack,
IntPtr pmcsclientIn,
out IntPtr ppmcsclientOut)
{
ppmcsclientOut = IntPtr.Zero;
MbpInfo mbp = MbpInfo.FromElement(Table);
MarginCollapsingState mcs = null;
if (pmcsclientIn != IntPtr.Zero)
mcs = PtsContext.HandleToObject(pmcsclientIn) as MarginCollapsingState;
MarginCollapsingState mcsNew = null;
int margin;
MarginCollapsingState.CollapseBottomMargin(PtsContext, mbp, mcs, out mcsNew, out margin);
if (mcsNew != null)
ppmcsclientOut = mcsNew.Handle;
}
///
/// GetFirstHeaderRow
///
/// Repeated header flag
/// Indication that first header row is found
/// First header row name
internal void GetFirstHeaderRow(
int fRepeatedHeader,
out int fFound,
out IntPtr pnmFirstHeaderRow)
{
fFound = PTS.False;
pnmFirstHeaderRow = IntPtr.Zero;
}
///
/// GetNextHeaderRow
///
/// Repeated header flag
/// Previous header row
/// Indication that header row is found
/// Header row name
internal void GetNextHeaderRow(
int fRepeatedHeader,
IntPtr nmHeaderRow,
out int fFound,
out IntPtr pnmNextHeaderRow)
{
fFound = PTS.False;
pnmNextHeaderRow = IntPtr.Zero;
}
///
/// GetFirstFooterRow
///
/// Repeated footer flag
/// Indication that first header row is found
/// First footer row name
internal void GetFirstFooterRow(
int fRepeatedFooter,
out int fFound,
out IntPtr pnmFirstFooterRow)
{
fFound = PTS.False;
pnmFirstFooterRow = IntPtr.Zero;
}
///
/// GetNextFooterRow
///
/// Repeated footer flag
/// Previous footer row
/// Indication that header row is found
/// Footer row name
internal void GetNextFooterRow(
int fRepeatedFooter,
IntPtr nmFooterRow,
out int fFound,
out IntPtr pnmNextFooterRow)
{
fFound = PTS.False;
pnmNextFooterRow = IntPtr.Zero;
}
///
/// GetFirstRow
///
/// Indication that first body row is found
/// First body row name
internal void GetFirstRow(
out int fFound,
out IntPtr pnmFirstRow)
{
if(_firstChild == null)
{
TableRow tableRow = null;
for(int rowGroupIndex = 0; rowGroupIndex < Table.RowGroups.Count && tableRow == null; rowGroupIndex++)
{
TableRowGroup rowGroup = Table.RowGroups[rowGroupIndex];
if(rowGroup.Rows.Count > 0)
{
tableRow = rowGroup.Rows[0];
Invariant.Assert(tableRow.Index != -1);
}
}
if(tableRow != null)
{
_firstChild = new RowParagraph(tableRow, StructuralCache);
((RowParagraph)_firstChild).CalculateRowSpans();
}
}
if(_firstChild != null)
{
fFound = PTS.True;
pnmFirstRow = _firstChild.Handle;
}
else
{
fFound = PTS.False;
pnmFirstRow = IntPtr.Zero;
}
}
///
/// GetNextRow
///
/// Previous body row name
/// Indication that body row is found
/// Body row name
internal void GetNextRow(
IntPtr nmRow,
out int fFound,
out IntPtr pnmNextRow)
{
Debug.Assert(Table.RowGroups.Count > 0);
BaseParagraph prevParagraph = ((RowParagraph)PtsContext.HandleToObject(nmRow));
BaseParagraph nextParagraph = prevParagraph.Next;
if(nextParagraph == null)
{
TableRow currentRow = ((RowParagraph)prevParagraph).Row;
TableRowGroup currentRowGroup = currentRow.RowGroup;
TableRow tableRow = null;
int nextRowIndex = currentRow.Index + 1;
int nextRowGroupIndex = currentRowGroup.Index + 1;
if (nextRowIndex < currentRowGroup.Rows.Count)
{
Debug.Assert(currentRowGroup.Rows[nextRowIndex].Index != -1,
"Row is not in a table");
tableRow = currentRowGroup.Rows[nextRowIndex];
}
while(tableRow == null)
{
if(nextRowGroupIndex == Table.RowGroups.Count)
{
break;
}
TableRowCollection Rows = Table.RowGroups[nextRowGroupIndex].Rows;
if (Rows.Count > 0)
{
Debug.Assert(Rows[0].Index != -1,
"Row is not in a table");
tableRow = Rows[0];
}
nextRowGroupIndex++;
}
if(tableRow != null)
{
nextParagraph = new RowParagraph(tableRow, StructuralCache);
prevParagraph.Next = nextParagraph;
nextParagraph.Previous = prevParagraph;
((RowParagraph)nextParagraph).CalculateRowSpans();
}
}
if(nextParagraph != null)
{
fFound = PTS.True;
pnmNextRow = nextParagraph.Handle;
}
else
{
fFound = PTS.False;
pnmNextRow = IntPtr.Zero;
}
}
///
/// UpdFChangeInHeaderFooter
///
/// Header changed?
/// Footer changed?
/// Repeated header changed?
/// Repeated footer changed?
internal void UpdFChangeInHeaderFooter( // we don't do update in header/footer
out int fHeaderChanged, // OUT:
out int fFooterChanged, // OUT:
out int fRepeatedHeaderChanged, // OUT: unneeded for bottomless page, but...
out int fRepeatedFooterChanged) // OUT: unneeded for bottomless page, but...
{
fHeaderChanged = PTS.False;
fRepeatedHeaderChanged = PTS.False;
fFooterChanged = PTS.False;
fRepeatedFooterChanged = PTS.False;
}
///
/// UpdGetFirstChangeInTable
///
/// Indication that changed body row is found
/// Is the change in the first body row?
/// The last unchanged body row
internal void UpdGetFirstChangeInTable(
out int fFound, // OUT:
out int fChangeFirst, // OUT:
out IntPtr pnmRowBeforeChange) // OUT:
{
// No incremental update for table.
fFound = PTS.True;
fChangeFirst = PTS.True;
pnmRowBeforeChange = IntPtr.Zero;
}
///
/// GetDistributionKind
///
/// Direction of the Table
/// Height distribution kind
internal void GetDistributionKind(
uint fswdirTable, // IN: direction of the Table
out PTS.FSKTABLEHEIGHTDISTRIBUTION tabledistr) // OUT: height distribution kind
{
tabledistr = PTS.FSKTABLEHEIGHTDISTRIBUTION.fskdistributeUnchanged;
}
// -----------------------------------------------------------------
// UpdGetParaChange
// -----------------------------------------------------------------
internal override void UpdGetParaChange(
out PTS.FSKCHANGE fskch, // OUT: kind of change
out int fNoFurtherChanges) // OUT: no changes after?
{
base.UpdGetParaChange(out fskch, out fNoFurtherChanges);
fskch = PTS.FSKCHANGE.fskchNew;
}
// -----------------------------------------------------------------
// Invalidate content's structural cache.
//
// startPosition - Position to start invalidation from.
//
// Returns: 'true' if entire paragraph is invalid.
// ------------------------------------------------------------------
internal override bool InvalidateStructure(int startPosition)
{
bool isEntireTableInvalid = true;
RowParagraph currentParagraph = _firstChild as RowParagraph;
while(currentParagraph != null)
{
if(!InvalidateRowStructure(currentParagraph, startPosition))
{
isEntireTableInvalid = false;
}
currentParagraph = currentParagraph.Next as RowParagraph;
}
return isEntireTableInvalid;
}
// -----------------------------------------------------------------
// Invalidate accumulated format caches for the table.
// ------------------------------------------------------------------
internal override void InvalidateFormatCache()
{
RowParagraph currentParagraph = _firstChild as RowParagraph;
while(currentParagraph != null)
{
InvalidateRowFormatCache(currentParagraph);
currentParagraph = currentParagraph.Next as RowParagraph;
}
}
#endregion Internal Methods
//------------------------------------------------------
//
// Internal Properties
//
//-----------------------------------------------------
#region Internal Properties
///
/// Table owner accessor
///
internal Table Table
{
get
{
return (Table)Element;
}
}
#endregion Internal Properties
//------------------------------------------------------
//
// Private methods
//
//-----------------------------------------------------
#region Private Methods
// -----------------------------------------------------------------
// Invalidate accumulated format caches for the row.
// -----------------------------------------------------------------
private bool InvalidateRowStructure(RowParagraph rowParagraph, int startPosition)
{
bool isEntireTableInvalid = true;
for(int iCell = 0; iCell < rowParagraph.Cells.Length; iCell++)
{
CellParagraph cellParagraph = rowParagraph.Cells[iCell];
if(cellParagraph.ParagraphEndCharacterPosition < startPosition ||
!cellParagraph.InvalidateStructure(startPosition))
{
isEntireTableInvalid = false;
}
}
return isEntireTableInvalid;
}
// ------------------------------------------------------------------
// Invalidate accumulated format caches for the row.
// -----------------------------------------------------------------
private void InvalidateRowFormatCache(RowParagraph rowParagraph)
{
for(int iCell = 0; iCell < rowParagraph.Cells.Length; iCell++)
{
rowParagraph.Cells[iCell].InvalidateFormatCache();
}
}
// ------------------------------------------------------------------
// Table has been structurally altered
// ------------------------------------------------------------------
private void TableStructureChanged(object sender, EventArgs e)
{
// Disconnect obsolete paragraphs.
BaseParagraph paraInvalid = _firstChild;
while (paraInvalid != null)
{
paraInvalid.Dispose();
paraInvalid = paraInvalid.Next;
}
_firstChild = null;
//
// Since whole table content is disposed, we need
// - to create dirty text range corresponding to the Table content
// - notify formatter that Table's content is changed.
//
int charCount = Table.SymbolCount - 2;// This is equivalent to (ContentEndOffset � ContentStartOffset) but is more performant.
if (charCount > 0)
{
DirtyTextRange dtr = new DirtyTextRange(Table.ContentStartOffset, charCount, charCount);
StructuralCache.AddDirtyTextRange(dtr);
}
if (StructuralCache.FormattingOwner.Formatter != null)
{
StructuralCache.FormattingOwner.Formatter.OnContentInvalidated(true, Table.ContentStart, Table.ContentEnd);
}
}
#endregion Private Methods
//-----------------------------------------------------
//
// Private Properties
//
//------------------------------------------------------
#region Private Properties
#endregion Private Properties
//-----------------------------------------------------
//
// Private Fields
//
//-----------------------------------------------------
#region Private Fields
BaseParagraph _firstChild;
#endregion Private Fields
//-----------------------------------------------------
//
// Private Structures / Classes
//
//------------------------------------------------------
#region Private Structures Classes
#endregion Private Structures Classes
}
}
#pragma warning enable 1634, 1691
// 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
- StrongNameIdentityPermission.cs
- DependentList.cs
- RegexCode.cs
- ZoneLinkButton.cs
- ContentFileHelper.cs
- CaseInsensitiveHashCodeProvider.cs
- PasswordRecovery.cs
- TypefaceCollection.cs
- ServiceBusyException.cs
- SendKeys.cs
- ArgumentNullException.cs
- ParameterCollection.cs
- TraceProvider.cs
- WebRequestModulesSection.cs
- FontWeightConverter.cs
- DataBoundControl.cs
- ClientFormsIdentity.cs
- ScrollEvent.cs
- _OSSOCK.cs
- PkcsMisc.cs
- XmlTextReader.cs
- ExchangeUtilities.cs
- LingerOption.cs
- SimpleApplicationHost.cs
- RelationshipType.cs
- XamlBrushSerializer.cs
- StreamingContext.cs
- DependencyObjectProvider.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- AttachedPropertyDescriptor.cs
- TraceData.cs
- ButtonFieldBase.cs
- AffineTransform3D.cs
- InheritanceAttribute.cs
- TableDetailsCollection.cs
- IBuiltInEvidence.cs
- StorageMappingItemCollection.cs
- MdiWindowListItemConverter.cs
- SequentialUshortCollection.cs
- BrowserDefinition.cs
- ArrangedElement.cs
- BamlLocalizabilityResolver.cs
- DataTableCollection.cs
- Parameter.cs
- GlobalizationSection.cs
- GridViewHeaderRowPresenter.cs
- MULTI_QI.cs
- WebBrowserProgressChangedEventHandler.cs
- RouteUrlExpressionBuilder.cs
- JapaneseLunisolarCalendar.cs
- EncoderBestFitFallback.cs
- ReceiveDesigner.xaml.cs
- TransportChannelListener.cs
- ChangeInterceptorAttribute.cs
- DocumentPage.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- WindowsProgressbar.cs
- JsonClassDataContract.cs
- TdsRecordBufferSetter.cs
- DesignBindingPicker.cs
- Light.cs
- XsdDuration.cs
- CodeCommentStatementCollection.cs
- DataGridColumnCollection.cs
- SecurityException.cs
- BaseDataBoundControlDesigner.cs
- EventSourceCreationData.cs
- NativeWindow.cs
- CustomExpression.cs
- HashMembershipCondition.cs
- HttpCookieCollection.cs
- MethodBuilder.cs
- HashHelper.cs
- StickyNoteContentControl.cs
- StringAnimationUsingKeyFrames.cs
- NetworkInterface.cs
- BulletDecorator.cs
- OrCondition.cs
- CheckBox.cs
- SolidColorBrush.cs
- CodeAccessPermission.cs
- SqlNodeAnnotations.cs
- GridViewSelectEventArgs.cs
- DesignerAttribute.cs
- UndoManager.cs
- ControlCachePolicy.cs
- ToolStripContentPanel.cs
- AutoResetEvent.cs
- ItemTypeToolStripMenuItem.cs
- CodeAccessPermission.cs
- WorkflowServiceAttributesTypeConverter.cs
- StylusButtonEventArgs.cs
- Positioning.cs
- EnumCodeDomSerializer.cs
- Brush.cs
- ClientTargetSection.cs
- AsyncDataRequest.cs
- XmlLinkedNode.cs
- ObjectDisposedException.cs
- XmlSchemaRedefine.cs