Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 17 additions & 10 deletions VSRAD.Package/Commands/ProfileDropdownCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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);
}
Expand All @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion VSRAD.Package/Options/DefaultOptionValues.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
20 changes: 0 additions & 20 deletions VSRAD.Package/Options/ProfileOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,26 +127,6 @@ public async Task<Result<GeneralProfileOptions>> EvaluateAsync(IMacroEvaluator e
}
}

public readonly struct ServerConnectionOptions : IEquatable<ServerConnectionOptions>
{
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<ActionEnvironment>
{
public string LocalWorkDir { get; }
Expand Down
19 changes: 9 additions & 10 deletions VSRAD.Package/Options/ProjectOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -28,9 +29,9 @@ public sealed class ProjectOptions : DefaultNotifyPropertyChanged
public DebugVisualizer.ColumnStylingOptions VisualizerColumnStyling { get; } =
new DebugVisualizer.ColumnStylingOptions();

[JsonConverter(typeof(MruCollection<string>.Converter))]
public MruCollection<string> TargetHosts { get; } =
new MruCollection<string>();
[JsonConverter(typeof(HostItemMruCollectionConverter))]
public MruCollection<HostItem> TargetHosts { get; } =
new MruCollection<HostItem>();

public ProjectOptions() { }

Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public static ProjectOptions ImportObsoleteOptions(string path)

if (json["TargetHosts"] != null)
foreach (var host in json["TargetHosts"].ToObject<List<string>>())
options.TargetHosts.Add(host);
options.TargetHosts.Add(Utils.HostItem.TryParseHost(host));

options.ActiveProfile = activeProfile;

Expand Down
32 changes: 31 additions & 1 deletion VSRAD.Package/ProjectSystem/Profiles/TargetHostsEditor.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<Button Content="Cancel" IsCancel="True" Click="HandleCancel" Width="61" Height="22" Margin="4,0,0,0" />
</StackPanel>
<DataGrid x:Name="HostGrid" ItemsSource="{Binding Hosts, ElementName=Root}" Margin="4" GridLinesVisibility="None" Focusable="True"
RowEditEnding="ValidateHostAfterEdit" PreviewKeyDown="HandleDeleteKey"
PreviewKeyDown="HandleDeleteKey"
AutoGenerateColumns="False" CanUserAddRows="False" CanUserReorderColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" CanUserDeleteRows="False"
HeadersVisibility="Column" HorizontalScrollBarVisibility="Disabled" RowHeight="24">
<DataGrid.Columns>
Expand All @@ -37,6 +37,36 @@
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Port" Binding="{Binding Port, UpdateSourceTrigger=PropertyChanged}" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Padding" Value="6,0" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}">
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Padding" Value="3,0" />
<Setter Property="Height" Value="22" />
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Alias" Binding="{Binding Alias, UpdateSourceTrigger=PropertyChanged}" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Padding" Value="6,0" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}">
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Padding" Value="3,0" />
<Setter Property="Height" Value="22" />
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn Width="36" MinWidth="36" MaxWidth="36">
<DataGridTemplateColumn.Header>
<Button Grid.Column="1" Content="➕" ToolTip="Add host" Width="22" Height="22" HorizontalAlignment="Center" Click="AddHost" />
Expand Down
64 changes: 8 additions & 56 deletions VSRAD.Package/ProjectSystem/Profiles/TargetHostsEditor.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,38 +12,6 @@ namespace VSRAD.Package.ProjectSystem.Profiles
{
public sealed partial class TargetHostsEditor : DialogWindow
{
public sealed class HostItem : DefaultNotifyPropertyChanged
{
private string _host = "";
public string Host { get => _host; set => SetField(ref _host, value); }

public bool UsedInActiveProfile { get; }

public HostItem(string host, bool usedInActiveProfile)
{
Host = host;
UsedInActiveProfile = usedInActiveProfile;
}
}

public static bool TryParseHost(string input, out string formatted, out string hostname, out ushort port)
{
formatted = "";
hostname = "";
port = 0;

var hostnamePort = input.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
if (hostnamePort.Length == 0)
return false;

hostname = hostnamePort[0];
if (hostnamePort.Length < 2 || !ushort.TryParse(hostnamePort[1], out port))
port = 9339;

formatted = $"{hostname}:{port}";
return true;
}

public ObservableCollection<HostItem> Hosts { get; }
public ICommand DeleteHostCommand { get; }

Expand All @@ -53,16 +21,15 @@ public static bool TryParseHost(string input, out string formatted, out string h
public TargetHostsEditor(IProject project)
{
_project = project;
Hosts = new ObservableCollection<HostItem>(project.Options.TargetHosts.Select(h =>
new HostItem(h, usedInActiveProfile: !project.Options.Profile.General.RunActionsLocally && project.Options.Connection.ToString() == h)));
Hosts = new ObservableCollection<HostItem>(project.Options.TargetHosts);
DeleteHostCommand = new WpfDelegateCommand(DeleteHost);

InitializeComponent();
}

private void AddHost(object sender, RoutedEventArgs e)
{
var item = new HostItem("", usedInActiveProfile: false);
var item = new HostItem("", Options.DefaultOptionValues.Port);
Hosts.Add(item);

// Finish editing the current host before moving the focus away from it
Expand All @@ -85,35 +52,20 @@ private void DeleteHost(object param)

private void SaveChanges()
{
var oldHost = _project.Options.TargetHosts.Count != 0
? _project.Options.TargetHosts[0]
: null;
_project.Options.TargetHosts.Clear();
_project.Options.TargetHosts.AddRange(Hosts.Select(h => h.Host).Distinct());
_project.Options.TargetHosts.AddRange(Hosts.Distinct());

var updatedProfile = (Options.ProfileOptions)_project.Options.Profile.Clone();
if (Hosts.FirstOrDefault(h => h.UsedInActiveProfile) is HostItem hi && TryParseHost(hi.Host, out _, out var hostname, out var port))
{
_project.Options.RemoteMachine = hostname;
_project.Options.Port = port;
}
else
{
if (oldHost == null || !Hosts.Contains(oldHost))
updatedProfile.General.RunActionsLocally = true;
}
_project.Options.UpdateActiveProfile(updatedProfile);

_project.SaveOptions();
}

private void ValidateHostAfterEdit(object sender, DataGridRowEditEndingEventArgs e)
{
var item = (HostItem)e.Row.DataContext;
if (TryParseHost(item.Host, out var formattedHost, out _, out _))
item.Host = formattedHost;
else
#pragma warning disable VSTHRD001 // Using BeginInvoke to delete item after all post-edit events fire
Dispatcher.BeginInvoke((Action)(() => Hosts.Remove(item)), System.Windows.Threading.DispatcherPriority.Background);
#pragma warning restore VSTHRD001
}

private void HandleDeleteKey(object sender, KeyEventArgs e)
{
IEditableCollectionView itemsView = HostGrid.Items;
Expand Down Expand Up @@ -162,7 +114,7 @@ private bool HasChanges()

for (int i = 0; i < Hosts.Count; ++i)
{
if (Hosts[i].Host != _project.Options.TargetHosts[i])
if (Hosts[i] != _project.Options.TargetHosts[i])
return true;
}

Expand Down
2 changes: 1 addition & 1 deletion VSRAD.Package/Server/CommunicationChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
using VSRAD.DebugServer;
using VSRAD.DebugServer.IPC.Commands;
using VSRAD.DebugServer.IPC.Responses;
using VSRAD.Package.Options;
using VSRAD.Package.ProjectSystem;
using VSRAD.Package.Utils;
using Task = System.Threading.Tasks.Task;

namespace VSRAD.Package.Server
Expand Down
Loading