| | |
| | | /****************************************************************************
|
| | | **
|
| | | ** 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.
|
| | |
| | | **
|
| | | ****************************************************************************/
|
| | |
|
| | | 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;
|
| | |
| | | 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)
|
| | |
| | | var menuCommandID = new CommandID(MainMenuGuid, F1QtHelpId);
|
| | | commandService.AddCommand(new MenuCommand(F1QtHelpEventHandler, menuCommandID));
|
| | | }
|
| | |
|
| | | IServiceProvider ServiceProvider
|
| | | {
|
| | | get { return package; }
|
| | | }
|
| | |
|
| | | static bool IsSuperfluousCharacter(string text)
|
| | | {
|
| | | switch (text) {
|
| | |
| | |
|
| | | 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;
|
| | |
| | | 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);
|
| | | }
|
| | |
| | |
|
| | | 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;
|
| | |
|
| | |
| | | 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))
|
| | |
| | | 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;
|
| | |
| | | };
|
| | | 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;
|
| | | }
|
| | | }
|
| | | }
|