/// <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
         ));
     }
 }
示例#2
0
        /// <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();
        }