diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2022-02-07 10:06:53 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2022-02-09 18:53:04 +0000 |
commit | 57a23fdb7aece0143663d4216baa28765031ca5b (patch) | |
tree | 5deadcc377b5dc6da87ea7b775d174d3167482c7 /QtVsTools.Core | |
parent | 9d2d7aaf63f309aa2b42273bad3b05c40f848515 (diff) |
Fix warning: Add ThreadHelper.ThrowIfNotOnUIThread();
Change-Id: I8e7cc3a16eb5b303823ea5b1c85e04f5ce85947b
Reviewed-by: Miguel Costa <miguel.costa@qt.io>
Diffstat (limited to 'QtVsTools.Core')
-rw-r--r-- | QtVsTools.Core/HelperFunctions.cs | 64 | ||||
-rw-r--r-- | QtVsTools.Core/MainWinWrapper.cs | 2 | ||||
-rw-r--r-- | QtVsTools.Core/Messages.cs | 29 | ||||
-rw-r--r-- | QtVsTools.Core/MsBuildProject.cs | 8 | ||||
-rw-r--r-- | QtVsTools.Core/ProjectExporter.cs | 33 | ||||
-rw-r--r-- | QtVsTools.Core/ProjectImporter.cs | 14 | ||||
-rw-r--r-- | QtVsTools.Core/QMake.cs | 15 | ||||
-rw-r--r-- | QtVsTools.Core/QMakeConf.cs | 3 | ||||
-rw-r--r-- | QtVsTools.Core/QMakeQuery.cs | 16 | ||||
-rw-r--r-- | QtVsTools.Core/QtModules.cs | 2 | ||||
-rw-r--r-- | QtVsTools.Core/QtProject.cs | 149 | ||||
-rw-r--r-- | QtVsTools.Core/QtVSIPSettings.cs | 50 | ||||
-rw-r--r-- | QtVsTools.Core/QtVersionManager.cs | 50 | ||||
-rw-r--r-- | QtVsTools.Core/RccOptions.cs | 13 | ||||
-rw-r--r-- | QtVsTools.Core/VersionInformation.cs | 4 | ||||
-rw-r--r-- | QtVsTools.Core/WaitDialog.cs | 14 |
16 files changed, 425 insertions, 41 deletions
diff --git a/QtVsTools.Core/HelperFunctions.cs b/QtVsTools.Core/HelperFunctions.cs index 1327a864..df92470b 100644 --- a/QtVsTools.Core/HelperFunctions.cs +++ b/QtVsTools.Core/HelperFunctions.cs @@ -27,6 +27,7 @@ ****************************************************************************/ using EnvDTE; +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.VCProjectEngine; #if VS2017 using Microsoft.Win32; @@ -95,16 +96,19 @@ namespace QtVsTools.Core static public void SetDebuggingEnvironment(Project prj) { + ThreadHelper.ThrowIfNotOnUIThread(); SetDebuggingEnvironment(prj, string.Empty); } static public void SetDebuggingEnvironment(Project prj, string solutionConfig) { + ThreadHelper.ThrowIfNotOnUIThread(); SetDebuggingEnvironment(prj, "PATH=$(QTDIR)\\bin;$(PATH)", false, solutionConfig); } static public void SetDebuggingEnvironment(Project prj, string envpath, bool overwrite) { + ThreadHelper.ThrowIfNotOnUIThread(); SetDebuggingEnvironment(prj, envpath, overwrite, string.Empty); } @@ -113,6 +117,8 @@ namespace QtVsTools.Core if (QtProject.GetFormatVersion(prj) >= Resources.qtMinFormatVersion_Settings) return; + ThreadHelper.ThrowIfNotOnUIThread(); + // Get platform name from given solution configuration // or if not available take the active configuration var activePlatformName = string.Empty; @@ -174,8 +180,9 @@ namespace QtVsTools.Core public static bool IsProjectInSolution(DTE dteObject, string fullName) { - var fi = new FileInfo(fullName); + ThreadHelper.ThrowIfNotOnUIThread(); + var fi = new FileInfo(fullName); foreach (var p in ProjectsInSolution(dteObject)) { if (p.FullName.ToLower() == fi.FullName.ToLower()) return true; @@ -336,6 +343,8 @@ namespace QtVsTools.Core /// <returns></returns> public static void ReplaceInCustomBuildTools(Project project, string oldString, string replaceString) { + ThreadHelper.ThrowIfNotOnUIThread(); + var vcPro = (VCProject)project.Object; if (vcPro == null) return; @@ -410,6 +419,8 @@ namespace QtVsTools.Core /// <param name="projectItem">Project Item which needs to have custom build tool</param> static public void EnsureCustomBuildToolAvailable(ProjectItem projectItem) { + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (Property prop in projectItem.Properties) { if (prop.Name == "ItemType") { if ((string)prop.Value != "CustomBuild") @@ -447,7 +458,8 @@ namespace QtVsTools.Core if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings) return; - string qtDir = null; + ThreadHelper.ThrowIfNotOnUIThread(); + var vcPro = (VCProject)project.Object; if (!IsQMakeProject(project)) return; @@ -455,7 +467,7 @@ namespace QtVsTools.Core // TODO: qtPro is never used. var qtPro = QtProject.Create(project); var vm = QtVersionManager.The(); - qtDir = vm.GetInstallPath(project); + string qtDir = vm.GetInstallPath(project); foreach (var global in (string[])project.Globals.VariableNames) { if (global.StartsWith("Qt5Version", StringComparison.Ordinal)) @@ -485,7 +497,7 @@ namespace QtVsTools.Core ReplaceInCustomBuildTools(project, "$(QTDIR)", qtDir); } else { - qtDir = GetQtDirFromQMakeProject(project); + string qtDir = GetQtDirFromQMakeProject(project); var vm = QtVersionManager.The(); var qtVersion = vm.GetQtVersionFromInstallDir(qtDir); @@ -558,6 +570,8 @@ namespace QtVsTools.Core /// <param name="project">The project is needed to convert relative paths to absolute paths.</param> private static void ReplaceDirectory(ref List<string> paths, string oldDirectory, string replacement, Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + for (var i = 0; i < paths.Count; ++i) { var dirName = paths[i]; if (dirName.StartsWith("\"", StringComparison.Ordinal) && dirName.EndsWith("\"", StringComparison.Ordinal)) { @@ -582,6 +596,8 @@ namespace QtVsTools.Core public static string GetQtDirFromQMakeProject(Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + var vcProject = project.Object as VCProject; if (vcProject == null) return null; @@ -674,6 +690,8 @@ namespace QtVsTools.Core if (QtProject.GetFormatVersion(proj) >= Resources.qtMinFormatVersion_Settings) return true; + ThreadHelper.ThrowIfNotOnUIThread(); + var envPro = proj.Object as Project; if (envPro.Globals == null || envPro.Globals.VariableNames == null) return false; @@ -691,6 +709,7 @@ namespace QtVsTools.Core /// <param name="proj">project</param> public static bool IsQtProject(Project proj) { + ThreadHelper.ThrowIfNotOnUIThread(); try { if (proj != null && proj.Kind == "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") return IsQtProject(proj.Object as VCProject); @@ -723,6 +742,7 @@ namespace QtVsTools.Core /// <param name="proj">project</param> public static bool IsQMakeProject(Project proj) { + ThreadHelper.ThrowIfNotOnUIThread(); try { if (proj != null && proj.Kind == "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") return IsQMakeProject(proj.Object as VCProject); @@ -732,6 +752,8 @@ namespace QtVsTools.Core public static void CleanupQMakeDependencies(Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + var vcPro = (VCProject)project.Object; // clean up qmake mess var rxp1 = new Regex("\\bQt\\w+d?5?\\.lib\\b"); @@ -904,6 +926,8 @@ namespace QtVsTools.Core if (string.IsNullOrEmpty(nodeToCollapseFilter)) return; + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (UIHierarchyItem innerItem in item.UIHierarchyItems) { if (innerItem.Name == nodeToCollapseFilter) CollapseFilter(innerItem, hierarchy); @@ -914,6 +938,8 @@ namespace QtVsTools.Core public static void CollapseFilter(UIHierarchyItem item, UIHierarchy hierarchy) { + ThreadHelper.ThrowIfNotOnUIThread(); + var subItems = item.UIHierarchyItems; if (subItems != null) { foreach (UIHierarchyItem innerItem in subItems) { @@ -962,7 +988,7 @@ namespace QtVsTools.Core public static List<string> GetProjectFiles(Project pro, FilesToList filter) { - var fileList = new List<string>(); + ThreadHelper.ThrowIfNotOnUIThread(); VCProject vcpro; try { @@ -972,6 +998,7 @@ namespace QtVsTools.Core return null; } + var fileList = new List<string>(); var configurationName = pro.ConfigurationManager.ActiveConfiguration.ConfigurationName; foreach (VCFile vcfile in (IVCCollection)vcpro.Files) { @@ -1040,6 +1067,8 @@ namespace QtVsTools.Core /// <param name="fileName"></param> public static void RemoveFileInProject(VCProject vcpro, string fileName) { + ThreadHelper.ThrowIfNotOnUIThread(); + var qtProj = QtProject.Create(vcpro); var fi = new FileInfo(fileName); @@ -1055,6 +1084,9 @@ namespace QtVsTools.Core { if (dteObject == null) return null; + + ThreadHelper.ThrowIfNotOnUIThread(); + Array prjs = null; try { prjs = (Array)dteObject.ActiveSolutionProjects; @@ -1073,6 +1105,8 @@ namespace QtVsTools.Core public static Project GetActiveDocumentProject(DTE dteObject) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (dteObject == null) return null; var doc = dteObject.ActiveDocument; @@ -1087,6 +1121,8 @@ namespace QtVsTools.Core public static Project GetSingleProjectInSolution(DTE dteObject) { + ThreadHelper.ThrowIfNotOnUIThread(); + var projectList = ProjectsInSolution(dteObject); if (dteObject == null || dteObject.Solution == null || projectList.Count != 1) @@ -1102,6 +1138,8 @@ namespace QtVsTools.Core /// </summary> public static Project GetSelectedQtProject(DTE dteObject) { + ThreadHelper.ThrowIfNotOnUIThread(); + // can happen sometimes shortly after starting VS if (dteObject == null || dteObject.Solution == null || ProjectsInSolution(dteObject).Count == 0) @@ -1121,6 +1159,8 @@ namespace QtVsTools.Core if (GetSelectedQtProject(dteObject) == null) return null; + ThreadHelper.ThrowIfNotOnUIThread(); + if (dteObject.SelectedItems.Count <= 0) return null; @@ -1159,6 +1199,8 @@ namespace QtVsTools.Core public static RccOptions ParseRccOptions(string cmdLine, VCFile qrcFile) { + ThreadHelper.ThrowIfNotOnUIThread(); + var pro = VCProjectToProject((VCProject)qrcFile.project); var rccOpts = new RccOptions(pro, qrcFile); @@ -1181,11 +1223,14 @@ namespace QtVsTools.Core public static Project VCProjectToProject(VCProject vcproj) { + ThreadHelper.ThrowIfNotOnUIThread(); return (Project)vcproj.Object; } public static List<Project> ProjectsInSolution(DTE dteObject) { + ThreadHelper.ThrowIfNotOnUIThread(); + var projects = new List<Project>(); var solution = dteObject.Solution; if (solution != null) { @@ -1207,6 +1252,8 @@ namespace QtVsTools.Core private static void addSubProjects(Project prj, ref List<Project> projects) { + ThreadHelper.ThrowIfNotOnUIThread(); + // If the actual object of the project is null then the project was probably unloaded. if (prj.Object == null) return; @@ -1226,6 +1273,8 @@ namespace QtVsTools.Core if (subItems == null) return; + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (ProjectItem item in subItems) { Project subprj = null; try { @@ -1358,13 +1407,14 @@ namespace QtVsTools.Core string platformName, string filePath = null) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (project == null || string.IsNullOrEmpty(configName) || string.IsNullOrEmpty(platformName)) return false; var vcProject = project.Object as VCProject; - if (filePath == null) { var vcConfig = (from VCConfiguration _config in (IVCCollection)vcProject.Configurations @@ -1620,6 +1670,8 @@ namespace QtVsTools.Core public static bool SetVCVars(VersionInformation VersionInfo, ProcessStartInfo startInfo) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (VersionInfo == null) { VersionInfo = QtVersionManager.The().GetVersionInfo( QtVersionManager.The().GetDefaultVersion()); diff --git a/QtVsTools.Core/MainWinWrapper.cs b/QtVsTools.Core/MainWinWrapper.cs index f8beb439..2880bd06 100644 --- a/QtVsTools.Core/MainWinWrapper.cs +++ b/QtVsTools.Core/MainWinWrapper.cs @@ -44,6 +44,8 @@ namespace QtVsTools.Core { get { + Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread(); + if (dteObject != null) #if VS2022 return dteObject.MainWindow.HWnd; diff --git a/QtVsTools.Core/Messages.cs b/QtVsTools.Core/Messages.cs index 7eb46ab0..c00208d6 100644 --- a/QtVsTools.Core/Messages.cs +++ b/QtVsTools.Core/Messages.cs @@ -31,11 +31,14 @@ using System.Collections.Concurrent; using System.Diagnostics; using System.Linq; using System.Threading; -using Thread = System.Threading.Thread; using System.Windows.Forms; using System.Threading.Tasks; using Microsoft.VisualStudio.Threading; using QtVsTools.VisualStudio; +using Microsoft.VisualStudio.Shell; + +using Thread = System.Threading.Thread; +using Task = System.Threading.Tasks.Task; namespace QtVsTools.Core { @@ -49,8 +52,13 @@ namespace QtVsTools.Core { get { + ThreadHelper.ThrowIfNotOnUIThread(); return _BuildPane ?? (_BuildPane = Window.OutputWindowPanes.Cast<OutputWindowPane>() - .Where(pane => pane.Guid == "{1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}") + .Where(pane => + { + ThreadHelper.ThrowIfNotOnUIThread(); + return pane.Guid == "{1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}"; + }) .FirstOrDefault()); } } @@ -66,11 +74,14 @@ namespace QtVsTools.Core Text = text, Activate = activate }); + + ThreadHelper.ThrowIfNotOnUIThread(); FlushMessages(); } static void OutputWindowPane_Print(string text) { + ThreadHelper.ThrowIfNotOnUIThread(); OutputWindowPane_Init(); Pane.OutputString(text + "\r\n"); // show buildPane if a build is in progress @@ -87,12 +98,17 @@ namespace QtVsTools.Core { Activate = true }); + + ThreadHelper.ThrowIfNotOnUIThread(); FlushMessages(); } static void OutputWindowPane_Activate() { OutputWindowPane_Init(); + + ThreadHelper.ThrowIfNotOnUIThread(); + Pane?.Activate(); } @@ -155,12 +171,18 @@ namespace QtVsTools.Core { Clear = true }); + + ThreadHelper.ThrowIfNotOnUIThread(); + FlushMessages(); } static void OutputWindowPane_Clear() { OutputWindowPane_Init(); + + ThreadHelper.ThrowIfNotOnUIThread(); + Pane?.Clear(); } @@ -185,6 +207,9 @@ namespace QtVsTools.Core if (Dte == null) Dte = VsServiceProvider.GetService<DTE>(); var t = Stopwatch.StartNew(); + + ThreadHelper.ThrowIfNotOnUIThread(); + while (Pane == null && t.ElapsedMilliseconds < 5000) { try { Window = Dte.Windows.Item(Constants.vsWindowKindOutput).Object as OutputWindow; diff --git a/QtVsTools.Core/MsBuildProject.cs b/QtVsTools.Core/MsBuildProject.cs index 83b0cda0..187382a2 100644 --- a/QtVsTools.Core/MsBuildProject.cs +++ b/QtVsTools.Core/MsBuildProject.cs @@ -39,6 +39,7 @@ using Microsoft.Build.Construction; using Microsoft.Build.Execution; using Microsoft.Build.Evaluation; using QtVsTools.SyntaxAnalysis; +using Microsoft.VisualStudio.Shell; namespace QtVsTools.Core { @@ -288,6 +289,8 @@ namespace QtVsTools.Core /// <returns>true if successful</returns> public bool UpdateProjectFormatVersion() { + ThreadHelper.ThrowIfNotOnUIThread(); + if (ConfigCondition == null) return false; @@ -910,6 +913,9 @@ namespace QtVsTools.Core var projPath = this[Files.Project].filePath; bool error = false; + + ThreadHelper.ThrowIfNotOnUIThread(); + using (var evaluator = new MSBuildEvaluator(this[Files.Project])) { foreach (var row in query) { @@ -1202,6 +1208,8 @@ namespace QtVsTools.Core //remove .moc.cbt CustomBuild items cbtToRemove.ForEach(x => x.Remove()); + ThreadHelper.ThrowIfNotOnUIThread(); + //convert moc custom build steps var mocCustomBuilds = GetCustomBuilds(QtMoc.ToolExecName); if (!SetCommandLines(qtMsBuild, configurations, mocCustomBuilds, diff --git a/QtVsTools.Core/ProjectExporter.cs b/QtVsTools.Core/ProjectExporter.cs index df8b7105..55d8c36e 100644 --- a/QtVsTools.Core/ProjectExporter.cs +++ b/QtVsTools.Core/ProjectExporter.cs @@ -28,6 +28,7 @@ using EnvDTE; using EnvDTE80; +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.VCProjectEngine; using System; using System.Collections; @@ -94,6 +95,8 @@ namespace QtVsTools.Core ProFileContent content; var prosln = new ProSolution(sln); + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (var proj in HelperFunctions.ProjectsInSolution(sln.DTE)) { try { // only add qt projects @@ -113,6 +116,8 @@ namespace QtVsTools.Core private void addProjectsInFolder(Project solutionFolder, ProSolution sln) { + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (ProjectItem pi in solutionFolder.ProjectItems) { var containedProject = pi.Object as Project; if (HelperFunctions.IsQtProject(containedProject)) { @@ -130,6 +135,8 @@ namespace QtVsTools.Core var qtPro = QtProject.Create(project); var content = new ProFileContent(qtPro.VCProject); + ThreadHelper.ThrowIfNotOnUIThread(); + // hack to get active config var activeConfig = project.ConfigurationManager.ActiveConfiguration.ConfigurationName; var activePlatform = project.ConfigurationManager.ActiveConfiguration.PlatformName; @@ -343,6 +350,8 @@ namespace QtVsTools.Core private static ProFileContent CreatePriFileContent(Project project, string priFileDirectory) { + ThreadHelper.ThrowIfNotOnUIThread(); + ProFileOption option; var qtPro = QtProject.Create(project); var content = new ProFileContent(qtPro.VCProject); @@ -432,6 +441,8 @@ namespace QtVsTools.Core qtDir = HelperFunctions.NormalizeRelativeFilePath(qtDir); + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (var s in includePaths.Split(';', ',')) { var d = HelperFunctions.NormalizeRelativeFilePath(s); if (!d.StartsWith("$(qtdir)\\include", StringComparison.OrdinalIgnoreCase) && @@ -461,9 +472,10 @@ namespace QtVsTools.Core qtDir = Environment.GetEnvironmentVariable("QTDIR"); if (qtDir == null) qtDir = ""; - qtDir = HelperFunctions.NormalizeRelativeFilePath(qtDir); + ThreadHelper.ThrowIfNotOnUIThread(); + if (paths != null) { foreach (var s in paths.Split(';', ',')) { var d = HelperFunctions.NormalizeRelativeFilePath(s); @@ -491,6 +503,8 @@ namespace QtVsTools.Core private static void AddModules(QtProject qtPrj, ProFileOption optionQT, ProFileOption optionCONFIG) { + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (var module in QtModules.Instance.GetAvailableModules()) { if (!qtPrj.HasModule(module.Id)) continue; @@ -504,6 +518,8 @@ namespace QtVsTools.Core private void WriteProSolution(ProSolution prosln, bool openFile) { + ThreadHelper.ThrowIfNotOnUIThread(); + var sln = prosln.ProjectSolution; if (string.IsNullOrEmpty(sln.FileName)) return; @@ -605,8 +621,8 @@ namespace QtVsTools.Core WriteProFileOptions(sw, content.Options); } - // open the file in vs - if (openFile) + ThreadHelper.ThrowIfNotOnUIThread(); + if (openFile) // open the file in vs dteObject.OpenFile(Constants.vsViewKindTextView, proFile).Activate(); } @@ -714,6 +730,8 @@ namespace QtVsTools.Core foreach (var s in projFiles) cmpProjFiles.Add(HelperFunctions.NormalizeFilePath(s).ToLower()); + ThreadHelper.ThrowIfNotOnUIThread(); + var qtPro = QtProject.Create(vcproj); var filterPathTable = new Hashtable(17); var pathFilterTable = new Hashtable(17); @@ -779,7 +797,7 @@ namespace QtVsTools.Core public void ExportToProFile() { - var expDlg = new ExportProjectDialog(); + ThreadHelper.ThrowIfNotOnUIThread(); var sln = dteObject.Solution; var prosln = CreateProFileSolution(sln); @@ -789,6 +807,7 @@ namespace QtVsTools.Core return; } + var expDlg = new ExportProjectDialog(); expDlg.ProFileSolution = prosln; expDlg.StartPosition = FormStartPosition.CenterParent; var ww = new MainWinWrapper(dteObject); @@ -814,8 +833,9 @@ namespace QtVsTools.Core public string ExportToPriFile(Project proj) { - VCProject vcproj; + ThreadHelper.ThrowIfNotOnUIThread(); + VCProject vcproj; if (HelperFunctions.IsQtProject(proj)) { try { vcproj = (VCProject)proj.Object; @@ -844,8 +864,9 @@ namespace QtVsTools.Core public void ExportToPriFile(Project proj, string fileName) { - var priFile = new FileInfo(fileName); + ThreadHelper.ThrowIfNotOnUIThread(); + var priFile = new FileInfo(fileName); var content = CreatePriFileContent(proj, priFile.DirectoryName); WritePriFile(content, priFile.FullName); } diff --git a/QtVsTools.Core/ProjectImporter.cs b/QtVsTools.Core/ProjectImporter.cs index c9885d7a..ea72953f 100644 --- a/QtVsTools.Core/ProjectImporter.cs +++ b/QtVsTools.Core/ProjectImporter.cs @@ -27,6 +27,7 @@ ****************************************************************************/ using EnvDTE; +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.VCProjectEngine; using System; using System.Collections.Generic; @@ -56,6 +57,8 @@ namespace QtVsTools.Core if (DialogResult.OK != toOpen.ShowDialog()) return; + ThreadHelper.ThrowIfNotOnUIThread(); + var mainInfo = new FileInfo(toOpen.FileName); if (HelperFunctions.IsSubDirsFile(mainInfo.FullName)) { // we use the safe way. Make the user close the existing solution manually @@ -84,6 +87,8 @@ namespace QtVsTools.Core return; ImportQMakeSolution(VCInfo, versionInfo); + ThreadHelper.ThrowIfNotOnUIThread(); + try { if (CheckQtVersion(versionInfo)) { dteObject.Solution.Open(VCInfo.FullName); @@ -113,6 +118,7 @@ namespace QtVsTools.Core ImportQMakeProject(VCInfo, versionInfo); + ThreadHelper.ThrowIfNotOnUIThread(); try { if (CheckQtVersion(versionInfo)) { // no need to add the project again if it's already there... @@ -179,6 +185,9 @@ namespace QtVsTools.Core private void ImportQMakeSolution(FileInfo solutionFile, VersionInformation vi) { var projects = ParseProjectsFromSolution(solutionFile); + + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (var project in projects) { var projectInfo = new FileInfo(project); ImportQMakeProject(projectInfo, vi); @@ -205,6 +214,8 @@ namespace QtVsTools.Core private void ImportQMakeProject(FileInfo projectFile, VersionInformation vi) { + ThreadHelper.ThrowIfNotOnUIThread(); + var xmlProject = MsBuildProject.Load(projectFile.FullName); xmlProject.ReplacePath(vi.qtDir, "$(QTDIR)"); xmlProject.ReplacePath(projectFile.DirectoryName, "."); @@ -241,6 +252,7 @@ namespace QtVsTools.Core qtProject.CollapseFilter(Filters.ResourceFiles().Name); qtProject.CollapseFilter(Filters.GeneratedFiles().Name); + ThreadHelper.ThrowIfNotOnUIThread(); try { // save the project after modification qtProject.Project.Save(null); @@ -249,6 +261,8 @@ namespace QtVsTools.Core private FileInfo RunQmake(FileInfo mainInfo, string ext, bool recursive, VersionInformation vi) { + ThreadHelper.ThrowIfNotOnUIThread(); + var name = mainInfo.Name.Remove(mainInfo.Name.IndexOf('.')); var VCInfo = new FileInfo(mainInfo.DirectoryName + "\\" + name + ext); diff --git a/QtVsTools.Core/QMake.cs b/QtVsTools.Core/QMake.cs index 07101389..7ea1be88 100644 --- a/QtVsTools.Core/QMake.cs +++ b/QtVsTools.Core/QMake.cs @@ -31,6 +31,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; +using Microsoft.VisualStudio.Shell; using QtVsTools.VisualStudio; namespace QtVsTools.Core @@ -141,6 +142,9 @@ namespace QtVsTools.Core { StartInfo = qmakeStartInfo, }; + + ThreadHelper.ThrowIfNotOnUIThread(); + qmakeProc.OutputDataReceived += (sender, ev) => OutMsg(ev.Data); qmakeProc.ErrorDataReceived += (sender, ev) => ErrMsg(ev.Data); @@ -149,30 +153,37 @@ namespace QtVsTools.Core protected virtual void OutMsg(string msg) { + ThreadHelper.ThrowIfNotOnUIThread(); if (Dte != null && !string.IsNullOrEmpty(msg)) Messages.Print(msg); } protected virtual void ErrMsg(string msg) { + ThreadHelper.ThrowIfNotOnUIThread(); if (Dte != null && !string.IsNullOrEmpty(msg)) Messages.Print(msg); } protected virtual void InfoMsg(string msg) { + ThreadHelper.ThrowIfNotOnUIThread(); if (Dte != null && !string.IsNullOrEmpty(msg)) Messages.Print(msg); } protected virtual void InfoStart(Process qmakeProc) { + ThreadHelper.ThrowIfNotOnUIThread(); + InfoMsg(string.Format("--- qmake({0}): started {1}", qmakeProc.Id, qmakeProc.StartInfo.FileName)); } protected virtual void InfoExit(Process qmakeProc) { + ThreadHelper.ThrowIfNotOnUIThread(); + InfoMsg(string.Format("--- qmake({0}): exit code {1} ({2:0.##} msecs)\r\n", qmakeProc.Id, qmakeProc.ExitCode, (qmakeProc.ExitTime - qmakeProc.StartTime).TotalMilliseconds)); @@ -180,6 +191,8 @@ namespace QtVsTools.Core public virtual int Run(bool setVCVars = false) { + ThreadHelper.ThrowIfNotOnUIThread(); + int exitCode = -1; using (var qmakeProc = CreateProcess()) { try { @@ -231,6 +244,8 @@ namespace QtVsTools.Core protected override void InfoStart(Process qmakeProc) { + ThreadHelper.ThrowIfNotOnUIThread(); + base.InfoStart(qmakeProc); InfoMsg("--- qmake: Working Directory: " + qmakeProc.StartInfo.WorkingDirectory); InfoMsg("--- qmake: Arguments: " + qmakeProc.StartInfo.Arguments); diff --git a/QtVsTools.Core/QMakeConf.cs b/QtVsTools.Core/QMakeConf.cs index 2701772c..7ac6ccb6 100644 --- a/QtVsTools.Core/QMakeConf.cs +++ b/QtVsTools.Core/QMakeConf.cs @@ -26,6 +26,7 @@ ** ****************************************************************************/ +using Microsoft.VisualStudio.Shell; using System; using System.Collections; using System.IO; @@ -39,6 +40,8 @@ namespace QtVsTools.Core public QMakeConf(VersionInformation versionInfo, QMakeQuery qmakeQuery = null) { + ThreadHelper.ThrowIfNotOnUIThread(); + Entries = new Hashtable(); QMakeSpecDirectory = Path.Combine(versionInfo.qtDir, "mkspecs", "default"); var qmakeConf = Path.Combine(QMakeSpecDirectory, "qmake.conf"); diff --git a/QtVsTools.Core/QMakeQuery.cs b/QtVsTools.Core/QMakeQuery.cs index d9007891..9e79bbea 100644 --- a/QtVsTools.Core/QMakeQuery.cs +++ b/QtVsTools.Core/QMakeQuery.cs @@ -30,6 +30,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; +using Microsoft.VisualStudio.Shell; using QtVsTools.SyntaxAnalysis; namespace QtVsTools.Core @@ -49,6 +50,8 @@ namespace QtVsTools.Core protected override void InfoStart(Process qmakeProc) { + ThreadHelper.ThrowIfNotOnUIThread(); + base.InfoStart(qmakeProc); InfoMsg("--- qmake: Querying persistent properties"); } @@ -58,6 +61,8 @@ namespace QtVsTools.Core stdOutput = new StringBuilder(); Query = " "; + ThreadHelper.ThrowIfNotOnUIThread(); + if (Run() == 0 && stdOutput.Length > 0) { return PropertyParser .Parse(stdOutput.ToString()) @@ -74,6 +79,8 @@ namespace QtVsTools.Core { get { + ThreadHelper.ThrowIfNotOnUIThread(); + string value = string.Empty; if (Properties.TryGetValue(name, out value)) return value; @@ -83,7 +90,14 @@ namespace QtVsTools.Core } Dictionary<string, string> _Properties; - Dictionary<string, string> Properties => _Properties ?? (_Properties = QueryAllValues()); + Dictionary<string, string> Properties + { + get + { + ThreadHelper.ThrowIfNotOnUIThread(); + return _Properties ?? (_Properties = QueryAllValues()); + } + } Parser _PropertyParser; Parser PropertyParser diff --git a/QtVsTools.Core/QtModules.cs b/QtVsTools.Core/QtModules.cs index 19bd9268..52e2fbe4 100644 --- a/QtVsTools.Core/QtModules.cs +++ b/QtVsTools.Core/QtModules.cs @@ -83,6 +83,8 @@ namespace QtVsTools.Core if (xml == null) return; + Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread(); + foreach (var xModule in xml.Elements("QtVsTools").Elements("Module")) { int id = (int)xModule.Attribute("Id"); QtModule module = new QtModule(id); diff --git a/QtVsTools.Core/QtProject.cs b/QtVsTools.Core/QtProject.cs index 5223bef7..4c651fc5 100644 --- a/QtVsTools.Core/QtProject.cs +++ b/QtVsTools.Core/QtProject.cs @@ -37,6 +37,7 @@ using System.Text.RegularExpressions; using System.Windows.Forms; using System.Xml; using QtVsTools.Core.QtMsBuild; +using Microsoft.VisualStudio.Shell; namespace QtVsTools.Core { @@ -59,6 +60,7 @@ namespace QtVsTools.Core public static QtProject Create(VCProject vcProject) { + ThreadHelper.ThrowIfNotOnUIThread(); return Create((Project)vcProject.Object); } @@ -79,6 +81,8 @@ namespace QtVsTools.Core private QtProject(Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (project == null) throw new QtVSException(SR.GetString("QtProject_CannotConstructWithoutValidProject")); envPro = project; @@ -131,6 +135,8 @@ namespace QtVsTools.Core public static bool IsQtMsBuildEnabled(Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (project == null) return false; return IsQtMsBuildEnabled(project.Object as VCProject); @@ -139,6 +145,8 @@ namespace QtVsTools.Core private bool? isQtMsBuildEnabled = null; public bool IsQtMsBuildEnabled() { + ThreadHelper.ThrowIfNotOnUIThread(); + if (!isQtMsBuildEnabled.HasValue) { if (vcPro != null) isQtMsBuildEnabled = IsQtMsBuildEnabled(vcPro); @@ -166,6 +174,8 @@ namespace QtVsTools.Core { get { + ThreadHelper.ThrowIfNotOnUIThread(); + var ret = false; if (lastConfigurationRowNames == null) { lastConfigurationRowNames = envPro.ConfigurationManager.ConfigurationRowNames as Array; @@ -187,6 +197,8 @@ namespace QtVsTools.Core /// <param name="uiFile">name of the ui file</param> public string GetUiGeneratedFileName(string uiFile) { + ThreadHelper.ThrowIfNotOnUIThread(); + var fi = new FileInfo(uiFile); var file = fi.Name; if (HelperFunctions.IsUicFile(file)) { @@ -225,6 +237,8 @@ namespace QtVsTools.Core private string GetRelativeMocFilePath(string file, string configName = null, string platformName = null) { + ThreadHelper.ThrowIfNotOnUIThread(); + var fileName = GetMocFileName(file); if (fileName == null) return null; @@ -252,17 +266,25 @@ namespace QtVsTools.Core public static int GetFormatVersion(Project pro) { - if (pro == null) - return 0; - return GetFormatVersion(pro.Object as VCProject); + ThreadHelper.ThrowIfNotOnUIThread(); + return pro == null ? 0 : GetFormatVersion(pro.Object as VCProject); } - public int FormatVersion { get { return GetFormatVersion(Project); } } + public int FormatVersion + { + get + { + ThreadHelper.ThrowIfNotOnUIThread(); + return GetFormatVersion(Project); + } + } public static string GetPropertyValue( EnvDTE.Project dteProject, string propName) { + ThreadHelper.ThrowIfNotOnUIThread(); + var activeConfig = dteProject.ConfigurationManager?.ActiveConfiguration; if (activeConfig == null) return null; @@ -275,6 +297,8 @@ namespace QtVsTools.Core EnvDTE.Configuration dteConfig, string propName) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (dteProject == null || dteConfig == null) return null; return GetPropertyValue( @@ -310,6 +334,8 @@ namespace QtVsTools.Core public void AddModule(int id) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (HasModule(id)) return; @@ -375,6 +401,8 @@ namespace QtVsTools.Core public void RemoveModule(int id) { + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) { var compiler = CompilerToolWrapper.Create(config); var linker = (VCLinkerTool)((IVCCollection)config.Tools).Item("VCLinkerTool"); @@ -413,6 +441,8 @@ namespace QtVsTools.Core public void UpdateModules(VersionInformation oldVersion, VersionInformation newVersion) { + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) { var linker = (VCLinkerTool)((IVCCollection)config.Tools).Item("VCLinkerTool"); @@ -462,6 +492,8 @@ namespace QtVsTools.Core public bool HasModule(int id) { + ThreadHelper.ThrowIfNotOnUIThread(); + var foundInIncludes = false; var foundInLibs = false; @@ -514,6 +546,8 @@ namespace QtVsTools.Core public void MarkAsDesignerPluginProject() { + ThreadHelper.ThrowIfNotOnUIThread(); + Project.Globals["IsDesignerPlugin"] = true.ToString(); if (!Project.Globals.get_VariablePersists("IsDesignerPlugin")) Project.Globals.set_VariablePersists("IsDesignerPlugin", true); @@ -558,6 +592,8 @@ namespace QtVsTools.Core return; } + ThreadHelper.ThrowIfNotOnUIThread(); + CustomTool toolSettings = IsQtMsBuildEnabled() ? CustomTool.MSBuildTarget : CustomTool.CustomBuildStep; @@ -751,6 +787,8 @@ namespace QtVsTools.Core private string GetPCHMocOptions(VCFile file, CompilerToolWrapper compiler) { + ThreadHelper.ThrowIfNotOnUIThread(); + // As .moc files are included, we should not add anything there if (!HelperFunctions.IsHeaderFile(file.Name)) return string.Empty; @@ -777,6 +815,8 @@ namespace QtVsTools.Core VCFileConfiguration workFileConfig, VCFile mocFile) { + ThreadHelper.ThrowIfNotOnUIThread(); + var hasDifferentMocFilePerConfig = QtVSIPSettings.HasDifferentMocFilePerConfig(envPro); var hasDifferentMocFilePerPlatform = @@ -903,6 +943,9 @@ namespace QtVsTools.Core + mocFileName + "))"; var regExp = new Regex(pattern); var matchList = regExp.Matches(tool.Outputs.Replace(ProjectMacros.Name, baseFileName)); + + ThreadHelper.ThrowIfNotOnUIThread(); + if (matchList.Count > 0) { if (matchList[0].Length > 0) outputMocFile = matchList[0].ToString(); @@ -1037,6 +1080,8 @@ namespace QtVsTools.Core string includes, string description) { + ThreadHelper.ThrowIfNotOnUIThread(); + var baseFileName = sourceFile.Name.Remove(sourceFile.Name.LastIndexOf('.')); var outputMocFile = GetRelativeMocFilePath(sourceFile.FullPath); var outputMocPath = Path.GetDirectoryName(outputMocFile); @@ -1074,6 +1119,8 @@ namespace QtVsTools.Core var platform = vcConfig.Platform as VCPlatform; var platformName = platform.Name; + ThreadHelper.ThrowIfNotOnUIThread(); + var mocRelPath = GetRelativeMocFilePath( sourceFile.FullPath, vcConfig.ConfigurationName, @@ -1164,6 +1211,7 @@ namespace QtVsTools.Core CustomTool toolSettings = IsQtMsBuildEnabled() ? CustomTool.MSBuildTarget : CustomTool.CustomBuildStep; + ThreadHelper.ThrowIfNotOnUIThread(); try { var mocFileName = GetMocFileName(file.FullPath); if (mocFileName == null) @@ -1257,6 +1305,8 @@ namespace QtVsTools.Core if (HelperFunctions.IsHeaderFile(file.Name)) return CheckForCommand(file, "moc.exe"); + ThreadHelper.ThrowIfNotOnUIThread(); + if (HelperFunctions.IsSourceFile(file.Name)) { return (HasCppMocFiles(file)); } @@ -1286,6 +1336,8 @@ namespace QtVsTools.Core public void RefreshRccSteps() { + ThreadHelper.ThrowIfNotOnUIThread(); + Messages.Print("\r\n=== Update rcc steps ==="); var files = GetResourceFiles(); @@ -1316,6 +1368,8 @@ namespace QtVsTools.Core public void RefreshRccSteps(string oldRccDir) { + ThreadHelper.ThrowIfNotOnUIThread(); + RefreshRccSteps(); UpdateCompilerIncludePaths(oldRccDir, QtVSIPSettings.GetRccDirectory(envPro)); } @@ -1348,16 +1402,15 @@ namespace QtVsTools.Core var cmdLine = string.Empty; var cbt = HelperFunctions.GetCustomBuildTool(vfc); - cbt.AdditionalDependencies = filesInQrcFile; - cbt.Description = "Rcc'ing " + ProjectMacros.FileName + "..."; - cbt.Outputs = qrcCppFile.Replace(nameOnly, ProjectMacros.Name); cmdLine += "\"" + Resources.rcc4Command + "\"" + " -name \"" + ProjectMacros.Name + "\""; + ThreadHelper.ThrowIfNotOnUIThread(); + if (rccOptsCfg == null) rccOptsCfg = HelperFunctions.ParseRccOptions(cbt.CommandLine, qrcFile); @@ -1378,6 +1431,8 @@ namespace QtVsTools.Core return; } + ThreadHelper.ThrowIfNotOnUIThread(); + CustomTool toolSettings = IsQtMsBuildEnabled() ? CustomTool.MSBuildTarget : CustomTool.CustomBuildStep; @@ -1529,27 +1584,30 @@ namespace QtVsTools.Core bool HasCppMocFiles(VCFile cppFile) { - if (!IsQtMsBuildEnabled()) { + ThreadHelper.ThrowIfNotOnUIThread(); + + if (!IsQtMsBuildEnabled()) return File.Exists(Path.ChangeExtension(cppFile.FullPath, ".cbt")); - } else { - var vcProj = cppFile.project as VCProject; - if (vcProj != null) { - foreach (VCFile vcFile in (IVCCollection)vcProj.Files) { - if (vcFile.ItemType == "CustomBuild") { - if (IsCppMocFileCustomBuild(vcProj, vcFile, cppFile)) - return true; - } else if (vcFile.ItemType == QtMoc.ItemTypeName) { - if (IsCppMocFileQtMsBuild(vcProj, vcFile, cppFile)) - return true; - } + + var vcProj = cppFile.project as VCProject; + if (vcProj != null) { + foreach (VCFile vcFile in (IVCCollection)vcProj.Files) { + if (vcFile.ItemType == "CustomBuild") { + if (IsCppMocFileCustomBuild(vcProj, vcFile, cppFile)) + return true; + } else if (vcFile.ItemType == QtMoc.ItemTypeName) { + if (IsCppMocFileQtMsBuild(vcProj, vcFile, cppFile)) + return true; } } - return false; } + return false; } public void RemoveMocStep(VCFile file) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (file.ItemType == QtMoc.ItemTypeName) { RemoveMocStepQtMsBuild(file); } else if (HelperFunctions.IsHeaderFile(file.Name)) { @@ -1588,6 +1646,7 @@ namespace QtVsTools.Core /// <param name="file">file</param> public void RemoveMocStepCustomBuild(VCFile file) { + ThreadHelper.ThrowIfNotOnUIThread(); try { if (!HasMocStep(file)) return; @@ -1971,6 +2030,8 @@ namespace QtVsTools.Core public bool IsDesignerPluginProject() { + ThreadHelper.ThrowIfNotOnUIThread(); + var b = false; if (Project.Globals.get_VariablePersists("IsDesignerPlugin")) { var s = (string)Project.Globals["IsDesignerPlugin"]; @@ -1997,7 +2058,7 @@ namespace QtVsTools.Core } try { - Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread(); + ThreadHelper.ThrowIfNotOnUIThread(); var prop = dte.get_Properties("TextEditor", "C/C++"); var tabSize = Convert.ToInt64(prop.Item("TabSize").Value); var insertTabs = Convert.ToBoolean(prop.Item("InsertTabs").Value); @@ -2056,6 +2117,8 @@ namespace QtVsTools.Core public void AddActiveQtBuildStep(string version, string defFile = null) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (FormatVersion < Resources.qtMinFormatVersion_ClProperties) return; @@ -2086,6 +2149,8 @@ namespace QtVsTools.Core private void UpdateCompilerIncludePaths(string oldDir, string newDir) { + ThreadHelper.ThrowIfNotOnUIThread(); + var fixedOldDir = FixFilePathForComparison(oldDir); var dirs = new[] { FixFilePathForComparison(QtVSIPSettings.GetUicDirectory(envPro)), @@ -2139,6 +2204,8 @@ namespace QtVsTools.Core public void UpdateUicSteps(string oldUicDir, bool update_inc_path) { + ThreadHelper.ThrowIfNotOnUIThread(); + Messages.Print("\r\n=== Update uic steps ==="); var vcFilter = FindFilterFromGuid(Filters.GeneratedFiles().UniqueIdentifier); if (vcFilter != null) { @@ -2253,6 +2320,8 @@ namespace QtVsTools.Core /// <returns></returns> private VCFile GetGeneratedMocFile(string fileName, VCFileConfiguration fileConfig) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (QtVSIPSettings.HasDifferentMocFilePerConfig(envPro) || QtVSIPSettings.HasDifferentMocFilePerPlatform(envPro)) { var projectConfig = (VCConfiguration)fileConfig.ProjectConfiguration; @@ -2332,6 +2401,8 @@ namespace QtVsTools.Core if (filesCollection == null) return; + ThreadHelper.ThrowIfNotOnUIThread(); + int progress = 0; int progressTotal = filesCollection.Count; var waitDialog = WaitDialog.StartWithProgress(SR.GetString("Resources_QtVsTools"), @@ -2351,6 +2422,7 @@ namespace QtVsTools.Core public void RefreshMocStep(VCFile vcfile) { + ThreadHelper.ThrowIfNotOnUIThread(); RefreshMocStep(vcfile, true); } @@ -2371,6 +2443,8 @@ namespace QtVsTools.Core if (mocCmdChecker == null) mocCmdChecker = new MocCmdChecker(); + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (VCFileConfiguration config in (IVCCollection)vcfile.FileConfigurations) { try { string commandLine = ""; @@ -2503,6 +2577,8 @@ namespace QtVsTools.Core public void OnExcludedFromBuildChanged(VCFile vcFile, VCFileConfiguration vcFileCfg) { + ThreadHelper.ThrowIfNotOnUIThread(); + // Update the ExcludedFromBuild flags of the mocced file // according to the ExcludedFromBuild flag of the mocable source file. var moccedFileName = GetMocFileName(vcFile.Name); @@ -2572,6 +2648,8 @@ namespace QtVsTools.Core public void UpdateMocSteps(string oldMocDir) { + ThreadHelper.ThrowIfNotOnUIThread(); + Messages.Print("\r\n=== Update moc steps ==="); var orgFiles = new List<VCFile>(); var abandonedMocFiles = new List<string>(); @@ -2634,6 +2712,8 @@ namespace QtVsTools.Core private void Clean() { + ThreadHelper.ThrowIfNotOnUIThread(); + var solutionConfigs = envPro.DTE.Solution.SolutionBuild.SolutionConfigurations; var backup = new List<KeyValuePair<SolutionContext, bool>>(); foreach (SolutionConfiguration config in solutionConfigs) { @@ -2688,6 +2768,8 @@ namespace QtVsTools.Core public bool isWinRT() { + ThreadHelper.ThrowIfNotOnUIThread(); + try { var vcProject = Project.Object as VCProject; var vcConfigs = vcProject.Configurations as IVCCollection; @@ -2714,6 +2796,8 @@ namespace QtVsTools.Core if (newIsWinRt == oldIsWinRt || newIsWinRt == isWinRT()) return true; + ThreadHelper.ThrowIfNotOnUIThread(); + var promptCaption = string.Format("Change Qt Version ({0})", Project.Name); var promptText = string.Format( "Changing Qt version from {0} to {1}.\r\n" + @@ -2753,6 +2837,8 @@ namespace QtVsTools.Core var refreshMocSteps = (vsPlatformNameNew != vsPlatformNameOld); var platformChanged = (vsPlatformNameNew != vsPlatformNameOld); + ThreadHelper.ThrowIfNotOnUIThread(); + try { if (platformChanged) { if (!SelectSolutionPlatform(vsPlatformNameNew) || !HasPlatform(vsPlatformNameNew)) { @@ -2804,6 +2890,8 @@ namespace QtVsTools.Core public bool SelectSolutionPlatform(string platformName) { + ThreadHelper.ThrowIfNotOnUIThread(); + foreach (SolutionConfiguration solutionCfg in dte.Solution.SolutionBuild.SolutionConfigurations) { var contexts = solutionCfg.SolutionContexts; for (var i = 1; i <= contexts.Count; ++i) { @@ -2829,6 +2917,8 @@ namespace QtVsTools.Core public void CreatePlatform(string oldPlatform, string newPlatform, VersionInformation viOld, VersionInformation viNew, ref bool newProjectCreated) { + ThreadHelper.ThrowIfNotOnUIThread(); + try { var cfgMgr = envPro.ConfigurationManager; cfgMgr.AddPlatform(newPlatform, oldPlatform, true); @@ -2890,9 +2980,9 @@ namespace QtVsTools.Core if (genVCFilter == null) return; - var error = false; - error = DeleteFilesFromFilter(genVCFilter); - if (error) + ThreadHelper.ThrowIfNotOnUIThread(); + + if (DeleteFilesFromFilter(genVCFilter)) Messages.Print(SR.GetString("DeleteGeneratedFilesError")); } @@ -3037,6 +3127,8 @@ namespace QtVsTools.Core public void CollapseFilter(string filterName) { + ThreadHelper.ThrowIfNotOnUIThread(); + var solutionExplorer = (UIHierarchy)dte.Windows.Item(Constants.vsext_wk_SProjectWindow).Object; if (solutionExplorer.UIHierarchyItems.Count == 0) return; @@ -3050,6 +3142,8 @@ namespace QtVsTools.Core private UIHierarchyItem FindProjectHierarchyItem(UIHierarchy hierarchy) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (hierarchy.UIHierarchyItems.Count == 0) return null; @@ -3065,6 +3159,8 @@ namespace QtVsTools.Core private UIHierarchyItem FindProjectHierarchyItem(UIHierarchyItem root) { + ThreadHelper.ThrowIfNotOnUIThread(); + UIHierarchyItem projectItem = null; try { if (root.Name == envPro.Name) @@ -3085,6 +3181,7 @@ namespace QtVsTools.Core /// </summary> public string GetQtVersion() { + ThreadHelper.ThrowIfNotOnUIThread(); return QtVersionManager.The().GetProjectQtVersion(envPro); } @@ -3093,6 +3190,7 @@ namespace QtVsTools.Core /// </summary> public void SetQtEnvironment() { + ThreadHelper.ThrowIfNotOnUIThread(); SetQtEnvironment(QtVersionManager.The().GetProjectQtVersion(envPro)); } @@ -3101,6 +3199,7 @@ namespace QtVsTools.Core /// </summary> public void SetQtEnvironment(string qtVersion) { + ThreadHelper.ThrowIfNotOnUIThread(); SetQtEnvironment(qtVersion, string.Empty); } @@ -3119,6 +3218,8 @@ namespace QtVsTools.Core if (qtVersion != "$(QTDIR)") qtDir = QtVersionManager.The().GetInstallPath(qtVersion); HelperFunctions.SetEnvironmentVariableEx("QTDIR", qtDir); + + ThreadHelper.ThrowIfNotOnUIThread(); try { var propertyAccess = (IVCBuildPropertyStorage)vcPro; var vcprj = envPro.Object as VCProject; diff --git a/QtVsTools.Core/QtVSIPSettings.cs b/QtVsTools.Core/QtVSIPSettings.cs index 58c7b2ad..374cfb0f 100644 --- a/QtVsTools.Core/QtVSIPSettings.cs +++ b/QtVsTools.Core/QtVSIPSettings.cs @@ -26,6 +26,7 @@ ** ****************************************************************************/ +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.VCProjectEngine; using Microsoft.Win32; using System; @@ -56,11 +57,14 @@ namespace QtVsTools.Core public static string GetUicDirectory(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); return GetDirectory(project, Resources.uicDirKeyword); } public static void SaveUicDirectory(EnvDTE.Project project, string directory) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (directory == null) SaveDirectory(project, Resources.uicDirKeyword, GetDirectory(project, Resources.uicDirKeyword)); else @@ -74,6 +78,7 @@ namespace QtVsTools.Core public static string GetMocDirectory(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); return GetDirectory(project, Resources.mocDirKeyword); } @@ -82,6 +87,8 @@ namespace QtVsTools.Core string configName, string platformName, VCFile vCFile) { + ThreadHelper.ThrowIfNotOnUIThread(); + string filePath = null; if (vCFile != null) filePath = vCFile.FullPath; @@ -94,6 +101,8 @@ namespace QtVsTools.Core string platformName, string filePath = null) { + ThreadHelper.ThrowIfNotOnUIThread(); + var dir = GetDirectory(project, Resources.mocDirKeyword); if (!string.IsNullOrEmpty(configName) && !string.IsNullOrEmpty(platformName)) @@ -103,12 +112,16 @@ namespace QtVsTools.Core public static bool HasDifferentMocFilePerConfig(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + var mocDir = GetMocDirectory(project); return mocDir.Contains("$(ConfigurationName)"); } public static bool HasDifferentMocFilePerPlatform(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + var mocDir = GetMocDirectory(project); return mocDir.Contains("$(PlatformName)"); } @@ -120,11 +133,14 @@ namespace QtVsTools.Core public static string GetMocOptions(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); return GetOption(project, Resources.mocOptionsKeyword); } public static bool GetLUpdateOnBuild(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (GetProjectQtSetting(project, "QtRunLUpdateOnBuild") == "true") return true; return GetBoolValue(project, Resources.lupdateKeyword); @@ -137,6 +153,8 @@ namespace QtVsTools.Core static string GetProjectQtSetting(EnvDTE.Project project, string propertyName) { + ThreadHelper.ThrowIfNotOnUIThread(); + var vcProject = project.Object as VCProject; if (vcProject == null) return null; @@ -165,6 +183,8 @@ namespace QtVsTools.Core public static string GetLUpdateOptions(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + string qtLUpdateOptions = GetProjectQtSetting(project, "QtLUpdateOptions"); if (!string.IsNullOrEmpty(qtLUpdateOptions)) return qtLUpdateOptions; @@ -178,6 +198,8 @@ namespace QtVsTools.Core public static string GetLReleaseOptions(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + string qtLReleaseOptions = GetProjectQtSetting(project, "QtLReleaseOptions"); if (!string.IsNullOrEmpty(qtLReleaseOptions)) return qtLReleaseOptions; @@ -186,6 +208,8 @@ namespace QtVsTools.Core public static void SaveMocDirectory(EnvDTE.Project project, string directory) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (directory == null) SaveDirectory(project, Resources.mocDirKeyword, GetDirectory(project, Resources.mocDirKeyword)); else @@ -196,11 +220,15 @@ namespace QtVsTools.Core { if (options == null) options = GetMocOptions(); + + ThreadHelper.ThrowIfNotOnUIThread(); + SaveOption(project, Resources.mocOptionsKeyword, options); } public static void SaveLUpdateOnBuild(EnvDTE.Project project, bool value) { + ThreadHelper.ThrowIfNotOnUIThread(); SetBoolValue(project, Resources.lupdateKeyword, value); } @@ -209,6 +237,8 @@ namespace QtVsTools.Core if (options == null) options = GetLUpdateOptions(); + ThreadHelper.ThrowIfNotOnUIThread(); + SaveOption(project, Resources.lupdateOptionsKeyword, options); } @@ -216,16 +246,22 @@ namespace QtVsTools.Core { if (options == null) options = GetLReleaseOptions(); + + ThreadHelper.ThrowIfNotOnUIThread(); + SaveOption(project, Resources.lreleaseOptionsKeyword, options); } public static string GetRccDirectory(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); return GetDirectory(project, Resources.rccDirKeyword); } public static void SaveRccDirectory(EnvDTE.Project project, string directory) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (directory == null) SaveDirectory(project, Resources.rccDirKeyword, GetDirectory(project, Resources.rccDirKeyword)); else @@ -272,6 +308,8 @@ namespace QtVsTools.Core private static string GetDirectory(EnvDTE.Project project, string type) { + ThreadHelper.ThrowIfNotOnUIThread(); + // check for directory in following order: // - stored in project // - stored in cache @@ -355,6 +393,8 @@ namespace QtVsTools.Core private static string GetOption(EnvDTE.Project project, string type) { + ThreadHelper.ThrowIfNotOnUIThread(); + // check for directory in following order: // - stored in project // - globally defined default option @@ -366,6 +406,8 @@ namespace QtVsTools.Core private static bool GetBoolValue(EnvDTE.Project project, string type) { + ThreadHelper.ThrowIfNotOnUIThread(); + // check for directory in following order: // - stored in project // - globally defined default option @@ -377,6 +419,8 @@ namespace QtVsTools.Core private static void SaveDirectory(EnvDTE.Project project, string type, string dir) { + ThreadHelper.ThrowIfNotOnUIThread(); + dir = HelperFunctions.NormalizeRelativeFilePath(dir); project.Globals[type] = dir; if (!project.Globals.get_VariablePersists(type)) @@ -387,6 +431,8 @@ namespace QtVsTools.Core private static void SaveOption(EnvDTE.Project project, string type, string option) { + ThreadHelper.ThrowIfNotOnUIThread(); + project.Globals[type] = option; if (!project.Globals.get_VariablePersists(type)) project.Globals.set_VariablePersists(type, true); @@ -394,6 +440,8 @@ namespace QtVsTools.Core private static void SetBoolValue(EnvDTE.Project project, string type, bool value) { + ThreadHelper.ThrowIfNotOnUIThread(); + project.Globals[type] = Convert.ToInt32(value).ToString(); if (!project.Globals.get_VariablePersists(type)) project.Globals.set_VariablePersists(type, true); @@ -401,6 +449,8 @@ namespace QtVsTools.Core public static void cleanUpCache(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + try { var mocEnumerator = mocDirCache.GetEnumerator(); while (mocEnumerator.MoveNext()) { diff --git a/QtVsTools.Core/QtVersionManager.cs b/QtVsTools.Core/QtVersionManager.cs index c52b0661..9353efab 100644 --- a/QtVsTools.Core/QtVersionManager.cs +++ b/QtVsTools.Core/QtVersionManager.cs @@ -26,6 +26,7 @@ ** ****************************************************************************/ +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.VCProjectEngine; using Microsoft.Win32; using System; @@ -48,6 +49,8 @@ namespace QtVsTools.Core protected QtVersionManager() { + ThreadHelper.ThrowIfNotOnUIThread(); + strVersionKey = "Versions"; regVersionPath = Resources.registryVersionPath; RefreshVersionNames(); @@ -63,8 +66,8 @@ namespace QtVsTools.Core } } catch (Exception e) { - Messages.Print( - e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace); + ThreadHelper.ThrowIfNotOnUIThread(); + Messages.Print(e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace); } } @@ -89,6 +92,8 @@ namespace QtVsTools.Core public VersionInformation GetVersionInfo(string name) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (name == "$(DefaultQtVersion)") name = GetDefaultVersion(); if (name == null) @@ -108,6 +113,7 @@ namespace QtVsTools.Core public VersionInformation GetVersionInfo(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); return GetVersionInfo(GetProjectQtVersion(project)); } @@ -118,6 +124,8 @@ namespace QtVsTools.Core public string GetQtVersionFromInstallDir(string qtDir) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (qtDir == null) return null; @@ -153,6 +161,8 @@ namespace QtVsTools.Core /// <returns>true, if we found an invalid version</returns> public bool HasInvalidVersions(out string errorMessage) { + ThreadHelper.ThrowIfNotOnUIThread(); + var validVersions = new Dictionary<string, QtConfig>(); var invalidVersions = new List<string>(); @@ -230,6 +240,8 @@ namespace QtVsTools.Core public string GetInstallPath(string version) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (version == "$(DefaultQtVersion)") version = GetDefaultVersion(); return GetInstallPath(version, Registry.CurrentUser); @@ -237,6 +249,8 @@ namespace QtVsTools.Core public string GetInstallPath(string version, RegistryKey root) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (version == "$(DefaultQtVersion)") version = GetDefaultVersion(root); if (version == "$(QTDIR)") @@ -253,6 +267,8 @@ namespace QtVsTools.Core public string GetInstallPath(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + var version = GetProjectQtVersion(project); if (version == "$(DefaultQtVersion)") version = GetDefaultVersion(); @@ -283,6 +299,8 @@ namespace QtVsTools.Core } } + ThreadHelper.ThrowIfNotOnUIThread(); + string rootKeyPath = "SOFTWARE\\" + Resources.registryRootPath; string versionKeyPath = strVersionKey + "\\" + verName; using (var key = Registry.CurrentUser.CreateSubKey(rootKeyPath)) { @@ -311,6 +329,9 @@ namespace QtVsTools.Core return; key.DeleteSubKey(versionName); key.Close(); + + ThreadHelper.ThrowIfNotOnUIThread(); + RefreshVersionNames(); } @@ -329,6 +350,7 @@ namespace QtVsTools.Core public bool SaveProjectQtVersion(EnvDTE.Project project, string version) { + ThreadHelper.ThrowIfNotOnUIThread(); return SaveProjectQtVersion(project, version, project.ConfigurationManager.ActiveConfiguration.PlatformName); } @@ -336,6 +358,9 @@ namespace QtVsTools.Core { if (!IsVersionAvailable(version) && version != "$(DefaultQtVersion)") return false; + + ThreadHelper.ThrowIfNotOnUIThread(); + if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings) { var vcPro = project.Object as VCProject; if (vcPro == null) @@ -346,6 +371,9 @@ namespace QtVsTools.Core } return true; } + + ThreadHelper.ThrowIfNotOnUIThread(); + var key = "Qt5Version " + platform; if (!project.Globals.get_VariableExists(key) || project.Globals[key].ToString() != version) project.Globals[key] = version; @@ -356,6 +384,8 @@ namespace QtVsTools.Core public string GetProjectQtVersion(EnvDTE.Project project) { + ThreadHelper.ThrowIfNotOnUIThread(); + EnvDTE.Configuration config = null; try { config = project.ConfigurationManager.ActiveConfiguration; @@ -383,6 +413,8 @@ namespace QtVsTools.Core if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings) return QtProject.GetPropertyValue(project, config, "QtInstall"); + ThreadHelper.ThrowIfNotOnUIThread(); + var key = "Qt5Version " + config.PlatformName; if (!project.Globals.get_VariablePersists(key)) return null; @@ -396,6 +428,8 @@ namespace QtVsTools.Core if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings) return GetProjectQtVersion(project); + ThreadHelper.ThrowIfNotOnUIThread(); + var key = "Qt5Version " + platform; if (!project.Globals.get_VariablePersists(key)) return null; @@ -423,6 +457,9 @@ namespace QtVsTools.Core { if (!IsVersionAvailable(version) && version != "$(DefaultQtVersion)") return false; + + ThreadHelper.ThrowIfNotOnUIThread(); + solution.Globals["Qt5Version"] = version; if (!solution.Globals.get_VariablePersists("Qt5Version")) solution.Globals.set_VariablePersists("Qt5Version", true); @@ -434,6 +471,8 @@ namespace QtVsTools.Core if (solution == null) return null; + ThreadHelper.ThrowIfNotOnUIThread(); + if (solution.Globals.get_VariableExists("Qt5Version")) { var version = (string)solution.Globals["Qt5Version"]; return VerifyIfQtVersionExists(version) ? version : null; @@ -444,6 +483,7 @@ namespace QtVsTools.Core public string GetDefaultVersion() { + ThreadHelper.ThrowIfNotOnUIThread(); return GetDefaultVersion(Registry.CurrentUser); } @@ -458,6 +498,8 @@ namespace QtVsTools.Core Messages.DisplayWarningMessage(SR.GetString("QtVersionManager_CannotLoadQtVersion")); } + ThreadHelper.ThrowIfNotOnUIThread(); + if (defaultVersion == null) { MergeVersions(); var key = root.OpenSubKey("SOFTWARE\\" + regVersionPath, false); @@ -498,6 +540,8 @@ namespace QtVsTools.Core var hkcuVersions = GetVersions(); var hklmVersions = GetVersions(Registry.LocalMachine); + ThreadHelper.ThrowIfNotOnUIThread(); + var hkcuInstDirs = new string[hkcuVersions.Length]; for (var i = 0; i < hkcuVersions.Length; ++i) hkcuInstDirs[i] = GetInstallPath(hkcuVersions[i]); @@ -533,6 +577,8 @@ namespace QtVsTools.Core private bool VerifyIfQtVersionExists(string version) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (version == "$(DefaultQtVersion)") version = GetDefaultVersion(); if (!string.IsNullOrEmpty(version)) { diff --git a/QtVsTools.Core/RccOptions.cs b/QtVsTools.Core/RccOptions.cs index 6d4696af..71c0c761 100644 --- a/QtVsTools.Core/RccOptions.cs +++ b/QtVsTools.Core/RccOptions.cs @@ -26,6 +26,7 @@ ** ****************************************************************************/ +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.VCProjectEngine; using System; @@ -57,6 +58,8 @@ namespace QtVsTools.Core { get { + ThreadHelper.ThrowIfNotOnUIThread(); + if (project.Globals.get_VariablePersists("RccCompressFiles" + id) && (string)project.Globals["RccCompressFiles" + id] == "true") return true; @@ -64,6 +67,8 @@ namespace QtVsTools.Core } set { + ThreadHelper.ThrowIfNotOnUIThread(); + if (value) project.Globals["RccCompressFiles" + id] = "true"; else @@ -77,12 +82,16 @@ namespace QtVsTools.Core { get { + ThreadHelper.ThrowIfNotOnUIThread(); + if (project.Globals.get_VariablePersists("RccCompressLevel" + id)) return Convert.ToInt32((string)project.Globals["RccCompressLevel" + id], 10); return 0; } set { + ThreadHelper.ThrowIfNotOnUIThread(); + project.Globals["RccCompressLevel" + id] = value.ToString(); if (!project.Globals.get_VariablePersists("RccCompressLevel" + id)) project.Globals.set_VariablePersists("RccCompressLevel" + id, true); @@ -93,12 +102,16 @@ namespace QtVsTools.Core { get { + ThreadHelper.ThrowIfNotOnUIThread(); + if (project.Globals.get_VariablePersists("RccCompressThreshold" + id)) return Convert.ToInt32((string)project.Globals["RccCompressThreshold" + id], 10); return 0; } set { + ThreadHelper.ThrowIfNotOnUIThread(); + project.Globals["RccCompressThreshold" + id] = value.ToString(); if (!project.Globals.get_VariablePersists("RccCompressThreshold" + id)) project.Globals.set_VariablePersists("RccCompressThreshold" + id, true); diff --git a/QtVsTools.Core/VersionInformation.cs b/QtVsTools.Core/VersionInformation.cs index a5287f8e..45129efd 100644 --- a/QtVsTools.Core/VersionInformation.cs +++ b/QtVsTools.Core/VersionInformation.cs @@ -26,6 +26,7 @@ ** ****************************************************************************/ +using Microsoft.VisualStudio.Shell; using System; using System.Collections; using System.Collections.Generic; @@ -95,6 +96,7 @@ namespace QtVsTools.Core { qtDir = qtDirIn; + ThreadHelper.ThrowIfNotOnUIThread(); try { var qmakeQuery = new QMakeQuery(this); SetupPlatformSpecificData(qmakeQuery); @@ -287,6 +289,8 @@ namespace QtVsTools.Core { var qmakeQuery = new QMakeQuery(this); string qmakeXSpec; + + ThreadHelper.ThrowIfNotOnUIThread(); try { qmakeXSpec = qmakeQuery["QMAKE_XSPEC"]; } catch { diff --git a/QtVsTools.Core/WaitDialog.cs b/QtVsTools.Core/WaitDialog.cs index a97a1642..0eef5bc5 100644 --- a/QtVsTools.Core/WaitDialog.cs +++ b/QtVsTools.Core/WaitDialog.cs @@ -28,6 +28,7 @@ using System; using Microsoft.VisualStudio; +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; using QtVsTools.VisualStudio; @@ -53,6 +54,8 @@ namespace QtVsTools.Core if (VsWaitDialog == null) return false; + ThreadHelper.ThrowIfNotOnUIThread(); + bool canceled = false; int res = VsWaitDialog.HasCanceled(out canceled); if (res != VSConstants.S_OK) @@ -77,6 +80,8 @@ namespace QtVsTools.Core return null; } + ThreadHelper.ThrowIfNotOnUIThread(); + IVsThreadedWaitDialog2 vsWaitDialog = null; factory.CreateInstance(out vsWaitDialog); if (vsWaitDialog == null) @@ -103,6 +108,8 @@ namespace QtVsTools.Core if (dialog == null) return null; + ThreadHelper.ThrowIfNotOnUIThread(); + var res = dialog.VsWaitDialog.StartWaitDialog(caption, message, progressText, null, statusBarText, delay, isCancelable, showMarqueeProgress); @@ -127,6 +134,8 @@ namespace QtVsTools.Core if (dialog == null) return null; + ThreadHelper.ThrowIfNotOnUIThread(); + var res = dialog.VsWaitDialog.StartWaitDialogWithPercentageProgress( caption, message, progressText, null, statusBarText, isCancelable, delay, totalSteps, currentStep); @@ -148,6 +157,8 @@ namespace QtVsTools.Core if (!Running) return; + ThreadHelper.ThrowIfNotOnUIThread(); + bool canceled = false; int res = VsWaitDialog.UpdateProgress(message, progressText, statusBarText, currentStep, totalSteps, disableCancel, out canceled); @@ -164,6 +175,8 @@ namespace QtVsTools.Core if (!Running) return; + ThreadHelper.ThrowIfNotOnUIThread(); + Running = false; int canceled = 0; VsWaitDialog.EndWaitDialog(out canceled); @@ -172,6 +185,7 @@ namespace QtVsTools.Core void IDisposable.Dispose() { + ThreadHelper.ThrowIfNotOnUIThread(); Stop(); } } |