Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Framework / MS / Internal / PtsHost / BaseParagraph.cs / 1 / BaseParagraph.cs
//---------------------------------------------------------------------------- // // Copyright (C) Microsoft Corporation. All rights reserved. // // Description: BaseParagraph represents a paragraph corresponding to part // of a text based content. // // History: // 05/05/2003 : grzegorz - moving from Avalon branch. // 10/30/2004 : grzegorz - ElementReference cleanup. // //--------------------------------------------------------------------------- using System; using System.Diagnostics; using System.Windows; using System.Windows.Documents; using MS.Internal.Documents; using MS.Internal.Text; using MS.Internal.PtsHost.UnsafeNativeMethods; namespace MS.Internal.PtsHost { ////// BaseParagraph represents a paragraph corresponding to part of a text /// based content. /// internal abstract class BaseParagraph : UnmanagedHandle { //------------------------------------------------------------------- // // Constructors // //------------------------------------------------------------------- #region Constructors ////// Constructor. /// /// /// Element associated with paragraph. /// /// /// Content's structural cache /// protected BaseParagraph(DependencyObject element, StructuralCache structuralCache) : base(structuralCache.PtsContext) { _element = element; _structuralCache = structuralCache; _changeType = PTS.FSKCHANGE.fskchNone; _stopAsking = false; UpdateLastFormatPositions(); } #endregion Constructors // ------------------------------------------------------------------ // // PTS callbacks // // ----------------------------------------------------------------- #region PTS callbacks ////// UpdGetParaChange /// /// /// OUT: kind of change /// /// /// OUT: no changes after? /// internal virtual void UpdGetParaChange( out PTS.FSKCHANGE fskch, out int fNoFurtherChanges) { fskch = _changeType; fNoFurtherChanges = PTS.FromBoolean(_stopAsking); #if TEXTPANELLAYOUTDEBUG if (StructuralCache.CurrentFormatContext.IncrementalUpdate) { TextPanelDebug.Log("Para.UpdGetParaChange, Para=" + this.GetType().Name + " Change=" + _changeType.ToString(), TextPanelDebug.Category.ContentChange); } #endif } ////// Collapse margins /// /// /// IN: Paragraph's para client /// /// /// IN: input margin collapsing state /// /// /// IN: current direction (of the track, in which margin collapsing is happening) /// /// /// IN: suppress empty space at the top of page /// /// /// OUT: dvr, calculated based on margin collapsing state /// internal virtual void CollapseMargin( BaseParaClient paraClient, MarginCollapsingState mcs, uint fswdir, bool suppressTopSpace, out int dvr) { // Suppress top space only in paginated scenarios. dvr = (mcs == null || (suppressTopSpace)) ? 0 : mcs.Margin; } ////// Get Para Properties /// /// /// OUT: paragraph properties /// internal abstract void GetParaProperties( ref PTS.FSPAP fspap); ////// CreateParaclient /// /// /// OUT: opaque to PTS paragraph client /// internal abstract void CreateParaclient( out IntPtr pfsparaclient); #endregion PTS callbacks // ------------------------------------------------------------------ // // Internal Methods // // ------------------------------------------------------------------ #region Internal Methods ////// Set update info. Those flags are used later by PTS to decide /// if paragraph needs to be updated and when to stop asking for /// update information. /// /// /// Type of change within the paragraph. /// /// /// Synchronization point is reached? /// internal virtual void SetUpdateInfo(PTS.FSKCHANGE fskch, bool stopAsking) { _changeType = fskch; _stopAsking = stopAsking; } ////// Clear previously accumulated update info. /// internal virtual void ClearUpdateInfo() { _changeType = PTS.FSKCHANGE.fskchNone; _stopAsking = true; } ////// Invalidate content's structural cache. Returns: 'true' if entire paragraph /// is invalid. /// /// /// Position to start invalidation from. /// internal virtual bool InvalidateStructure(int startPosition) { Debug.Assert(ParagraphEndCharacterPosition >= startPosition); int openEdgeCp = TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.BeforeStart); return (openEdgeCp == startPosition); } ////// Invalidate accumulated format caches. /// internal virtual void InvalidateFormatCache() { } ////// Update number of characters consumed by the paragraph. /// internal void UpdateLastFormatPositions() { _lastFormatCch = Cch; } #endregion Internal Methods //------------------------------------------------------------------- // // Protected Methods // //-------------------------------------------------------------------- #region Protected Methods ////// Retrieve PTS paragraph properties. /// /// /// Paragraph properties to initialize. /// /// /// Ignore element properties? /// protected void GetParaProperties(ref PTS.FSPAP fspap, bool ignoreElementProps) { if (!ignoreElementProps) { fspap.fKeepWithNext = PTS.FromBoolean(DynamicPropertyReader.GetKeepWithNext(_element)); // Can be broken only if Block.BreakPageBefore is set fspap.fBreakPageBefore = _element is Block ? PTS.FromBoolean(StructuralCache.CurrentFormatContext.FinitePage && ((Block)_element).BreakPageBefore) : PTS.FromBoolean(false); // Can be broken only if Block.BreakColumnBefore is set fspap.fBreakColumnBefore = _element is Block ? PTS.FromBoolean(((Block)_element).BreakColumnBefore) : PTS.FromBoolean(false); } } #endregion Protected Methods //------------------------------------------------------------------- // // Properties / Fields // //------------------------------------------------------------------- #region Properties / Fields ////// CharacterPosition at the start of paragraph. /// internal int ParagraphStartCharacterPosition { get { // This is done here, rather than deriving for two reasons - This is special cased for text paragraph - no other // paras should use their cps in this way, and this is also not a virtual method, so can be used from C'Tor. if(this is TextParagraph) { return TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.AfterStart); } else { return TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.BeforeStart); } } } ////// CharacterPosition at the end of paragraph. The first character /// that does not belong to the paragraph. /// internal int ParagraphEndCharacterPosition { get { // This is done here, rather than deriving for two reasons - This is special cased for text paragraph - no other // paras should use their cps in this way, and this is also not a virtual method, so can be used from C'Tor. if(this is TextParagraph) { return TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.BeforeEnd); } else { return TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.AfterEnd); } } } ////// Incremental update information for the paragraph. /// Those fields are used only during incremental update process. /// protected PTS.FSKCHANGE _changeType; protected bool _stopAsking; ////// Number of characters consumed by the paragraph. /// internal int Cch { get { int cch = TextContainerHelper.GetCchFromElement(StructuralCache.TextContainer, Element); // This is done here, rather than deriving for two reasons - This is special cased for text paragraph - no other // paras should use their cps in this way, and this is also not a virtual method, so can be used from C'Tor. if (this is TextParagraph && Element is TextElement) { Invariant.Assert(cch >= 2); cch -= 2; } return cch; } } ////// Cch paragraph had during last format /// internal int LastFormatCch { get { return _lastFormatCch; } } protected int _lastFormatCch; ////// The next and previous sibling in paragraph list. /// internal BaseParagraph Next; internal BaseParagraph Previous; ////// Content's structural cache. /// internal StructuralCache StructuralCache { get { return _structuralCache; } } protected readonly StructuralCache _structuralCache; ////// Object associated with the paragraph. /// internal DependencyObject Element { get { return _element; } } protected readonly DependencyObject _element; #endregion Properties / Fields } } // 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: BaseParagraph represents a paragraph corresponding to part // of a text based content. // // History: // 05/05/2003 : grzegorz - moving from Avalon branch. // 10/30/2004 : grzegorz - ElementReference cleanup. // //--------------------------------------------------------------------------- using System; using System.Diagnostics; using System.Windows; using System.Windows.Documents; using MS.Internal.Documents; using MS.Internal.Text; using MS.Internal.PtsHost.UnsafeNativeMethods; namespace MS.Internal.PtsHost { ////// BaseParagraph represents a paragraph corresponding to part of a text /// based content. /// internal abstract class BaseParagraph : UnmanagedHandle { //------------------------------------------------------------------- // // Constructors // //------------------------------------------------------------------- #region Constructors ////// Constructor. /// /// /// Element associated with paragraph. /// /// /// Content's structural cache /// protected BaseParagraph(DependencyObject element, StructuralCache structuralCache) : base(structuralCache.PtsContext) { _element = element; _structuralCache = structuralCache; _changeType = PTS.FSKCHANGE.fskchNone; _stopAsking = false; UpdateLastFormatPositions(); } #endregion Constructors // ------------------------------------------------------------------ // // PTS callbacks // // ----------------------------------------------------------------- #region PTS callbacks ////// UpdGetParaChange /// /// /// OUT: kind of change /// /// /// OUT: no changes after? /// internal virtual void UpdGetParaChange( out PTS.FSKCHANGE fskch, out int fNoFurtherChanges) { fskch = _changeType; fNoFurtherChanges = PTS.FromBoolean(_stopAsking); #if TEXTPANELLAYOUTDEBUG if (StructuralCache.CurrentFormatContext.IncrementalUpdate) { TextPanelDebug.Log("Para.UpdGetParaChange, Para=" + this.GetType().Name + " Change=" + _changeType.ToString(), TextPanelDebug.Category.ContentChange); } #endif } ////// Collapse margins /// /// /// IN: Paragraph's para client /// /// /// IN: input margin collapsing state /// /// /// IN: current direction (of the track, in which margin collapsing is happening) /// /// /// IN: suppress empty space at the top of page /// /// /// OUT: dvr, calculated based on margin collapsing state /// internal virtual void CollapseMargin( BaseParaClient paraClient, MarginCollapsingState mcs, uint fswdir, bool suppressTopSpace, out int dvr) { // Suppress top space only in paginated scenarios. dvr = (mcs == null || (suppressTopSpace)) ? 0 : mcs.Margin; } ////// Get Para Properties /// /// /// OUT: paragraph properties /// internal abstract void GetParaProperties( ref PTS.FSPAP fspap); ////// CreateParaclient /// /// /// OUT: opaque to PTS paragraph client /// internal abstract void CreateParaclient( out IntPtr pfsparaclient); #endregion PTS callbacks // ------------------------------------------------------------------ // // Internal Methods // // ------------------------------------------------------------------ #region Internal Methods ////// Set update info. Those flags are used later by PTS to decide /// if paragraph needs to be updated and when to stop asking for /// update information. /// /// /// Type of change within the paragraph. /// /// /// Synchronization point is reached? /// internal virtual void SetUpdateInfo(PTS.FSKCHANGE fskch, bool stopAsking) { _changeType = fskch; _stopAsking = stopAsking; } ////// Clear previously accumulated update info. /// internal virtual void ClearUpdateInfo() { _changeType = PTS.FSKCHANGE.fskchNone; _stopAsking = true; } ////// Invalidate content's structural cache. Returns: 'true' if entire paragraph /// is invalid. /// /// /// Position to start invalidation from. /// internal virtual bool InvalidateStructure(int startPosition) { Debug.Assert(ParagraphEndCharacterPosition >= startPosition); int openEdgeCp = TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.BeforeStart); return (openEdgeCp == startPosition); } ////// Invalidate accumulated format caches. /// internal virtual void InvalidateFormatCache() { } ////// Update number of characters consumed by the paragraph. /// internal void UpdateLastFormatPositions() { _lastFormatCch = Cch; } #endregion Internal Methods //------------------------------------------------------------------- // // Protected Methods // //-------------------------------------------------------------------- #region Protected Methods ////// Retrieve PTS paragraph properties. /// /// /// Paragraph properties to initialize. /// /// /// Ignore element properties? /// protected void GetParaProperties(ref PTS.FSPAP fspap, bool ignoreElementProps) { if (!ignoreElementProps) { fspap.fKeepWithNext = PTS.FromBoolean(DynamicPropertyReader.GetKeepWithNext(_element)); // Can be broken only if Block.BreakPageBefore is set fspap.fBreakPageBefore = _element is Block ? PTS.FromBoolean(StructuralCache.CurrentFormatContext.FinitePage && ((Block)_element).BreakPageBefore) : PTS.FromBoolean(false); // Can be broken only if Block.BreakColumnBefore is set fspap.fBreakColumnBefore = _element is Block ? PTS.FromBoolean(((Block)_element).BreakColumnBefore) : PTS.FromBoolean(false); } } #endregion Protected Methods //------------------------------------------------------------------- // // Properties / Fields // //------------------------------------------------------------------- #region Properties / Fields ////// CharacterPosition at the start of paragraph. /// internal int ParagraphStartCharacterPosition { get { // This is done here, rather than deriving for two reasons - This is special cased for text paragraph - no other // paras should use their cps in this way, and this is also not a virtual method, so can be used from C'Tor. if(this is TextParagraph) { return TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.AfterStart); } else { return TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.BeforeStart); } } } ////// CharacterPosition at the end of paragraph. The first character /// that does not belong to the paragraph. /// internal int ParagraphEndCharacterPosition { get { // This is done here, rather than deriving for two reasons - This is special cased for text paragraph - no other // paras should use their cps in this way, and this is also not a virtual method, so can be used from C'Tor. if(this is TextParagraph) { return TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.BeforeEnd); } else { return TextContainerHelper.GetCPFromElement(StructuralCache.TextContainer, Element, ElementEdge.AfterEnd); } } } ////// Incremental update information for the paragraph. /// Those fields are used only during incremental update process. /// protected PTS.FSKCHANGE _changeType; protected bool _stopAsking; ////// Number of characters consumed by the paragraph. /// internal int Cch { get { int cch = TextContainerHelper.GetCchFromElement(StructuralCache.TextContainer, Element); // This is done here, rather than deriving for two reasons - This is special cased for text paragraph - no other // paras should use their cps in this way, and this is also not a virtual method, so can be used from C'Tor. if (this is TextParagraph && Element is TextElement) { Invariant.Assert(cch >= 2); cch -= 2; } return cch; } } ////// Cch paragraph had during last format /// internal int LastFormatCch { get { return _lastFormatCch; } } protected int _lastFormatCch; ////// The next and previous sibling in paragraph list. /// internal BaseParagraph Next; internal BaseParagraph Previous; ////// Content's structural cache. /// internal StructuralCache StructuralCache { get { return _structuralCache; } } protected readonly StructuralCache _structuralCache; ////// Object associated with the paragraph. /// internal DependencyObject Element { get { return _element; } } protected readonly DependencyObject _element; #endregion Properties / Fields } } // 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
- FieldNameLookup.cs
- PopOutPanel.cs
- HttpCachePolicyWrapper.cs
- ProfilePropertyNameValidator.cs
- IISMapPath.cs
- MaterialGroup.cs
- MenuTracker.cs
- UnsafeMethods.cs
- CatalogPart.cs
- PointIndependentAnimationStorage.cs
- SqlParameter.cs
- IPPacketInformation.cs
- UserControlAutomationPeer.cs
- AutomationPatternInfo.cs
- SByte.cs
- WindowsHyperlink.cs
- SecurityElement.cs
- DecodeHelper.cs
- MembershipPasswordException.cs
- Directory.cs
- XamlRtfConverter.cs
- WebPartDisplayModeEventArgs.cs
- PhysicalAddress.cs
- DataTransferEventArgs.cs
- XmlComplianceUtil.cs
- InputMethodStateTypeInfo.cs
- DataTableCollection.cs
- RawUIStateInputReport.cs
- SystemIPv6InterfaceProperties.cs
- brushes.cs
- JpegBitmapDecoder.cs
- InputProcessorProfiles.cs
- CompositeDesignerAccessibleObject.cs
- StringToken.cs
- XmlText.cs
- ApplicationGesture.cs
- columnmapfactory.cs
- PartialList.cs
- ImplicitInputBrush.cs
- SoapIgnoreAttribute.cs
- QueryOutputWriterV1.cs
- HyperLink.cs
- RequestTimeoutManager.cs
- TypeBuilder.cs
- UnmanagedMemoryAccessor.cs
- ProfilePropertySettings.cs
- XmlSignatureManifest.cs
- CompiledIdentityConstraint.cs
- HtmlFormWrapper.cs
- DiscoveryClientElement.cs
- ObjectListDataBindEventArgs.cs
- URLAttribute.cs
- QueryCursorEventArgs.cs
- XsltLibrary.cs
- AsyncContentLoadedEventArgs.cs
- HttpDebugHandler.cs
- XmlDictionary.cs
- LicenseException.cs
- ToolStripDropDownClosingEventArgs.cs
- SqlInternalConnectionSmi.cs
- ConnectionStringSettingsCollection.cs
- SchemaConstraints.cs
- IgnoreFileBuildProvider.cs
- ConditionCollection.cs
- ImageButton.cs
- DataGridViewAccessibleObject.cs
- ConnectionPointCookie.cs
- QilTypeChecker.cs
- BuilderPropertyEntry.cs
- GrammarBuilderRuleRef.cs
- DbParameterCollection.cs
- SessionStateModule.cs
- CodeNamespaceCollection.cs
- ApplicationServiceManager.cs
- ParserContext.cs
- TemplatePropertyEntry.cs
- SocketElement.cs
- BindingListCollectionView.cs
- OrCondition.cs
- XmlProcessingInstruction.cs
- FileRecordSequenceHelper.cs
- Bind.cs
- XMLSchema.cs
- NullableFloatAverageAggregationOperator.cs
- IIS7WorkerRequest.cs
- InkCanvasInnerCanvas.cs
- FloaterBaseParaClient.cs
- OleServicesContext.cs
- MetadataPropertyCollection.cs
- XpsSerializerWriter.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- NamespaceExpr.cs
- EventRouteFactory.cs
- CodeSnippetExpression.cs
- ResolveResponseInfo.cs
- XmlSchemaSequence.cs
- TextChange.cs
- XmlDataSourceView.cs
- NetCodeGroup.cs
- Currency.cs