/// <summary> /// Applies a highlighting color to a visual line element. /// </summary> protected virtual void ApplyColorToElement(VisualLineElement element, HighlightingColor color) { if (color.Foreground != null) { Brush b = color.Foreground.GetBrush(CurrentContext); if (b != null) element.TextRunProperties.SetForegroundBrush(b); } if (color.Background != null) { Brush b = color.Background.GetBrush(CurrentContext); if (b != null) element.BackgroundBrush = b; } if (color.FontStyle != null || color.FontWeight != null) { Typeface tf = element.TextRunProperties.Typeface; element.TextRunProperties.SetTypeface(new Typeface( tf.FontFamily, color.FontStyle ?? tf.Style, color.FontWeight ?? tf.Weight, tf.Stretch )); } }
/// <summary> /// Helper method for splitting this line element into two, correctly updating the /// <see cref="VisualLength"/>, <see cref="DocumentLength"/>, <see cref="VisualColumn"/> /// and <see cref="RelativeTextOffset"/> properties. /// </summary> /// <param name="firstPart">The element before the split position.</param> /// <param name="secondPart">The element after the split position.</param> /// <param name="splitVisualColumn">The split position as visual column.</param> /// <param name="splitRelativeTextOffset">The split position as text offset.</param> protected void SplitHelper(VisualLineElement firstPart, VisualLineElement secondPart, int splitVisualColumn, int splitRelativeTextOffset) { if (firstPart == null) throw new ArgumentNullException("firstPart"); if (secondPart == null) throw new ArgumentNullException("secondPart"); int relativeSplitVisualColumn = splitVisualColumn - VisualColumn; int relativeSplitRelativeTextOffset = splitRelativeTextOffset - RelativeTextOffset; if (relativeSplitVisualColumn <= 0 || relativeSplitVisualColumn >= VisualLength) throw new ArgumentOutOfRangeException("splitVisualColumn", splitVisualColumn, "Value must be between " + (VisualColumn + 1) + " and " + (VisualColumn + VisualLength - 1)); if (relativeSplitRelativeTextOffset < 0 || relativeSplitRelativeTextOffset > DocumentLength) throw new ArgumentOutOfRangeException("splitRelativeTextOffset", splitRelativeTextOffset, "Value must be between " + (RelativeTextOffset) + " and " + (RelativeTextOffset + DocumentLength)); int oldVisualLength = VisualLength; int oldDocumentLength = DocumentLength; int oldVisualColumn = VisualColumn; int oldRelativeTextOffset = RelativeTextOffset; firstPart.VisualColumn = oldVisualColumn; secondPart.VisualColumn = oldVisualColumn + relativeSplitVisualColumn; firstPart.RelativeTextOffset = oldRelativeTextOffset; secondPart.RelativeTextOffset = oldRelativeTextOffset + relativeSplitRelativeTextOffset; firstPart.VisualLength = relativeSplitVisualColumn; secondPart.VisualLength = oldVisualLength - relativeSplitVisualColumn; firstPart.DocumentLength = relativeSplitRelativeTextOffset; secondPart.DocumentLength = oldDocumentLength - relativeSplitRelativeTextOffset; if (firstPart.TextRunProperties == null) firstPart.TextRunProperties = TextRunProperties.Clone(); if (secondPart.TextRunProperties == null) secondPart.TextRunProperties = TextRunProperties.Clone(); }