| /****************************************************************************  | 
| **  | 
| ** Copyright (C) 2020 The Qt Company Ltd.  | 
| ** Contact: https://www.qt.io/licensing/  | 
| **  | 
| ** This file is part of the Qt VS Tools.  | 
| **  | 
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$  | 
| ** Commercial License Usage  | 
| ** Licensees holding valid commercial Qt licenses may use this file in  | 
| ** accordance with the commercial license agreement provided with the  | 
| ** Software or, alternatively, in accordance with the terms contained in  | 
| ** a written agreement between you and The Qt Company. For licensing terms  | 
| ** and conditions see https://www.qt.io/terms-conditions. For further  | 
| ** information use the contact form at https://www.qt.io/contact-us.  | 
| **  | 
| ** GNU General Public License Usage  | 
| ** Alternatively, this file may be used under the terms of the GNU  | 
| ** General Public License version 3 as published by the Free Software  | 
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT  | 
| ** included in the packaging of this file. Please review the following  | 
| ** information to ensure the GNU General Public License requirements will  | 
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html.  | 
| **  | 
| ** $QT_END_LICENSE$  | 
| **  | 
| ****************************************************************************/  | 
|   | 
| using System;  | 
| using System.Collections.Generic;  | 
| using System.Linq;  | 
| using System.Windows;  | 
| using Microsoft.VisualStudio.Shell;  | 
| using Microsoft.VisualStudio.Shell.Interop;  | 
| using QtVsTools.Core;  | 
|   | 
| namespace QtVsTools.Options  | 
| {  | 
|     public class QtVersionsPage : UIElementDialogPage  | 
|     {  | 
|         QtVersionManager VersionManager => QtVersionManager.The();  | 
|   | 
|         QtVersionsTable _VersionsTable;  | 
|         QtVersionsTable VersionsTable => _VersionsTable  | 
|             ?? (_VersionsTable = new QtVersionsTable());  | 
|   | 
|         protected override UIElement Child => VersionsTable;  | 
|   | 
|         public override void LoadSettingsFromStorage()  | 
|         {  | 
|             var versions = new List<QtVersionsTable.Row>();  | 
|             foreach (var versionName in VersionManager.GetVersions()) {  | 
|                 var versionPath = VersionManager.GetInstallPath(versionName);  | 
|                 BuildHost host = BuildHost.Windows;  | 
|                 string compiler = "msvc";  | 
|                 if (versionPath.StartsWith("SSH:") || versionPath.StartsWith("WSL:")) {  | 
|                     var linuxPaths = versionPath.Split(':');  | 
|                     versionPath = linuxPaths[1];  | 
|                     if (linuxPaths[0] == "SSH")  | 
|                         host = BuildHost.LinuxSSH;  | 
|                     else  | 
|                         host = BuildHost.LinuxWSL;  | 
|                     compiler = "g++";  | 
|                     if (linuxPaths.Length > 2 && !string.IsNullOrEmpty(linuxPaths[2]))  | 
|                         compiler = linuxPaths[2];  | 
|                 }  | 
|                 var defaultVersion = VersionManager.GetDefaultVersion();  | 
|                 versions.Add(new QtVersionsTable.Row()  | 
|                 {  | 
|                     IsDefault = (versionName == defaultVersion),  | 
|                     VersionName = versionName,  | 
|                     Path = versionPath,  | 
|                     Host = host,  | 
|                     Compiler = compiler,  | 
|                 });  | 
|             }  | 
|             VersionsTable.UpdateVersions(versions);  | 
|         }  | 
|   | 
|         public override void SaveSettingsToStorage()  | 
|         {  | 
|             foreach (var versionName in VersionManager.GetVersions()) {  | 
|                 try {  | 
|                     VersionManager.RemoveVersion(versionName);  | 
|                 } catch (Exception exception) {  | 
|                     Messages.Print(  | 
|                         exception.Message + "\r\n\r\nStacktrace:\r\n" + exception.StackTrace);  | 
|                 }  | 
|             }  | 
|             foreach (var version in VersionsTable.Versions) {  | 
|                 try {  | 
|                     if (version.Host == BuildHost.Windows) {  | 
|                         var versionInfo = VersionInformation.Get(version.Path);  | 
|                         var generator = versionInfo.GetQMakeConfEntry("MAKEFILE_GENERATOR");  | 
|                         if (generator != "MSVC.NET" && generator != "MSBUILD")  | 
|                             throw new Exception(SR.GetString(  | 
|                                 "AddQtVersionDialog_IncorrectMakefileGenerator", generator));  | 
|                         VersionManager.SaveVersion(version.VersionName, version.Path);  | 
|                     } else {  | 
|                         string name = version.VersionName;  | 
|                         string access =  | 
|                             (version.Host == BuildHost.LinuxSSH) ? "SSH" : "WSL";  | 
|                         string path = version.Path;  | 
|                         string compiler = version.Compiler;  | 
|                         if (compiler == "g++")  | 
|                             compiler = string.Empty;  | 
|                         path = string.Format("{0}:{1}:{2}", access, path, compiler);  | 
|                         VersionManager.SaveVersion(name, path, checkPath: false);  | 
|                     }  | 
|                 } catch (Exception exception) {  | 
|                     Messages.Print(  | 
|                         exception.Message + "\r\n\r\nStacktrace:\r\n" + exception.StackTrace);  | 
|                 }  | 
|             }  | 
|             try {  | 
|                 var defaultVersion = VersionsTable.Versions  | 
|                     .Where(version => version.IsDefault)  | 
|                     .FirstOrDefault();  | 
|                 if (defaultVersion != null)  | 
|                     VersionManager.SaveDefaultVersion(defaultVersion.VersionName);  | 
|             } catch (Exception exception) {  | 
|                 Messages.Print(  | 
|                     exception.Message + "\r\n\r\nStacktrace:\r\n" + exception.StackTrace);  | 
|             }  | 
|         }  | 
|   | 
|         protected override void OnApply(PageApplyEventArgs e)  | 
|         {  | 
|             var errorMessages = VersionsTable.GetErrorMessages();  | 
|             if (errorMessages == null || !errorMessages.Any()) {  | 
|                 base.OnApply(e);  | 
|                 return;  | 
|             }  | 
|             e.ApplyBehavior = ApplyKind.Cancel;  | 
|             VersionsTable.Focus();  | 
|             string errorMessage = string.Format("Invalid Qt versions:\r\n{0}",  | 
|                     string.Join("\r\n", errorMessages.Select(errMsg => " * " + errMsg)));  | 
|             VsShellUtilities.ShowMessageBox(QtVsToolsPackage.Instance,  | 
|                 errorMessage, "Qt VS Tools", OLEMSGICON.OLEMSGICON_WARNING,  | 
|                 OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);  | 
|         }  | 
|     }  | 
| }  |