/**************************************************************************** ** ** Copyright (C) 2022 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.IO; using System.Linq; using System.Windows; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; namespace QtVsTools.Options { using Common; using Core; using static QtVsTools.Options.QtVersionsTable; public class QtVersionsPage : UIElementDialogPage { static LazyFactory Lazy { get; } = new LazyFactory(); QtVersionManager VersionManager => QtVersionManager.The(); QtVersionsTable VersionsTable => Lazy.Get(() => VersionsTable, () => new QtVersionsTable()); protected override UIElement Child => VersionsTable; public override void LoadSettingsFromStorage() { var versions = new List(); foreach (var versionName in VersionManager.GetVersions()) { var versionPath = VersionManager.GetInstallPath(versionName); if (string.IsNullOrEmpty(versionPath)) continue; 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 Row() { IsDefault = (versionName == defaultVersion), VersionName = versionName, InitialVersionName = versionName, Path = versionPath, Host = host, Compiler = compiler, State = State.Unknown }); } VersionsTable.UpdateVersions(versions); } public override void SaveSettingsToStorage() { void RemoveVersion(string versionName) { try { VersionManager.RemoveVersion(versionName); } catch (Exception exception) { exception.Log(); } } var versions = VersionsTable.Versions; foreach (var version in versions) { if (version.State.HasFlag(State.Removed)) RemoveVersion(version.VersionName); if (!version.State.HasFlag(State.Modified)) continue; try { if (version.Host == BuildHost.Windows) { if (version.State.HasFlag((State)Column.Path)) { var versionPath = version.Path; var ignoreCase = StringComparison.CurrentCultureIgnoreCase; if (Path.GetFileName(versionPath).Equals("qmake.exe", ignoreCase)) versionPath = Path.GetDirectoryName(versionPath); if (Path.GetFileName(versionPath).Equals("bin", ignoreCase)) versionPath = Path.GetDirectoryName(versionPath); var versionInfo = VersionInformation.Get(versionPath); var generator = versionInfo.GetQMakeConfEntry("MAKEFILE_GENERATOR"); if (generator != "MSVC.NET" && generator != "MSBUILD") throw new Exception(string.Format( "This Qt version uses an unsupported makefile generator (used: " + "{0}, supported: MSVC.NET, MSBUILD)", generator)); VersionManager.SaveVersion(version.VersionName, versionPath); } } 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); } if (version.State.HasFlag((State)Column.VersionName)) { try { VersionManager.SaveVersion(version.VersionName, version.Path); if (!string.IsNullOrEmpty(version.InitialVersionName)) VersionManager.RemoveVersion(version.InitialVersionName); } catch (Exception exception) { exception.Log(); } } } catch (Exception exception) { exception.Log(); version.State = State.Removed; RemoveVersion(version.VersionName); } } try { var defaultVersion = versions.FirstOrDefault(v => v.IsDefault && v.State != State.Removed) ?? versions.FirstOrDefault(v => v.State != State.Removed); VersionManager.SaveDefaultVersion(defaultVersion?.VersionName ?? ""); } catch (Exception exception) { exception.Log(); } if (Notifications.NoQtVersion.IsOpen && VersionManager.GetVersions()?.Any() == true) Notifications.NoQtVersion.Close(); } 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); } } }