optimized event raising so we only save the credential list once for multiple property changes

This commit is contained in:
David Sparer
2017-01-20 13:02:57 -07:00
parent 6c0b33c0dc
commit 7b851e7ac8
4 changed files with 37 additions and 80 deletions

View File

@@ -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));
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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();
}