Наша сборка Qt VS Tools
giy
2022-09-02 ca47896204482bf4a6979e3838bf7f09f61cebeb
QtVsTools.Package/QtVsToolsPackage.cs
@@ -27,20 +27,14 @@
****************************************************************************/
using System;
using System.ComponentModel.Design;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using Task = System.Threading.Tasks.Task;
using System.Windows.Forms;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Settings;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
@@ -49,13 +43,15 @@
using Microsoft.Win32;
using EnvDTE;
using Task = System.Threading.Tasks.Task;
namespace QtVsTools
{
    using Core;
    using QtMsBuild;
    using SyntaxAnalysis;
    using static SyntaxAnalysis.RegExpr;
    using VisualStudio;
    using static SyntaxAnalysis.RegExpr;
    [Guid(QtVsToolsPackage.PackageGuidString)]
    [InstalledProductRegistration("#110", "#112", Version.PRODUCT_VERSION, IconResourceID = 400)]
@@ -97,7 +93,7 @@
        "Qt", "Versions", 0, 0, true, Sort = 1)]
    // Legacy options page
    [ProvideOptionPage(typeof(Options.QtLegacyOptionsPage),
    [ProvideOptionPage(typeof(Legacy.QtOptionsPage),
        "Qt", "Legacy Project Format", 0, 0, true, Sort = 2)]
    public sealed class QtVsToolsPackage : AsyncPackage, IVsServiceProvider, IProjectTracker
@@ -109,13 +105,13 @@
        public string PkgInstallPath { get; private set; }
        public Options.QtOptionsPage Options
            => GetDialogPage(typeof(Options.QtOptionsPage)) as Options.QtOptionsPage;
        public Options.QtLegacyOptionsPage LegacyOptions
            => GetDialogPage(typeof(Options.QtLegacyOptionsPage)) as Options.QtLegacyOptionsPage;
        public Legacy.QtOptionsPage LegacyOptions
            => GetDialogPage(typeof(Legacy.QtOptionsPage)) as Legacy.QtOptionsPage;
        public Editors.QtDesigner QtDesigner { get; private set; }
        public Editors.QtLinguist QtLinguist { get; private set; }
        public Editors.QtResourceEditor QtResourceEditor { get; private set; }
        private Editors.QtResourceEditor QtResourceEditor { get; set; }
        static EventWaitHandle initDone = new EventWaitHandle(false, EventResetMode.ManualReset);
        static readonly EventWaitHandle initDone = new EventWaitHandle(false, EventResetMode.ManualReset);
        static QtVsToolsPackage instance = null;
        public static QtVsToolsPackage Instance
@@ -167,7 +163,6 @@
                var timeInitBegin = initTimer.Elapsed;
                VsServiceProvider.Instance = instance = this;
                QtProject.ProjectTracker = this;
                Messages.JoinableTaskFactory = JoinableTaskFactory;
                // determine the package installation directory
                var uri = new Uri(System.Reflection.Assembly
@@ -180,7 +175,7 @@
                await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
                var timeUiThreadBegin = initTimer.Elapsed;
                if ((Dte = VsServiceProvider.GetService<DTE>()) == null)
                if ((Dte = await VsServiceProvider.GetServiceAsync<DTE>()) == null)
                    throw new Exception("Unable to get service: DTE");
                QtVSIPSettings.Options = Options;
@@ -188,14 +183,14 @@
                eventHandler = new DteEventsHandler(Dte);
                Qml.Debug.Launcher.Initialize();
                QtMainMenu.Initialize(this);
                QtSolutionContextMenu.Initialize(this);
                QtProjectContextMenu.Initialize(this);
                QtItemContextMenu.Initialize(this);
                QtMainMenu.Initialize();
                QtSolutionContextMenu.Initialize();
                QtProjectContextMenu.Initialize();
                QtItemContextMenu.Initialize();
                RegisterEditorFactory(QtDesigner = new Editors.QtDesigner());
                RegisterEditorFactory(QtLinguist = new Editors.QtLinguist());
                RegisterEditorFactory(QtResourceEditor = new Editors.QtResourceEditor());
                QtHelp.Initialize(this);
                QtHelp.Initialize();
                if (!string.IsNullOrEmpty(VsShell.InstallRootDir))
                    HelperFunctions.VCPath = Path.Combine(VsShell.InstallRootDir, "VC");
@@ -209,9 +204,11 @@
                var timeUiThreadEnd = initTimer.Elapsed;
                var vm = QtVersionManager.The(initDone);
                var error = string.Empty;
                if (vm.HasInvalidVersions(out error))
                if (vm.HasInvalidVersions(out string error, out bool defaultInvalid)) {
                    if (defaultInvalid)
                        vm.SetLatestQtVersionAsDefault();
                    Messages.Print(error);
                }
                ///////////
                // Install Qt/MSBuild files from package folder to standard location
@@ -306,9 +303,8 @@
    ================================================================",
                        urlDownloadQtIo, devRelease));
                }
            } catch (Exception e) {
                Messages.Print(
                    e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
            } catch (Exception exception) {
                exception.Log();
            } finally {
                initDone.Set();
                initTimer.Stop();
@@ -326,11 +322,35 @@
                eventHandler.SolutionEvents_Opened();
        }
        bool TestVersionInstalled()
        {
            bool newVersion = false;
            string versionFile = Path.Combine(PkgInstallPath, "lastversion.txt");
            if (File.Exists(versionFile)) {
                string lastVersion = File.ReadAllText(versionFile);
                newVersion = (lastVersion!= Version.PRODUCT_VERSION);
            } else {
                newVersion = true;
            }
            if (newVersion)
                File.WriteAllText(versionFile, Version.PRODUCT_VERSION);
            return newVersion;
        }
        public void VsMainWindowActivated()
        {
            if (QtVersionManager.The().GetVersions()?.Length == 0)
                Notifications.NoQtVersion.Show();
            if (Options.NotifyInstalled && TestVersionInstalled())
                Notifications.NotifyInstall.Show();
        }
        protected override int QueryClose(out bool canClose)
        {
            if (eventHandler != null) {
            ThreadHelper.ThrowIfNotOnUIThread();
            if (eventHandler != null)
                eventHandler.Disconnect();
            }
            return base.QueryClose(out canClose);
        }
@@ -381,14 +401,15 @@
                File.WriteAllText(Path.Combine(visualizersPath, natvisFile),
                    natvis, System.Text.Encoding.UTF8);
            } catch (Exception e) {
                Messages.Print(
                    e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
            } catch (Exception exception) {
                exception.Log();
            }
        }
        public string GetNatvisPath()
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            try {
                using (var vsRootKey = Registry.CurrentUser.OpenSubKey(Dte.RegistryRoot)) {
                    if (vsRootKey.GetValue("VisualStudioLocation") is string vsLocation)
@@ -433,6 +454,7 @@
        void IProjectTracker.AddProject(Project project)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            QtProjectTracker.Add(project);
        }