298 lines
11 KiB
C#
298 lines
11 KiB
C#
using NStandard;
|
|
using System;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Windows.Forms;
|
|
using static System.Windows.Forms.ListViewItem;
|
|
|
|
namespace PortProxyGUI
|
|
{
|
|
public partial class PortProxyGUI : Form
|
|
{
|
|
public SetProxy SetProxyForm;
|
|
public About AboutForm;
|
|
private ListViewColumnSorter lvwColumnSorter;
|
|
|
|
public PortProxyGUI()
|
|
{
|
|
InitializeComponent();
|
|
Font = Util.UiFont;
|
|
|
|
lvwColumnSorter = new ListViewColumnSorter();
|
|
listViewProxies.ListViewItemSorter = lvwColumnSorter;
|
|
}
|
|
|
|
private void PortProxyGUI_Load(object sender, EventArgs e)
|
|
{
|
|
}
|
|
|
|
private void PortProxyGUI_Shown(object sender, EventArgs e)
|
|
{
|
|
RefreshProxyList();
|
|
}
|
|
|
|
private Data.Rule ParseRule(ListViewItem item)
|
|
{
|
|
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
|
|
int listenPort, connectPort;
|
|
|
|
listenPort = Data.Rule.ParsePort(subItems[3].Text);
|
|
connectPort = Data.Rule.ParsePort(subItems[5].Text);
|
|
|
|
var rule = new Data.Rule
|
|
{
|
|
Type = subItems[1].Text.Trim(),
|
|
ListenOn = subItems[2].Text.Trim(),
|
|
ListenPort = listenPort,
|
|
ConnectTo = subItems[4].Text.Trim(),
|
|
ConnectPort = connectPort,
|
|
Comment = subItems[6].Text.Trim(),
|
|
Group = item.Group?.Header.Trim(),
|
|
};
|
|
return rule;
|
|
}
|
|
|
|
private void EnableSelectedProxies()
|
|
{
|
|
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
|
|
foreach (var item in items)
|
|
{
|
|
item.ImageIndex = 1;
|
|
|
|
try
|
|
{
|
|
var rule = ParseRule(item);
|
|
CmdUtil.AddOrUpdateProxy(rule);
|
|
}
|
|
catch (NotSupportedException ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DisableSelectedProxies()
|
|
{
|
|
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
|
|
foreach (var item in items)
|
|
{
|
|
item.ImageIndex = 0;
|
|
|
|
try
|
|
{
|
|
var rule = ParseRule(item);
|
|
CmdUtil.DeleteProxy(rule);
|
|
}
|
|
catch (NotSupportedException ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DeleteSelectedProxies()
|
|
{
|
|
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
|
|
DisableSelectedProxies();
|
|
Program.SqliteDbScope.RemoveRange(items.Select(x => new Data.Rule { Id = x.Tag.ToString() }));
|
|
foreach (var item in items) listViewProxies.Items.Remove(item);
|
|
}
|
|
|
|
private void SetProxyForUpdate(SetProxy form)
|
|
{
|
|
var item = listViewProxies.SelectedItems.OfType<ListViewItem>().FirstOrDefault();
|
|
try
|
|
{
|
|
var rule = ParseRule(item);
|
|
form.UseUpdateMode(item, rule);
|
|
}
|
|
catch (NotSupportedException ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
|
return;
|
|
}
|
|
}
|
|
|
|
private void InitProxyGroups(Data.Rule[] rules)
|
|
{
|
|
listViewProxies.Groups.Clear();
|
|
var groups = (
|
|
from g in rules.GroupBy(x => x.Group)
|
|
let name = g.Key
|
|
where !name.IsNullOrWhiteSpace()
|
|
orderby name
|
|
select new ListViewGroup(name)
|
|
).ToArray();
|
|
listViewProxies.Groups.AddRange(groups);
|
|
}
|
|
|
|
private void InitProxyItems(Data.Rule[] rules, Data.Rule[] proxies)
|
|
{
|
|
listViewProxies.Items.Clear();
|
|
foreach (var rule in rules)
|
|
{
|
|
var imageIndex = proxies.Any(p => p.EqualsWithKeys(rule)) ? 1 : 0;
|
|
var group = listViewProxies.Groups.OfType<ListViewGroup>().FirstOrDefault(x => x.Header == rule.Group);
|
|
|
|
var item = new ListViewItem();
|
|
UpdateListViewItem(item, rule, imageIndex);
|
|
listViewProxies.Items.Add(item);
|
|
}
|
|
}
|
|
|
|
public void UpdateListViewItem(ListViewItem item, Data.Rule rule, int imageIndex)
|
|
{
|
|
item.ImageIndex = imageIndex;
|
|
item.Tag = rule.Id;
|
|
item.SubItems.Clear();
|
|
item.SubItems.AddRange(new[]
|
|
{
|
|
new ListViewSubItem(item, rule.Type),
|
|
new ListViewSubItem(item, rule.ListenOn),
|
|
new ListViewSubItem(item, rule.ListenPort.ToString()) { Tag = "Number" },
|
|
new ListViewSubItem(item, rule.ConnectTo),
|
|
new ListViewSubItem(item, rule.ConnectPort.ToString ()) { Tag = "Number" },
|
|
new ListViewSubItem(item, rule.Comment ?? ""),
|
|
});
|
|
|
|
if (rule.Group.IsNullOrWhiteSpace()) item.Group = null;
|
|
else
|
|
{
|
|
var group = listViewProxies.Groups.OfType<ListViewGroup>().FirstOrDefault(x => x.Header == rule.Group);
|
|
if (group == null)
|
|
{
|
|
group = new ListViewGroup(rule.Group);
|
|
listViewProxies.Groups.Add(group);
|
|
}
|
|
item.Group = group;
|
|
}
|
|
}
|
|
|
|
public void RefreshProxyList()
|
|
{
|
|
var proxies = CmdUtil.GetProxies();
|
|
var rules = Program.SqliteDbScope.Rules.ToArray();
|
|
foreach (var proxy in proxies)
|
|
{
|
|
var matchedRule = rules.FirstOrDefault(r => r.EqualsWithKeys(proxy));
|
|
proxy.Id = matchedRule?.Id;
|
|
}
|
|
|
|
var pendingAdds = proxies.Where(x => x.Valid && x.Id == null);
|
|
var pendingUpdates = proxies.Where(x => x.Valid && x.Id != null && !x.Equals(rules.First(r => r.Id == x.Id)));
|
|
|
|
Program.SqliteDbScope.AddRange(pendingAdds);
|
|
Program.SqliteDbScope.UpdateRange(pendingUpdates);
|
|
|
|
rules = Program.SqliteDbScope.Rules.ToArray();
|
|
InitProxyGroups(rules);
|
|
InitProxyItems(rules, proxies);
|
|
}
|
|
|
|
private void contextMenuStrip1_MouseClick(object sender, MouseEventArgs e)
|
|
{
|
|
if (sender is ContextMenuStrip _sender)
|
|
{
|
|
var selected = _sender.Items.OfType<ToolStripMenuItem>().Where(x => x.Selected).FirstOrDefault();
|
|
if (selected is null || !selected.Enabled) return;
|
|
|
|
switch (selected)
|
|
{
|
|
case ToolStripMenuItem item when item == toolStripMenuItem_Enable: EnableSelectedProxies(); break;
|
|
case ToolStripMenuItem item when item == toolStripMenuItem_Disable: DisableSelectedProxies(); break;
|
|
|
|
case ToolStripMenuItem item when item == toolStripMenuItem_New:
|
|
if (SetProxyForm == null) SetProxyForm = new SetProxy(this);
|
|
SetProxyForm.UseNormalMode();
|
|
SetProxyForm.ShowDialog();
|
|
break;
|
|
|
|
case ToolStripMenuItem item when item == toolStripMenuItem_Modify:
|
|
if (SetProxyForm == null) SetProxyForm = new SetProxy(this);
|
|
SetProxyForUpdate(SetProxyForm);
|
|
SetProxyForm.ShowDialog();
|
|
break;
|
|
|
|
case ToolStripMenuItem item when item == toolStripMenuItem_Refresh:
|
|
RefreshProxyList();
|
|
break;
|
|
|
|
case ToolStripMenuItem item when item == toolStripMenuItem_Delete: DeleteSelectedProxies(); break;
|
|
|
|
case ToolStripMenuItem item when item == toolStripMenuItem_About:
|
|
if (AboutForm == null)
|
|
{
|
|
AboutForm = new About(this);
|
|
AboutForm.Show();
|
|
}
|
|
else AboutForm.Show();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void listView1_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
if (sender is ListView _sender)
|
|
{
|
|
toolStripMenuItem_Enable.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any(x => x.ImageIndex == 0);
|
|
toolStripMenuItem_Disable.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any(x => x.ImageIndex == 1);
|
|
|
|
toolStripMenuItem_Delete.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any();
|
|
toolStripMenuItem_Modify.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Count() == 1;
|
|
}
|
|
}
|
|
|
|
private void listView1_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
if (sender is ListView _sender)
|
|
{
|
|
var selectAny = _sender.SelectedItems.OfType<ListViewItem>().Any();
|
|
if (selectAny)
|
|
{
|
|
if (SetProxyForm == null) SetProxyForm = new SetProxy(this);
|
|
SetProxyForUpdate(SetProxyForm);
|
|
SetProxyForm.ShowDialog();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
|
|
{
|
|
// Determine if clicked column is already the column that is being sorted.
|
|
if (e.Column == lvwColumnSorter.SortColumn)
|
|
{
|
|
// Reverse the current sort direction for this column.
|
|
if (lvwColumnSorter.Order == SortOrder.Ascending)
|
|
{
|
|
lvwColumnSorter.Order = SortOrder.Descending;
|
|
}
|
|
else
|
|
{
|
|
lvwColumnSorter.Order = SortOrder.Ascending;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Set the column number that is to be sorted; default to ascending.
|
|
lvwColumnSorter.SortColumn = e.Column;
|
|
lvwColumnSorter.Order = SortOrder.Ascending;
|
|
}
|
|
|
|
// Perform the sort with these new sort options.
|
|
listViewProxies.Sort();
|
|
}
|
|
|
|
private void listViewProxies_KeyUp(object sender, KeyEventArgs e)
|
|
{
|
|
if (sender is ListView)
|
|
{
|
|
if (e.KeyCode == Keys.Delete) DeleteSelectedProxies();
|
|
}
|
|
}
|
|
}
|
|
}
|