Code:
/ 4.0 / 4.0 / 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. //---------------------------------------------------------------------------- // //// 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
- NavigationWindowAutomationPeer.cs
- BlurEffect.cs
- RangeValidator.cs
- CriticalExceptions.cs
- CultureTable.cs
- ServiceModelEnhancedConfigurationElementCollection.cs
- DrawingContextDrawingContextWalker.cs
- JumpPath.cs
- ResourceSet.cs
- ElapsedEventArgs.cs
- DoubleAnimation.cs
- SystemUdpStatistics.cs
- DebuggerService.cs
- Helpers.cs
- WebCategoryAttribute.cs
- ObjectDataSourceMethodEditor.cs
- AliasGenerator.cs
- XmlDocument.cs
- HandlerBase.cs
- PenContexts.cs
- ListViewSelectEventArgs.cs
- TextTreeExtractElementUndoUnit.cs
- SerializationHelper.cs
- TraceHandler.cs
- IdentityHolder.cs
- PersonalizationProviderHelper.cs
- URLString.cs
- AsyncPostBackErrorEventArgs.cs
- DataGridColumn.cs
- InputReferenceExpression.cs
- CapabilitiesAssignment.cs
- DoubleAnimationClockResource.cs
- SqlCommandBuilder.cs
- ValueCollectionParameterReader.cs
- OleDbConnection.cs
- SingleConverter.cs
- UrlPath.cs
- CommandBinding.cs
- TreeWalkHelper.cs
- CorruptingExceptionCommon.cs
- ListenDesigner.cs
- StorageInfo.cs
- Int32.cs
- NameSpaceEvent.cs
- Vector3DConverter.cs
- ellipse.cs
- FormViewUpdateEventArgs.cs
- TypeSystem.cs
- DefaultMemberAttribute.cs
- MouseActionConverter.cs
- BitmapCacheBrush.cs
- CfgRule.cs
- SqlDataSourceCache.cs
- ValidationSummary.cs
- DockAndAnchorLayout.cs
- EventSinkHelperWriter.cs
- PriorityQueue.cs
- IriParsingElement.cs
- ReadingWritingEntityEventArgs.cs
- UrlPath.cs
- EventPrivateKey.cs
- PnrpPermission.cs
- SchemaImporter.cs
- LocalizationParserHooks.cs
- CodeComment.cs
- DrawListViewColumnHeaderEventArgs.cs
- DataControlImageButton.cs
- ListMarkerLine.cs
- TickBar.cs
- FastPropertyAccessor.cs
- TemplatedMailWebEventProvider.cs
- NativeStructs.cs
- ToolStripSplitButton.cs
- ControlParameter.cs
- DataGridViewCellStyleChangedEventArgs.cs
- SystemKeyConverter.cs
- XhtmlBasicTextBoxAdapter.cs
- ToolStripContainerActionList.cs
- EraserBehavior.cs
- ClearTypeHintValidation.cs
- TreeIterator.cs
- DataGridViewRowEventArgs.cs
- HttpHostedTransportConfiguration.cs
- StrokeCollection2.cs
- ExpressionBindingCollection.cs
- UnknownWrapper.cs
- XmlSchemaSimpleTypeRestriction.cs
- SettingsPropertyWrongTypeException.cs
- BrowserTree.cs
- ComponentCommands.cs
- IsolatedStorageFilePermission.cs
- PartialCachingAttribute.cs
- MediaElementAutomationPeer.cs
- ObsoleteAttribute.cs
- DataObjectMethodAttribute.cs
- UInt16Converter.cs
- LayoutTable.cs
- UIElementPropertyUndoUnit.cs
- SafeRightsManagementPubHandle.cs
- DbRetry.cs