File: IWpfTextViewExtensions.cs
Web Access
Project: src\src\EditorFeatures\Core.Wpf\Microsoft.CodeAnalysis.EditorFeatures.Wpf_cjqm5e1b_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 Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.VisualStudio.Text.Editor;
 
namespace Microsoft.CodeAnalysis.Editor.Shared.Extensions
{
    internal static class IWpfTextViewExtensions
    {
        public static void SizeToFit(this IWpfTextView view, IThreadingContext threadingContext)
        {
            void firstLayout(object sender, TextViewLayoutChangedEventArgs args)
            {
                threadingContext.JoinableTaskFactory.RunAsync(async () =>
                {
                    await threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(alwaysYield: true);
 
                    var newHeight = view.LineHeight * view.TextBuffer.CurrentSnapshot.LineCount;
                    if (IsGreater(newHeight, view.VisualElement.Height))
                    {
                        view.VisualElement.Height = newHeight;
                    }
 
                    var newWidth = view.MaxTextRightCoordinate;
                    if (IsGreater(newWidth, view.VisualElement.Width))
                    {
                        view.VisualElement.Width = newWidth;
                    }
                });
 
                view.LayoutChanged -= firstLayout;
            }
 
            view.LayoutChanged += firstLayout;
 
            static bool IsGreater(double value, double other)
                => IsNormal(value) && (!IsNormal(other) || value > other);
 
            static bool IsNormal(double value)
                => !double.IsNaN(value) && !double.IsInfinity(value);
        }
    }
}