diff --git a/mRemoteV1/Credential/CredentialRepositoryList.cs b/mRemoteV1/Credential/CredentialRepositoryList.cs index 5ede7b277..8dadd9d68 100644 --- a/mRemoteV1/Credential/CredentialRepositoryList.cs +++ b/mRemoteV1/Credential/CredentialRepositoryList.cs @@ -23,8 +23,6 @@ namespace mRemoteNG.Credential RaiseCollectionChangedEvent(NotifyCollectionChangedAction.Add, new[] { credentialProvider }); } - - public void RemoveProvider(ICredentialRepository credentialProvider) { if (!Contains(credentialProvider.Config.Id)) return; diff --git a/mRemoteV1/UI/Controls/CredentialRepositoryListView.Designer.cs b/mRemoteV1/UI/Controls/CredentialRepositoryListView.Designer.cs new file mode 100644 index 000000000..ee257622c --- /dev/null +++ b/mRemoteV1/UI/Controls/CredentialRepositoryListView.Designer.cs @@ -0,0 +1,96 @@ +namespace mRemoteNG.UI.Controls +{ + partial class CredentialRepositoryListView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.objectListView1 = new BrightIdeasSoftware.ObjectListView(); + this.olvColumnProvider = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + this.olvColumnSource = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + ((System.ComponentModel.ISupportInitialize)(this.objectListView1)).BeginInit(); + this.SuspendLayout(); + // + // objectListView1 + // + this.objectListView1.AllColumns.Add(this.olvColumnProvider); + this.objectListView1.AllColumns.Add(this.olvColumnSource); + this.objectListView1.CellEditUseWholeCell = false; + this.objectListView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.olvColumnProvider, + this.olvColumnSource}); + this.objectListView1.CopySelectionOnControlC = false; + this.objectListView1.CopySelectionOnControlCUsesDragSource = false; + this.objectListView1.Cursor = System.Windows.Forms.Cursors.Default; + this.objectListView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.objectListView1.FullRowSelect = true; + this.objectListView1.HideSelection = false; + this.objectListView1.Location = new System.Drawing.Point(0, 0); + this.objectListView1.Name = "objectListView1"; + this.objectListView1.SelectAllOnControlA = false; + this.objectListView1.ShowGroups = false; + this.objectListView1.Size = new System.Drawing.Size(308, 171); + this.objectListView1.TabIndex = 8; + this.objectListView1.UseCompatibleStateImageBehavior = false; + this.objectListView1.UseNotifyPropertyChanged = true; + this.objectListView1.View = System.Windows.Forms.View.Details; + // + // olvColumnProvider + // + this.olvColumnProvider.AspectName = ""; + this.olvColumnProvider.FillsFreeSpace = true; + this.olvColumnProvider.Groupable = false; + this.olvColumnProvider.Hideable = false; + this.olvColumnProvider.IsEditable = false; + this.olvColumnProvider.Searchable = false; + this.olvColumnProvider.Text = "Provider"; + // + // olvColumnSource + // + this.olvColumnSource.AspectName = ""; + this.olvColumnSource.FillsFreeSpace = true; + this.olvColumnSource.Groupable = false; + this.olvColumnSource.Text = "Source"; + // + // CredentialRepositoryListView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.objectListView1); + this.Name = "CredentialRepositoryListView"; + this.Size = new System.Drawing.Size(308, 171); + ((System.ComponentModel.ISupportInitialize)(this.objectListView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private BrightIdeasSoftware.ObjectListView objectListView1; + private BrightIdeasSoftware.OLVColumn olvColumnProvider; + private BrightIdeasSoftware.OLVColumn olvColumnSource; + } +} diff --git a/mRemoteV1/UI/Controls/CredentialRepositoryListView.cs b/mRemoteV1/UI/Controls/CredentialRepositoryListView.cs new file mode 100644 index 000000000..3f7513f80 --- /dev/null +++ b/mRemoteV1/UI/Controls/CredentialRepositoryListView.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Specialized; +using System.Windows.Forms; +using BrightIdeasSoftware; +using mRemoteNG.Credential; +using mRemoteNG.Tree; + +namespace mRemoteNG.UI.Controls +{ + public partial class CredentialRepositoryListView : UserControl + { + private ICredentialRepositoryList _credentialRepositoryList = new CredentialRepositoryList(); + + public ICredentialRepositoryList CredentialRepositoryList + { + get { return _credentialRepositoryList; } + set + { + _credentialRepositoryList.CollectionChanged -= UpdateList; + _credentialRepositoryList = value; + objectListView1.SetObjects(CredentialRepositoryList.CredentialProviders); + _credentialRepositoryList.CollectionChanged += UpdateList; + } + } + + public ICredentialRepository SelectedRepository => GetSelectedRepository(); + public Func DoubleClickHandler { get; set; } + + public CredentialRepositoryListView() + { + InitializeComponent(); + SetupObjectListView(); + } + + private void SetupObjectListView() + { + olvColumnProvider.AspectGetter = rowObject => ((ICredentialRepository)rowObject).Config.TypeName; + olvColumnSource.AspectGetter = rowObject => ((ICredentialRepository)rowObject).Config.Source; + objectListView1.SetObjects(CredentialRepositoryList.CredentialProviders); + objectListView1.SelectionChanged += (sender, args) => RaiseSelectionChangedEvent(); + objectListView1.MouseDoubleClick += ObjectListView1OnMouseDoubleClick; + } + + private void UpdateList(object sender, NotifyCollectionChangedEventArgs args) + { + objectListView1.SetObjects(CredentialRepositoryList.CredentialProviders); + } + + private void ObjectListView1OnMouseDoubleClick(object sender, MouseEventArgs mouseEventArgs) + { + if (mouseEventArgs.Clicks < 2) return; + OLVColumn column; + var listItem = objectListView1.GetItemAt(mouseEventArgs.X, mouseEventArgs.Y, out column); + var clickedNode = listItem.RowObject as ICredentialRepository; + if (clickedNode == null) return; + DoubleClickHandler?.Invoke(clickedNode); + } + + private ICredentialRepository GetSelectedRepository() + { + return objectListView1.SelectedObject as ICredentialRepository; + } + + public event EventHandler SelectionChanged; + private void RaiseSelectionChangedEvent() + { + SelectionChanged?.Invoke(this, EventArgs.Empty); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/Controls/CredentialRepositoryListView.resx b/mRemoteV1/UI/Controls/CredentialRepositoryListView.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/mRemoteV1/UI/Controls/CredentialRepositoryListView.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialListPage.Designer.cs b/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialListPage.Designer.cs index 58e9884e2..f9d0f8b98 100644 --- a/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialListPage.Designer.cs +++ b/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialListPage.Designer.cs @@ -29,13 +29,14 @@ private void InitializeComponent() { this.objectListView1 = new BrightIdeasSoftware.ObjectListView(); + this.olvColumnCredentialId = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); this.olvColumnTitle = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); this.olvColumnUsername = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); this.olvColumnDomain = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + this.olvColumnSource = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); this.buttonAdd = new System.Windows.Forms.Button(); this.buttonRemove = new System.Windows.Forms.Button(); - this.olvColumnSource = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); - this.olvColumnCredentialId = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + this.buttonEdit = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.objectListView1)).BeginInit(); this.SuspendLayout(); // @@ -71,31 +72,42 @@ this.objectListView1.UseNotifyPropertyChanged = true; this.objectListView1.View = System.Windows.Forms.View.Details; // + // olvColumnCredentialId + // + this.olvColumnCredentialId.AspectName = ""; + this.olvColumnCredentialId.IsEditable = false; + this.olvColumnCredentialId.IsVisible = false; + this.olvColumnCredentialId.Text = "Credential ID"; + // // olvColumnTitle // - this.olvColumnTitle.AspectName = "Title"; + this.olvColumnTitle.AspectName = ""; this.olvColumnTitle.FillsFreeSpace = true; this.olvColumnTitle.Groupable = false; this.olvColumnTitle.Text = "Title"; // // olvColumnUsername // - this.olvColumnUsername.AspectName = "Username"; + this.olvColumnUsername.AspectName = ""; this.olvColumnUsername.FillsFreeSpace = true; this.olvColumnUsername.Text = "Username"; // // olvColumnDomain // - this.olvColumnDomain.AspectName = "Domain"; + this.olvColumnDomain.AspectName = ""; this.olvColumnDomain.FillsFreeSpace = true; this.olvColumnDomain.Text = "Domain"; // + // olvColumnSource + // + this.olvColumnSource.Text = "Source"; + // // buttonAdd // this.buttonAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonAdd.Image = global::mRemoteNG.Resources.key_add; this.buttonAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.buttonAdd.Location = new System.Drawing.Point(176, 241); + this.buttonAdd.Location = new System.Drawing.Point(71, 241); this.buttonAdd.Name = "buttonAdd"; this.buttonAdd.Size = new System.Drawing.Size(99, 32); this.buttonAdd.TabIndex = 3; @@ -117,21 +129,23 @@ this.buttonRemove.UseVisualStyleBackColor = true; this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click); // - // olvColumnSource + // buttonEdit // - this.olvColumnSource.Text = "Source"; - // - // olvColumnCredentialId - // - this.olvColumnCredentialId.AspectName = "Id"; - this.olvColumnCredentialId.IsEditable = false; - this.olvColumnCredentialId.IsVisible = false; - this.olvColumnCredentialId.Text = "Credential ID"; + this.buttonEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonEdit.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.buttonEdit.Location = new System.Drawing.Point(176, 241); + this.buttonEdit.Name = "buttonEdit"; + this.buttonEdit.Size = new System.Drawing.Size(99, 32); + this.buttonEdit.TabIndex = 5; + this.buttonEdit.Text = "Edit"; + this.buttonEdit.UseVisualStyleBackColor = true; + this.buttonEdit.Click += new System.EventHandler(this.buttonEdit_Click); // // CredentialListPage // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.buttonEdit); this.Controls.Add(this.buttonAdd); this.Controls.Add(this.buttonRemove); this.Controls.Add(this.objectListView1); @@ -152,5 +166,6 @@ private System.Windows.Forms.Button buttonRemove; private BrightIdeasSoftware.OLVColumn olvColumnCredentialId; private BrightIdeasSoftware.OLVColumn olvColumnSource; + private System.Windows.Forms.Button buttonEdit; } } diff --git a/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoriesPage.Designer.cs b/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoriesPage.Designer.cs index 7a50bc568..2845440dd 100644 --- a/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoriesPage.Designer.cs +++ b/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoriesPage.Designer.cs @@ -28,13 +28,11 @@ /// private void InitializeComponent() { + mRemoteNG.Credential.CredentialRepositoryList credentialRepositoryList1 = new mRemoteNG.Credential.CredentialRepositoryList(); this.buttonAdd = new System.Windows.Forms.Button(); this.buttonRemove = new System.Windows.Forms.Button(); - this.objectListView1 = new BrightIdeasSoftware.ObjectListView(); - this.olvColumnProvider = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); - this.olvColumnSource = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); this.buttonEdit = new System.Windows.Forms.Button(); - ((System.ComponentModel.ISupportInitialize)(this.objectListView1)).BeginInit(); + this.credentialRepositoryListView = new mRemoteNG.UI.Controls.CredentialRepositoryListView(); this.SuspendLayout(); // // buttonAdd @@ -64,49 +62,6 @@ this.buttonRemove.UseVisualStyleBackColor = true; this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click); // - // objectListView1 - // - this.objectListView1.AllColumns.Add(this.olvColumnProvider); - this.objectListView1.AllColumns.Add(this.olvColumnSource); - this.objectListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.objectListView1.CellEditUseWholeCell = false; - this.objectListView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.olvColumnProvider, - this.olvColumnSource}); - this.objectListView1.CopySelectionOnControlC = false; - this.objectListView1.CopySelectionOnControlCUsesDragSource = false; - this.objectListView1.Cursor = System.Windows.Forms.Cursors.Default; - this.objectListView1.FullRowSelect = true; - this.objectListView1.HideSelection = false; - this.objectListView1.Location = new System.Drawing.Point(0, 0); - this.objectListView1.Name = "objectListView1"; - this.objectListView1.SelectAllOnControlA = false; - this.objectListView1.ShowGroups = false; - this.objectListView1.Size = new System.Drawing.Size(417, 263); - this.objectListView1.TabIndex = 7; - this.objectListView1.UseCompatibleStateImageBehavior = false; - this.objectListView1.UseNotifyPropertyChanged = true; - this.objectListView1.View = System.Windows.Forms.View.Details; - // - // olvColumnProvider - // - this.olvColumnProvider.AspectName = ""; - this.olvColumnProvider.FillsFreeSpace = true; - this.olvColumnProvider.Groupable = false; - this.olvColumnProvider.Hideable = false; - this.olvColumnProvider.IsEditable = false; - this.olvColumnProvider.Searchable = false; - this.olvColumnProvider.Text = "Provider"; - // - // olvColumnSource - // - this.olvColumnSource.AspectName = ""; - this.olvColumnSource.FillsFreeSpace = true; - this.olvColumnSource.Groupable = false; - this.olvColumnSource.Text = "Source"; - // // buttonEdit // this.buttonEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); @@ -120,17 +75,28 @@ this.buttonEdit.UseVisualStyleBackColor = true; this.buttonEdit.Click += new System.EventHandler(this.buttonEdit_Click); // + // credentialRepositoryListView + // + this.credentialRepositoryListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.credentialRepositoryListView.CredentialRepositoryList = credentialRepositoryList1; + this.credentialRepositoryListView.DoubleClickHandler = null; + this.credentialRepositoryListView.Location = new System.Drawing.Point(0, 0); + this.credentialRepositoryListView.Name = "credentialRepositoryListView"; + this.credentialRepositoryListView.Size = new System.Drawing.Size(417, 263); + this.credentialRepositoryListView.TabIndex = 9; + // // CredentialRepositoriesPage // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.credentialRepositoryListView); this.Controls.Add(this.buttonEdit); - this.Controls.Add(this.objectListView1); this.Controls.Add(this.buttonAdd); this.Controls.Add(this.buttonRemove); this.Name = "CredentialRepositoriesPage"; this.Size = new System.Drawing.Size(417, 304); - ((System.ComponentModel.ISupportInitialize)(this.objectListView1)).EndInit(); this.ResumeLayout(false); } @@ -139,9 +105,7 @@ private System.Windows.Forms.Button buttonAdd; private System.Windows.Forms.Button buttonRemove; - private BrightIdeasSoftware.ObjectListView objectListView1; - private BrightIdeasSoftware.OLVColumn olvColumnProvider; - private BrightIdeasSoftware.OLVColumn olvColumnSource; private System.Windows.Forms.Button buttonEdit; + private Controls.CredentialRepositoryListView credentialRepositoryListView; } } diff --git a/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoriesPage.cs b/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoriesPage.cs index 4e53640cd..702100bfb 100644 --- a/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoriesPage.cs +++ b/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoriesPage.cs @@ -1,8 +1,6 @@ using System; using System.Drawing; -using System.Linq; using System.Windows.Forms; -using BrightIdeasSoftware; using mRemoteNG.Credential; using mRemoteNG.Credential.Repositories; using mRemoteNG.UI.Controls; @@ -26,41 +24,18 @@ namespace mRemoteNG.UI.Forms.CredentialManagerPages _providerCatalog = providerCatalog; InitializeComponent(); - SetupObjectListView(); - } - - private void SetupObjectListView() - { - olvColumnProvider.AspectGetter = rowObject => ((ICredentialRepository) rowObject).Config.TypeName; - olvColumnSource.AspectGetter = rowObject => ((ICredentialRepository)rowObject).Config.Source; - objectListView1.SetObjects(_providerCatalog.CredentialProviders); - _providerCatalog.CollectionChanged += (sender, args) => UpdateList(); - objectListView1.SelectionChanged += ObjectListView1OnSelectionChanged; - objectListView1.MouseDoubleClick += ObjectListView1OnMouseDoubleClick; + credentialRepositoryListView.CredentialRepositoryList = providerCatalog; + credentialRepositoryListView.SelectionChanged += ObjectListView1OnSelectionChanged; + credentialRepositoryListView.DoubleClickHandler = EditRepository; } private void ObjectListView1OnSelectionChanged(object sender, EventArgs eventArgs) { - var selectedRepository = objectListView1.SelectedObject as ICredentialRepository; + var selectedRepository = credentialRepositoryListView.SelectedRepository; buttonRemove.Enabled = selectedRepository != null; buttonEdit.Enabled = selectedRepository != null; } - private void ObjectListView1OnMouseDoubleClick(object sender, MouseEventArgs mouseEventArgs) - { - if (mouseEventArgs.Clicks < 2) return; - OLVColumn column; - var listItem = objectListView1.GetItemAt(mouseEventArgs.X, mouseEventArgs.Y, out column); - var clickedNode = listItem.RowObject as ICredentialRepository; - if (clickedNode == null) return; - EditRepository(clickedNode); - } - - private void UpdateList() - { - objectListView1.SetObjects(_providerCatalog.CredentialProviders); - } - private void buttonAdd_Click(object sender, EventArgs e) { var addRepoSequence = new PageSequence(Parent, @@ -82,12 +57,12 @@ namespace mRemoteNG.UI.Forms.CredentialManagerPages private void buttonEdit_Click(object sender, EventArgs e) { - var selectedRepository = objectListView1.SelectedObject as ICredentialRepository; + var selectedRepository = credentialRepositoryListView.SelectedRepository; if (selectedRepository == null) return; EditRepository(selectedRepository); } - private void EditRepository(ICredentialRepository repository) + private bool EditRepository(ICredentialRepository repository) { var editorPage = CredentialRepositoryPageEditorFactory.BuildXmlCredentialRepositoryEditorPage(repository.Config, _providerCatalog); var pageSequence = new PageSequence(Parent, @@ -96,13 +71,14 @@ namespace mRemoteNG.UI.Forms.CredentialManagerPages this ); RaiseNextPageEvent(); + return true; } private void buttonRemove_Click(object sender, EventArgs e) { - var selectedRepository = objectListView1.SelectedObject as ICredentialRepository; + var selectedRepository = credentialRepositoryListView.SelectedRepository; if (selectedRepository == null) return; - if (_providerCatalog.Contains(selectedRepository)) + if (_providerCatalog.Contains(selectedRepository.Config.Id)) _providerCatalog.RemoveProvider(selectedRepository); } } diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index d7ce00249..d720d073f 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -299,6 +299,12 @@ CredentialRecordListBox.cs + + UserControl + + + CredentialRepositoryListView.cs + Component @@ -663,6 +669,9 @@ Designer + + CredentialRepositoryListView.cs + IPTextBox.cs