diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index 7b0d6df0..840356c6 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -39,8 +39,8 @@ namespace Shadowsocks Application.SetCompatibleTextRenderingDefault(false); ShadowsocksController controller = new ShadowsocksController(); - // TODO run without a main form to save RAM - Application.Run(new ConfigForm(controller)); + MenuViewController viewController = new MenuViewController(controller); + Application.Run(); } } } diff --git a/shadowsocks-csharp/View/ConfigForm.Designer.cs b/shadowsocks-csharp/View/ConfigForm.Designer.cs index 1d5f7236..a9d9a3da 100755 --- a/shadowsocks-csharp/View/ConfigForm.Designer.cs +++ b/shadowsocks-csharp/View/ConfigForm.Designer.cs @@ -28,7 +28,6 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.RemarksTextBox = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); @@ -42,31 +41,15 @@ this.PasswordTextBox = new System.Windows.Forms.TextBox(); this.label5 = new System.Windows.Forms.Label(); this.EncryptionSelect = new System.Windows.Forms.ComboBox(); - this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.panel2 = new System.Windows.Forms.Panel(); this.OKButton = new System.Windows.Forms.Button(); this.MyCancelButton = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); - this.contextMenu1 = new System.Windows.Forms.ContextMenu(); - this.enableItem = new System.Windows.Forms.MenuItem(); - this.AutoStartupItem = new System.Windows.Forms.MenuItem(); - this.ShareOverLANItem = new System.Windows.Forms.MenuItem(); - this.ServersItem = new System.Windows.Forms.MenuItem(); - this.SeperatorItem = new System.Windows.Forms.MenuItem(); - this.ConfigItem = new System.Windows.Forms.MenuItem(); - this.menuItem4 = new System.Windows.Forms.MenuItem(); - this.editPACFileItem = new System.Windows.Forms.MenuItem(); - this.QRCodeItem = new System.Windows.Forms.MenuItem(); - this.ShowLogItem = new System.Windows.Forms.MenuItem(); - this.aboutItem = new System.Windows.Forms.MenuItem(); - this.menuItem3 = new System.Windows.Forms.MenuItem(); - this.quitItem = new System.Windows.Forms.MenuItem(); this.panel3 = new System.Windows.Forms.Panel(); this.DeleteButton = new System.Windows.Forms.Button(); this.AddButton = new System.Windows.Forms.Button(); this.ServerGroupBox = new System.Windows.Forms.GroupBox(); this.ServersListBox = new System.Windows.Forms.ListBox(); - this.menuItem1 = new System.Windows.Forms.MenuItem(); this.tableLayoutPanel1.SuspendLayout(); this.panel1.SuspendLayout(); this.panel3.SuspendLayout(); @@ -93,9 +76,9 @@ this.tableLayoutPanel1.Controls.Add(this.label5, 0, 3); this.tableLayoutPanel1.Controls.Add(this.EncryptionSelect, 1, 3); this.tableLayoutPanel1.Location = new System.Drawing.Point(8, 21); - this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); + this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(5); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(5, 5, 5, 5); + this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(5); this.tableLayoutPanel1.RowCount = 6; this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); @@ -233,11 +216,6 @@ this.EncryptionSelect.Size = new System.Drawing.Size(160, 21); this.EncryptionSelect.TabIndex = 3; // - // notifyIcon1 - // - this.notifyIcon1.Text = "Shadowsocks"; - this.notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick); - // // panel2 // this.panel2.Anchor = System.Windows.Forms.AnchorStyles.Top; @@ -282,99 +260,6 @@ this.panel1.Size = new System.Drawing.Size(165, 30); this.panel1.TabIndex = 1; // - // contextMenu1 - // - this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { - this.enableItem, - this.ServersItem, - this.menuItem1, - this.AutoStartupItem, - this.ShareOverLANItem, - this.editPACFileItem, - this.menuItem4, - this.QRCodeItem, - this.ShowLogItem, - this.aboutItem, - this.menuItem3, - this.quitItem}); - // - // enableItem - // - this.enableItem.Index = 0; - this.enableItem.Text = "&Enable"; - this.enableItem.Click += new System.EventHandler(this.EnableItem_Click); - // - // AutoStartupItem - // - this.AutoStartupItem.Index = 3; - this.AutoStartupItem.Text = "Start on Boot"; - this.AutoStartupItem.Click += new System.EventHandler(this.AutoStartupItem_Click); - // - // ShareOverLANItem - // - this.ShareOverLANItem.Index = 4; - this.ShareOverLANItem.Text = "Share over LAN"; - this.ShareOverLANItem.Click += new System.EventHandler(this.ShareOverLANItem_Click); - // - // ServersItem - // - this.ServersItem.Index = 1; - this.ServersItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { - this.SeperatorItem, - this.ConfigItem}); - this.ServersItem.Text = "&Servers"; - // - // SeperatorItem - // - this.SeperatorItem.Index = 0; - this.SeperatorItem.Text = "-"; - // - // ConfigItem - // - this.ConfigItem.Index = 1; - this.ConfigItem.Text = "Edit Servers..."; - this.ConfigItem.Click += new System.EventHandler(this.Config_Click); - // - // menuItem4 - // - this.menuItem4.Index = 6; - this.menuItem4.Text = "-"; - // - // editPACFileItem - // - this.editPACFileItem.Index = 5; - this.editPACFileItem.Text = "Edit &PAC File..."; - this.editPACFileItem.Click += new System.EventHandler(this.EditPACFileItem_Click); - // - // QRCodeItem - // - this.QRCodeItem.Index = 7; - this.QRCodeItem.Text = "Show &QRCode..."; - this.QRCodeItem.Click += new System.EventHandler(this.QRCodeItem_Click); - // - // ShowLogItem - // - this.ShowLogItem.Index = 8; - this.ShowLogItem.Text = "Show Logs..."; - this.ShowLogItem.Click += new System.EventHandler(this.ShowLogItem_Click); - // - // aboutItem - // - this.aboutItem.Index = 9; - this.aboutItem.Text = "About..."; - this.aboutItem.Click += new System.EventHandler(this.AboutItem_Click); - // - // menuItem3 - // - this.menuItem3.Index = 10; - this.menuItem3.Text = "-"; - // - // quitItem - // - this.quitItem.Index = 11; - this.quitItem.Text = "&Quit"; - this.quitItem.Click += new System.EventHandler(this.Quit_Click); - // // panel3 // this.panel3.AutoSize = true; @@ -425,11 +310,6 @@ this.ServersListBox.TabIndex = 5; this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); // - // menuItem1 - // - this.menuItem1.Index = 2; - this.menuItem1.Text = "-"; - // // ConfigForm // this.AcceptButton = this.OKButton; @@ -474,35 +354,19 @@ private System.Windows.Forms.TextBox ServerPortTextBox; private System.Windows.Forms.TextBox PasswordTextBox; private System.Windows.Forms.TextBox ProxyPortTextBox; - private System.Windows.Forms.NotifyIcon notifyIcon1; private System.Windows.Forms.Label label5; private System.Windows.Forms.ComboBox EncryptionSelect; private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Button OKButton; private System.Windows.Forms.Button MyCancelButton; private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.ContextMenu contextMenu1; - private System.Windows.Forms.MenuItem enableItem; - private System.Windows.Forms.MenuItem aboutItem; - private System.Windows.Forms.MenuItem menuItem3; - private System.Windows.Forms.MenuItem quitItem; - private System.Windows.Forms.MenuItem ConfigItem; - private System.Windows.Forms.MenuItem editPACFileItem; private System.Windows.Forms.Panel panel3; private System.Windows.Forms.Button DeleteButton; private System.Windows.Forms.Button AddButton; private System.Windows.Forms.GroupBox ServerGroupBox; private System.Windows.Forms.ListBox ServersListBox; - private System.Windows.Forms.MenuItem ServersItem; - private System.Windows.Forms.MenuItem SeperatorItem; - private System.Windows.Forms.MenuItem menuItem4; private System.Windows.Forms.TextBox RemarksTextBox; private System.Windows.Forms.Label label6; - private System.Windows.Forms.MenuItem QRCodeItem; - private System.Windows.Forms.MenuItem ShowLogItem; - private System.Windows.Forms.MenuItem ShareOverLANItem; - private System.Windows.Forms.MenuItem AutoStartupItem; - private System.Windows.Forms.MenuItem menuItem1; } } diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index c1bfff63..5d664eb8 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -25,79 +25,19 @@ namespace Shadowsocks.View public ConfigForm(ShadowsocksController controller) { InitializeComponent(); - LoadTrayIcon(); - notifyIcon1.ContextMenu = contextMenu1; + this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); this.controller = controller; - controller.EnableStatusChanged += controller_EnableStatusChanged; controller.ConfigChanged += controller_ConfigChanged; - controller.PACFileReadyToOpen += controller_PACFileReadyToOpen; - controller.ShareOverLANStatusChanged += controller_ShareOverLANStatusChanged; - - this.updateChecker = new UpdateChecker(); - updateChecker.NewVersionFound += updateChecker_NewVersionFound; LoadCurrentConfiguration(); } - private void LoadTrayIcon() - { - int dpi; - Graphics graphics = this.CreateGraphics(); - dpi = (int)graphics.DpiX; - graphics.Dispose(); - Bitmap icon = null; - if (dpi < 97) - { - // dpi = 96; - icon = Resources.ss16; - } - else if (dpi < 121) - { - // dpi = 120; - icon = Resources.ss20; - } - else - { - icon = Resources.ss24; - } - notifyIcon1.Icon = Icon.FromHandle(icon.GetHicon()); - notifyIcon1.Visible = true; - this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); - } - private void controller_ConfigChanged(object sender, EventArgs e) { LoadCurrentConfiguration(); } - private void controller_EnableStatusChanged(object sender, EventArgs e) - { - enableItem.Checked = controller.GetConfiguration().enabled; - } - - void controller_ShareOverLANStatusChanged(object sender, EventArgs e) - { - ShareOverLANItem.Checked = controller.GetConfiguration().shareOverLan; - } - - void controller_PACFileReadyToOpen(object sender, ShadowsocksController.PathEventArgs e) - { - string argument = @"/select, " + e.Path; - - System.Diagnostics.Process.Start("explorer.exe", argument); - } - - void updateChecker_NewVersionFound(object sender, EventArgs e) - { - notifyIcon1.BalloonTipTitle = "Shadowsocks " + updateChecker.LatestVersionNumber + " Update Found"; - notifyIcon1.BalloonTipText = "Click here to download"; - notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; - notifyIcon1.BalloonTipClicked += notifyIcon1_BalloonTipClicked; - notifyIcon1.ShowBalloonTip(5000); - _isFirstRun = false; - } - void notifyIcon1_BalloonTipClicked(object sender, EventArgs e) { Process.Start(updateChecker.LatestVersionURL); @@ -181,52 +121,11 @@ namespace Shadowsocks.View _oldSelectedIndex = _modifiedConfiguration.index; ServersListBox.SelectedIndex = _modifiedConfiguration.index; LoadSelectedServer(); - - UpdateServersMenu(); - enableItem.Checked = _modifiedConfiguration.enabled; - ShareOverLANItem.Checked = _modifiedConfiguration.shareOverLan; - AutoStartupItem.Checked = AutoStartup.Check(); - } - - private void UpdateServersMenu() - { - var items = ServersItem.MenuItems; - - items.Clear(); - - Configuration configuration = controller.GetConfiguration(); - for (int i = 0; i < configuration.configs.Count; i++) - { - Server server = configuration.configs[i]; - MenuItem item = new MenuItem(string.IsNullOrEmpty(server.remarks) ? server.server + ":" + server.server_port : server.server + ":" + server.server_port + " (" + server.remarks + ")"); - item.Tag = i; - item.Click += AServerItem_Click; - items.Add(item); - } - items.Add(SeperatorItem); - items.Add(ConfigItem); - - if (configuration.index >= 0 && configuration.index < configuration.configs.Count) - { - items[configuration.index].Checked = true; - } } private void ConfigForm_Load(object sender, EventArgs e) { - if (!controller.GetConfiguration().isDefault) - { - this.Opacity = 0; - BeginInvoke(new MethodInvoker(delegate - { - this.Hide(); - })); - } - else - { - _isFirstRun = true; - } - updateChecker.CheckUpdate(); + } private void ServersListBox_SelectedIndexChanged(object sender, EventArgs e) @@ -277,28 +176,6 @@ namespace Shadowsocks.View LoadSelectedServer(); } - private void Config_Click(object sender, EventArgs e) - { - ShowWindow(); - } - - private void Quit_Click(object sender, EventArgs e) - { - this.Close(); - } - - private void ShowFirstTimeBalloon() - { - if (_isFirstRun) - { - notifyIcon1.BalloonTipTitle = "Shadowsocks is here"; - notifyIcon1.BalloonTipText = "You can turn on/off Shadowsocks in the context menu"; - notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; - notifyIcon1.ShowBalloonTip(0); - _isFirstRun = false; - } - } - private void OKButton_Click(object sender, EventArgs e) { if (!SaveOldSelectedServer()) @@ -312,60 +189,11 @@ namespace Shadowsocks.View } controller.SaveServers(_modifiedConfiguration.configs); this.Hide(); - ShowFirstTimeBalloon(); } private void CancelButton_Click(object sender, EventArgs e) { - this.Hide(); - LoadCurrentConfiguration(); - ShowFirstTimeBalloon(); - } - - private void ConfigForm_FormClosed(object sender, FormClosedEventArgs e) - { - controller.Stop(); - } - - private void AboutItem_Click(object sender, EventArgs e) - { - Process.Start("https://github.com/clowwindy/shadowsocks-csharp"); - } - - private void notifyIcon1_DoubleClick(object sender, EventArgs e) - { - ShowWindow(); - } - - - private void EnableItem_Click(object sender, EventArgs e) - { - enableItem.Checked = !enableItem.Checked; - controller.ToggleEnable(enableItem.Checked); - } - - private void ShareOverLANItem_Click(object sender, EventArgs e) - { - ShareOverLANItem.Checked = !ShareOverLANItem.Checked; - controller.ToggleShareOverLAN(ShareOverLANItem.Checked); - } - - private void EditPACFileItem_Click(object sender, EventArgs e) - { - controller.TouchPACFile(); - } - - private void AServerItem_Click(object sender, EventArgs e) - { - MenuItem item = (MenuItem)sender; - controller.SelectServerIndex((int)item.Tag); - } - - private void ShowLogItem_Click(object sender, EventArgs e) - { - string argument = Logging.LogFile; - - System.Diagnostics.Process.Start("notepad.exe", argument); + this.Close(); } private void ConfigForm_Shown(object sender, EventArgs e) @@ -373,18 +201,10 @@ namespace Shadowsocks.View IPTextBox.Focus(); } - private void QRCodeItem_Click(object sender, EventArgs e) + private void ConfigForm_FormClosed(object sender, FormClosedEventArgs e) { - QRCodeForm qrCodeForm = new QRCodeForm(controller.GetQRCodeForCurrentServer()); - qrCodeForm.Icon = this.Icon; - qrCodeForm.Show(); + controller.ConfigChanged -= controller_ConfigChanged; } - private void AutoStartupItem_Click(object sender, EventArgs e) { - AutoStartupItem.Checked = !AutoStartupItem.Checked; - if (!AutoStartup.Set(AutoStartupItem.Checked)) { - MessageBox.Show("Failed to edit registry"); - } - } } } diff --git a/shadowsocks-csharp/View/ConfigForm.resx b/shadowsocks-csharp/View/ConfigForm.resx index 3dc5188a..ff31a6db 100755 --- a/shadowsocks-csharp/View/ConfigForm.resx +++ b/shadowsocks-csharp/View/ConfigForm.resx @@ -112,15 +112,9 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 - - - 146, 19 - \ No newline at end of file diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs new file mode 100755 index 00000000..669531ec --- /dev/null +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -0,0 +1,388 @@ +using Shadowsocks.Controller; +using Shadowsocks.Model; +using Shadowsocks.Properties; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Shadowsocks.View +{ + public class MenuViewController + { + // yes this is just a menu view controller + // when config form is closed, it moves away from RAM + // and it should just does anything related to the config form + + private ShadowsocksController controller; + private UpdateChecker updateChecker; + + private NotifyIcon notifyIcon1; + private ContextMenu contextMenu1; + + // this is a copy of configuration that we are working on + private bool _isFirstRun; + private MenuItem enableItem; + private MenuItem AutoStartupItem; + private MenuItem ShareOverLANItem; + private MenuItem SeperatorItem; + private MenuItem ConfigItem; + private MenuItem menuItem4; + private MenuItem editPACFileItem; + private MenuItem QRCodeItem; + private MenuItem ShowLogItem; + private MenuItem aboutItem; + private MenuItem ServersItem; + private MenuItem menuItem3; + private MenuItem quitItem; + private MenuItem menuItem1; + private ConfigForm configForm; + + public MenuViewController(ShadowsocksController controller) + { + LoadMenu(); + LoadTrayIcon(); + + this.controller = controller; + controller.EnableStatusChanged += controller_EnableStatusChanged; + controller.ConfigChanged += controller_ConfigChanged; + controller.PACFileReadyToOpen += controller_PACFileReadyToOpen; + controller.ShareOverLANStatusChanged += controller_ShareOverLANStatusChanged; + + this.updateChecker = new UpdateChecker(); + updateChecker.NewVersionFound += updateChecker_NewVersionFound; + + LoadCurrentConfiguration(); + + updateChecker.CheckUpdate(); + + if (controller.GetConfiguration().isDefault) + { + _isFirstRun = true; + ShowConfigForm(); + } + } + + private void LoadTrayIcon() + { + int dpi; + Graphics graphics = Graphics.FromHwnd(IntPtr.Zero); + dpi = (int)graphics.DpiX; + graphics.Dispose(); + Bitmap icon = null; + if (dpi < 97) + { + // dpi = 96; + icon = Resources.ss16; + } + else if (dpi < 121) + { + // dpi = 120; + icon = Resources.ss20; + } + else + { + icon = Resources.ss24; + } + notifyIcon1 = new NotifyIcon(); + notifyIcon1.Icon = Icon.FromHandle(icon.GetHicon()); + notifyIcon1.Visible = true; + + notifyIcon1.ContextMenu = contextMenu1; + notifyIcon1.DoubleClick +=notifyIcon1_DoubleClick; + } + + private void LoadMenu() + { + this.contextMenu1 = new System.Windows.Forms.ContextMenu(); + this.enableItem = new System.Windows.Forms.MenuItem(); + this.AutoStartupItem = new System.Windows.Forms.MenuItem(); + this.ShareOverLANItem = new System.Windows.Forms.MenuItem(); + this.ServersItem = new System.Windows.Forms.MenuItem(); + this.SeperatorItem = new System.Windows.Forms.MenuItem(); + this.ConfigItem = new System.Windows.Forms.MenuItem(); + this.menuItem4 = new System.Windows.Forms.MenuItem(); + this.editPACFileItem = new System.Windows.Forms.MenuItem(); + this.QRCodeItem = new System.Windows.Forms.MenuItem(); + this.ShowLogItem = new System.Windows.Forms.MenuItem(); + this.aboutItem = new System.Windows.Forms.MenuItem(); + this.menuItem3 = new System.Windows.Forms.MenuItem(); + this.quitItem = new System.Windows.Forms.MenuItem(); + this.menuItem1 = new System.Windows.Forms.MenuItem(); + + // + // contextMenu1 + // + this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { + this.enableItem, + this.ServersItem, + this.menuItem1, + this.AutoStartupItem, + this.ShareOverLANItem, + this.editPACFileItem, + this.menuItem4, + this.QRCodeItem, + this.ShowLogItem, + this.aboutItem, + this.menuItem3, + this.quitItem}); + // + // enableItem + // + this.enableItem.Index = 0; + this.enableItem.Text = "&Enable"; + this.enableItem.Click += new System.EventHandler(this.EnableItem_Click); + // + // AutoStartupItem + // + this.AutoStartupItem.Index = 3; + this.AutoStartupItem.Text = "Start on Boot"; + this.AutoStartupItem.Click += new System.EventHandler(this.AutoStartupItem_Click); + // + // ShareOverLANItem + // + this.ShareOverLANItem.Index = 4; + this.ShareOverLANItem.Text = "Share over LAN"; + this.ShareOverLANItem.Click += new System.EventHandler(this.ShareOverLANItem_Click); + // + // ServersItem + // + this.ServersItem.Index = 1; + this.ServersItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { + this.SeperatorItem, + this.ConfigItem}); + this.ServersItem.Text = "&Servers"; + // + // SeperatorItem + // + this.SeperatorItem.Index = 0; + this.SeperatorItem.Text = "-"; + // + // ConfigItem + // + this.ConfigItem.Index = 1; + this.ConfigItem.Text = "Edit Servers..."; + this.ConfigItem.Click += new System.EventHandler(this.Config_Click); + // + // menuItem4 + // + this.menuItem4.Index = 6; + this.menuItem4.Text = "-"; + // + // editPACFileItem + // + this.editPACFileItem.Index = 5; + this.editPACFileItem.Text = "Edit &PAC File..."; + this.editPACFileItem.Click += new System.EventHandler(this.EditPACFileItem_Click); + // + // QRCodeItem + // + this.QRCodeItem.Index = 7; + this.QRCodeItem.Text = "Show &QRCode..."; + this.QRCodeItem.Click += new System.EventHandler(this.QRCodeItem_Click); + // + // ShowLogItem + // + this.ShowLogItem.Index = 8; + this.ShowLogItem.Text = "Show Logs..."; + this.ShowLogItem.Click += new System.EventHandler(this.ShowLogItem_Click); + // + // aboutItem + // + this.aboutItem.Index = 9; + this.aboutItem.Text = "About..."; + this.aboutItem.Click += new System.EventHandler(this.AboutItem_Click); + // + // menuItem3 + // + this.menuItem3.Index = 10; + this.menuItem3.Text = "-"; + // + // quitItem + // + this.quitItem.Index = 11; + this.quitItem.Text = "&Quit"; + this.quitItem.Click += new System.EventHandler(this.Quit_Click); + // + // menuItem1 + // + this.menuItem1.Index = 2; + this.menuItem1.Text = "-"; + } + + private void controller_ConfigChanged(object sender, EventArgs e) + { + LoadCurrentConfiguration(); + } + + private void controller_EnableStatusChanged(object sender, EventArgs e) + { + enableItem.Checked = controller.GetConfiguration().enabled; + } + + void controller_ShareOverLANStatusChanged(object sender, EventArgs e) + { + ShareOverLANItem.Checked = controller.GetConfiguration().shareOverLan; + } + + void controller_PACFileReadyToOpen(object sender, ShadowsocksController.PathEventArgs e) + { + string argument = @"/select, " + e.Path; + + System.Diagnostics.Process.Start("explorer.exe", argument); + } + + void updateChecker_NewVersionFound(object sender, EventArgs e) + { + notifyIcon1.BalloonTipTitle = "Shadowsocks " + updateChecker.LatestVersionNumber + " Update Found"; + notifyIcon1.BalloonTipText = "Click here to download"; + notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; + notifyIcon1.BalloonTipClicked += notifyIcon1_BalloonTipClicked; + notifyIcon1.ShowBalloonTip(5000); + _isFirstRun = false; + } + + void notifyIcon1_BalloonTipClicked(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(updateChecker.LatestVersionURL); + } + + + private void LoadCurrentConfiguration() + { + Configuration config = controller.GetConfiguration(); + UpdateServersMenu(); + enableItem.Checked = config.enabled; + ShareOverLANItem.Checked = config.shareOverLan; + AutoStartupItem.Checked = AutoStartup.Check(); + } + + private void UpdateServersMenu() + { + var items = ServersItem.MenuItems; + + items.Clear(); + + Configuration configuration = controller.GetConfiguration(); + for (int i = 0; i < configuration.configs.Count; i++) + { + Server server = configuration.configs[i]; + MenuItem item = new MenuItem(string.IsNullOrEmpty(server.remarks) ? server.server + ":" + server.server_port : server.server + ":" + server.server_port + " (" + server.remarks + ")"); + item.Tag = i; + item.Click += AServerItem_Click; + items.Add(item); + } + items.Add(SeperatorItem); + items.Add(ConfigItem); + + if (configuration.index >= 0 && configuration.index < configuration.configs.Count) + { + items[configuration.index].Checked = true; + } + } + + private void ShowConfigForm() + { + if (configForm != null) + { + configForm.Focus(); + } + else + { + configForm = new ConfigForm(controller); + configForm.Show(); + configForm.FormClosed += configForm_FormClosed; + } + } + + void configForm_FormClosed(object sender, FormClosedEventArgs e) + { + configForm = null; + GC.Collect(); + GC.WaitForPendingFinalizers(); + ShowFirstTimeBalloon(); + } + + private void Config_Click(object sender, EventArgs e) + { + ShowConfigForm(); + } + + private void Quit_Click(object sender, EventArgs e) + { + controller.Stop(); + notifyIcon1.Visible = false; + Application.Exit(); + } + + private void ShowFirstTimeBalloon() + { + if (_isFirstRun) + { + notifyIcon1.BalloonTipTitle = "Shadowsocks is here"; + notifyIcon1.BalloonTipText = "You can turn on/off Shadowsocks in the context menu"; + notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; + notifyIcon1.ShowBalloonTip(0); + _isFirstRun = false; + } + } + + private void AboutItem_Click(object sender, EventArgs e) + { + Process.Start("https://github.com/clowwindy/shadowsocks-csharp"); + } + + private void notifyIcon1_DoubleClick(object sender, EventArgs e) + { + ShowConfigForm(); + } + + + private void EnableItem_Click(object sender, EventArgs e) + { + enableItem.Checked = !enableItem.Checked; + controller.ToggleEnable(enableItem.Checked); + } + + private void ShareOverLANItem_Click(object sender, EventArgs e) + { + ShareOverLANItem.Checked = !ShareOverLANItem.Checked; + controller.ToggleShareOverLAN(ShareOverLANItem.Checked); + } + + private void EditPACFileItem_Click(object sender, EventArgs e) + { + controller.TouchPACFile(); + } + + private void AServerItem_Click(object sender, EventArgs e) + { + MenuItem item = (MenuItem)sender; + controller.SelectServerIndex((int)item.Tag); + } + + private void ShowLogItem_Click(object sender, EventArgs e) + { + string argument = Logging.LogFile; + + System.Diagnostics.Process.Start("notepad.exe", argument); + } + + private void QRCodeItem_Click(object sender, EventArgs e) + { + QRCodeForm qrCodeForm = new QRCodeForm(controller.GetQRCodeForCurrentServer()); + //qrCodeForm.Icon = this.Icon; + // TODO + qrCodeForm.Show(); + } + + private void AutoStartupItem_Click(object sender, EventArgs e) { + AutoStartupItem.Checked = !AutoStartupItem.Checked; + if (!AutoStartup.Set(AutoStartupItem.Checked)) { + MessageBox.Show("Failed to edit registry"); + } + } + } +} diff --git a/shadowsocks-csharp/View/QRCodeForm.cs b/shadowsocks-csharp/View/QRCodeForm.cs index 12c5b6fd..01441614 100755 --- a/shadowsocks-csharp/View/QRCodeForm.cs +++ b/shadowsocks-csharp/View/QRCodeForm.cs @@ -20,6 +20,7 @@ namespace Shadowsocks.View { this.code = code; InitializeComponent(); + this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); } private void GenQR(string ssconfig) diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 41515225..e9d322b2 100755 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -96,6 +96,7 @@ + Form