예제 #1
0
        async void F1QtHelpCallback(object sender, EventArgs args)
        {
            try {
                var dte             = ServiceProvider.GetService(typeof(SDTE)) as DTE;
                var objTextDocument = dte.ActiveDocument.Object() as TextDocument;

                var keyword   = string.Empty;
                var selection = objTextDocument.Selection;
                if (selection.IsEmpty)                                 // no selection inside the document
                {
                    var line   = selection.ActivePoint.Line;           // current line
                    var offset = selection.ActivePoint.LineCharOffset; // current char offset

                    selection.CharLeft(true);                          // try the character before the cursor
                    if (!selection.IsEmpty)
                    {
                        keyword = selection.Text;  // something in front of the cursor
                        selection.CharRight(true); // reset to origin
                        if (!IsSuperfluousCharacter(keyword))
                        {
                            // move the selection to the start of the word
                            selection.WordLeft(true);
                            selection.MoveToPoint(selection.TopPoint);
                        }
                    }
                    selection.WordRight(true);                   // select the word
                    keyword = selection.Text;                    // get the selected text
                    selection.MoveToLineAndOffset(line, offset); // reset
                }
                else
                {
                    keyword = selection.Text;
                }

                keyword = keyword.Trim();
                if (keyword.Length <= 1 || IsSuperfluousCharacter(keyword))
                {
                    return; // suppress single character, operators etc...
                }
                var qtVersion = "$(DefaultQtVersion)";
                var project   = HelperFunctions.GetSelectedQtProject(dte);
                if (project == null)
                {
                    project = HelperFunctions.GetSelectedProject(dte);
                    if (project != null && HelperFunctions.IsQMakeProject(project))
                    {
                        var qmakeQtDir = HelperFunctions.GetQtDirFromQMakeProject(project);
                        qtVersion = QtVersionManager.The().GetQtVersionFromInstallDir(qmakeQtDir);
                    }
                }
                else
                {
                    qtVersion = QtVersionManager.The().GetProjectQtVersion(project);
                }

                var docPath = QtVersionManager.The().GetVersionInfo(qtVersion).QtInstallDocs;
                if (string.IsNullOrEmpty(docPath) || !Directory.Exists(docPath))
                {
                    return;
                }

                var qchFiles = Directory.GetFiles(docPath, "*?.qch");
                if (qchFiles.Length == 0)
                {
                    return;
                }

                var settingsManager = new ShellSettingsManager(Instance.ServiceProvider);
                var store           = settingsManager.GetReadOnlySettingsStore(SettingsScope.UserSettings);
                var offline         =
                    store.GetBoolean(Statics.HelpPreferencePath, Statics.HelpPreferenceKey, true);

                var linksForKeyword = string.Format("SELECT d.Title, f.Name, e.Name, "
                                                    + "d.Name, a.Anchor FROM IndexTable a, FileNameTable d, FolderTable e, "
                                                    + "NamespaceTable f WHERE a.FileId=d.FileId AND d.FolderId=e.Id AND "
                                                    + "a.NamespaceId=f.Id AND a.Name='{0}'", keyword);

                var links   = new Dictionary <string, string>();
                var builder = new SQLiteConnectionStringBuilder
                {
                    ReadOnly = true
                };
                foreach (var file in qchFiles)
                {
                    builder.DataSource = file;
                    using (var connection = new SQLiteConnection(builder.ToString())) {
                        connection.Open();
                        using (var command = new SQLiteCommand(linksForKeyword, connection)) {
                            using (var reader = await command.ExecuteReaderAsync()) {
                                while (reader.Read())
                                {
                                    var title = GetString(reader, 0);
                                    if (string.IsNullOrWhiteSpace(title))
                                    {
                                        title = keyword + ':' + GetString(reader, 3);
                                    }
                                    var path = string.Empty;
                                    if (offline)
                                    {
                                        path = "file:///" + Path.Combine(docPath,
                                                                         GetString(reader, 2), GetString(reader, 3));
                                    }
                                    else
                                    {
                                        path = "https://" + Path.Combine("doc.qt.io", "qt-5",
                                                                         GetString(reader, 3));
                                    }
                                    if (!string.IsNullOrWhiteSpace(GetString(reader, 4)))
                                    {
                                        path += "#" + GetString(reader, 4);
                                    }
                                    links.Add(title, path);
                                }
                            }
                        }
                    }
                }

                var uri = string.Empty;
                switch (links.Values.Count)
                {
                case 0:
                    if (!offline)
                    {
                        uri = new UriBuilder("https://doc.qt.io/qt-5/search-results.html")
                        {
                            Query = "q=" + keyword
                        }.ToString();
                    }
                    break;

                case 1:
                    uri = links.First().Value;
                    break;

                default:
                    var dialog = new QtHelpLinkChooser
                    {
                        Links         = links,
                        Keyword       = keyword,
                        ShowInTaskbar = false
                    };
                    if (!dialog.ShowModal().GetValueOrDefault())
                    {
                        return;
                    }
                    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.",
                                                    string.Empty, OLEMSGICON.OLEMSGICON_INFO, OLEMSGBUTTON.OLEMSGBUTTON_OK,
                                                    OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
                }
                else
                {
                    if (uri.StartsWith("file:///", StringComparison.Ordinal) &&
                        !File.Exists(uri.Substring("file:///".Length)))
                    {
                        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));
                    }
                }
            } catch { }
        }
예제 #2
0
파일: QtHelp.cs 프로젝트: qt-labs/vstools
        public static bool QueryEditorContextHelp(bool defaultTryOnline = false)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            try {
                var dte             = VsServiceProvider.GetService <SDTE, DTE>();
                var objTextDocument = dte?.ActiveDocument?.Object() as TextDocument;
                if (objTextDocument == null)
                {
                    return(false);
                }

                var keyword   = string.Empty;
                var selection = objTextDocument.Selection;
                if (selection.IsEmpty)                                 // no selection inside the document
                {
                    var line   = selection.ActivePoint.Line;           // current line
                    var offset = selection.ActivePoint.LineCharOffset; // current char offset

                    selection.CharLeft(true);                          // try the character before the cursor
                    if (!selection.IsEmpty)
                    {
                        keyword = selection.Text;  // something in front of the cursor
                        selection.CharRight(true); // reset to origin
                        if (!IsSuperfluousCharacter(keyword))
                        {
                            // move the selection to the start of the word
                            selection.WordLeft(true);
                            selection.MoveToPoint(selection.TopPoint);
                        }
                    }
                    selection.WordRight(true);                   // select the word
                    keyword = selection.Text;                    // get the selected text
                    selection.MoveToLineAndOffset(line, offset); // reset
                }
                else
                {
                    keyword = selection.Text;
                }

                keyword = keyword.Trim();
                if (keyword.Length <= 1 || IsSuperfluousCharacter(keyword))
                {
                    return(false); // suppress single character, operators etc...
                }
                var qtVersion = "$(DefaultQtVersion)";
                var project   = HelperFunctions.GetSelectedQtProject(dte);
                if (project == null)
                {
                    project = HelperFunctions.GetSelectedProject(dte);
                    if (project != null && HelperFunctions.IsQMakeProject(project))
                    {
                        var qmakeQtDir = HelperFunctions.GetQtDirFromQMakeProject(project);
                        qtVersion = QtVersionManager.The().GetQtVersionFromInstallDir(qmakeQtDir);
                    }
                }
                else
                {
                    qtVersion = QtVersionManager.The().GetProjectQtVersion(project);
                }

                var info    = QtVersionManager.The().GetVersionInfo(qtVersion);
                var docPath = info?.QtInstallDocs;
                if (string.IsNullOrEmpty(docPath) || !Directory.Exists(docPath))
                {
                    return(false);
                }

                var qchFiles = Directory.GetFiles(docPath, "*?.qch");
                if (qchFiles.Length == 0)
                {
                    return(false);
                }

                var offline = QtVsToolsPackage.Instance.Options.HelpPreference == SourcePreference.Offline;

                var linksForKeyword = string.Format("SELECT d.Title, f.Name, e.Name, "
                                                    + "d.Name, a.Anchor FROM IndexTable a, FileNameTable d, FolderTable e, "
                                                    + "NamespaceTable f WHERE a.FileId=d.FileId AND d.FolderId=e.Id AND "
                                                    + "a.NamespaceId=f.Id AND a.Name='{0}'", keyword);

                var links   = new Dictionary <string, string>();
                var builder = new SQLiteConnectionStringBuilder
                {
                    ReadOnly = true
                };
                foreach (var file in qchFiles)
                {
                    builder.DataSource = file;
                    using (var connection = new SQLiteConnection(builder.ToString())) {
                        connection.Open();
                        using (var command = new SQLiteCommand(linksForKeyword, connection)) {
                            var reader = QtVsToolsPackage.Instance.JoinableTaskFactory
                                         .Run(async() => await command.ExecuteReaderAsync());
                            using (reader) {
                                while (reader.Read())
                                {
                                    var title = GetString(reader, 0);
                                    if (string.IsNullOrWhiteSpace(title))
                                    {
                                        title = keyword + ':' + GetString(reader, 3);
                                    }
                                    var path = string.Empty;
                                    if (offline)
                                    {
                                        path = "file:///" + Path.Combine(docPath,
                                                                         GetString(reader, 2), GetString(reader, 3));
                                    }
                                    else
                                    {
                                        path = "https://" + Path.Combine("doc.qt.io",
                                                                         $"qt-{info.qtMajor}", GetString(reader, 3));
                                    }
                                    if (!string.IsNullOrWhiteSpace(GetString(reader, 4)))
                                    {
                                        path += "#" + GetString(reader, 4);
                                    }
                                    links.Add(title, path);
                                }
                            }
                        }
                    }
                }

                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;

                case 1:
                    uri = links.First().Value;
                    break;

                default:
                    var dialog = new QtHelpLinkChooser
                    {
                        Links         = links,
                        Keyword       = keyword,
                        ShowInTaskbar = false
                    };
                    if (!dialog.ShowModal().GetValueOrDefault())
                    {
                        return(false);
                    }
                    uri = dialog.Link
                          .Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
                    break;
                }

                if (string.IsNullOrEmpty(uri))   // offline mode without a single search hit
                {
                    VsShellUtilities.ShowMessageBox(QtVsToolsPackage.Instance,
                                                    "Your search - " + keyword + " - did not match any documents.",
                                                    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(QtVsToolsPackage.Instance,
                                                        "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));
                    }
                }
            } catch (Exception e) {
                Messages.Print(
                    e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
            }
            return(true);
        }