diff --git a/VSRAD.Package/Commands/ProfileDropdownCommand.cs b/VSRAD.Package/Commands/ProfileDropdownCommand.cs index 448bafe68..b0f7dee5b 100644 --- a/VSRAD.Package/Commands/ProfileDropdownCommand.cs +++ b/VSRAD.Package/Commands/ProfileDropdownCommand.cs @@ -11,6 +11,7 @@ using VSRAD.Package.Options; using VSRAD.Package.ProjectSystem; using VSRAD.Package.ProjectSystem.Profiles; +using VSRAD.Package.Utils; namespace VSRAD.Package.Commands { @@ -65,22 +66,21 @@ public void Execute(uint commandId, uint commandExecOpt, IntPtr variantIn, IntPt private void ListTargetMachines(IntPtr variantOut) { - var displayItems = _project.Options.TargetHosts.Prepend("Local").Append("Edit...").ToArray(); + var displayItems = _project.Options.TargetHosts.Select(h => h.Name).Prepend("Local").Append("Edit...").ToArray(); Marshal.GetNativeVariantForObject(displayItems, variantOut); } private void GetCurrentTargetMachine(IntPtr variantOut) { string currentHost; - if (_project.Options.Profile.General.RunActionsLocally) + if (_project.Options.Profile.General.RunActionsLocally + || _project.Options.TargetHosts.Count == 0) { currentHost = "Local"; } else { - currentHost = _project.Options.Connection.ToString(); - // Display current host at the top of the list - _project.Options.TargetHosts.Add(currentHost); + currentHost = _project.Options.TargetHosts[0].Name; } Marshal.GetNativeVariantForObject(currentHost, variantOut); } @@ -95,13 +95,20 @@ private void SetNewTargetMachine(string selected) } else { - if (!TargetHostsEditor.TryParseHost(selected, out var formattedHost, out var hostname, out var port)) - return; + var item = HostItem.TryParseHost(selected); + var tmpItem = default(HostItem); - _project.Options.TargetHosts.Add(formattedHost); + if (item == default(HostItem)) // check maybe user entered existing alias + tmpItem = _project.Options.TargetHosts.FirstOrDefault(h => h.Alias == selected); + else // maybe there is existing host but with alias + tmpItem = _project.Options.TargetHosts + .FirstOrDefault(h => h.Host == item.Host && h.Port == item.Port); + + if (tmpItem != default(HostItem)) item = tmpItem; + else if (item == default(HostItem)) return; + + _project.Options.TargetHosts.Add(item); - _project.Options.RemoteMachine = hostname; - _project.Options.Port = port; updatedProfile.General.RunActionsLocally = false; } diff --git a/VSRAD.Package/Options/DefaultOptionValues.cs b/VSRAD.Package/Options/DefaultOptionValues.cs index 54963eec3..567427c94 100644 --- a/VSRAD.Package/Options/DefaultOptionValues.cs +++ b/VSRAD.Package/Options/DefaultOptionValues.cs @@ -7,7 +7,7 @@ internal static class DefaultOptionValues { #region General public const string DeployDirectory = ""; - public const string RemoteMachineAdredd = "127.0.0.1"; + public const string RemoteMachineAdress = "127.0.0.1"; public const int Port = 9339; public const string AdditionalSources = ""; public const bool CopySources = true; diff --git a/VSRAD.Package/Options/ProfileOptions.cs b/VSRAD.Package/Options/ProfileOptions.cs index e541d6328..7e81cd51e 100644 --- a/VSRAD.Package/Options/ProfileOptions.cs +++ b/VSRAD.Package/Options/ProfileOptions.cs @@ -127,26 +127,6 @@ public async Task> EvaluateAsync(IMacroEvaluator e } } - public readonly struct ServerConnectionOptions : IEquatable - { - public string RemoteMachine { get; } - public int Port { get; } - - public ServerConnectionOptions(string remoteMachine = "127.0.0.1", int port = 9339) - { - RemoteMachine = remoteMachine; - Port = port; - } - - public override string ToString() => $"{RemoteMachine}:{Port}"; - - public bool Equals(ServerConnectionOptions s) => RemoteMachine == s.RemoteMachine && Port == s.Port; - public override bool Equals(object o) => o is ServerConnectionOptions s && Equals(s); - public override int GetHashCode() => (RemoteMachine, Port).GetHashCode(); - public static bool operator ==(ServerConnectionOptions left, ServerConnectionOptions right) => left.Equals(right); - public static bool operator !=(ServerConnectionOptions left, ServerConnectionOptions right) => !(left == right); - } - public readonly struct ActionEnvironment : IEquatable { public string LocalWorkDir { get; } diff --git a/VSRAD.Package/Options/ProjectOptions.cs b/VSRAD.Package/Options/ProjectOptions.cs index 089ee734f..7035fcb43 100644 --- a/VSRAD.Package/Options/ProjectOptions.cs +++ b/VSRAD.Package/Options/ProjectOptions.cs @@ -8,6 +8,7 @@ using System.Windows.Forms; using VSRAD.Package.ProjectSystem.Profiles; using VSRAD.Package.Utils; +using static VSRAD.Package.Utils.HostItem; namespace VSRAD.Package.Options { @@ -28,9 +29,9 @@ public sealed class ProjectOptions : DefaultNotifyPropertyChanged public DebugVisualizer.ColumnStylingOptions VisualizerColumnStyling { get; } = new DebugVisualizer.ColumnStylingOptions(); - [JsonConverter(typeof(MruCollection.Converter))] - public MruCollection TargetHosts { get; } = - new MruCollection(); + [JsonConverter(typeof(HostItemMruCollectionConverter))] + public MruCollection TargetHosts { get; } = + new MruCollection(); public ProjectOptions() { } @@ -47,14 +48,12 @@ public ProjectOptions(DebuggerOptions debugger, VisualizerOptions visualizer, Sl private string _activeProfile = "Default"; public string ActiveProfile { get => _activeProfile; set { if (value != null) SetField(ref _activeProfile, value, raiseIfEqual: true); } } - private string _remoteMachine = "127.0.0.1"; - public string RemoteMachine { get => _remoteMachine; set => SetField(ref _remoteMachine, value); } - - private int _port = 9339; - public int Port { get => _port; set => SetField(ref _port, value); } - + // we can safely assume that TargetHosts[0] is the host we want, because + // TargetHosts order are updated according to MRU collection (see VSRAD.Package.Utils.MruCollection.cs) [JsonIgnore] - public ServerConnectionOptions Connection => new ServerConnectionOptions(RemoteMachine, Port); + public ServerConnectionOptions Connection => TargetHosts.Count != 0 + ? TargetHosts[0].ConnectionOptions + : default(ServerConnectionOptions); [JsonIgnore] public bool HasProfiles => Profiles.Count > 0; diff --git a/VSRAD.Package/ProjectSystem/Profiles/ProfileTransferManager.cs b/VSRAD.Package/ProjectSystem/Profiles/ProfileTransferManager.cs index 4f7ecfa98..85f16c490 100644 --- a/VSRAD.Package/ProjectSystem/Profiles/ProfileTransferManager.cs +++ b/VSRAD.Package/ProjectSystem/Profiles/ProfileTransferManager.cs @@ -41,7 +41,7 @@ public static ProjectOptions ImportObsoleteOptions(string path) if (json["TargetHosts"] != null) foreach (var host in json["TargetHosts"].ToObject>()) - options.TargetHosts.Add(host); + options.TargetHosts.Add(Utils.HostItem.TryParseHost(host)); options.ActiveProfile = activeProfile; diff --git a/VSRAD.Package/ProjectSystem/Profiles/TargetHostsEditor.xaml b/VSRAD.Package/ProjectSystem/Profiles/TargetHostsEditor.xaml index 461d146d5..d5a6ed408 100644 --- a/VSRAD.Package/ProjectSystem/Profiles/TargetHostsEditor.xaml +++ b/VSRAD.Package/ProjectSystem/Profiles/TargetHostsEditor.xaml @@ -18,7 +18,7 @@