Наша сборка Qt VS Tools
giy
2022-09-02 ca47896204482bf4a6979e3838bf7f09f61cebeb
QtVsTools.Package/Package/QtHelp.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,13 +26,6 @@
**
****************************************************************************/
using EnvDTE;
using Microsoft.VisualStudio.Settings;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Shell.Settings;
using QtVsTools.Core;
using QtVsTools.VisualStudio;
using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
@@ -40,37 +33,36 @@
using System.Data.SQLite;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Task = System.Threading.Tasks.Task;
using EnvDTE;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
namespace QtVsTools
{
    using Core;
    using VisualStudio;
    public class QtHelp
    {
        public enum SourcePreference { Online, Offline }
        public static QtHelp Instance
        private static QtHelp Instance
        {
            get;
            private set;
            set;
        }
        public static void Initialize(Package package)
        public static void Initialize()
        {
            Instance = new QtHelp(package);
            Instance = new QtHelp();
        }
        const int F1QtHelpId = 0x0502;
        readonly Package package;
        public static readonly Guid MainMenuGuid = new Guid("58f83fff-d39d-4c66-810b-2702e1f04e73");
        private static readonly Guid MainMenuGuid = new Guid("58f83fff-d39d-4c66-810b-2702e1f04e73");
        QtHelp(Package pkg)
        private QtHelp()
        {
            if (pkg == null)
                throw new ArgumentNullException("package");
            package = pkg;
            var commandService = VsServiceProvider
                .GetService<IMenuCommandService, OleMenuCommandService>();
            if (commandService == null)
@@ -79,12 +71,6 @@
            var menuCommandID = new CommandID(MainMenuGuid, F1QtHelpId);
            commandService.AddCommand(new MenuCommand(F1QtHelpEventHandler, menuCommandID));
        }
        IServiceProvider ServiceProvider
        {
            get { return package; }
        }
        static bool IsSuperfluousCharacter(string text)
        {
            switch (text) {
@@ -131,11 +117,17 @@
        void F1QtHelpEventHandler(object sender, EventArgs args)
        {
            QueryEditorContextHelp(true);
            ThreadHelper.ThrowIfNotOnUIThread();
            if (!ShowEditorContextHelp()) {
                Messages.Print("No help match was found. You can still try to search online at "
                    + "https://doc.qt.io" + ".", false, true);
            }
        }
        public static bool QueryEditorContextHelp(bool defaultTryOnline = false)
        public static bool ShowEditorContextHelp()
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            try {
                var dte = VsServiceProvider.GetService<SDTE, DTE>();
                var objTextDocument = dte?.ActiveDocument?.Object() as TextDocument;
@@ -173,7 +165,7 @@
                var project = HelperFunctions.GetSelectedQtProject(dte);
                if (project == null) {
                    project = HelperFunctions.GetSelectedProject(dte);
                    if (project != null && HelperFunctions.IsQMakeProject(project)) {
                    if (project != null && HelperFunctions.IsQtProject(project)) {
                        var qmakeQtDir = HelperFunctions.GetQtDirFromQMakeProject(project);
                        qtVersion = QtVersionManager.The().GetQtVersionFromInstallDir(qmakeQtDir);
                    }
@@ -188,7 +180,7 @@
                var qchFiles = Directory.GetFiles(docPath, "*?.qch");
                if (qchFiles.Length == 0)
                    return false;
                    return TryShowGenericSearchResultsOnline(keyword, info.qtMajor);
                var offline = QtVsToolsPackage.Instance.Options.HelpPreference == SourcePreference.Offline;
@@ -207,8 +199,9 @@
                    using (var connection = new SQLiteConnection(builder.ToString())) {
                        connection.Open();
                        using (var command = new SQLiteCommand(linksForKeyword, connection)) {
                            using (var reader =
                                Task.Run(async () => await command.ExecuteReaderAsync()).Result) {
                            var reader = QtVsToolsPackage.Instance.JoinableTaskFactory
                                .Run(async () => await command.ExecuteReaderAsync());
                            using (reader) {
                                while (reader.Read()) {
                                    var title = GetString(reader, 0);
                                    if (string.IsNullOrWhiteSpace(title))
@@ -233,15 +226,7 @@
                var uri = string.Empty;
                switch (links.Values.Count) {
                case 0:
                    if (!offline && defaultTryOnline) {
                        uri = new UriBuilder($"https://doc.qt.io/qt-{info.qtMajor}/search-results.html")
                        {
                            Query = "q=" + keyword
                        }.ToString();
                    } else {
                        return false;
                    }
                    break;
                    return TryShowGenericSearchResultsOnline(keyword, info.qtMajor);
                case 1:
                    uri = links.First().Value;
                    break;
@@ -254,34 +239,40 @@
                    };
                    if (!dialog.ShowModal().GetValueOrDefault())
                        return false;
                    uri = dialog.Link
                        .Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
                    uri = dialog.Link;
                    break;
                }
                if (string.IsNullOrEmpty(uri)) { // offline mode without a single search hit
                    VsShellUtilities.ShowMessageBox(Instance.ServiceProvider,
                        "Your search - " + keyword + " - did not match any documents.",
                uri = HelperFunctions.FromNativeSeparators(uri);
                var helpUri = new Uri(uri);
                if (helpUri.IsFile && !File.Exists(helpUri.LocalPath)) {
                    VsShellUtilities.ShowMessageBox(QtVsToolsPackage.Instance,
                        "Your search - " + keyword + " - did match a document, but it could "
                        + "not be found on disk. To use the online help, select: "
                        + "Tools | Options | Qt | Preferred source | Online",
                        string.Empty, OLEMSGICON.OLEMSGICON_INFO, OLEMSGBUTTON.OLEMSGBUTTON_OK,
                        OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
                } else {
                    var helpUri = new Uri(uri.Replace('\\', '/'));
                    if (helpUri.IsFile && !File.Exists(helpUri.LocalPath)) {
                        VsShellUtilities.ShowMessageBox(Instance.ServiceProvider,
                            "Your search - " + keyword + " - did match a document, but it could "
                            + "not be found on disk. To use the online help, select: "
                            + "Help | Set Qt Help Preference | Use Online Documentation",
                            string.Empty, OLEMSGICON.OLEMSGICON_INFO, OLEMSGBUTTON.OLEMSGBUTTON_OK,
                            OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
                    } else {
                        VsShellUtilities.OpenSystemBrowser(HelperFunctions.ChangePathFormat(uri));
                    }
                    VsShellUtilities.OpenSystemBrowser(uri);
                }
            } catch (Exception e) {
                Messages.Print(
                    e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
            } catch (Exception exception) {
                exception.Log();
            }
            return true;
        }
        private static bool TryShowGenericSearchResultsOnline(string keyword, uint version)
        {
            if (QtVsToolsPackage.Instance.Options.HelpPreference != SourcePreference.Online)
                return false;
            VsShellUtilities.OpenSystemBrowser(HelperFunctions.FromNativeSeparators(
                new UriBuilder($"https://doc.qt.io/qt-{version}/search-results.html")
                {
                    Query = "q=" + keyword
                }.ToString())
            );
            return true;
        }
    }
}