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