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.Package/Package/DteEventsHandler.cs | 143 ++++++++++++++++++++++++++++++++++------------- 1 files changed, 104 insertions(+), 39 deletions(-) diff --git a/QtVsTools.Package/Package/DteEventsHandler.cs b/QtVsTools.Package/Package/DteEventsHandler.cs index c7304c0..df8bfc4 100644 --- a/QtVsTools.Package/Package/DteEventsHandler.cs +++ b/QtVsTools.Package/Package/DteEventsHandler.cs @@ -26,44 +26,45 @@ ** ****************************************************************************/ -using EnvDTE; -using EnvDTE80; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.VisualStudio.VCProjectEngine; -using QtVsTools.Core; -using QtVsTools.Core.QtMsBuild; -using QtVsTools.QtMsBuild; using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; +using Microsoft.VisualStudio; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.VCProjectEngine; +using EnvDTE; +using EnvDTE80; namespace QtVsTools { + using Core; + using QtMsBuild; + class DteEventsHandler { - private DTE dte; - private SolutionEvents solutionEvents; - private BuildEvents buildEvents; - private DocumentEvents documentEvents; - private ProjectItemsEvents projectItemsEvents; + private readonly DTE dte; + private readonly SolutionEvents solutionEvents; + private readonly BuildEvents buildEvents; + private readonly DocumentEvents documentEvents; + private readonly ProjectItemsEvents projectItemsEvents; private vsBuildAction currentBuildAction = vsBuildAction.vsBuildActionBuild; private VCProjectEngineEvents vcProjectEngineEvents; - private CommandEvents debugStartEvents; - private CommandEvents debugStartWithoutDebuggingEvents; - private CommandEvents f1HelpEvents; - private int dispId_VCFileConfiguration_ExcludedFromBuild; - private int dispId_VCCLCompilerTool_UsePrecompiledHeader; - private int dispId_VCCLCompilerTool_PrecompiledHeaderThrough; - private int dispId_VCCLCompilerTool_PreprocessorDefinitions; - private int dispId_VCCLCompilerTool_AdditionalIncludeDirectories; + private readonly CommandEvents debugStartEvents; + private readonly CommandEvents debugStartWithoutDebuggingEvents; + private readonly CommandEvents f1HelpEvents; + private WindowEvents windowEvents; + private readonly int dispId_VCFileConfiguration_ExcludedFromBuild; + private readonly int dispId_VCCLCompilerTool_UsePrecompiledHeader; + private readonly int dispId_VCCLCompilerTool_PrecompiledHeaderThrough; + private readonly int dispId_VCCLCompilerTool_PreprocessorDefinitions; + private readonly int dispId_VCCLCompilerTool_AdditionalIncludeDirectories; public DteEventsHandler(DTE _dte) { + ThreadHelper.ThrowIfNotOnUIThread(); + dte = _dte; var events = dte.Events as Events2; @@ -85,6 +86,9 @@ solutionEvents.Opened += SolutionEvents_Opened; solutionEvents.AfterClosing += SolutionEvents_AfterClosing; + windowEvents = events.WindowEvents; + windowEvents.WindowActivated += WindowEvents_WindowActivated; + var debugCommandsGUID = "{5EFC7975-14BC-11CF-9B2B-00AA00573819}"; debugStartEvents = events.get_CommandEvents(debugCommandsGUID, 295); debugStartEvents.BeforeExecute += debugStartEvents_BeforeExecute; @@ -105,15 +109,33 @@ InitializeVCProjects(); } + private void WindowEvents_WindowActivated(Window gotFocus, Window lostFocus) + { + ThreadHelper.ThrowIfNotOnUIThread(); + if (dte.MainWindow?.Visible == true) { + windowEvents.WindowActivated -= WindowEvents_WindowActivated; + windowEvents = null; + QtVsToolsPackage.Instance.VsMainWindowActivated(); + } + } + private void F1HelpEvents_BeforeExecute( string Guid, int ID, object CustomIn, object CustomOut, ref bool CancelDefault) { - if (QtVsToolsPackage.Instance.Options.TryQtHelpOnF1Pressed && QtHelp.QueryEditorContextHelp()) + ThreadHelper.ThrowIfNotOnUIThread(); + if (QtVsToolsPackage.Instance.Options.TryQtHelpOnF1Pressed) { + if (!QtHelp.ShowEditorContextHelp()) { + Messages.Print("No help match was found. You can still try to search online at " + + "https://doc.qt.io" + ".", false, true); + } CancelDefault = true; + } } void debugStartEvents_BeforeExecute(string Guid, int ID, object CustomIn, object CustomOut, ref bool CancelDefault) { + ThreadHelper.ThrowIfNotOnUIThread(); + var debugger = dte.Debugger; if (debugger != null && debugger.CurrentMode != dbgDebugMode.dbgDesignMode) return; @@ -147,6 +169,8 @@ public void Disconnect() { + ThreadHelper.ThrowIfNotOnUIThread(); + if (buildEvents != null) { buildEvents.OnBuildBegin -= buildEvents_OnBuildBegin; buildEvents.OnBuildProjConfigBegin -= OnBuildProjConfigBegin; @@ -174,12 +198,19 @@ if (debugStartWithoutDebuggingEvents != null) debugStartWithoutDebuggingEvents.BeforeExecute -= debugStartWithoutDebuggingEvents_BeforeExecute; - if (vcProjectEngineEvents != null) + if (vcProjectEngineEvents != null) { vcProjectEngineEvents.ItemPropertyChange -= OnVCProjectEngineItemPropertyChange; + vcProjectEngineEvents.ItemPropertyChange2 -= OnVCProjectEngineItemPropertyChange2; + } + + if (windowEvents != null) + windowEvents.WindowActivated -= WindowEvents_WindowActivated; } public void OnBuildProjConfigBegin(string projectName, string projectConfig, string platform, string solutionConfig) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (!QtVsToolsPackage.Instance.LegacyOptions.PreBuildSetup) return; @@ -195,7 +226,7 @@ break; } } - if (project == null || !HelperFunctions.IsQtProject(project)) + if (project == null || !HelperFunctions.IsVsToolsProject(project)) return; if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings) @@ -229,9 +260,11 @@ public void DocumentSaved(Document document) { + ThreadHelper.ThrowIfNotOnUIThread(); + var qtPro = QtProject.Create(document.ProjectItem.ContainingProject); - if (!HelperFunctions.IsQtProject(qtPro.VCProject)) + if (!HelperFunctions.IsVsToolsProject(qtPro.VCProject)) return; var file = (VCFile)((IVCCollection)qtPro.VCProject.Files).Item(document.FullName); @@ -323,10 +356,13 @@ public void ProjectItemsEvents_ItemAdded(ProjectItem projectItem) { + ThreadHelper.ThrowIfNotOnUIThread(); + var project = HelperFunctions.GetSelectedQtProject(QtVsToolsPackage.Instance.Dte); var qtPro = QtProject.Create(project); - if (!HelperFunctions.IsQtProject(project)) + if (!HelperFunctions.IsVsToolsProject(project)) return; + var vcFile = GetVCFileFromProject(projectItem.Name, qtPro.VCProject); if (vcFile == null) return; @@ -373,12 +409,15 @@ HelperFunctions.EnsureCustomBuildToolAvailable(projectItem); qtPro.UpdateRccStep(vcFile, null); } else if (HelperFunctions.IsTranslationFile(vcFile.Name)) { + Translation.RunlUpdate(vcFile); } } catch { } } void ProjectItemsEvents_ItemRemoved(ProjectItem ProjectItem) { + ThreadHelper.ThrowIfNotOnUIThread(); + var pro = HelperFunctions.GetSelectedQtProject(QtVsToolsPackage.Instance.Dte); if (pro == null) return; @@ -389,6 +428,8 @@ void ProjectItemsEvents_ItemRenamed(ProjectItem ProjectItem, string OldName) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (OldName == null) return; var pro = HelperFunctions.GetSelectedQtProject(QtVsToolsPackage.Instance.Dte); @@ -397,12 +438,15 @@ var qtPro = QtProject.Create(pro); qtPro.RemoveGeneratedFiles(OldName); + ProjectItemsEvents_ItemAdded(ProjectItem); } void SolutionEvents_ProjectAdded(Project project) { - if (HelperFunctions.IsQMakeProject(project)) { + ThreadHelper.ThrowIfNotOnUIThread(); + + if (HelperFunctions.IsQtProject(project)) { InitializeVCProject(project); QtProjectTracker.Add(project); var vcpro = project.Object as VCProject; @@ -446,9 +490,11 @@ public void SolutionEvents_Opened() { + ThreadHelper.ThrowIfNotOnUIThread(); + QtProjectTracker.SolutionPath = QtVsToolsPackage.Instance.Dte.Solution.FullName; foreach (var p in HelperFunctions.ProjectsInSolution(QtVsToolsPackage.Instance.Dte)) { - if (HelperFunctions.IsQtProject(p)) { + if (HelperFunctions.IsVsToolsProject(p)) { InitializeVCProject(p); QtProjectTracker.Add(p); } @@ -464,14 +510,18 @@ void InitializeVCProjects() { + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (var project in HelperFunctions.ProjectsInSolution(dte)) { - if (project != null && HelperFunctions.IsQtProject(project)) + if (project != null && HelperFunctions.IsVsToolsProject(project)) InitializeVCProject(project); } } void InitializeVCProject(Project p) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (vcProjectEngineEvents != null) return; @@ -480,12 +530,12 @@ return; // Retrieves the VCProjectEngine from the given project and registers the handlers for VCProjectEngineEvents. - var prjEngine = vcPrj.VCProjectEngine as VCProjectEngine; - if (prjEngine != null) { + if (vcPrj.VCProjectEngine is VCProjectEngine prjEngine) { vcProjectEngineEvents = prjEngine.Events as VCProjectEngineEvents; if (vcProjectEngineEvents != null) { try { vcProjectEngineEvents.ItemPropertyChange += OnVCProjectEngineItemPropertyChange; + vcProjectEngineEvents.ItemPropertyChange2 += OnVCProjectEngineItemPropertyChange2; } catch { Messages.DisplayErrorMessage("VCProjectEngine events could not be registered."); } @@ -495,7 +545,6 @@ private void OnVCProjectEngineItemPropertyChange(object item, object tool, int dispid) { - //System.Diagnostics.Debug.WriteLine("OnVCProjectEngineItemPropertyChange " + dispid.ToString()); var vcFileCfg = item as VCFileConfiguration; if (vcFileCfg == null) { // A global or project specific property has changed. @@ -506,7 +555,7 @@ var vcPrj = vcCfg.project as VCProject; if (vcPrj == null) return; - if (!HelperFunctions.IsQtProject(vcPrj)) + if (!HelperFunctions.IsVsToolsProject(vcPrj)) return; // Ignore property events when using shared compiler properties if (QtProject.GetFormatVersion(vcPrj) >= Resources.qtMinFormatVersion_ClProperties) @@ -538,7 +587,7 @@ var vcPrj = vcFile.project as VCProject; if (vcPrj == null) return; - if (!HelperFunctions.IsQtProject(vcPrj)) + if (!HelperFunctions.IsVsToolsProject(vcPrj)) return; // Ignore property events when using shared compiler properties if (QtProject.GetFormatVersion(vcPrj) >= Resources.qtMinFormatVersion_ClProperties) @@ -557,10 +606,27 @@ } } + private void OnVCProjectEngineItemPropertyChange2( + object item, + string propertySheet, + string itemType, + string propertyName) + { + ThreadHelper.ThrowIfNotOnUIThread(); + if (!propertyName.StartsWith("Qt") || propertyName == "QtLastBackgroundBuild") + return; + if (item is VCConfiguration vcConfig + && vcConfig.project is VCProject vcProject + && vcProject.Object is Project project) { + QtProjectIntellisense.Refresh( + QtProjectTracker.Get(project, project.FullName).Project, vcConfig.Name); + } + } + private static VCFile GetVCFileFromProject(string absFileName, VCProject project) { foreach (VCFile f in (IVCCollection)project.Files) { - if (f.Name.ToLower() == absFileName.ToLower()) + if (f.Name.Equals(absFileName, StringComparison.OrdinalIgnoreCase)) return f; } return null; @@ -574,8 +640,7 @@ var pi = type.GetProperty(propertyName); if (pi != null) { foreach (Attribute attribute in pi.GetCustomAttributes(true)) { - var dispIdAttribute = attribute as DispIdAttribute; - if (dispIdAttribute != null) + if (attribute is DispIdAttribute dispIdAttribute) return dispIdAttribute.Value; } } -- Gitblit v1.9.1