mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
optimized event raising so we only save the credential list once for multiple property changes
This commit is contained in:
@@ -1,58 +1,16 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Security;
|
||||
|
||||
|
||||
namespace mRemoteNG.Credential
|
||||
{
|
||||
public class CredentialRecord : ICredentialRecord, INotifyPropertyChanged
|
||||
public class CredentialRecord : ICredentialRecord
|
||||
{
|
||||
private string _title = "New Credential";
|
||||
private string _username = "";
|
||||
private SecureString _password = new SecureString();
|
||||
private string _domain = "";
|
||||
|
||||
public Guid Id { get; } = Guid.NewGuid();
|
||||
|
||||
public string Title
|
||||
{
|
||||
get { return _title; }
|
||||
set
|
||||
{
|
||||
_title = value;
|
||||
RaisePropertyChangedEvent(nameof(Title));
|
||||
}
|
||||
}
|
||||
|
||||
public string Username
|
||||
{
|
||||
get { return _username; }
|
||||
set
|
||||
{
|
||||
_username = value;
|
||||
RaisePropertyChangedEvent(nameof(Username));
|
||||
}
|
||||
}
|
||||
|
||||
public SecureString Password
|
||||
{
|
||||
get { return _password; }
|
||||
set
|
||||
{
|
||||
_password = value;
|
||||
RaisePropertyChangedEvent(nameof(Password));
|
||||
}
|
||||
}
|
||||
|
||||
public string Domain
|
||||
{
|
||||
get { return _domain; }
|
||||
set
|
||||
{
|
||||
_domain = value;
|
||||
RaisePropertyChangedEvent(nameof(Domain));
|
||||
}
|
||||
}
|
||||
public string Title { get; set; } = "New Credential";
|
||||
public string Username { get; set; } = "";
|
||||
public SecureString Password { get; set; } = new SecureString();
|
||||
public string Domain { get; set; } = "";
|
||||
|
||||
|
||||
public CredentialRecord()
|
||||
@@ -70,12 +28,5 @@ namespace mRemoteNG.Credential
|
||||
{
|
||||
Id = customGuid;
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
protected virtual void RaisePropertyChangedEvent(string propertyName)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,17 +31,11 @@ namespace mRemoteNG.UI.Forms
|
||||
|
||||
private void SaveFormToCredential()
|
||||
{
|
||||
if (_credentialRecord.Title != textBoxTitle.Text)
|
||||
_credentialRecord.Title = textBoxTitle.Text;
|
||||
|
||||
if(_credentialRecord.Username != textBoxUsername.Text)
|
||||
_credentialRecord.Username = textBoxUsername.Text;
|
||||
|
||||
if(_credentialRecord.Domain != textBoxDomain.Text)
|
||||
_credentialRecord.Domain = textBoxDomain.Text;
|
||||
|
||||
if(_credentialRecord.Password.ConvertToUnsecureString() != textBoxPassword.Text)
|
||||
_credentialRecord.Password = textBoxPassword.Text.ConvertToSecureString();
|
||||
_credentialRecord.Title = textBoxTitle.Text;
|
||||
_credentialRecord.Username = textBoxUsername.Text;
|
||||
_credentialRecord.Domain = textBoxDomain.Text;
|
||||
_credentialRecord.Password = textBoxPassword.Text.ConvertToSecureString();
|
||||
RaiseChangesAcceptedEvent(_credentialRecord);
|
||||
}
|
||||
|
||||
private void buttonAccept_Click(object sender, EventArgs e)
|
||||
@@ -54,5 +48,12 @@ namespace mRemoteNG.UI.Forms
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
public event EventHandler ChangesAccepted;
|
||||
|
||||
private void RaiseChangesAcceptedEvent(object sender)
|
||||
{
|
||||
ChangesAccepted?.Invoke(sender, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,36 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Specialized;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using BrightIdeasSoftware;
|
||||
using mRemoteNG.Credential;
|
||||
using mRemoteNG.Tools;
|
||||
|
||||
|
||||
namespace mRemoteNG.UI.Forms
|
||||
{
|
||||
public partial class CredentialManagerForm : Form
|
||||
{
|
||||
private readonly ObservablePropertyCollection<CredentialRecord> _credentialRecords;
|
||||
private readonly ObservableCollection<ICredentialRecord> _credentialRecords;
|
||||
|
||||
public CredentialManagerForm(ObservablePropertyCollection<CredentialRecord> credentialRecords)
|
||||
public CredentialManagerForm(IList<ICredentialRecord> credentialRecords)
|
||||
{
|
||||
if (credentialRecords == null)
|
||||
throw new ArgumentNullException(nameof(credentialRecords));
|
||||
|
||||
_credentialRecords = credentialRecords;
|
||||
_credentialRecords = new ObservableCollection<ICredentialRecord>(credentialRecords);
|
||||
InitializeComponent();
|
||||
ApplyLanguage();
|
||||
ApplyThemes();
|
||||
objectListView1.SetObjects(_credentialRecords.ToList());
|
||||
_credentialRecords.CollectionChanged += (sender, args) => objectListView1.SetObjects(_credentialRecords);
|
||||
CredentialsChanged += (sender, args) => objectListView1.RefreshObjects(_credentialRecords);
|
||||
objectListView1.CellClick += HandleCellDoubleClick;
|
||||
objectListView1.SelectionChanged += ObjectListView1OnSelectionChanged;
|
||||
_credentialRecords.CollectionChanged += CredentialRecordsOnCollectionChanged;
|
||||
}
|
||||
|
||||
private void CredentialRecordsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
|
||||
{
|
||||
objectListView1.SetObjects(_credentialRecords);
|
||||
}
|
||||
|
||||
#region Form stuff
|
||||
@@ -55,6 +51,7 @@ namespace mRemoteNG.UI.Forms
|
||||
var clickedCredential = cellClickEventArgs.Model as ICredentialRecord;
|
||||
if (clickedCredential == null) return;
|
||||
var credentialEditorForm = new CredentialEditorForm(clickedCredential);
|
||||
credentialEditorForm.ChangesAccepted += (o, args) => RaiseCredentialsChangedEvent(o);
|
||||
credentialEditorForm.Show(this);
|
||||
}
|
||||
|
||||
@@ -62,6 +59,7 @@ namespace mRemoteNG.UI.Forms
|
||||
{
|
||||
var newCredential = new CredentialRecord();
|
||||
_credentialRecords.Add(newCredential);
|
||||
RaiseCredentialsChangedEvent(this);
|
||||
}
|
||||
|
||||
private void buttonRemove_Click(object sender, EventArgs e)
|
||||
@@ -69,11 +67,19 @@ namespace mRemoteNG.UI.Forms
|
||||
var selectedCredential = objectListView1.SelectedObject as CredentialRecord;
|
||||
if (selectedCredential == null) return;
|
||||
_credentialRecords.Remove(selectedCredential);
|
||||
RaiseCredentialsChangedEvent(this);
|
||||
}
|
||||
|
||||
private void ObjectListView1OnSelectionChanged(object sender, EventArgs eventArgs)
|
||||
{
|
||||
buttonRemove.Enabled = objectListView1.SelectedObjects.Count != 0;
|
||||
}
|
||||
|
||||
public event EventHandler CredentialsChanged;
|
||||
|
||||
private void RaiseCredentialsChangedEvent(object sender)
|
||||
{
|
||||
CredentialsChanged?.Invoke(sender, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -49,7 +49,7 @@ namespace mRemoteNG.UI.Forms
|
||||
private SystemMenu _systemMenu;
|
||||
private ConnectionTreeWindow ConnectionTreeWindow { get; set; }
|
||||
private readonly IConnectionInitiator _connectionInitiator = new ConnectionInitiator();
|
||||
private ObservablePropertyCollection<CredentialRecord> _credentialRecords = new ObservablePropertyCollection<CredentialRecord>();
|
||||
private List<ICredentialRecord> _credentialRecords = new List<ICredentialRecord>();
|
||||
private string _credentialFilePath = Path.Combine(CredentialsFileInfo.CredentialsPath, CredentialsFileInfo.CredentialsFile);
|
||||
|
||||
|
||||
@@ -1255,15 +1255,14 @@ namespace mRemoteNG.UI.Forms
|
||||
private void LoadCredentials()
|
||||
{
|
||||
var credentialLoader = new CredentialRecordLoader(new FileDataProvider(_credentialFilePath), new XmlCredentialDeserializer());
|
||||
_credentialRecords = new ObservablePropertyCollection<CredentialRecord>(credentialLoader.Load("tempEncryptionKey".ConvertToSecureString()).Cast<CredentialRecord>());
|
||||
_credentialRecords.CollectionChanged += (o, args) => SaveCredentialList();
|
||||
_credentialRecords.PropertyChanged += (o, args) => SaveCredentialList();
|
||||
_credentialRecords = new List<ICredentialRecord>(credentialLoader.Load("tempEncryptionKey".ConvertToSecureString()));
|
||||
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Loaded credentials from file: {_credentialFilePath}", true);
|
||||
}
|
||||
|
||||
private void credentialManagerToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var credentialManager = new CredentialManagerForm(_credentialRecords);
|
||||
credentialManager.CredentialsChanged += (o, args) => SaveCredentialList();
|
||||
credentialManager.Show();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user