// Inserts an Inline at the current location, adding contextual // elements as needed to enforce the schema. internal void InsertInline(Inline inline) { TextPointer position = this; // Check for hyperlink schema validity first -- we'll throw on an illegal Hyperlink descendent insert. bool isValidChild = TextSchema.ValidateChild(position, /*childType*/inline.GetType(), false /* throwIfIllegalChild */, true /* throwIfIllegalHyperlinkDescendent */); // Now, it is safe to assume that !isValidChild will be the case of incomplete content. if (!isValidChild) { if (position.Parent == null) { // throw new InvalidOperationException(SR.Get(SRID.TextSchema_CannotInsertContentInThisPosition)); } // Ensure text content. position = TextRangeEditTables.EnsureInsertionPosition(this); Invariant.Assert(position.Parent is Run, "EnsureInsertionPosition() must return a position in text content"); Run run = (Run)position.Parent; if (run.IsEmpty) { // Remove the implicit (empty) Run, since we are going to insert an inline at this position. run.RepositionWithContent(null); } else { // Position is parented by Run, split formatting elements to prepare for inserting inline at this position. position = TextRangeEdit.SplitFormattingElement(position, /*keepEmptyFormatting:*/false); } Invariant.Assert(TextSchema.IsValidChild(position, /*childType*/inline.GetType())); } inline.RepositionWithContent(position); }