WingMan

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 6  →  ?path2? @ 7
/trunk/WingMan/WingManForm.cs
@@ -3,10 +3,12 @@
using System.Drawing;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Gma.System.MouseKeyHook;
using WingMan.Communication;
using WingMan.Lobby;
using WingMan.MouseKey;
using WingMan.Properties;
 
@@ -19,93 +21,130 @@
InitializeComponent();
 
FormTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
FormCancellationTokenSource = new CancellationTokenSource();
 
MQTTCommunication = new MQTTCommunication(FormTaskScheduler);
MQTTCommunication = new MQTTCommunication(FormTaskScheduler, FormCancellationTokenSource.Token);
 
MouseKeyBindings = new MouseKeyBindings(new List<MouseKeyBinding>());
 
HelmBindingSource = new BindingSource
HelmListBoxBindingSource = new BindingSource
{
DataSource = MouseKeyBindings.Bindings
};
HelmBindingsListBox.DisplayMember = "DisplayName";
HelmBindingsListBox.ValueMember = "Keys";
HelmBindingsListBox.DataSource = HelmBindingSource;
HelmBindingsListBox.DataSource = HelmListBoxBindingSource;
 
MouseKeyBindingsExchange = new MouseKeyBindingsExchange();
WingBindingSource = new BindingSource
MouseKeyBindingsExchange = new MouseKeyBindingsExchange
{
ExchangeBindings = new List<MouseKeyBindingExchange>()
};
 
WingBindingsComboBoxSource = new BindingSource
{
DataSource = MouseKeyBindingsExchange.ExchangeBindings
};
WingBindingsComboBox.DisplayMember = "Nick";
WingBindingsComboBox.ValueMember = "Names";
WingBindingsComboBox.DataSource = WingBindingSource;
WingBindingsComboBox.ValueMember = "MouseKeyBindings";
WingBindingsComboBox.DataSource = WingBindingsComboBoxSource;
 
// Start lobby message synchronizer.
LobbyMessageSynchronizer = new LobbyMessageSynchronizer(MQTTCommunication);
LobbyMessageSynchronizer = new LobbyMessageSynchronizer(MQTTCommunication, FormTaskScheduler,
FormCancellationTokenSource.Token);
LobbyMessageSynchronizer.OnLobbyMessageReceived += OnLobbyMessageReceived;
 
// Start mouse key bindings synchronizer.
MouseKeyBindingsSynchronizer = new MouseKeyBindingsSynchronizer(MouseKeyBindings, MQTTCommunication);
MouseKeyBindingsSynchronizer = new MouseKeyBindingsSynchronizer(MouseKeyBindings, MQTTCommunication,
FormTaskScheduler, FormCancellationTokenSource.Token);
MouseKeyBindingsSynchronizer.OnMouseKeyBindingsSynchronized += OnMouseKeyBindingsSynchronized;
}
 
private void OnMouseKeyBindingsSynchronized(object sender, MouseKeyBindingsSynchronizedEventArgs e)
{
foreach (var binding in e.ExchangeBindings)
{
ActivityTextBox.AppendText(
$"{Strings.Synchronized_bindings_with_client} : {binding.Nick} : {binding.Names.Count}{Environment.NewLine}");
private static CancellationTokenSource FormCancellationTokenSource { get; set; }
 
private static TaskScheduler FormTaskScheduler { get; set; }
 
var exchangeBindings = MouseKeyBindingsExchange.ExchangeBindings.FirstOrDefault(exchangeBinding =>
string.Equals(exchangeBinding.Nick, binding.Nick, StringComparison.Ordinal));
private static IKeyboardMouseEvents MouseKeyApplicationHook { get; set; }
 
// If the nick has not been registered add it.
if (exchangeBindings == null)
{
MouseKeyBindingsExchange.ExchangeBindings.Add(binding);
continue;
}
private List<string> MouseKeyCombo { get; set; }
 
// If the nick has been added, then update the binding names.
exchangeBindings.Names = binding.Names;
private MouseKeyBindings MouseKeyBindings { get; }
 
// Update wing list box.
var selectedExchangeBinding = (MouseKeyBindingExchange) WingBindingsComboBox.SelectedItem;
if (selectedExchangeBinding == null || !string.Equals(selectedExchangeBinding.Nick, binding.Nick))
continue;
private BindingSource HelmListBoxBindingSource { get; }
 
WingBindingsListBox.Items.Clear();
WingBindingsListBox.DisplayMember = "Name";
WingBindingsListBox.ValueMember = "Name";
WingBindingsListBox.Items.AddRange(exchangeBindings.Names.Select(name => (object) name).ToArray());
private BindingSource WingBindingsComboBoxSource { get; }
 
private MouseKeyBindingsExchange MouseKeyBindingsExchange { get; }
 
public MQTTCommunication MQTTCommunication { get; set; }
 
public LobbyMessageSynchronizer LobbyMessageSynchronizer { get; set; }
 
public MouseKeyBindingsSynchronizer MouseKeyBindingsSynchronizer { get; set; }
 
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && components != null)
{
FormCancellationTokenSource.Dispose();
FormCancellationTokenSource = null;
 
components.Dispose();
}
 
WingBindingSource.ResetBindings(false);
base.Dispose(disposing);
}
 
private static TaskScheduler FormTaskScheduler { get; set; }
private void OnMouseKeyBindingsSynchronized(object sender, MouseKeyBindingsSynchronizedEventArgs e)
{
ActivityTextBox.AppendText(
$"{Strings.Synchronized_bindings_with_client} : {e.Bindings.Nick} : {e.Bindings.MouseKeyBindings.Count}{Environment.NewLine}");
 
private static IKeyboardMouseEvents MouseKeyApplicationHook { get; set; }
var exchangeBindings = MouseKeyBindingsExchange.ExchangeBindings.FirstOrDefault(exchangeBinding =>
string.Equals(exchangeBinding.Nick, e.Bindings.Nick, StringComparison.Ordinal));
 
private List<string> MouseKeyCombo { get; set; }
// If the nick does not exist then add it.
if (exchangeBindings == null)
{
MouseKeyBindingsExchange.ExchangeBindings.Add(e.Bindings);
WingBindingsComboBoxSource.ResetBindings(false);
UpdateWingListBoxItems();
return;
}
 
private MouseKeyBindings MouseKeyBindings { get; }
// If the bindings for the nick have not changed then do not update.
if (exchangeBindings.MouseKeyBindings.SequenceEqual(e.Bindings.MouseKeyBindings))
{
WingBindingsComboBoxSource.ResetBindings(false);
UpdateWingListBoxItems();
return;
}
 
private BindingSource HelmBindingSource { get; }
// Update the bindings.
exchangeBindings.MouseKeyBindings = e.Bindings.MouseKeyBindings;
WingBindingsComboBoxSource.ResetBindings(false);
UpdateWingListBoxItems();
}
 
private BindingSource WingBindingSource { get; set; }
private void UpdateWingListBoxItems()
{
var exchangeBinding = (List<MouseKeyBinding>) WingBindingsComboBox.SelectedValue;
if (exchangeBinding == null)
return;
 
private MouseKeyBindingsExchange MouseKeyBindingsExchange { get; set; }
WingBindingsListBox.Items.Clear();
WingBindingsListBox.DisplayMember = "Name";
WingBindingsListBox.ValueMember = "Name";
var i = exchangeBinding.Select(binding => (object) binding.Name).ToArray();
if (i.Length == 0)
return;
 
public MQTTCommunication MQTTCommunication { get; set; }
WingBindingsListBox.Items.AddRange(i);
}
 
public LobbyMessageSynchronizer LobbyMessageSynchronizer { get; set; }
 
public MouseKeyBindingsSynchronizer MouseKeyBindingsSynchronizer { get; set; }
 
private void OnLobbyMessageReceived(object sender, LobbyMessageReceivedEventArgs e)
{
LobbyTextBox.Invoke((MethodInvoker) delegate
@@ -265,7 +304,7 @@
{
MouseKeyBindings.Bindings.Add(new MouseKeyBinding(HelmNameTextBox.Text, MouseKeyCombo));
 
HelmBindingSource.ResetBindings(false);
HelmListBoxBindingSource.ResetBindings(false);
 
MouseKeyApplicationHook.KeyDown -= MouseKeyHookOnKeyDown;
MouseKeyApplicationHook.KeyUp -= MouseKeyHookOnKeyUp;
@@ -282,7 +321,7 @@
{
MouseKeyBindings.Bindings.Add(new MouseKeyBinding(HelmNameTextBox.Text, MouseKeyCombo));
 
HelmBindingSource.ResetBindings(false);
HelmListBoxBindingSource.ResetBindings(false);
 
MouseKeyApplicationHook.KeyDown -= MouseKeyHookOnKeyDown;
MouseKeyApplicationHook.KeyUp -= MouseKeyHookOnKeyUp;
@@ -320,7 +359,7 @@
return;
 
MouseKeyBindings.Bindings.Remove(helmBinding);
HelmBindingSource.ResetBindings(false);
HelmListBoxBindingSource.ResetBindings(false);
}
 
private async void LobbySayButtonClick(object sender, EventArgs e)
@@ -332,14 +371,7 @@
 
private void WingBindingsComboBoxSelectionChangeCompleted(object sender, EventArgs e)
{
var exchangeBinding = (MouseKeyBindingExchange)WingBindingsComboBox.SelectedItem;
if (exchangeBinding == null)
return;
 
WingBindingsListBox.Items.Clear();
WingBindingsListBox.DisplayMember = "Name";
WingBindingsListBox.ValueMember = "Name";
WingBindingsListBox.Items.AddRange(exchangeBinding.Names.Select(name => (object)name).ToArray());
UpdateWingListBoxItems();
}
}
}