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/Translation.cs |  171 ++++++++++++--------------------------------------------
 1 files changed, 37 insertions(+), 134 deletions(-)

diff --git a/QtVsTools.Package/Package/Translation.cs b/QtVsTools.Package/Package/Translation.cs
index 3c7e9f2..d47e525 100644
--- a/QtVsTools.Package/Package/Translation.cs
+++ b/QtVsTools.Package/Package/Translation.cs
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2022 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the Qt VS Tools.
@@ -26,24 +26,16 @@
 **
 ****************************************************************************/
 
-using Microsoft.VisualStudio;
-using Microsoft.VisualStudio.Shell.Interop;
-using Microsoft.VisualStudio.VCProjectEngine;
-using QtVsTools.Core;
-using QtVsTools.VisualStudio;
 using System;
 using System.Collections.Generic;
-using System.Diagnostics;
 using System.IO;
 using System.Linq;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Windows.Forms;
+using Microsoft.VisualStudio.Shell;
+using Microsoft.VisualStudio.VCProjectEngine;
 
 namespace QtVsTools
 {
-    using static Core.HelperFunctions;
+    using Core;
     using QtMsBuild;
 
     /// <summary>
@@ -51,16 +43,10 @@
     /// </summary>
     public static class Translation
     {
-        public static void RunlRelease(VCFile vcFile)
-        {
-            var vcProj = vcFile.project as VCProject;
-            var project = vcProj?.Object as EnvDTE.Project;
-            RunTranslationTarget(BuildAction.Release,
-                project, new[] { vcFile.RelativePath });
-        }
-
         public static void RunlRelease(VCFile[] vcFiles)
         {
+            ThreadHelper.ThrowIfNotOnUIThread();
+
             var vcProj = vcFiles.FirstOrDefault()?.project as VCProject;
             var project = vcProj?.Object as EnvDTE.Project;
             RunTranslationTarget(BuildAction.Release,
@@ -69,11 +55,14 @@
 
         public static void RunlRelease(EnvDTE.Project project)
         {
+            ThreadHelper.ThrowIfNotOnUIThread();
             RunTranslationTarget(BuildAction.Release, project);
         }
 
         public static void RunlRelease(EnvDTE.Solution solution)
         {
+            ThreadHelper.ThrowIfNotOnUIThread();
+
             if (solution == null)
                 return;
 
@@ -83,6 +72,8 @@
 
         public static void RunlUpdate(VCFile vcFile)
         {
+            ThreadHelper.ThrowIfNotOnUIThread();
+
             var vcProj = vcFile.project as VCProject;
             var project = vcProj?.Object as EnvDTE.Project;
             RunTranslationTarget(BuildAction.Update,
@@ -91,6 +82,8 @@
 
         public static void RunlUpdate(VCFile[] vcFiles)
         {
+            ThreadHelper.ThrowIfNotOnUIThread();
+
             var vcProj = vcFiles.FirstOrDefault()?.project as VCProject;
             var project = vcProj?.Object as EnvDTE.Project;
             RunTranslationTarget(BuildAction.Update,
@@ -99,16 +92,19 @@
 
         public static void RunlUpdate(EnvDTE.Project project)
         {
+            ThreadHelper.ThrowIfNotOnUIThread();
             RunTranslationTarget(BuildAction.Update, project);
         }
 
-        enum BuildAction { Update, Release }
+        internal enum BuildAction { Update, Release }
 
         static void RunTranslationTarget(
             BuildAction buildAction,
             EnvDTE.Project project,
             IEnumerable<string> selectedFiles = null)
         {
+            ThreadHelper.ThrowIfNotOnUIThread();
+
             using (WaitDialog.Start(
                 "Qt Visual Studio Tools", "Running translation tool...")) {
 
@@ -122,10 +118,9 @@
                 if (qtPro.FormatVersion < Resources.qtMinFormatVersion_Settings) {
                     Messages.Print("translation: Legacy project format");
                     try {
-                        Legacy_RunTranslation(buildAction, qtPro, selectedFiles);
-                    } catch (Exception e) {
-                        Messages.Print(
-                            e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
+                        Legacy.Translation.Run(buildAction, qtPro, selectedFiles);
+                    } catch (Exception exception) {
+                        exception.Log();
                     }
                     return;
                 }
@@ -152,12 +147,15 @@
                 if (selectedFiles != null)
                     properties["SelectedFiles"] = string.Join(";", selectedFiles);
 
-                QtProjectBuild.StartBuild(project, activeConfigId, properties, new[] { target });
+                QtProjectBuild.StartBuild(
+                    project, project.FullName, activeConfigId, properties, new[] { target });
             }
         }
 
         public static void RunlUpdate(EnvDTE.Solution solution)
         {
+            ThreadHelper.ThrowIfNotOnUIThread();
+
             if (solution == null)
                 return;
 
@@ -165,118 +163,23 @@
                 RunlUpdate(project);
         }
 
-        static void Legacy_RunTranslation(
-            BuildAction buildAction,
-            QtProject qtProject,
-            IEnumerable<string> tsFiles)
-        {
-            if (tsFiles == null) {
-                tsFiles = (qtProject.VCProject
-                    .GetFilesEndingWith(".ts") as IVCCollection)
-                    .Cast<VCFile>()
-                    .Select(vcFile => vcFile.RelativePath);
-                if (tsFiles == null) {
-                    Messages.Print("translation: no translation files found");
-                    return;
-                }
-            }
-            string tempFile = null;
-            foreach (var file in tsFiles.Where(file => file != null))
-                Legacy_RunTranslation(buildAction, qtProject, file, ref tempFile);
-        }
-
-        static void Legacy_RunTranslation(
-            BuildAction buildAction,
-            QtProject qtProject,
-            string tsFile,
-            ref string tempFile)
-        {
-            var qtVersion = qtProject.GetQtVersion();
-            var qtInstallPath = QtVersionManager.The().GetInstallPath(qtVersion);
-            if (string.IsNullOrEmpty(qtInstallPath)) {
-                Messages.Print("translation: Error accessing Qt installation");
-                return;
-            }
-
-            var procInfo = new ProcessStartInfo
-            {
-                WorkingDirectory = qtProject.ProjectDir,
-                CreateNoWindow = true,
-                UseShellExecute = false,
-                RedirectStandardError = true,
-                RedirectStandardOutput = true,
-                Arguments = ""
-            };
-            switch (buildAction) {
-            case BuildAction.Update:
-                Messages.Print("\r\n--- (lupdate) file: " + tsFile);
-                procInfo.FileName = Path.Combine(qtInstallPath, "bin", "lupdate.exe");
-                var options = QtVSIPSettings.GetLUpdateOptions();
-                if (!string.IsNullOrEmpty(options))
-                    procInfo.Arguments += options + " ";
-                if (tempFile == null) {
-                    var inputFiles = GetProjectFiles(qtProject.Project, FilesToList.FL_HFiles)
-                        .Union(GetProjectFiles(qtProject.Project, FilesToList.FL_CppFiles))
-                        .Union(GetProjectFiles(qtProject.Project, FilesToList.FL_UiFiles))
-                        .Union(GetProjectFiles(qtProject.Project, FilesToList.FL_QmlFiles));
-                    tempFile = Path.GetTempFileName();
-                    File.WriteAllLines(tempFile, inputFiles);
-                }
-                procInfo.Arguments += string.Format("\"@{0}\" -ts \"{1}\"", tempFile, tsFile);
-                break;
-            case BuildAction.Release:
-                Messages.Print("\r\n--- (lrelease) file: " + tsFile);
-                procInfo.FileName = Path.Combine(qtInstallPath, "bin", "lrelease.exe");
-                options = QtVSIPSettings.GetLReleaseOptions();
-                if (!string.IsNullOrEmpty(options))
-                    procInfo.Arguments += options + " ";
-                procInfo.Arguments += string.Format("\"{0}\"", tsFile);
-                break;
-            }
-            using (var proc = Process.Start(procInfo)) {
-                proc.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
-                {
-                    if (!string.IsNullOrEmpty(e.Data))
-                        Messages.Print(e.Data);
-                };
-                proc.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
-                {
-                    if (!string.IsNullOrEmpty(e.Data))
-                        Messages.Print(e.Data);
-                };
-                proc.BeginOutputReadLine();
-                proc.BeginErrorReadLine();
-                proc.WaitForExit();
-                switch (proc.ExitCode) {
-                case 0:
-                    Messages.Print("translation: ok");
-                    break;
-                default:
-                    Messages.Print(string.Format("translation: ERROR {0}", proc.ExitCode));
-                    break;
-                }
-            }
-        }
-
-        public static void CreateNewTranslationFile(EnvDTE.Project project)
+        public static bool ToolsAvailable(EnvDTE.Project project)
         {
             if (project == null)
-                return;
+                return false;
+            if (QtProject.GetPropertyValue(project, "ApplicationType") == "Linux")
+                return true;
 
-            using (var transDlg = new AddTranslationDialog(project)) {
-                if (transDlg.ShowDialog() == DialogResult.OK) {
-                    try {
-                        var qtPro = QtProject.Create(project);
-                        var file = qtPro.AddFileInFilter(Filters.TranslationFiles(),
-                            transDlg.TranslationFile, true);
-                        RunlUpdate(file);
-                    } catch (QtVSException e) {
-                        Messages.DisplayErrorMessage(e.Message);
-                    } catch (System.Exception ex) {
-                        Messages.DisplayErrorMessage(ex.Message);
-                    }
-                }
+            var qtToolsPath = QtProject.GetPropertyValue(project, "QtToolsPath");
+            if (string.IsNullOrEmpty(qtToolsPath)) {
+                var qtVersion = QtVersionManager.The().GetProjectQtVersion(project);
+                var qtInstallPath = QtVersionManager.The().GetInstallPath(qtVersion);
+                if (string.IsNullOrEmpty(qtInstallPath))
+                    return false;
+                qtToolsPath = Path.Combine(qtInstallPath, "bin");
             }
+            return File.Exists(Path.Combine(qtToolsPath, "lupdate.exe"))
+                && File.Exists(Path.Combine(qtToolsPath, "lrelease.exe"));
         }
     }
 }

--
Gitblit v1.9.1