From ca47896204482bf4a6979e3838bf7f09f61cebeb Mon Sep 17 00:00:00 2001
From: giy <giy@omp-system.ru>
Date: Fri, 02 Sep 2022 14:16:56 +0300
Subject: [PATCH] Обновление до версии 2.9.0

---
 QtVsTools.Core/Messages.cs |  134 ++++++++++++++++++--------------------------
 1 files changed, 56 insertions(+), 78 deletions(-)

diff --git a/QtVsTools.Core/Messages.cs b/QtVsTools.Core/Messages.cs
index c5eea32..507bcbb 100644
--- a/QtVsTools.Core/Messages.cs
+++ b/QtVsTools.Core/Messages.cs
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2022 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the Qt VS Tools.
@@ -26,34 +26,25 @@
 **
 ****************************************************************************/
 
-using EnvDTE;
+using System;
 using System.Collections.Concurrent;
-using System.Diagnostics;
-using System.Linq;
 using System.Threading;
-using Thread = System.Threading.Thread;
 using System.Windows.Forms;
-using System.Threading.Tasks;
+using Microsoft.VisualStudio.Shell;
 using Microsoft.VisualStudio.Threading;
-using QtVsTools.VisualStudio;
+
+using Task = System.Threading.Tasks.Task;
 
 namespace QtVsTools.Core
 {
+    using VisualStudio;
+
     public static class Messages
     {
-        private static OutputWindow Window { get; set; }
         private static OutputWindowPane Pane { get; set; }
 
-        private static OutputWindowPane _BuildPane;
-        private static OutputWindowPane BuildPane
-        {
-            get
-            {
-                return _BuildPane ?? (_BuildPane = Window.OutputWindowPanes.Cast<OutputWindowPane>()
-                    .Where(pane => pane.Guid == "{1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}")
-                    .FirstOrDefault());
-            }
-        }
+        private static readonly string PaneName = "Qt VS Tools";
+        private static readonly Guid PaneGuid = new Guid("8f6a1e44-fa0b-49e5-9934-1c050555350e");
 
         /// <summary>
         /// Show a message on the output pane.
@@ -69,13 +60,15 @@
             FlushMessages();
         }
 
-        static void OutputWindowPane_Print(string text)
+        public static void Log(this Exception exception, bool clear = false, bool activate = false)
         {
-            OutputWindowPane_Init();
-            Pane.OutputString(text + "\r\n");
-            // show buildPane if a build is in progress
-            if (Dte.Solution.SolutionBuild.BuildState == vsBuildState.vsBuildStateInProgress)
-                BuildPane?.Activate();
+            msgQueue.Enqueue(new Msg()
+            {
+                Clear = clear,
+                Text = ExceptionToString(exception),
+                Activate = activate
+            });
+            FlushMessages();
         }
 
         /// <summary>
@@ -90,50 +83,44 @@
             FlushMessages();
         }
 
-        static void OutputWindowPane_Activate()
+        static async Task OutputWindowPane_ActivateAsync()
         {
-            OutputWindowPane_Init();
-            Pane?.Activate();
+            await OutputWindowPane_InitAsync();
+            await Pane?.ActivateAsync();
         }
 
-        private static string ExceptionToString(System.Exception e)
+        private static string ExceptionToString(System.Exception exception)
         {
-            return e.Message + "\r\n" + "(" + e.StackTrace.Trim() + ")";
+            return $"An exception ({exception.GetType().Name}) occurred.\r\n"
+                   + $"Message:\r\n   {exception.Message}\r\n"
+                   + $"Stack Trace:\r\n   {exception.StackTrace.Trim()}\r\n";
         }
 
         private static readonly string ErrorString = SR.GetString("Messages_ErrorOccured");
         private static readonly string WarningString = SR.GetString("Messages_Warning");
         private static readonly string SolutionString = SR.GetString("Messages_SolveProblem");
 
-        static public void DisplayCriticalErrorMessage(System.Exception e)
-        {
-            MessageBox.Show(ErrorString +
-                ExceptionToString(e),
-                SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Error);
-        }
-
-        static public void DisplayCriticalErrorMessage(string msg)
+        public static void DisplayCriticalErrorMessage(string msg)
         {
             MessageBox.Show(ErrorString +
                 msg,
                 SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
 
-        static public void DisplayErrorMessage(System.Exception e)
+        public static void DisplayErrorMessage(System.Exception e)
         {
-            MessageBox.Show(ErrorString +
-                ExceptionToString(e),
+            MessageBox.Show(ExceptionToString(e),
                 SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
 
-        static public void DisplayErrorMessage(string msg)
+        public static void DisplayErrorMessage(string msg)
         {
             MessageBox.Show(ErrorString +
                 msg,
                 SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
 
-        static public void DisplayWarningMessage(System.Exception e, string solution)
+        public static void DisplayWarningMessage(System.Exception e, string solution)
         {
             MessageBox.Show(WarningString +
                 ExceptionToString(e) +
@@ -142,7 +129,7 @@
                 SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Warning);
         }
 
-        static public void DisplayWarningMessage(string msg)
+        public static void DisplayWarningMessage(string msg)
         {
             MessageBox.Show(WarningString +
                 msg,
@@ -158,10 +145,10 @@
             FlushMessages();
         }
 
-        static void OutputWindowPane_Clear()
+        static async Task OutputWindowPane_ClearAsync()
         {
-            OutputWindowPane_Init();
-            Pane?.Clear();
+            await OutputWindowPane_InitAsync();
+            await Pane?.ClearAsync();
         }
 
         class Msg
@@ -171,33 +158,20 @@
             public bool Activate { get; set; } = false;
         }
 
-        static bool shuttingDown = false;
-        static ConcurrentQueue<Msg> msgQueue = new ConcurrentQueue<Msg>();
-        static DTE Dte { get; set; } = null;
+        static readonly ConcurrentQueue<Msg> msgQueue = new ConcurrentQueue<Msg>();
 
-        private static void OnBeginShutdown()
+        private static async Task OutputWindowPane_InitAsync()
         {
-            shuttingDown = true;
-        }
-
-        private static void OutputWindowPane_Init()
-        {
-            if (Dte == null)
-                Dte = VsServiceProvider.GetService<DTE>();
-            var t = Stopwatch.StartNew();
-            while (Pane == null && t.ElapsedMilliseconds < 5000) {
-                try {
-                    Window = Dte.Windows.Item(Constants.vsWindowKindOutput).Object as OutputWindow;
-                    Pane = Window?.OutputWindowPanes.Add(SR.GetString("Resources_QtVsTools"));
-                } catch {
-                }
+            try {
                 if (Pane == null)
-                    Thread.Yield();
+                    Pane = await OutputWindowPane.CreateAsync(PaneName, PaneGuid);
+            } catch (Exception ex) {
+                System.Diagnostics.Debug.WriteLine(ex);
             }
-            Dte.Events.DTEEvents.OnBeginShutdown += OnBeginShutdown;
         }
 
         public static JoinableTaskFactory JoinableTaskFactory { get; set; }
+
         static readonly object staticCriticalSection = new object();
         static Task FlushTask { get; set; }
         static EventWaitHandle MessageReady { get; set; }
@@ -209,27 +183,21 @@
                     MessageReady = new EventWaitHandle(false, EventResetMode.AutoReset);
                     FlushTask = Task.Run(async () =>
                     {
-                        while (!shuttingDown) {
+                        var package = VsServiceProvider.Instance as Package;
+                        while (!package.Zombied) {
                             if (!await MessageReady.ToTask(3000))
                                 continue;
                             while (!msgQueue.IsEmpty) {
-                                Msg msg;
-                                if (!msgQueue.TryDequeue(out msg)) {
+                                if (!msgQueue.TryDequeue(out Msg msg)) {
                                     await Task.Yield();
                                     continue;
                                 }
-                                ////////////////////////////////////////////////////////////////////
-                                // Switch to main (UI) thread
-                                await JoinableTaskFactory.SwitchToMainThreadAsync();
                                 if (msg.Clear)
-                                    OutputWindowPane_Clear();
+                                    await OutputWindowPane_ClearAsync();
                                 if (msg.Text != null)
-                                    OutputWindowPane_Print(msg.Text);
+                                    await OutputWindowPane_PrintAsync(msg.Text);
                                 if (msg.Activate)
-                                    OutputWindowPane_Activate();
-                                ////////////////////////////////////////////////////////////////////
-                                // Switch to background thread
-                                await TaskScheduler.Default;
+                                    await OutputWindowPane_ActivateAsync();
                             }
                         }
                     });
@@ -237,5 +205,15 @@
             }
             MessageReady.Set();
         }
+
+        static async Task OutputWindowPane_PrintAsync(string text)
+        {
+            var active = await OutputWindowPane.GetActiveAsync();
+
+            await OutputWindowPane_InitAsync();
+            await Pane.PrintAsync(text);
+
+            (active?.ActivateAsync()).Forget();
+        }
     }
 }

--
Gitblit v1.9.1