rdp-portal/src/MainForm.cs

244 lines
7.5 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace RDP_Portal {
public partial class MainForm : Form {
private Config _config;
private bool _editMode = false;
private Profile selectedProfile = null;
public MainForm() {
InitializeComponent();
_config = Config.GetConfig();
}
private void MainForm_Load(object sender, EventArgs e) {
listBox.DataSource = _config.Profiles;
if (_config.Profiles.Count == 0) {
AddNewProfile();
}
checkBoxKeepOpening.Checked = _config.KeepOpening;
}
public bool EditMode {
get => _editMode;
set {
buttonEdit.Visible = !value;
buttonSave.Visible = value;
buttonCancel.Visible = value;
buttonOptions.Enabled = !value;
buttonConnect.Enabled = !value;
textBoxName.Enabled = value;
textBoxComputer.Enabled = value;
textBoxUsername.Enabled = value;
textBoxPassword.Enabled = value;
textBoxDomain.Enabled = value;
}
}
private void AddNewProfile() {
var profile = new Profile();
profile.JustAdded = true;
_config.Profiles.Add(profile);
listBox.SelectedIndex = _config.Profiles.Count - 1;
}
private void buttonMoreOptions_Click(object sender, EventArgs e) {
ProcessStartInfo startInfo = new ProcessStartInfo {
CreateNoWindow = false,
UseShellExecute = false,
FileName = "mstsc.exe",
Arguments = "/edit " + GetSelectedProfile().Filename,
};
try {
var exeProcess = Process.Start(startInfo) ?? throw new InvalidOperationException();
exeProcess.WaitForExit();
} catch (Exception ex) {
MessageBox.Show(ex.ToString());
}
}
private void buttonConnect_Click(object sender, EventArgs e) {
var profile = GetSelectedProfile();
if (String.IsNullOrWhiteSpace(profile.Computer) || String.IsNullOrWhiteSpace(profile.Computer)) {
MessageBox.Show("Invalid connection");
return;
}
profile.PrepareRdpFile();
ProcessStartInfo startInfo = new ProcessStartInfo {
CreateNoWindow = false,
UseShellExecute = false,
FileName = "mstsc.exe",
Arguments = profile.Filename,
};
try {
var exeProcess = Process.Start(startInfo) ?? throw new InvalidOperationException();
exeProcess.WaitForExit();
if (!_config.KeepOpening) {
this.Close();
}
} catch (Exception ex) {
MessageBox.Show(ex.ToString());
}
}
private void listBox_SelectedValueChanged(object sender, EventArgs e) {
SelectProfile();
}
private Profile GetSelectedProfile() {
return (Profile) listBox.SelectedItem;
}
private void SelectProfile(bool force = false) {
var profile = (Profile) listBox.SelectedItem;
// Avoid click empty area reset value
if (profile == selectedProfile && !force) {
return;
}
selectedProfile = profile;
EditMode = profile.JustAdded;
textBoxName.Text = profile.Name ;
textBoxComputer.Text = profile.Computer;
textBoxUsername.Text = profile.Username ;
textBoxPassword.Text = profile.Password;
textBoxDomain.Text = profile.Domain;
}
private void buttonEdit_Click(object sender, EventArgs e) {
EditMode = true;
}
private void buttonCancel_Click(object sender, EventArgs e) {
EditMode = false;
var profile = GetSelectedProfile();
if (profile.JustAdded && _config.Profiles.Count > 1) {
buttonDelete_Click(null, null);
} else {
SelectProfile(true);
}
}
private void buttonNew_Click(object sender, EventArgs e) {
AddNewProfile();
}
private void buttonDelete_Click(object sender, EventArgs e) {
// show confirm dialog
var confirmResult = MessageBox.Show(
"Are you sure to delete this profile?",
"Confirm",
MessageBoxButtons.YesNo);
// if confirm delete
if (confirmResult == DialogResult.Yes) {
var selectedItems = (Profile) listBox.SelectedItem;
selectedItems.Delete();
_config.Profiles.Remove(selectedItems);
_config.Save();
if (_config.Profiles.Count == 0) {
AddNewProfile();
SelectProfile(true);
}
}
}
private void buttonSave_Click(object sender, EventArgs e) {
var profile = (Profile) listBox.SelectedItem;
profile.JustAdded = false;
profile.Name = textBoxName.Text;
profile.Computer = textBoxComputer.Text;
profile.Username = textBoxUsername.Text;
profile.Password = textBoxPassword.Text;
profile.Domain = textBoxDomain.Text;
profile.PrepareRdpFile();
_config.Save();
EditMode = false;
// Refresh the list
listBox.DisplayMember = null;
listBox.DisplayMember = "Name";
}
private void checkBoxKeepOpening_CheckedChanged(object sender, EventArgs e) {
_config.KeepOpening = checkBoxKeepOpening.Checked;
_config.Save();
}
private void buttonAbout_Click(object sender, EventArgs e) {
About about = new About();
about.ShowDialog(this);
}
private void listBox_MouseDoubleClick(object sender, MouseEventArgs e) {
buttonConnect_Click(sender, e);
}
/**
* From https://stackoverflow.com/questions/8333282/how-can-i-include-icons-in-my-listbox
*/
private void listBox_DrawItem(object sender, DrawItemEventArgs e) {
if (e.Index == -1)
return;
e.DrawBackground();
Brush myBrush = Brushes.Black;
var iconWidth = listBox.ItemHeight;
var iconMargin = 4;
var textMargin = (iconWidth - 18) / 2;
var rect = new Rectangle(e.Bounds.X + iconMargin, e.Bounds.Y, iconWidth, iconWidth);
//assuming the icon is already added to project resources
e.Graphics.DrawIcon(rdp_portal.Properties.Resources.icon, rect);
var profile = (Profile)listBox.Items[e.Index];
e.Graphics.DrawString(
profile.Name,
e.Font,
myBrush,
new Rectangle(e.Bounds.X + iconMargin * 2 + iconWidth, e.Bounds.Y + textMargin, e.Bounds.Width, e.Bounds.Height),
StringFormat.GenericDefault
);
// If the ListBox has focus, draw a focus rectangle around the selected item.
e.DrawFocusRectangle();
}
}
}