JD2022-TU1/main/tools/modules/JD.Remoting.WPF.Module/Actions/ConnectAction.cs

79 lines
3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using JD.Interfaces.Remoting;
using JD.Remoting.Services;
using JD.Remoting.WPF.Module.Settings;
using Plume.Icons;
using Plume.Interfaces.WPF;
using Plume.Interfaces.WPF.Actions;
using Plume.Interfaces.WPF.Notifications;
namespace JD.Remoting.WPF.Actions
{
public class ConnectAction : Plume.Interfaces.WPF.Actions.Action<EngineConnection>
{
public ConnectAction(EngineConnection connection)
:base($"{connection}", $"Connect the application to {connection}", StandardIcon.Wifi)
{
CommandParameter = connection;
}
/// <inheritdoc />
public override void Execute(IActionContext context, EngineConnection connection)
{
var app = Application.Current as IWpfApplication;
INotificationManager notificationService = app.NotificationManager;
IPluginService pluginService = app.ServiceManager.GetPluginService();
pluginService?.Start(new EndPointId(connection.Ip, connection.Port));
Task.Delay(500).ContinueWith(task =>
{
foreach (IPlugin plugin in pluginService)
{
if (!plugin.IsConnected)
{
notificationService.ShowError($"Unable to connect the plugin ({plugin.Name}) to the engine; target: {pluginService.EndPointId}");
}
}
});
}
/// <inheritdoc />
public override bool CanExecute(IActionContext context, EngineConnection parameter)
{
return true;
}
public static MenuItem GetMenu()
{
var app = Application.Current as IWpfApplication;
var connectToMenuItem = new MenuItem { Header = "Connect", Icon = new Icon(StandardIcon.Wifi).ToImage(16, 16) };
var remotingSettings = app.SettingsManager.Get<RemotingSettings>();
if (remotingSettings == null)
return null;
remotingSettings.PropertyChanged += (sender, args) => { UpdateConnectionsMenus(connectToMenuItem, remotingSettings); };
remotingSettings.Connections.CollectionChanged += (sender, args) => { UpdateConnectionsMenus(connectToMenuItem, remotingSettings); };
UpdateConnectionsMenus(connectToMenuItem, remotingSettings);
return connectToMenuItem;
}
private static void UpdateConnectionsMenus(MenuItem parentMenu, RemotingSettings settings)
{
parentMenu.Items.Clear();
var connections = settings.Connections.ToList();
connections.Insert(0, EngineConnection.Default);
foreach (var connection in connections)
{
var action = new ConnectAction(connection);
parentMenu.Items.Add(action.ToMenuItem());
}
}
}
}