//------------------------------------------------------------------- // // Private Methods // //------------------------------------------------------------------- #region Private Methods // ------------------------------------------------------------------ // Determine paragraph type at the current tree position and create it. // If going out of scope, return null. // // Paragraph type is determined using following: // (1) if textPointer points to Text, TextParagraph // (2) if textPointer points to ElementEnd (end of TextElement): // * if the same as Owner, NULL if fEmptyOk, TextPara otherwise // (3) if textPointer points to ElementStart (start of TextElement): // * if block, ContainerParagraph // * if inline, TextParagraph // (4) if textPointer points to UIElement: // * if block, UIElementParagraph // * if inline, TextParagraph // (5) if textPointer points to TextContainer.End, NULL // ------------------------------------------------------------------ protected virtual BaseParagraph GetParagraph(ITextPointer textPointer, bool fEmptyOk) { BaseParagraph paragraph = null; switch (textPointer.GetPointerContext(LogicalDirection.Forward)) { case TextPointerContext.Text: // Text paragraph // WORKAROUND FOR SCHEMA VALIDATION if(textPointer.TextContainer.Start.CompareTo(textPointer) > 0) { if(!(Element is TextElement) || ((TextElement)Element).ContentStart != textPointer) { throw new InvalidOperationException(SR.Get(SRID.TextSchema_TextIsNotAllowedInThisContext, Element.GetType().Name)); } } paragraph = new TextParagraph(Element, StructuralCache); break; case TextPointerContext.ElementEnd: // The end of TextElement Invariant.Assert(textPointer is TextPointer); Invariant.Assert(Element == ((TextPointer)textPointer).Parent); if(!fEmptyOk) { paragraph = new TextParagraph(Element, StructuralCache); } break; case TextPointerContext.ElementStart: // The beginning of TextElement // * if block, ContainerParagraph // * if inline, TextParagraph Debug.Assert(textPointer is TextPointer); TextElement element = ((TextPointer)textPointer).GetAdjacentElementFromOuterPosition(LogicalDirection.Forward); if (element is List) { paragraph = new ListParagraph(element, StructuralCache); } else if (element is Table) { paragraph = new TableParagraph(element, StructuralCache); } else if (element is BlockUIContainer) { paragraph = new UIElementParagraph(element, StructuralCache); } else if (element is Block || element is ListItem) { paragraph = new ContainerParagraph(element, StructuralCache); } else if (element is Inline) // Note this includes AnchoredBlocks - intentionally { paragraph = new TextParagraph(Element, StructuralCache); } else { // The only remaining TextElement classes are: TableRowGroup, TableRow, TableCell // which should never go here. Invariant.Assert(false); } break; case TextPointerContext.EmbeddedElement: // Embedded UIElements are always part of TextParagraph. // There is no possibility to make UIElement a block. paragraph = new TextParagraph(Element, StructuralCache); break; case TextPointerContext.None: // End of tree case. Invariant.Assert(textPointer.CompareTo(textPointer.TextContainer.End) == 0); if (!fEmptyOk) { paragraph = new TextParagraph(Element, StructuralCache); } break; } if (paragraph != null) { StructuralCache.CurrentFormatContext.DependentMax = (TextPointer) textPointer; } return paragraph; }
//------------------------------------------------------ // // Constructors // //------------------------------------------------------ #region Constructors /// <summary> /// Constructor /// </summary> /// <param name="paragraph">Owner of the para client</param> internal TableParaClient(TableParagraph paragraph) : base(paragraph) { }
// Token: 0x060067A3 RID: 26531 RVA: 0x001D08E0 File Offset: 0x001CEAE0 protected virtual BaseParagraph GetParagraph(ITextPointer textPointer, bool fEmptyOk) { BaseParagraph baseParagraph = null; switch (textPointer.GetPointerContext(LogicalDirection.Forward)) { case TextPointerContext.None: Invariant.Assert(textPointer.CompareTo(textPointer.TextContainer.End) == 0); if (!fEmptyOk) { baseParagraph = new TextParagraph(base.Element, base.StructuralCache); } break; case TextPointerContext.Text: if (textPointer.TextContainer.Start.CompareTo(textPointer) > 0 && (!(base.Element is TextElement) || ((TextElement)base.Element).ContentStart != textPointer)) { throw new InvalidOperationException(SR.Get("TextSchema_TextIsNotAllowedInThisContext", new object[] { base.Element.GetType().Name })); } baseParagraph = new TextParagraph(base.Element, base.StructuralCache); break; case TextPointerContext.EmbeddedElement: baseParagraph = new TextParagraph(base.Element, base.StructuralCache); break; case TextPointerContext.ElementStart: { TextElement adjacentElementFromOuterPosition = ((TextPointer)textPointer).GetAdjacentElementFromOuterPosition(LogicalDirection.Forward); if (adjacentElementFromOuterPosition is List) { baseParagraph = new ListParagraph(adjacentElementFromOuterPosition, base.StructuralCache); } else if (adjacentElementFromOuterPosition is Table) { baseParagraph = new TableParagraph(adjacentElementFromOuterPosition, base.StructuralCache); } else if (adjacentElementFromOuterPosition is BlockUIContainer) { baseParagraph = new UIElementParagraph(adjacentElementFromOuterPosition, base.StructuralCache); } else if (adjacentElementFromOuterPosition is Block || adjacentElementFromOuterPosition is ListItem) { baseParagraph = new ContainerParagraph(adjacentElementFromOuterPosition, base.StructuralCache); } else if (adjacentElementFromOuterPosition is Inline) { baseParagraph = new TextParagraph(base.Element, base.StructuralCache); } else { Invariant.Assert(false); } break; } case TextPointerContext.ElementEnd: Invariant.Assert(textPointer is TextPointer); Invariant.Assert(base.Element == ((TextPointer)textPointer).Parent); if (!fEmptyOk) { baseParagraph = new TextParagraph(base.Element, base.StructuralCache); } break; } if (baseParagraph != null) { base.StructuralCache.CurrentFormatContext.DependentMax = (TextPointer)textPointer; } return(baseParagraph); }