using Shadowsocks.Controller;
using Shadowsocks.Model;
using Shadowsocks.Properties;
using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using static Shadowsocks.Controller.HotkeyReg;
namespace Shadowsocks.View
{
public partial class HotkeySettingsForm : Form
{
private readonly ShadowsocksController _controller;
// this is a copy of hotkey configuration that we are working on
private HotkeyConfig _modifiedHotkeyConfig;
public HotkeySettingsForm(ShadowsocksController controller)
{
InitializeComponent();
UpdateTexts();
Icon = Icon.FromHandle(Resources.ssw128.GetHicon());
_controller = controller;
_controller.ConfigChanged += controller_ConfigChanged;
LoadCurrentConfiguration();
}
private void UpdateTexts()
{
I18N.TranslateForm(this);
}
private void controller_ConfigChanged(object sender, EventArgs e)
{
LoadCurrentConfiguration();
}
private void LoadCurrentConfiguration()
{
_modifiedHotkeyConfig = _controller.GetConfigurationCopy().hotkey;
SetConfigToUI(_modifiedHotkeyConfig);
}
private void SetConfigToUI(HotkeyConfig config)
{
SwitchSystemProxyTextBox.Text = config.SwitchSystemProxy;
SwitchProxyModeTextBox.Text = config.SwitchSystemProxyMode;
SwitchAllowLanTextBox.Text = config.SwitchAllowLan;
ShowLogsTextBox.Text = config.ShowLogs;
ServerMoveUpTextBox.Text = config.ServerMoveUp;
ServerMoveDownTextBox.Text = config.ServerMoveDown;
RegHotkeysAtStartupCheckBox.Checked = config.RegHotkeysAtStartup;
}
private void SaveConfig()
{
_controller.SaveHotkeyConfig(_modifiedHotkeyConfig);
}
private HotkeyConfig GetConfigFromUI()
{
return new HotkeyConfig
{
SwitchSystemProxy = SwitchSystemProxyTextBox.Text,
SwitchSystemProxyMode = SwitchProxyModeTextBox.Text,
SwitchAllowLan = SwitchAllowLanTextBox.Text,
ShowLogs = ShowLogsTextBox.Text,
ServerMoveUp = ServerMoveUpTextBox.Text,
ServerMoveDown = ServerMoveDownTextBox.Text,
RegHotkeysAtStartup = RegHotkeysAtStartupCheckBox.Checked
};
}
///
/// Capture hotkey - Press key
///
private void HotkeyDown(object sender, KeyEventArgs e)
{
StringBuilder sb = new StringBuilder();
//Combination key only
if (e.Modifiers != 0)
{
// XXX: Hotkey parsing depends on the sequence, more specifically, ModifierKeysConverter.
// Windows key is reserved by operating system, we deny this key.
if (e.Control)
{
sb.Append("Ctrl+");
}
if (e.Alt)
{
sb.Append("Alt+");
}
if (e.Shift)
{
sb.Append("Shift+");
}
Keys keyvalue = (Keys)e.KeyValue;
if ((keyvalue >= Keys.PageUp && keyvalue <= Keys.Down) ||
(keyvalue >= Keys.A && keyvalue <= Keys.Z) ||
(keyvalue >= Keys.F1 && keyvalue <= Keys.F12))
{
sb.Append(e.KeyCode);
}
else if (keyvalue >= Keys.D0 && keyvalue <= Keys.D9)
{
sb.Append('D').Append((char)e.KeyValue);
}
else if (keyvalue >= Keys.NumPad0 && keyvalue <= Keys.NumPad9)
{
sb.Append("NumPad").Append((char)(e.KeyValue - 48));
}
}
((TextBox)sender).Text = sb.ToString();
}
///
/// Capture hotkey - Release key
///
private void HotkeyUp(object sender, KeyEventArgs e)
{
var tb = (TextBox)sender;
var content = tb.Text.TrimEnd();
if (content.Length >= 1 && content[content.Length - 1] == '+')
{
tb.Text = "";
}
}
private void CancelButton_Click(object sender, EventArgs e)
{
this.Close();
}
private void OKButton_Click(object sender, EventArgs e)
{
_modifiedHotkeyConfig = GetConfigFromUI();
// try to register, notify to change settings if failed
if (!RegisterAllHotkeys(_modifiedHotkeyConfig))
{
MessageBox.Show(I18N.GetString("Register hotkey failed"));
}
// All check passed, saving
SaveConfig();
this.Close();
}
private void RegisterAllButton_Click(object sender, EventArgs e)
{
_modifiedHotkeyConfig = GetConfigFromUI();
RegisterAllHotkeys(_modifiedHotkeyConfig);
}
private bool RegisterAllHotkeys(HotkeyConfig hotkeyConfig)
{
return
RegHotkeyFromString(hotkeyConfig.SwitchSystemProxy, "SwitchSystemProxyCallback", result => HandleRegResult(hotkeyConfig.SwitchSystemProxy, SwitchSystemProxyLabel, result))
&& RegHotkeyFromString(hotkeyConfig.SwitchSystemProxyMode, "SwitchSystemProxyModeCallback", result => HandleRegResult(hotkeyConfig.SwitchSystemProxyMode, SwitchProxyModeLabel, result))
&& RegHotkeyFromString(hotkeyConfig.SwitchAllowLan, "SwitchAllowLanCallback", result => HandleRegResult(hotkeyConfig.SwitchAllowLan, SwitchAllowLanLabel, result))
&& RegHotkeyFromString(hotkeyConfig.ShowLogs, "ShowLogsCallback", result => HandleRegResult(hotkeyConfig.ShowLogs, ShowLogsLabel, result))
&& RegHotkeyFromString(hotkeyConfig.ServerMoveUp, "ServerMoveUpCallback", result => HandleRegResult(hotkeyConfig.ServerMoveUp, ServerMoveUpLabel, result))
&& RegHotkeyFromString(hotkeyConfig.ServerMoveDown, "ServerMoveDownCallback", result => HandleRegResult(hotkeyConfig.ServerMoveDown, ServerMoveDownLabel, result));
}
private void HandleRegResult(string hotkeyStr, Label label, RegResult result)
{
switch (result)
{
case RegResult.ParseError:
MessageBox.Show(I18N.GetString("Cannot parse hotkey: {0}", hotkeyStr));
break;
case RegResult.UnregSuccess:
label.ResetBackColor();
break;
case RegResult.RegSuccess:
label.BackColor = Color.Green;
break;
case RegResult.RegFailure:
label.BackColor = Color.Red;
break;
default:
break;
}
}
}
}