File: WpfClassificationExtensions.cs
Web Access
Project: src\src\EditorFeatures\Core.Wpf\Microsoft.CodeAnalysis.EditorFeatures.Wpf_a0rtafw3_wpftmp.csproj (Microsoft.CodeAnalysis.EditorFeatures.Wpf)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using Microsoft.CodeAnalysis.Classification;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.VisualStudio.Text.Classification;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.Editor.Shared.Extensions;
 
internal static partial class WpfClassificationExtensions
{
    public static Run ToRun(this ClassifiedText part, IClassificationFormatMap formatMap, ClassificationTypeMap typeMap)
    {
        var run = new Run(part.Text);
 
        var classificationType = typeMap.GetClassificationType(part.ClassificationType);
 
        var format = formatMap.GetTextProperties(classificationType);
        run.SetTextProperties(format);
 
        return run;
    }
 
    public static IList<Inline> ToInlines(
       this IEnumerable<ClassifiedText> parts,
       IClassificationFormatMap formatMap,
       ClassificationTypeMap typeMap,
       Action<Run, ClassifiedText, int> runCallback = null)
    {
        var inlines = new List<Inline>();
 
        var position = 0;
        foreach (var part in parts)
        {
            var run = part.ToRun(formatMap, typeMap);
            runCallback?.Invoke(run, part, position);
            inlines.Add(run);
 
            position += part.Text.Length;
        }
 
        return inlines;
    }
 
    public static IList<Inline> ToInlines(
        this IEnumerable<TaggedText> parts,
        IClassificationFormatMap formatMap,
        ClassificationTypeMap typeMap)
    {
        var classifiedTexts = parts.Select(p =>
            new ClassifiedText(
                p.Tag.ToClassificationTypeName(),
                p.ToVisibleDisplayString(includeLeftToRightMarker: true)));
        return classifiedTexts.ToInlines(formatMap, typeMap);
    }
 
    public static TextBlock ToTextBlock(
        this IEnumerable<TaggedText> parts,
        IClassificationFormatMap formatMap,
        ClassificationTypeMap typeMap)
    {
        var inlines = parts.ToInlines(formatMap, typeMap);
        return inlines.ToTextBlock(formatMap);
    }
 
    [Obsolete("Use 'public static TextBlock ToTextBlock(this IEnumerable <Inline> inlines, IClassificationFormatMap formatMap, bool wrap = true)' instead")]
    public static TextBlock ToTextBlock(
        this IEnumerable<Inline> inlines,
        IClassificationFormatMap formatMap,
        ClassificationTypeMap typeMap,
        string classificationFormatMap = null,
        bool wrap = true)
        => inlines.ToTextBlock(formatMap, wrap);
 
    public static TextBlock ToTextBlock(
        this IEnumerable<Inline> inlines,
        IClassificationFormatMap formatMap,
        bool wrap = true)
    {
        var textBlock = new TextBlock
        {
            TextWrapping = wrap ? TextWrapping.Wrap : TextWrapping.NoWrap,
            TextTrimming = wrap ? TextTrimming.None : TextTrimming.CharacterEllipsis
        };
 
        textBlock.SetDefaultTextProperties(formatMap);
        textBlock.Inlines.AddRange(inlines);
 
        return textBlock;
    }
 
    public static TextBlock ToTextBlock(this TaggedText part, IClassificationFormatMap formatMap, ClassificationTypeMap typeMap)
        => SpecializedCollections.SingletonEnumerable(part).ToTextBlock(formatMap, typeMap);
}