diff --git a/JexusManager.Features.Authorization/AuthorizationPage.Designer.cs b/JexusManager.Features.Authorization/AuthorizationPage.Designer.cs index 80e50877..74acc692 100644 --- a/JexusManager.Features.Authorization/AuthorizationPage.Designer.cs +++ b/JexusManager.Features.Authorization/AuthorizationPage.Designer.cs @@ -116,7 +116,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1_KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1_SelectedIndexChanged); // // chMode // diff --git a/JexusManager.Features.Authorization/AuthorizationPage.cs b/JexusManager.Features.Authorization/AuthorizationPage.cs index 3c31ba49..00ee7c2e 100644 --- a/JexusManager.Features.Authorization/AuthorizationPage.cs +++ b/JexusManager.Features.Authorization/AuthorizationPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class AuthorizationListViewItem : ListViewItem + private sealed class AuthorizationListViewItem : ListViewItem, IFeatureListViewItem { public AuthorizationRule Item { get; } @@ -107,13 +107,23 @@ protected override void Refresh() base.Refresh(); } - private void listView1_SelectedIndexChanged(object sender, EventArgs e) + private void ListView1_KeyDown(object sender, KeyEventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((AuthorizationListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) - this.Refresh(); + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1_MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + + private void ListView1_SelectedIndexChanged(object sender, EventArgs e) + { + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); } protected override bool ShowHelp() diff --git a/JexusManager.Features.Caching/CachingPage.Designer.cs b/JexusManager.Features.Caching/CachingPage.Designer.cs index b65dc050..43442316 100644 --- a/JexusManager.Features.Caching/CachingPage.Designer.cs +++ b/JexusManager.Features.Caching/CachingPage.Designer.cs @@ -119,6 +119,8 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chExtension diff --git a/JexusManager.Features.Caching/CachingPage.cs b/JexusManager.Features.Caching/CachingPage.cs index dff12b2f..b29f5939 100644 --- a/JexusManager.Features.Caching/CachingPage.cs +++ b/JexusManager.Features.Caching/CachingPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class CachingListViewItem : ListViewItem + private sealed class CachingListViewItem : ListViewItem, IFeatureListViewItem { public CachingItem Item { get; } @@ -115,6 +115,19 @@ protected override void Refresh() base.Refresh(); } + private void ListView1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void ListView1SelectedIndexChanged(object sender, EventArgs e) { _feature.SelectedItem = listView1.SelectedItems.Count > 0 diff --git a/JexusManager.Features.Certificates/CertificatesFeature.cs b/JexusManager.Features.Certificates/CertificatesFeature.cs index f7c29fb3..d4a03639 100644 --- a/JexusManager.Features.Certificates/CertificatesFeature.cs +++ b/JexusManager.Features.Certificates/CertificatesFeature.cs @@ -31,7 +31,7 @@ namespace JexusManager.Features.Certificates { - public class CertificatesFeature + public class CertificatesFeature : FeatureBase { private static readonly ILogger _logger = LogHelper.GetLogger("CertificatesFeature"); @@ -62,7 +62,7 @@ public override ICollection GetTaskItems() { result.Add(MethodTaskItem.CreateSeparator().SetUsage()); result.Add(new MethodTaskItem("View", "View...", string.Empty).SetUsage()); - X509Certificate2 certificate = _owner.SelectedItem.Certificate; + X509Certificate2 certificate = _owner.SelectedItem.Item; if (certificate.HasPrivateKey) { try @@ -214,8 +214,8 @@ public void Trust() } public CertificatesFeature(Microsoft.Web.Management.Client.Module module) + : base(module) { - Module = module; } protected static readonly Version FxVersion10 = new Version("1.0"); @@ -224,17 +224,6 @@ public CertificatesFeature(Microsoft.Web.Management.Client.Module module) protected static readonly Version FxVersionNotRequired = new Version(); private FeatureTaskList _taskList; - protected void DisplayErrorMessage(Exception ex, ResourceManager resourceManager) - { - var service = (IManagementUIService)GetService(typeof(IManagementUIService)); - service.ShowError(ex, resourceManager.GetString("General"), "", false); - } - - protected object GetService(Type type) - { - return (Module as IServiceProvider).GetService(type); - } - public TaskList GetTaskList() { return _taskList ?? (_taskList = new FeatureTaskList(this)); @@ -333,7 +322,7 @@ private void DeleteCertificate() start.UseShellExecute = true; start.FileName = "cmd"; start.Arguments = - $"/c \"\"{CertificateInstallerLocator.FileName}\" /h:\"{SelectedItem.Certificate.Thumbprint}\" /s:{(SelectedItem.Store == "Personal" ? "MY" : "WebHosting")}\""; + $"/c \"\"{CertificateInstallerLocator.FileName}\" /h:\"{SelectedItem.Item.Thumbprint}\" /s:{(SelectedItem.Store == "Personal" ? "MY" : "WebHosting")}\""; start.CreateNoWindow = true; start.WindowStyle = ProcessWindowStyle.Hidden; process.Start(); @@ -424,25 +413,29 @@ private void CreateRequest() private void Export() { - using var dialog = new ExportCertificateDialog(SelectedItem.Certificate, Module, this); + using var dialog = new ExportCertificateDialog(SelectedItem.Item, Module, this); dialog.ShowDialog(); } private void Renew() { - using var wizard = new CertificateRenewWizard(SelectedItem.Certificate, Module, this); + using var wizard = new CertificateRenewWizard(SelectedItem.Item, Module, this); wizard.ShowDialog(); } internal void View() { - var cert = SelectedItem.Certificate; - DialogHelper.DisplayCertificate(cert, IntPtr.Zero); + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(CertificatesItem item) + { + DialogHelper.DisplayCertificate(item.Item, IntPtr.Zero); } private void Trust() { - var cert = SelectedItem.Certificate; + var cert = SelectedItem.Item; var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); if (store.Certificates.Find(X509FindType.FindByThumbprint, cert.Thumbprint, false).Count == 0) @@ -469,25 +462,25 @@ private void Trust() store.Close(); } - public bool AutomicRebindEnabled { get; set; } + protected override ConfigurationElementCollection GetCollection(IConfigurationService service) + { + throw new NotImplementedException(); + } + + protected override void OnSettingsSaved() + { + } - public CertificatesItem SelectedItem { get; internal set; } + public bool AutomicRebindEnabled { get; set; } public CertificatesSettingsSavedEventHandler CertificatesSettingsUpdated { get; set; } public string Description { get; } - public virtual bool IsFeatureEnabled - { - get { return true; } - } - public virtual Version MinimumFrameworkVersion { get { return FxVersionNotRequired; } } - public Microsoft.Web.Management.Client.Module Module { get; } - public string Name { get diff --git a/JexusManager.Features.Certificates/CertificatesItem.cs b/JexusManager.Features.Certificates/CertificatesItem.cs index d638a532..d39a90c8 100644 --- a/JexusManager.Features.Certificates/CertificatesItem.cs +++ b/JexusManager.Features.Certificates/CertificatesItem.cs @@ -4,25 +4,41 @@ namespace JexusManager.Features.Certificates { - using System; using System.Security.Cryptography.X509Certificates; + using Microsoft.Web.Administration; - public class CertificatesItem : IEquatable + public class CertificatesItem : IItem { public CertificatesItem(X509Certificate2 certificate, string store, CertificatesFeature feature) { - Certificate = certificate; + Item = certificate; Store = store; Feature = feature; } - public X509Certificate2 Certificate { get; set; } + public X509Certificate2 Item { get; set; } public string Store { get; set; } public CertificatesFeature Feature { get; private set; } + public string Flag { get; set; } + public ConfigurationElement Element { get; set; } + + public void Apply() + { + } public bool Equals(CertificatesItem other) { - return other != null && other.Certificate.GetCertHashString() == Certificate.GetCertHashString(); + return other != null && Equals(other.Item); + } + + public bool Equals(X509Certificate2 other) + { + return other != null && other.GetCertHashString() == Item.GetCertHashString(); + } + + public bool Match(CertificatesItem other) + { + return Equals(other); } } } diff --git a/JexusManager.Features.Certificates/CertificatesPage.Designer.cs b/JexusManager.Features.Certificates/CertificatesPage.Designer.cs index 94b94605..213cd3a7 100644 --- a/JexusManager.Features.Certificates/CertificatesPage.Designer.cs +++ b/JexusManager.Features.Certificates/CertificatesPage.Designer.cs @@ -130,8 +130,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1_KeyDown); this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); // // chName // diff --git a/JexusManager.Features.Certificates/CertificatesPage.cs b/JexusManager.Features.Certificates/CertificatesPage.cs index 40d627fb..77eea0fc 100644 --- a/JexusManager.Features.Certificates/CertificatesPage.cs +++ b/JexusManager.Features.Certificates/CertificatesPage.cs @@ -16,7 +16,7 @@ namespace JexusManager.Features.Certificates using Microsoft.Web.Management.Client; using Microsoft.Web.Management.Client.Win32; - internal partial class CertificatesPage : ModuleListPage + public partial class CertificatesPage : ModuleListPage { private sealed class PageTaskList : ShowHelpTaskList { @@ -34,20 +34,20 @@ public override void ShowHelp() } } - private sealed class CertificatesListViewItem : ListViewItem + private sealed class CertificatesListViewItem : ListViewItem, IFeatureListViewItem { public CertificatesItem Item { get; } private readonly CertificatesPage _page; public CertificatesListViewItem(CertificatesItem item, CertificatesPage page) - : base(item.Certificate.FriendlyName) + : base(item.Item.FriendlyName) { Item = item; _page = page; - SubItems.Add(new ListViewSubItem(this, item.Certificate.GetNameInfo(X509NameType.SimpleName, false))); - SubItems.Add(new ListViewSubItem(this, item.Certificate.GetNameInfo(X509NameType.SimpleName, true))); - SubItems.Add(new ListViewSubItem(this, item.Certificate.GetExpirationDateString())); - SubItems.Add(new ListViewSubItem(this, item.Certificate.GetCertHashString())); + SubItems.Add(new ListViewSubItem(this, item.Item.GetNameInfo(X509NameType.SimpleName, false))); + SubItems.Add(new ListViewSubItem(this, item.Item.GetNameInfo(X509NameType.SimpleName, true))); + SubItems.Add(new ListViewSubItem(this, item.Item.GetExpirationDateString())); + SubItems.Add(new ListViewSubItem(this, item.Item.GetCertHashString())); SubItems.Add(new ListViewSubItem(this, item.Store)); } } @@ -102,11 +102,22 @@ protected override void Refresh() base.Refresh(); } + private void ListView1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1_MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void listView1_SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((CertificatesListViewItem)listView1.SelectedItems[0]).Item - : null; + _feature.HandleSelectedIndexChanged(listView1); Refresh(); } @@ -138,13 +149,5 @@ protected override TaskListCollection Tasks return base.Tasks; } } - - private void ListView1_MouseDoubleClick(object sender, MouseEventArgs e) - { - if (listView1.SelectedItems.Count > 0) - { - _feature.View(); - } - } } } diff --git a/JexusManager.Features.DefaultDocument/DefaultDocumentFeature.cs b/JexusManager.Features.DefaultDocument/DefaultDocumentFeature.cs index 2fdba4b5..7ac86cb6 100644 --- a/JexusManager.Features.DefaultDocument/DefaultDocumentFeature.cs +++ b/JexusManager.Features.DefaultDocument/DefaultDocumentFeature.cs @@ -66,7 +66,7 @@ public override ICollection GetTaskItems() if (_owner.CanRevert) { - result.Add(new MethodTaskItem("Revert", "Revert To Parent", string.Empty).SetUsage()); + result.Add(RevertTaskItem); } return result.ToArray(typeof(TaskItem)) as TaskItem[]; diff --git a/JexusManager.Features.DefaultDocument/DefaultDocumentPage.Designer.cs b/JexusManager.Features.DefaultDocument/DefaultDocumentPage.Designer.cs index ad4fbd70..31ce453f 100644 --- a/JexusManager.Features.DefaultDocument/DefaultDocumentPage.Designer.cs +++ b/JexusManager.Features.DefaultDocument/DefaultDocumentPage.Designer.cs @@ -135,7 +135,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1_KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1_SelectedIndexChanged); // // chName // diff --git a/JexusManager.Features.DefaultDocument/DefaultDocumentPage.cs b/JexusManager.Features.DefaultDocument/DefaultDocumentPage.cs index e3e2bfe7..0fd3099b 100644 --- a/JexusManager.Features.DefaultDocument/DefaultDocumentPage.cs +++ b/JexusManager.Features.DefaultDocument/DefaultDocumentPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class DefaultDocumentListViewItem : ListViewItem + private sealed class DefaultDocumentListViewItem : ListViewItem, IFeatureListViewItem { public DocumentItem Item { get; } private readonly DefaultDocumentPage _page; @@ -97,12 +97,23 @@ protected override void Refresh() base.Refresh(); } - private void listView1_SelectedIndexChanged(object sender, EventArgs e) + private void ListView1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1_MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + + private void ListView1_SelectedIndexChanged(object sender, EventArgs e) { // TODO: use WatchDog to suppress extra refresh (one selection triggers this event twice) - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((DefaultDocumentListViewItem)listView1.SelectedItems[0]).Item - : null; + _feature.HandleSelectedIndexChanged(listView1); Refresh(); } diff --git a/JexusManager.Features.FastCgi/FastCgiFeature.cs b/JexusManager.Features.FastCgi/FastCgiFeature.cs index 7fa72c68..9bc0fbad 100644 --- a/JexusManager.Features.FastCgi/FastCgiFeature.cs +++ b/JexusManager.Features.FastCgi/FastCgiFeature.cs @@ -126,6 +126,11 @@ public void Remove() } public void Edit() + { + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(FastCgiItem item) { using var dialog = new NewApplicationDialog(Module, SelectedItem, this); if (dialog.ShowDialog() != DialogResult.OK) diff --git a/JexusManager.Features.FastCgi/FastCgiPage.Designer.cs b/JexusManager.Features.FastCgi/FastCgiPage.Designer.cs index 0f93ab49..20baf3e2 100644 --- a/JexusManager.Features.FastCgi/FastCgiPage.Designer.cs +++ b/JexusManager.Features.FastCgi/FastCgiPage.Designer.cs @@ -114,8 +114,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chPath // diff --git a/JexusManager.Features.FastCgi/FastCgiPage.cs b/JexusManager.Features.FastCgi/FastCgiPage.cs index 6092e541..66bb7e00 100644 --- a/JexusManager.Features.FastCgi/FastCgiPage.cs +++ b/JexusManager.Features.FastCgi/FastCgiPage.cs @@ -31,7 +31,7 @@ public override void ShowHelp() } } - private sealed class FastCgiListViewItem : ListViewItem + private sealed class FastCgiListViewItem : ListViewItem, IFeatureListViewItem { public FastCgiItem Item { get; } @@ -96,12 +96,22 @@ protected override void Refresh() base.Refresh(); } + private void ListView1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void ListView1SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((FastCgiListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) + _feature.HandleSelectedIndexChanged(listView1); Refresh(); } @@ -125,10 +135,5 @@ protected override TaskListCollection Tasks return base.Tasks; } } - - private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) - { - _feature.Edit(); - } } } diff --git a/JexusManager.Features.Handlers/HandlersFeature.cs b/JexusManager.Features.Handlers/HandlersFeature.cs index a3ddf1b0..982f1924 100644 --- a/JexusManager.Features.Handlers/HandlersFeature.cs +++ b/JexusManager.Features.Handlers/HandlersFeature.cs @@ -64,6 +64,7 @@ public override ICollection GetTaskItems() { result.Add(MethodTaskItem.CreateSeparator().SetUsage()); result.Add(new MethodTaskItem("Edit", "Edit...", string.Empty).SetUsage()); + result.Add(new MethodTaskItem("Rename", "Rename", string.Empty).SetUsage()); result.Add(RemoveTaskItem); } @@ -71,7 +72,7 @@ public override ICollection GetTaskItems() result.Add(new MethodTaskItem("Set", "Edit Feature Permissions...", string.Empty).SetUsage()); if (_owner.CanRevert) { - result.Add(new MethodTaskItem("Revert", "Revert to Parent", string.Empty).SetUsage()); + result.Add(RevertTaskItem); } result.Add(new MethodTaskItem("InOrder", "View Ordered List...", string.Empty).SetUsage()); @@ -303,6 +304,7 @@ public void Edit() public void Rename() { + RenameInline(SelectedItem); } public void MoveUp() diff --git a/JexusManager.Features.Handlers/HandlersPage.Designer.cs b/JexusManager.Features.Handlers/HandlersPage.Designer.cs index a415547c..af4aaa6f 100644 --- a/JexusManager.Features.Handlers/HandlersPage.Designer.cs +++ b/JexusManager.Features.Handlers/HandlersPage.Designer.cs @@ -123,6 +123,8 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chName diff --git a/JexusManager.Features.Handlers/HandlersPage.cs b/JexusManager.Features.Handlers/HandlersPage.cs index b3d7579c..fc32a77a 100644 --- a/JexusManager.Features.Handlers/HandlersPage.cs +++ b/JexusManager.Features.Handlers/HandlersPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class HandlersListViewItem : ListViewItem + private sealed class HandlersListViewItem : ListViewItem, IFeatureListViewItem { public HandlersItem Item { get; } @@ -57,18 +57,35 @@ public HandlersListViewItem(HandlersItem item, HandlersPage page) public HandlersPage() { - this.InitializeComponent(); + InitializeComponent(); } protected override void Initialize(object navigationData) { base.Initialize(navigationData); - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); pictureBox1.Image = service.Scope.GetImage(); - _feature = new HandlersFeature(this.Module); - _feature.HandlersSettingsUpdated = this.InitializeListPage; + _feature = new HandlersFeature(Module); + _feature.HandlersSettingsUpdated = InitializeListPage; _feature.Load(); + + _feature.HandleMouseClick(listView1, (item, text) => + { + item.Name = text; + item.Apply(); + }, + text => + { + if (_feature.FindDuplicate(item => item.Name, text)) + { + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + service.ShowMessage("A handler with this name already exists.", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + + return true; + }); } protected override void InitializeListPage() @@ -97,17 +114,27 @@ protected override void InitializeListPage() protected override void Refresh() { - this.Tasks.Fill(tsActionPanel, cmsActionPanel); + Tasks.Fill(tsActionPanel, cmsActionPanel); base.Refresh(); } + private void ListView1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void ListView1SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((HandlersListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) - this.Refresh(); + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); } protected override bool ShowHelp() diff --git a/JexusManager.Features.HttpApi/HttpApiFeature.cs b/JexusManager.Features.HttpApi/HttpApiFeature.cs index 67528a50..34ee1220 100644 --- a/JexusManager.Features.HttpApi/HttpApiFeature.cs +++ b/JexusManager.Features.HttpApi/HttpApiFeature.cs @@ -2,6 +2,7 @@ // // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using Microsoft.Web.Administration; using Microsoft.Web.Management.Client; using System; diff --git a/JexusManager.Features.HttpApi/HttpApiPage.cs b/JexusManager.Features.HttpApi/HttpApiPage.cs index 4db65eb1..5c8bd4e0 100644 --- a/JexusManager.Features.HttpApi/HttpApiPage.cs +++ b/JexusManager.Features.HttpApi/HttpApiPage.cs @@ -34,7 +34,7 @@ public override void ShowHelp() } } - private sealed class SniMappingListViewItem : ListViewItem + private sealed class SniMappingListViewItem : ListViewItem, IFeatureListViewItem { public SniMappingItem Item { get; } private readonly HttpApiPage _page; @@ -72,7 +72,7 @@ public SniMappingListViewItem(SniMappingItem item, HttpApiPage page) } } - private sealed class IpMappingListViewItem : ListViewItem + private sealed class IpMappingListViewItem : ListViewItem, IFeatureListViewItem { public IpMappingItem Item { get; } private readonly HttpApiPage _page; @@ -110,7 +110,7 @@ public IpMappingListViewItem(IpMappingItem item, HttpApiPage page) } } - private sealed class ReservedUrlListViewItem : ListViewItem + private sealed class ReservedUrlListViewItem : ListViewItem, IFeatureListViewItem { public ReservedUrlsItem Item { get; } private readonly HttpApiPage _page; diff --git a/JexusManager.Features.HttpErrors/HttpErrorsFeature.cs b/JexusManager.Features.HttpErrors/HttpErrorsFeature.cs index 19cc392f..e3567bc8 100644 --- a/JexusManager.Features.HttpErrors/HttpErrorsFeature.cs +++ b/JexusManager.Features.HttpErrors/HttpErrorsFeature.cs @@ -135,15 +135,18 @@ public void Remove() public void Edit() { - using (var dialog = new NewErrorDialog(Module, SelectedItem, this)) + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(HttpErrorsItem item) + { + using var dialog = new NewErrorDialog(Module, item, this); + if (dialog.ShowDialog() != DialogResult.OK) { - if (dialog.ShowDialog() != DialogResult.OK) - { - return; - } + return; } - EditItem(SelectedItem); + EditItem(dialog.Item); } public void Set() diff --git a/JexusManager.Features.HttpErrors/HttpErrorsPage.Designer.cs b/JexusManager.Features.HttpErrors/HttpErrorsPage.Designer.cs index c610e7c8..2c5b2e41 100644 --- a/JexusManager.Features.HttpErrors/HttpErrorsPage.Designer.cs +++ b/JexusManager.Features.HttpErrors/HttpErrorsPage.Designer.cs @@ -120,6 +120,8 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1_KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDoubleClick); this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); // // chStatus diff --git a/JexusManager.Features.HttpErrors/HttpErrorsPage.cs b/JexusManager.Features.HttpErrors/HttpErrorsPage.cs index 8f942672..5b3e7b97 100644 --- a/JexusManager.Features.HttpErrors/HttpErrorsPage.cs +++ b/JexusManager.Features.HttpErrors/HttpErrorsPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class CustomErrorsListViewItem : ListViewItem + private sealed class CustomErrorsListViewItem : ListViewItem, IFeatureListViewItem { public HttpErrorsItem Item { get; } private readonly HttpErrorsPage _page; @@ -96,12 +96,22 @@ protected override void Refresh() base.Refresh(); } + private void ListView1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1_MouseDoubleClick(object sender, EventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void listView1_SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((CustomErrorsListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) + _feature.HandleSelectedIndexChanged(listView1); Refresh(); } diff --git a/JexusManager.Features.IpSecurity/IpSecurityFeature.cs b/JexusManager.Features.IpSecurity/IpSecurityFeature.cs index 8136a9e8..817c00f3 100644 --- a/JexusManager.Features.IpSecurity/IpSecurityFeature.cs +++ b/JexusManager.Features.IpSecurity/IpSecurityFeature.cs @@ -57,7 +57,7 @@ public override ICollection GetTaskItems() result.Add(new MethodTaskItem("Set", "Edit Feature Settings...", string.Empty).SetUsage()); if (_owner.CanRevert) { - result.Add(new MethodTaskItem("Revert", "Revert To Parent", string.Empty).SetUsage()); + result.Add(RevertTaskItem); } result.Add(new MethodTaskItem("View", "View Ordered List...", string.Empty).SetUsage()); diff --git a/JexusManager.Features.IpSecurity/IpSecurityPage.Designer.cs b/JexusManager.Features.IpSecurity/IpSecurityPage.Designer.cs index f77beb13..f1bbd749 100644 --- a/JexusManager.Features.IpSecurity/IpSecurityPage.Designer.cs +++ b/JexusManager.Features.IpSecurity/IpSecurityPage.Designer.cs @@ -117,6 +117,8 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1_KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDoubleClick); this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); // // chMode diff --git a/JexusManager.Features.IpSecurity/IpSecurityPage.cs b/JexusManager.Features.IpSecurity/IpSecurityPage.cs index 01516bd4..4d8a4dbf 100644 --- a/JexusManager.Features.IpSecurity/IpSecurityPage.cs +++ b/JexusManager.Features.IpSecurity/IpSecurityPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class IpSecurityListViewItem : ListViewItem + private sealed class IpSecurityListViewItem : ListViewItem, IFeatureListViewItem { public IpSecurityItem Item { get; } private readonly IpSecurityPage _page; @@ -96,12 +96,22 @@ protected override void Refresh() base.Refresh(); } + private void ListView1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1_MouseDoubleClick(object sender, EventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void listView1_SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((IpSecurityListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) + _feature.HandleSelectedIndexChanged(listView1); Refresh(); } diff --git a/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionFeature.cs b/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionFeature.cs index 84087bf6..60474bea 100644 --- a/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionFeature.cs +++ b/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionFeature.cs @@ -193,7 +193,12 @@ public void Remove() public void Edit() { - using var dialog = new NewRestrictionDialog(Module, SelectedItem, this); + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(IsapiCgiRestrictionItem item) + { + using var dialog = new NewRestrictionDialog(Module, item, this); if (dialog.ShowDialog() != DialogResult.OK) { return; diff --git a/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionPage.Designer.cs b/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionPage.Designer.cs index 4212c02d..247ad2b4 100644 --- a/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionPage.Designer.cs +++ b/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionPage.Designer.cs @@ -117,6 +117,8 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chDescription diff --git a/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionPage.cs b/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionPage.cs index 099d8a19..8f1cc48f 100644 --- a/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionPage.cs +++ b/JexusManager.Features.IsapiCgiRestriction/IsapiCgiRestrictionPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class IsapiCgiRestrictionListViewItem : ListViewItem + private sealed class IsapiCgiRestrictionListViewItem : ListViewItem, IFeatureListViewItem { public IsapiCgiRestrictionItem Item { get; } @@ -97,12 +97,22 @@ protected override void Refresh() base.Refresh(); } + private void ListView1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void ListView1SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((IsapiCgiRestrictionListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) + _feature.HandleSelectedIndexChanged(listView1); Refresh(); } diff --git a/JexusManager.Features.IsapiFilters/IsapiFiltersFeature.cs b/JexusManager.Features.IsapiFilters/IsapiFiltersFeature.cs index 73b05fee..314d45ea 100644 --- a/JexusManager.Features.IsapiFilters/IsapiFiltersFeature.cs +++ b/JexusManager.Features.IsapiFilters/IsapiFiltersFeature.cs @@ -65,7 +65,7 @@ public override ICollection GetTaskItems() result.Add(MethodTaskItem.CreateSeparator().SetUsage()); if (_owner.CanRevert) { - result.Add(new MethodTaskItem("Revert", "Revert to Parent", string.Empty).SetUsage()); + result.Add(RevertTaskItem); } result.Add(new MethodTaskItem("InOrder", "View Ordered List...", string.Empty).SetUsage()); @@ -186,7 +186,12 @@ public void Remove() public void Edit() { - using var dialog = new NewFilterDialog(Module, SelectedItem, this); + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(IsapiFiltersItem item) + { + using var dialog = new NewFilterDialog(Module, item, this); if (dialog.ShowDialog() != DialogResult.OK) { return; @@ -197,6 +202,7 @@ public void Edit() public void Rename() { + RenameInline(SelectedItem); } public void MoveUp() diff --git a/JexusManager.Features.IsapiFilters/IsapiFiltersPage.Designer.cs b/JexusManager.Features.IsapiFilters/IsapiFiltersPage.Designer.cs index 4b790544..21b988f3 100644 --- a/JexusManager.Features.IsapiFilters/IsapiFiltersPage.Designer.cs +++ b/JexusManager.Features.IsapiFilters/IsapiFiltersPage.Designer.cs @@ -117,6 +117,8 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chName diff --git a/JexusManager.Features.IsapiFilters/IsapiFiltersPage.cs b/JexusManager.Features.IsapiFilters/IsapiFiltersPage.cs index 9f314b09..8aa5bf88 100644 --- a/JexusManager.Features.IsapiFilters/IsapiFiltersPage.cs +++ b/JexusManager.Features.IsapiFilters/IsapiFiltersPage.cs @@ -31,7 +31,7 @@ public override void ShowHelp() } } - private sealed class IsapiFiltersListViewItem : ListViewItem + private sealed class IsapiFiltersListViewItem : ListViewItem, IFeatureListViewItem { public IsapiFiltersItem Item { get; } @@ -64,6 +64,23 @@ protected override void Initialize(object navigationData) _feature = new IsapiFiltersFeature(Module); _feature.IsapiFiltersSettingsUpdated = InitializeListPage; _feature.Load(); + + _feature.HandleMouseClick(listView1, (item, text) => + { + item.Name = text; + item.Apply(); + }, + text => + { + if (_feature.FindDuplicate(item => item.Name, text)) + { + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + service.ShowMessage("An ISAPI filter with this name already exists.", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + + return true; + }); } protected override void InitializeListPage() @@ -96,12 +113,22 @@ protected override void Refresh() base.Refresh(); } + private void ListView1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void ListView1SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((IsapiFiltersListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) + _feature.HandleSelectedIndexChanged(listView1); Refresh(); } diff --git a/JexusManager.Features.MimeMap/MimeMapFeature.cs b/JexusManager.Features.MimeMap/MimeMapFeature.cs index 3521fe97..52cf5209 100644 --- a/JexusManager.Features.MimeMap/MimeMapFeature.cs +++ b/JexusManager.Features.MimeMap/MimeMapFeature.cs @@ -131,6 +131,11 @@ public void Remove() public void Edit() { + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(MimeMapItem item) + { using var dialog = new NewMapItemDialog(Module, SelectedItem, this); if (dialog.ShowDialog() != DialogResult.OK) { diff --git a/JexusManager.Features.MimeMap/MimeMapPage.Designer.cs b/JexusManager.Features.MimeMap/MimeMapPage.Designer.cs index e3d54338..c37650e6 100644 --- a/JexusManager.Features.MimeMap/MimeMapPage.Designer.cs +++ b/JexusManager.Features.MimeMap/MimeMapPage.Designer.cs @@ -117,6 +117,8 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1_KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDoubleClick); this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); // // chExtension diff --git a/JexusManager.Features.MimeMap/MimeMapPage.cs b/JexusManager.Features.MimeMap/MimeMapPage.cs index a705c7e4..e83f45bb 100644 --- a/JexusManager.Features.MimeMap/MimeMapPage.cs +++ b/JexusManager.Features.MimeMap/MimeMapPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class MimeMapListViewItem : ListViewItem + private sealed class MimeMapListViewItem : ListViewItem, IFeatureListViewItem { public MimeMapItem Item { get; } @@ -42,10 +42,10 @@ private sealed class MimeMapListViewItem : ListViewItem public MimeMapListViewItem(MimeMapItem item, MimeMapPage page) : base(item.FileExtension) { - this.Item = item; + Item = item; _page = page; - this.SubItems.Add(new ListViewSubItem(this, item.MimeType)); - this.SubItems.Add(new ListViewSubItem(this, item.Flag)); + SubItems.Add(new ListViewSubItem(this, item.MimeType)); + SubItems.Add(new ListViewSubItem(this, item.Flag)); } } @@ -54,17 +54,17 @@ public MimeMapListViewItem(MimeMapItem item, MimeMapPage page) public MimeMapPage() { - this.InitializeComponent(); + InitializeComponent(); } protected override void Initialize(object navigationData) { base.Initialize(navigationData); - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); pictureBox1.Image = service.Scope.GetImage(); - _feature = new MimeMapFeature(this.Module); - _feature.MimeMapSettingsUpdated = this.InitializeListPage; + _feature = new MimeMapFeature(Module); + _feature.MimeMapSettingsUpdated = InitializeListPage; _feature.Load(); } @@ -78,7 +78,7 @@ protected override void InitializeListPage() if (_feature.SelectedItem == null) { - this.Refresh(); + Refresh(); return; } @@ -93,17 +93,27 @@ protected override void InitializeListPage() protected override void Refresh() { - this.Tasks.Fill(tsActionPanel, cmsActionPanel); + Tasks.Fill(tsActionPanel, cmsActionPanel); base.Refresh(); } + private void ListView1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1_MouseDoubleClick(object sender, EventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void listView1_SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((MimeMapListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) - this.Refresh(); + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); } protected override bool ShowHelp() diff --git a/JexusManager.Features.Modules/ModulesFeature.cs b/JexusManager.Features.Modules/ModulesFeature.cs index fe9a418b..e63ab594 100644 --- a/JexusManager.Features.Modules/ModulesFeature.cs +++ b/JexusManager.Features.Modules/ModulesFeature.cs @@ -65,7 +65,7 @@ public override ICollection GetTaskItems() result.Add(MethodTaskItem.CreateSeparator().SetUsage()); if (_owner.CanRevert) { - result.Add(new MethodTaskItem("Revert", "Revert to Parent", string.Empty).SetUsage()); + result.Add(RevertTaskItem); } result.Add(new MethodTaskItem("InOrder", "View Ordered List...", string.Empty).SetUsage()); @@ -264,6 +264,11 @@ public void Remove() } public void Edit() + { + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(ModulesItem item) { using var dialog = new NewModuleDialog(Module, SelectedItem, this); if (dialog.ShowDialog() != DialogResult.OK) diff --git a/JexusManager.Features.Modules/ModulesPage.Designer.cs b/JexusManager.Features.Modules/ModulesPage.Designer.cs index 627d381b..58606841 100644 --- a/JexusManager.Features.Modules/ModulesPage.Designer.cs +++ b/JexusManager.Features.Modules/ModulesPage.Designer.cs @@ -119,6 +119,8 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chName diff --git a/JexusManager.Features.Modules/ModulesPage.cs b/JexusManager.Features.Modules/ModulesPage.cs index b433a7ab..894218dd 100644 --- a/JexusManager.Features.Modules/ModulesPage.cs +++ b/JexusManager.Features.Modules/ModulesPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class ModulesListViewItem : ListViewItem + private sealed class ModulesListViewItem : ListViewItem, IFeatureListViewItem { public ModulesItem Item { get; } @@ -99,12 +99,22 @@ protected override void Refresh() base.Refresh(); } + private void ListView1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } + } + + private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + private void ListView1SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((ModulesListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) + _feature.HandleSelectedIndexChanged(listView1); Refresh(); } diff --git a/JexusManager.Features.RequestFiltering/RequestFilteringFeature.cs b/JexusManager.Features.RequestFiltering/RequestFilteringFeature.cs index f894dbc8..a81f0e00 100644 --- a/JexusManager.Features.RequestFiltering/RequestFilteringFeature.cs +++ b/JexusManager.Features.RequestFiltering/RequestFilteringFeature.cs @@ -13,7 +13,7 @@ namespace JexusManager.Features.RequestFiltering { using System; - + using Microsoft.Web.Administration; using Microsoft.Web.Management.Client; /// diff --git a/JexusManager.Features.RequestFiltering/RequestFilteringPage.cs b/JexusManager.Features.RequestFiltering/RequestFilteringPage.cs index de7873ea..3fd8191f 100644 --- a/JexusManager.Features.RequestFiltering/RequestFilteringPage.cs +++ b/JexusManager.Features.RequestFiltering/RequestFilteringPage.cs @@ -48,7 +48,7 @@ public void ShowHelp() } } - private sealed class ExtensionListViewItem : ListViewItem + private sealed class ExtensionListViewItem : ListViewItem, IFeatureListViewItem { public FileExtensionsItem Item { get; } private readonly RequestFilteringPage _page; @@ -62,7 +62,7 @@ public ExtensionListViewItem(FileExtensionsItem item, RequestFilteringPage page) } } - private sealed class RuleListViewItem : ListViewItem + private sealed class RuleListViewItem : ListViewItem, IFeatureListViewItem { public FilteringRulesItem Item { get; } private readonly RequestFilteringPage _page; @@ -78,7 +78,7 @@ public RuleListViewItem(FilteringRulesItem item, RequestFilteringPage page) } } - private sealed class SegmentListViewItem : ListViewItem + private sealed class SegmentListViewItem : ListViewItem, IFeatureListViewItem { public HiddenSegmentsItem Item { get; } private readonly RequestFilteringPage _page; @@ -91,7 +91,7 @@ public SegmentListViewItem(HiddenSegmentsItem item, RequestFilteringPage page) } } - private sealed class UrlListViewItem : ListViewItem + private sealed class UrlListViewItem : ListViewItem, IFeatureListViewItem { public UrlsItem Item { get; } private readonly RequestFilteringPage _page; @@ -105,7 +105,7 @@ public UrlListViewItem(UrlsItem item, RequestFilteringPage page) } } - private sealed class VerbListViewItem : ListViewItem + private sealed class VerbListViewItem : ListViewItem, IFeatureListViewItem { public VerbsItem Item { get; } private readonly RequestFilteringPage _page; @@ -119,7 +119,7 @@ public VerbListViewItem(VerbsItem item, RequestFilteringPage page) } } - private sealed class HeaderListViewItem : ListViewItem + private sealed class HeaderListViewItem : ListViewItem, IFeatureListViewItem { public HeadersItem Item { get; } private readonly RequestFilteringPage _page; @@ -133,7 +133,7 @@ public HeaderListViewItem(HeadersItem item, RequestFilteringPage page) } } - private sealed class QueryListViewItem : ListViewItem + private sealed class QueryListViewItem : ListViewItem, IFeatureListViewItem { public QueryStringsItem Item { get; } private readonly RequestFilteringPage _page; diff --git a/JexusManager.Features.ResponseHeaders/ResponseHeadersFeature.cs b/JexusManager.Features.ResponseHeaders/ResponseHeadersFeature.cs index b1e2511d..bf67f861 100644 --- a/JexusManager.Features.ResponseHeaders/ResponseHeadersFeature.cs +++ b/JexusManager.Features.ResponseHeaders/ResponseHeadersFeature.cs @@ -134,6 +134,11 @@ public void Remove() } public void Edit() + { + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(ResponseHeadersItem item) { using var dialog = new NewHeaderDialog(Module, SelectedItem, this); if (dialog.ShowDialog() != DialogResult.OK) @@ -141,7 +146,7 @@ public void Edit() return; } - this.EditItem(dialog.Item); + EditItem(dialog.Item); } public void Set() diff --git a/JexusManager.Features.ResponseHeaders/ResponseHeadersPage.Designer.cs b/JexusManager.Features.ResponseHeaders/ResponseHeadersPage.Designer.cs index 36ce4a9c..ac5e1572 100644 --- a/JexusManager.Features.ResponseHeaders/ResponseHeadersPage.Designer.cs +++ b/JexusManager.Features.ResponseHeaders/ResponseHeadersPage.Designer.cs @@ -118,8 +118,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chName // diff --git a/JexusManager.Features.ResponseHeaders/ResponseHeadersPage.cs b/JexusManager.Features.ResponseHeaders/ResponseHeadersPage.cs index b08ead6d..8907e972 100644 --- a/JexusManager.Features.ResponseHeaders/ResponseHeadersPage.cs +++ b/JexusManager.Features.ResponseHeaders/ResponseHeadersPage.cs @@ -33,7 +33,7 @@ public override void ShowHelp() } } - private sealed class ResponseHeadersListViewItem : ListViewItem + private sealed class ResponseHeadersListViewItem : ListViewItem, IFeatureListViewItem { public ResponseHeadersItem Item { get; } private readonly ResponseHeadersPage _page; @@ -96,17 +96,23 @@ protected override void Refresh() base.Refresh(); } - private void ListView1SelectedIndexChanged(object sender, EventArgs e) + private void ListView1KeyDown(object sender, KeyEventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((ResponseHeadersListViewItem)listView1.SelectedItems[0]).Item - : null; - Refresh(); + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } } private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) { - _feature.Edit(); + _feature.HandleMouseDoubleClick(listView1); + } + + private void ListView1SelectedIndexChanged(object sender, EventArgs e) + { + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); } protected override bool ShowHelp() diff --git a/JexusManager.Features.Rewrite/Inbound/AllowedVariablesFeature.cs b/JexusManager.Features.Rewrite/Inbound/AllowedVariablesFeature.cs index 90158daf..8a6ad818 100644 --- a/JexusManager.Features.Rewrite/Inbound/AllowedVariablesFeature.cs +++ b/JexusManager.Features.Rewrite/Inbound/AllowedVariablesFeature.cs @@ -14,6 +14,7 @@ namespace JexusManager.Features.Rewrite.Inbound using System.Collections; using System.Collections.Generic; using System.Diagnostics; + using System.Drawing; using System.Reflection; using System.Resources; using System.Windows.Forms; @@ -30,7 +31,7 @@ namespace JexusManager.Features.Rewrite.Inbound /// /// Description of DefaultDocumentFeature. /// - internal class AllowedVariablesFeature + internal class AllowedVariablesFeature : FeatureBase { private sealed class FeatureTaskList : DefaultTaskList { @@ -55,7 +56,7 @@ public override ICollection GetTaskItems() if (_owner.CanRevert) { result.Add(MethodTaskItem.CreateSeparator().SetUsage()); - result.Add(new MethodTaskItem("Revert", "Revert to Parent", string.Empty).SetUsage()); + result.Add(RevertTaskItem); } return result.ToArray(typeof(TaskItem)) as TaskItem[]; @@ -76,7 +77,7 @@ public override void Remove() [Obfuscation(Exclude = true)] public void Rename() { - _owner.Rename(); + _owner.Edit(); } [Obfuscation(Exclude = true)] @@ -87,8 +88,8 @@ public void Revert() } public AllowedVariablesFeature(Module module) + : base(module) { - Module = module; } protected static readonly Version FxVersion10 = new Version("1.0"); @@ -97,17 +98,6 @@ public AllowedVariablesFeature(Module module) protected static readonly Version FxVersionNotRequired = new Version(); private FeatureTaskList _taskList; - protected void DisplayErrorMessage(Exception ex, ResourceManager resourceManager) - { - var service = (IManagementUIService)GetService(typeof(IManagementUIService)); - service.ShowError(ex, resourceManager.GetString("General"), string.Empty, false); - } - - protected object GetService(Type type) - { - return (Module as IServiceProvider).GetService(type); - } - public TaskList GetTaskList() { return _taskList ?? (_taskList = new FeatureTaskList(this)); @@ -129,8 +119,6 @@ public void Load() OnRewriteSettingsSaved(); } - public List Items { get; set; } - public void Add() { using (var dialog = new AddAllowedVariableDialog(Module, this)) @@ -227,27 +215,36 @@ public void Revert() OnRewriteSettingsSaved(); } - private void Rename() + private void Edit() { + DoubleClick(SelectedItem); } - public AllowedVariableItem SelectedItem { get; internal set; } - public bool CanRevert { get; private set; } + protected override void DoubleClick(AllowedVariableItem item) + { + RenameInline(item); + } - public RewriteSettingsSavedEventHandler RewriteSettingsUpdated { get; set; } - public string Description { get; } + protected override ConfigurationElementCollection GetCollection(IConfigurationService service) + { + return null; + } - public virtual bool IsFeatureEnabled + protected override void OnSettingsSaved() { - get { return true; } + OnRewriteSettingsSaved(); } + public bool CanRevert { get; private set; } + + public RewriteSettingsSavedEventHandler RewriteSettingsUpdated { get; set; } + public string Description { get; } + public virtual Version MinimumFrameworkVersion { get { return FxVersionNotRequired; } } - public Module Module { get; } public string Name { get; } } } diff --git a/JexusManager.Features.Rewrite/Inbound/InboundFeature.cs b/JexusManager.Features.Rewrite/Inbound/InboundFeature.cs index 01747a11..c175bf5a 100644 --- a/JexusManager.Features.Rewrite/Inbound/InboundFeature.cs +++ b/JexusManager.Features.Rewrite/Inbound/InboundFeature.cs @@ -176,9 +176,14 @@ public void Revert() } public void Edit() + { + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(InboundRule item) { var service = (INavigationService)GetService(typeof(INavigationService)); - service.Navigate(null, null, typeof(InboundRulePage), new Tuple(this, SelectedItem)); + service.Navigate(null, null, typeof(InboundRulePage), new Tuple(this, item)); OnSettingsSaved(); } } diff --git a/JexusManager.Features.Rewrite/Inbound/MapItem.cs b/JexusManager.Features.Rewrite/Inbound/MapItem.cs index 4beb2ca5..a5c4cf41 100644 --- a/JexusManager.Features.Rewrite/Inbound/MapItem.cs +++ b/JexusManager.Features.Rewrite/Inbound/MapItem.cs @@ -4,11 +4,14 @@ namespace JexusManager.Features.Rewrite.Inbound { + using System; using System.Collections.Generic; - + using System.Windows.Forms; + using JexusManager.Services; using Microsoft.Web.Administration; + using Microsoft.Web.Management.Client.Win32; - internal class MapItem : IItem + internal class MapItem : FeatureBase, IItem { public ConfigurationElement Element { get; set; } @@ -27,16 +30,15 @@ public bool Match(MapItem other) public MapSettingsUpdatedEventHandler MapSettingsUpdated { get; set; } - public List Items { get; private set; } - - public MapRule SelectedItem { get; set; } - public MapItem(ConfigurationElement element, MapsFeature feature) + : base(feature.Module) { this.Element = element; _feature = feature; this.Flag = element == null || element.IsLocallyStored ? "Local" : "Inherited"; this.Name = element == null ? string.Empty : (string)element["name"]; + IgnoreCase = element == null ? true : (bool)element["ignoreCase"]; + DefaultValue = element == null ? string.Empty : (string)element["defaultValue"]; this.Items = new List(); if (element != null) { @@ -57,7 +59,8 @@ public void Apply() internal protected void OnRewriteSettingsSaved() { - this.MapSettingsUpdated?.Invoke(); + MapSettingsUpdated?.Invoke(); + _feature.OnRewriteSettingsSaved(); } public bool IgnoreCase { get; set; } @@ -66,5 +69,116 @@ public bool Equals(MapItem other) { return Match(other) && other.DefaultValue == DefaultValue && other.IgnoreCase == IgnoreCase; } + + protected override ConfigurationElementCollection GetCollection(IConfigurationService service) + { + return Element.GetCollection(); + } + + protected override void OnSettingsSaved() + { + OnRewriteSettingsSaved(); + } + + public void Add() + { + using (var dialog = new AddMapDialog(Module, null, _feature)) + { + if (dialog.ShowDialog() != DialogResult.OK) + { + return; + } + + var newItem = dialog.Item; + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); + ConfigurationElementCollection rulesCollection = SelectedItem.Element.GetCollection(); + + if (SelectedItem != newItem) + { + Items.Add(newItem); + SelectedItem = newItem; + } + else if (newItem.Flag != "Local") + { + rulesCollection.Remove(newItem.Element); + newItem.Flag = "Local"; + } + + newItem.AppendTo(rulesCollection); + service.ServerManager.CommitChanges(); + } + + OnRewriteSettingsSaved(); + } + + public void Edit() + { + using (var dialog = new AddMapDialog(Module, SelectedItem, _feature)) + { + if (dialog.ShowDialog() != DialogResult.OK) + { + return; + } + + var newItem = dialog.Item; + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); + ConfigurationElementCollection rulesCollection = SelectedItem.Element.GetCollection(); + + if (SelectedItem != newItem) + { + Items.Add(newItem); + SelectedItem = newItem; + } + else if (newItem.Flag != "Local") + { + rulesCollection.Remove(newItem.Element); + newItem.Flag = "Local"; + } + + newItem.AppendTo(rulesCollection); + service.ServerManager.CommitChanges(); + } + + OnRewriteSettingsSaved(); + } + + public void Set() + { + using (var dialog = new MapSettingsDialog(Module, this)) + { + if (dialog.ShowDialog() != DialogResult.OK) + { + return; + } + } + + OnRewriteSettingsSaved(); + } + + internal void Select() + { + _feature.SelectedItem = this; + } + + internal void Remove() + { + var dialog = (IManagementUIService)GetService(typeof(IManagementUIService)); + if ( + dialog.ShowMessage("Are you sure that you want to remove the selected entry?", "Confirm Remove", + MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) != + DialogResult.Yes) + { + return; + } + + Items.Remove(SelectedItem); + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); + ConfigurationElementCollection collection = Element.GetCollection(); + collection.Remove(SelectedItem.Element); + service.ServerManager.CommitChanges(); + + SelectedItem = null; + OnRewriteSettingsSaved(); + } } } diff --git a/JexusManager.Features.Rewrite/Inbound/MapPage.Designer.cs b/JexusManager.Features.Rewrite/Inbound/MapPage.Designer.cs index 51b19490..35623c3e 100644 --- a/JexusManager.Features.Rewrite/Inbound/MapPage.Designer.cs +++ b/JexusManager.Features.Rewrite/Inbound/MapPage.Designer.cs @@ -147,8 +147,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chOriginal // diff --git a/JexusManager.Features.Rewrite/Inbound/MapPage.cs b/JexusManager.Features.Rewrite/Inbound/MapPage.cs index 0eb82d4f..315a605f 100644 --- a/JexusManager.Features.Rewrite/Inbound/MapPage.cs +++ b/JexusManager.Features.Rewrite/Inbound/MapPage.cs @@ -37,7 +37,7 @@ public override ICollection GetTaskItems() var result = new ArrayList(); result.Add(new MethodTaskItem("Add", "Add Mapping Entry...", string.Empty).SetUsage()); result.Add(new MethodTaskItem("Set", "Edit Map Settings...", string.Empty).SetUsage()); - if (_owner.Map.SelectedItem != null) + if (_owner._feature.SelectedItem != null) { //result.Add(MethodTaskItem.CreateSeparator().SetUsage()); result.Add(new MethodTaskItem("Edit", "Edit Mapping Entry...", string.Empty).SetUsage()); @@ -95,7 +95,7 @@ public void Set() } } - private sealed class MapListViewItem : ListViewItem + private sealed class MapListViewItem : ListViewItem, IFeatureListViewItem { public MapRule Item { get; } private readonly MapPage _page; @@ -110,7 +110,7 @@ public MapListViewItem(MapRule item, MapPage page) } private TaskList _taskList; - private MapsFeature _feature; + private MapItem _feature; public MapPage() { @@ -120,33 +120,30 @@ public MapPage() protected override void Initialize(object navigationData) { base.Initialize(navigationData); - var info = (Tuple)navigationData; + var info = (MapItem)navigationData; // TODO: pictureBox1.Image = service.Scope.GetImage(); - _feature = info.Item1; - this.Map = info.Item2; - txtName.ReadOnly = this.Map != null; - if (this.Map != null) + _feature = info; + txtName.ReadOnly = this._feature != null; + if (this._feature != null) { - this.Map.MapSettingsUpdated = this.InitializeListPage; - txtName.Text = this.Map.Name; + this._feature.MapSettingsUpdated = this.InitializeListPage; + txtName.Text = this._feature.Name; } - this.Map?.OnRewriteSettingsSaved(); + this._feature?.OnRewriteSettingsSaved(); } - public MapItem Map { get; set; } - protected override void InitializeListPage() { listView1.Items.Clear(); - foreach (var file in this.Map.Items) + foreach (var file in this._feature.Items) { listView1.Items.Add(new MapListViewItem(file, this)); } - if (this.Map.SelectedItem == null) + if (this._feature.SelectedItem == null) { this.Refresh(); return; @@ -154,21 +151,13 @@ protected override void InitializeListPage() foreach (MapListViewItem item in listView1.Items) { - if (item.Item == this.Map.SelectedItem) + if (item.Item == this._feature.SelectedItem) { item.Selected = true; } } } - - private void ListView1SelectedIndexChanged(object sender, EventArgs e) - { - this.Map.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((MapListViewItem)listView1.SelectedItems[0]).Item - : null; - this.Refresh(); - } - + private void ListView1KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) @@ -177,6 +166,19 @@ private void ListView1KeyDown(object sender, KeyEventArgs e) } } + public void ListView1MouseDoubleClick(object sender, EventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + + private void ListView1SelectedIndexChanged(object sender, EventArgs e) + { + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); + } + + + protected override void Refresh() { this.Tasks.Fill(tsActionPanel, cmsActionPanel); @@ -201,7 +203,7 @@ private void Back() { var service = (INavigationService)GetService(typeof(INavigationService)); service?.NavigateBack(2); - _feature.SelectedItem = this.Map; + _feature.Select(); _feature.OnRewriteSettingsSaved(); } @@ -213,17 +215,17 @@ private void BackMore() public void Add() { - _feature.AddRule(); + _feature.Add(); } public void Remove() { - _feature.RemoveRule(); + _feature.Remove(); } private void Edit() { - _feature.EditRule(); + _feature.Edit(); } private void Set() diff --git a/JexusManager.Features.Rewrite/Inbound/MapsFeature.cs b/JexusManager.Features.Rewrite/Inbound/MapsFeature.cs index e4aac453..d5498aa4 100644 --- a/JexusManager.Features.Rewrite/Inbound/MapsFeature.cs +++ b/JexusManager.Features.Rewrite/Inbound/MapsFeature.cs @@ -31,7 +31,7 @@ namespace JexusManager.Features.Rewrite.Inbound /// /// Description of DefaultDocumentFeature. /// - internal class MapsFeature + internal class MapsFeature : FeatureBase { private sealed class FeatureTaskList : DefaultTaskList { @@ -76,8 +76,8 @@ public void Edit() } public MapsFeature(Module module) + : base(module) { - Module = module; } protected static readonly Version FxVersion10 = new Version("1.0"); @@ -86,20 +86,9 @@ public MapsFeature(Module module) protected static readonly Version FxVersionNotRequired = new Version(); private FeatureTaskList _taskList; - protected void DisplayErrorMessage(Exception ex, ResourceManager resourceManager) - { - var service = (IManagementUIService)GetService(typeof(IManagementUIService)); - service.ShowError(ex, resourceManager.GetString("General"), string.Empty, false); - } - - protected object GetService(Type type) - { - return (Module as IServiceProvider).GetService(type); - } - public TaskList GetTaskList() { - return _taskList ?? (_taskList = new FeatureTaskList(this)); + return _taskList ??= new FeatureTaskList(this); } public void Load() @@ -117,8 +106,6 @@ public void Load() OnRewriteSettingsSaved(); } - public List Items { get; set; } - public void Add() { using (var dialog = new AddMapsDialog(Module, this)) @@ -152,37 +139,6 @@ public void Add() Edit(); } - public void AddRule() - { - using (var dialog = new AddMapDialog(Module, null, this)) - { - if (dialog.ShowDialog() != DialogResult.OK) - { - return; - } - - var newItem = dialog.Item; - var service = (IConfigurationService)GetService(typeof(IConfigurationService)); - ConfigurationElementCollection rulesCollection = SelectedItem.Element.GetCollection(); - - if (SelectedItem.SelectedItem != newItem) - { - SelectedItem.Items.Add(newItem); - SelectedItem.SelectedItem = newItem; - } - else if (newItem.Flag != "Local") - { - rulesCollection.Remove(newItem.Element); - newItem.Flag = "Local"; - } - - newItem.AppendTo(rulesCollection); - service.ServerManager.CommitChanges(); - } - OnRewriteSettingsSaved(); - SelectedItem.OnRewriteSettingsSaved(); - } - public void Remove() { var dialog = (IManagementUIService)GetService(typeof(IManagementUIService)); @@ -205,28 +161,6 @@ public void Remove() OnRewriteSettingsSaved(); } - public void RemoveRule() - { - var dialog = (IManagementUIService)GetService(typeof(IManagementUIService)); - if ( - dialog.ShowMessage("Are you sure that you want to remove the selected entry?", "Confirm Remove", - MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) != - DialogResult.Yes) - { - return; - } - - SelectedItem.Items.Remove(SelectedItem.SelectedItem); - var service = (IConfigurationService)GetService(typeof(IConfigurationService)); - ConfigurationElementCollection collection = SelectedItem.Element.GetCollection(); - collection.Remove(SelectedItem.SelectedItem.Element); - service.ServerManager.CommitChanges(); - - SelectedItem.SelectedItem = null; - OnRewriteSettingsSaved(); - SelectedItem.OnRewriteSettingsSaved(); - } - internal protected void OnRewriteSettingsSaved() { RewriteSettingsUpdated?.Invoke(); @@ -239,72 +173,58 @@ public virtual bool ShowHelp() } internal void Edit() + { + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(MapItem item) { var service = (INavigationService)GetService(typeof(INavigationService)); - service.Navigate(null, null, typeof(MapPage), new Tuple(this, SelectedItem)); + service.Navigate(null, null, typeof(MapPage), SelectedItem); OnRewriteSettingsSaved(); } - public void EditRule() + public void Revert() { - using (var dialog = new AddMapDialog(Module, SelectedItem.SelectedItem, this)) + if (!CanRevert) { - if (dialog.ShowDialog() != DialogResult.OK) - { - return; - } - - var newItem = dialog.Item; - var service = (IConfigurationService)GetService(typeof(IConfigurationService)); - ConfigurationElementCollection rulesCollection = SelectedItem.Element.GetCollection(); - - if (SelectedItem.SelectedItem != newItem) - { - SelectedItem.Items.Add(newItem); - SelectedItem.SelectedItem = newItem; - } - else if (newItem.Flag != "Local") - { - rulesCollection.Remove(newItem.Element); - newItem.Flag = "Local"; - } + throw new InvalidOperationException("Revert operation cannot be done at server level"); + } - newItem.AppendTo(rulesCollection); - service.ServerManager.CommitChanges(); + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + var result = + service.ShowMessage( + "Reverting to the parent configuration will result in the loss of all settings in the local configuration file for this feature. Are you sure you want to continue?", + Name, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, + MessageBoxDefaultButton.Button1); + if (result != DialogResult.Yes) + { + return; } - OnRewriteSettingsSaved(); - SelectedItem.OnRewriteSettingsSaved(); + + RevertItems(); } - public MapItem SelectedItem { get; internal set; } - public bool CanRevert { get; private set; } + public bool CanRevert { get; private set; } = true; public RewriteSettingsSavedEventHandler RewriteSettingsUpdated { get; set; } public string Description { get; } - public virtual bool IsFeatureEnabled - { - get { return true; } - } public virtual Version MinimumFrameworkVersion { get { return FxVersionNotRequired; } } - public Module Module { get; } public string Name { get; } - public void Set() + protected override ConfigurationElementCollection GetCollection(IConfigurationService service) { - using (var dialog = new MapSettingsDialog(Module, SelectedItem)) - { - if (dialog.ShowDialog() != DialogResult.OK) - { - return; - } - } + return null; + } + protected override void OnSettingsSaved() + { OnRewriteSettingsSaved(); } } diff --git a/JexusManager.Features.Rewrite/Inbound/MapsPage.Designer.cs b/JexusManager.Features.Rewrite/Inbound/MapsPage.Designer.cs index 2ec2dd3b..3af6927a 100644 --- a/JexusManager.Features.Rewrite/Inbound/MapsPage.Designer.cs +++ b/JexusManager.Features.Rewrite/Inbound/MapsPage.Designer.cs @@ -115,10 +115,10 @@ private void InitializeComponent() this.listView1.Size = new System.Drawing.Size(560, 515); this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; - this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); + this.listView1.View = System.Windows.Forms.View.Details; this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chName // diff --git a/JexusManager.Features.Rewrite/Inbound/MapsPage.cs b/JexusManager.Features.Rewrite/Inbound/MapsPage.cs index 679a2827..f6301dc7 100644 --- a/JexusManager.Features.Rewrite/Inbound/MapsPage.cs +++ b/JexusManager.Features.Rewrite/Inbound/MapsPage.cs @@ -36,9 +36,11 @@ public PageTaskList(MapsPage owner) public override ICollection GetTaskItems() { return new TaskItem[] - { + { GetBackTaskItem("Back", "Back to Rules"), MethodTaskItem.CreateSeparator().SetUsage(), + RevertTaskItem, + MethodTaskItem.CreateSeparator().SetUsage(), HelpTaskItem }; } @@ -54,9 +56,15 @@ public void Back() { _owner.Back(); } + + [Obfuscation(Exclude = true)] + public void Revert() + { + _owner.Revert(); + } } - private sealed class MapsListViewItem : ListViewItem + private sealed class MapsListViewItem : ListViewItem, IFeatureListViewItem { public MapItem Item { get; } private readonly MapsPage _page; @@ -113,14 +121,6 @@ protected override void InitializeListPage() } } - private void ListView1SelectedIndexChanged(object sender, EventArgs e) - { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((MapsListViewItem)listView1.SelectedItems[0]).Item - : null; - this.Refresh(); - } - private void ListView1KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) @@ -131,7 +131,13 @@ private void ListView1KeyDown(object sender, KeyEventArgs e) private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) { - _feature.Edit(); + _feature.HandleMouseDoubleClick(listView1); + } + + private void ListView1SelectedIndexChanged(object sender, EventArgs e) + { + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); } protected override void Refresh() @@ -160,6 +166,11 @@ private void Back() service?.NavigateBack(1); } + private void Revert() + { + _feature.Revert(); + } + protected override TaskListCollection Tasks { get diff --git a/JexusManager.Features.Rewrite/Inbound/ServerVariablesPage.Designer.cs b/JexusManager.Features.Rewrite/Inbound/ServerVariablesPage.Designer.cs index 4f499ba5..cba407cf 100644 --- a/JexusManager.Features.Rewrite/Inbound/ServerVariablesPage.Designer.cs +++ b/JexusManager.Features.Rewrite/Inbound/ServerVariablesPage.Designer.cs @@ -116,8 +116,8 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chName // diff --git a/JexusManager.Features.Rewrite/Inbound/ServerVariablesPage.cs b/JexusManager.Features.Rewrite/Inbound/ServerVariablesPage.cs index c49555a4..a99a5907 100644 --- a/JexusManager.Features.Rewrite/Inbound/ServerVariablesPage.cs +++ b/JexusManager.Features.Rewrite/Inbound/ServerVariablesPage.cs @@ -56,7 +56,7 @@ public void Back() } } - private sealed class VariableListViewItem : ListViewItem + private sealed class VariableListViewItem : ListViewItem, IFeatureListViewItem { public AllowedVariableItem Item { get; } private readonly ServerVariablesPage _page; @@ -75,7 +75,7 @@ public VariableListViewItem(AllowedVariableItem item, ServerVariablesPage page) public ServerVariablesPage() { - this.InitializeComponent(); + InitializeComponent(); } protected override void Initialize(object navigationData) @@ -87,6 +87,23 @@ protected override void Initialize(object navigationData) _feature = new AllowedVariablesFeature(Module); _feature.RewriteSettingsUpdated = this.InitializeListPage; _feature.Load(); + + _feature.HandleMouseClick(listView1, (item, text) => + { + item.Name = text; + item.Apply(); + }, + text => + { + if (_feature.FindDuplicate(item => item.Name, text)) + { + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + service.ShowMessage("A server variable with this name already exists.", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + + return true; + }); } protected override void InitializeListPage() @@ -112,14 +129,6 @@ protected override void InitializeListPage() } } - private void ListView1SelectedIndexChanged(object sender, EventArgs e) - { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((VariableListViewItem)listView1.SelectedItems[0]).Item - : null; - this.Refresh(); - } - private void ListView1KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) @@ -128,6 +137,12 @@ private void ListView1KeyDown(object sender, KeyEventArgs e) } } + private void ListView1SelectedIndexChanged(object sender, EventArgs e) + { + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); + } + protected override void Refresh() { this.Tasks.Fill(tsActionPanel, cmsActionPanel); diff --git a/JexusManager.Features.Rewrite/Outbound/CustomTagsFeature.cs b/JexusManager.Features.Rewrite/Outbound/CustomTagsFeature.cs index 141cd5ce..0147654b 100644 --- a/JexusManager.Features.Rewrite/Outbound/CustomTagsFeature.cs +++ b/JexusManager.Features.Rewrite/Outbound/CustomTagsFeature.cs @@ -30,7 +30,7 @@ namespace JexusManager.Features.Rewrite.Outbound /// /// Description of DefaultDocumentFeature. /// - internal class CustomTagsFeature + internal class CustomTagsFeature : FeatureBase { private sealed class FeatureTaskList : DefaultTaskList { @@ -77,13 +77,13 @@ public void AddGroup() [Obfuscation(Exclude = true)] public void Rename() { - _owner.Rename(); + _owner.Edit(); } } public CustomTagsFeature(Module module) + : base(module) { - Module = module; } protected static readonly Version FxVersion10 = new Version("1.0"); @@ -92,17 +92,6 @@ public CustomTagsFeature(Module module) protected static readonly Version FxVersionNotRequired = new Version(); private FeatureTaskList _taskList; - protected void DisplayErrorMessage(Exception ex, ResourceManager resourceManager) - { - var service = (IManagementUIService)GetService(typeof(IManagementUIService)); - service.ShowError(ex, resourceManager.GetString("General"), string.Empty, false); - } - - protected object GetService(Type type) - { - return (Module as IServiceProvider).GetService(type); - } - public TaskList GetTaskList() { return _taskList ?? (_taskList = new FeatureTaskList(this)); @@ -124,8 +113,6 @@ public void Load() OnRewriteSettingsSaved(); } - public List Items { get; set; } - public void AddGroup() { using (var dialog = new AddCustomTagsDialog(Module)) @@ -196,8 +183,9 @@ public void Remove() OnRewriteSettingsSaved(); } - public void Rename() + public void Edit() { + RenameInline(SelectedItem); } internal protected void OnRewriteSettingsSaved() @@ -211,23 +199,26 @@ public virtual bool ShowHelp() return false; } - public CustomTagsItem SelectedItem { get; internal set; } + protected override ConfigurationElementCollection GetCollection(IConfigurationService service) + { + return null; + } + + protected override void OnSettingsSaved() + { + OnRewriteSettingsSaved(); + } + public bool CanRevert { get; private set; } public RewriteSettingsSavedEventHandler RewriteSettingsUpdated { get; set; } public string Description { get; } - public virtual bool IsFeatureEnabled - { - get { return true; } - } - public virtual Version MinimumFrameworkVersion { get { return FxVersionNotRequired; } } - public Module Module { get; } public string Name { get; } } } diff --git a/JexusManager.Features.Rewrite/Outbound/CustomTagsPage.Designer.cs b/JexusManager.Features.Rewrite/Outbound/CustomTagsPage.Designer.cs index 984180a9..418c1ab0 100644 --- a/JexusManager.Features.Rewrite/Outbound/CustomTagsPage.Designer.cs +++ b/JexusManager.Features.Rewrite/Outbound/CustomTagsPage.Designer.cs @@ -118,9 +118,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chName // diff --git a/JexusManager.Features.Rewrite/Outbound/CustomTagsPage.cs b/JexusManager.Features.Rewrite/Outbound/CustomTagsPage.cs index 580d61d8..93d42923 100644 --- a/JexusManager.Features.Rewrite/Outbound/CustomTagsPage.cs +++ b/JexusManager.Features.Rewrite/Outbound/CustomTagsPage.cs @@ -56,7 +56,7 @@ public void Back() } } - private sealed class CustomTagsListViewItem : ListViewItem + private sealed class CustomTagsListViewItem : ListViewItem, IFeatureListViewItem { public CustomTagsItem Item { get; } private readonly CustomTagsPage _page; @@ -93,6 +93,22 @@ protected override void Initialize(object navigationData) _feature = new CustomTagsFeature(Module); _feature.RewriteSettingsUpdated = this.InitializeListPage; _feature.Load(); + + _feature.HandleMouseClick(listView1, (item, text) => + { + item.Name = text; + item.Apply(); + }, + text => + { + if (_feature.FindDuplicate(item => item.Name, text)) + { + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + service.ShowMessage("A custom tag with this name already exists.", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + return true; + }); } protected override void InitializeListPage() @@ -118,14 +134,11 @@ protected override void InitializeListPage() } } - private void ListView1SelectedIndexChanged(object sender, EventArgs e) + private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((CustomTagsListViewItem)listView1.SelectedItems[0]).Item - : null; - this.Refresh(); + _feature.HandleMouseDoubleClick(listView1); } - + private void ListView1KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) @@ -134,6 +147,12 @@ private void ListView1KeyDown(object sender, KeyEventArgs e) } } + private void ListView1SelectedIndexChanged(object sender, EventArgs e) + { + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); + } + protected override void Refresh() { this.Tasks.Fill(tsActionPanel, cmsActionPanel); @@ -176,13 +195,5 @@ protected override TaskListCollection Tasks } public IModulePage ParentPage { get; set; } - - private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) - { - if (listView1.SelectedItems.Count > 0) - { - _feature.Rename(); - } - } } } diff --git a/JexusManager.Features.Rewrite/Outbound/OutboundFeature.cs b/JexusManager.Features.Rewrite/Outbound/OutboundFeature.cs index 14edbfa5..71b3a301 100644 --- a/JexusManager.Features.Rewrite/Outbound/OutboundFeature.cs +++ b/JexusManager.Features.Rewrite/Outbound/OutboundFeature.cs @@ -77,9 +77,14 @@ public void Load() public List PreConditions { get; set; } public void Edit() + { + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(OutboundRule item) { var service = (INavigationService)GetService(typeof(INavigationService)); - service.Navigate(null, null, typeof(OutboundRulePage), new Tuple(this, SelectedItem)); + service.Navigate(null, null, typeof(OutboundRulePage), new Tuple(this, item)); OnSettingsSaved(); } diff --git a/JexusManager.Features.Rewrite/Outbound/PreConditionsFeature.cs b/JexusManager.Features.Rewrite/Outbound/PreConditionsFeature.cs index 6dfa9950..a7b8f840 100644 --- a/JexusManager.Features.Rewrite/Outbound/PreConditionsFeature.cs +++ b/JexusManager.Features.Rewrite/Outbound/PreConditionsFeature.cs @@ -30,7 +30,7 @@ namespace JexusManager.Features.Rewrite.Outbound /// /// Description of DefaultDocumentFeature. /// - internal class PreConditionsFeature + internal class PreConditionsFeature : FeatureBase { private sealed class FeatureTaskList : DefaultTaskList { @@ -56,7 +56,7 @@ public override ICollection GetTaskItems() if (_owner.CanRevert) { result.Add(MethodTaskItem.CreateSeparator().SetUsage()); - result.Add(new MethodTaskItem("Revert", "Revert to Parent", string.Empty).SetUsage()); + result.Add(RevertTaskItem); } return result.ToArray(typeof(TaskItem)) as TaskItem[]; @@ -94,8 +94,8 @@ public void Revert() } public PreConditionsFeature(Module module) + : base(module) { - Module = module; } protected static readonly Version FxVersion10 = new Version("1.0"); @@ -104,17 +104,6 @@ public PreConditionsFeature(Module module) protected static readonly Version FxVersionNotRequired = new Version(); private FeatureTaskList _taskList; - protected void DisplayErrorMessage(Exception ex, ResourceManager resourceManager) - { - var service = (IManagementUIService)GetService(typeof(IManagementUIService)); - service.ShowError(ex, resourceManager.GetString("General"), string.Empty, false); - } - - protected object GetService(Type type) - { - return (Module as IServiceProvider).GetService(type); - } - public TaskList GetTaskList() { return _taskList ?? (_taskList = new FeatureTaskList(this)); @@ -136,8 +125,6 @@ public void Load() OnRewriteSettingsSaved(); } - public List Items { get; set; } - public void Add() { using (var dialog = new AddPreConditionDialog(Module, null)) @@ -170,9 +157,14 @@ public void Add() } public void Edit() + { + DoubleClick(SelectedItem); + } + + protected override void DoubleClick(PreConditionItem item) { // TODO: how to edit. - using (var dialog = new AddPreConditionDialog(Module, SelectedItem)) + using (var dialog = new AddPreConditionDialog(Module, item)) { if (dialog.ShowDialog() != DialogResult.OK) { @@ -269,25 +261,29 @@ public void Revert() private void Rename() { + RenameInline(SelectedItem); + } + + protected override ConfigurationElementCollection GetCollection(IConfigurationService service) + { + return null; + } + + protected override void OnSettingsSaved() + { + OnRewriteSettingsSaved(); } - public PreConditionItem SelectedItem { get; internal set; } public bool CanRevert { get; private set; } public RewriteSettingsSavedEventHandler RewriteSettingsUpdated { get; set; } public string Description { get; } - public virtual bool IsFeatureEnabled - { - get { return true; } - } - public virtual Version MinimumFrameworkVersion { get { return FxVersionNotRequired; } } - public Module Module { get; } public string Name { get; } } } diff --git a/JexusManager.Features.Rewrite/Outbound/PreConditionsPage.Designer.cs b/JexusManager.Features.Rewrite/Outbound/PreConditionsPage.Designer.cs index 9e1b3a94..c4bd7c18 100644 --- a/JexusManager.Features.Rewrite/Outbound/PreConditionsPage.Designer.cs +++ b/JexusManager.Features.Rewrite/Outbound/PreConditionsPage.Designer.cs @@ -118,9 +118,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chName // diff --git a/JexusManager.Features.Rewrite/Outbound/PreConditionsPage.cs b/JexusManager.Features.Rewrite/Outbound/PreConditionsPage.cs index 4244b24d..fb85fb18 100644 --- a/JexusManager.Features.Rewrite/Outbound/PreConditionsPage.cs +++ b/JexusManager.Features.Rewrite/Outbound/PreConditionsPage.cs @@ -56,7 +56,7 @@ public void Back() } } - private sealed class PreConditionListViewItem : ListViewItem + private sealed class PreConditionListViewItem : ListViewItem, IFeatureListViewItem { public PreConditionItem Item { get; } private readonly PreConditionsPage _page; @@ -91,8 +91,25 @@ protected override void Initialize(object navigationData) pictureBox1.Image = service.Scope.GetImage(); _feature = new PreConditionsFeature(Module); - _feature.RewriteSettingsUpdated = this.InitializeListPage; + _feature.RewriteSettingsUpdated = InitializeListPage; _feature.Load(); + + _feature.HandleMouseClick(listView1, (item, text) => + { + item.Name = text; + item.Apply(); + }, + text => + { + if (_feature.FindDuplicate(item => item.Name, text)) + { + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + service.ShowMessage("A precondition with this name already exists.", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + + return true; + }); } protected override void InitializeListPage() @@ -118,14 +135,6 @@ protected override void InitializeListPage() } } - private void ListView1SelectedIndexChanged(object sender, EventArgs e) - { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((PreConditionListViewItem)listView1.SelectedItems[0]).Item - : null; - this.Refresh(); - } - private void ListView1KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) @@ -134,6 +143,17 @@ private void ListView1KeyDown(object sender, KeyEventArgs e) } } + private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + + private void ListView1SelectedIndexChanged(object sender, EventArgs e) + { + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); + } + protected override void Refresh() { this.Tasks.Fill(tsActionPanel, cmsActionPanel); @@ -176,13 +196,5 @@ protected override TaskListCollection Tasks } public IModulePage ParentPage { get; set; } - - private void ListView1MouseDoubleClick(object sender, MouseEventArgs e) - { - if (listView1.SelectedItems.Count > 0) - { - _feature.Edit(); - } - } } } diff --git a/JexusManager.Features.Rewrite/RewriteFeature.cs b/JexusManager.Features.Rewrite/RewriteFeature.cs index f2cb6cf3..3a3424d5 100644 --- a/JexusManager.Features.Rewrite/RewriteFeature.cs +++ b/JexusManager.Features.Rewrite/RewriteFeature.cs @@ -46,7 +46,7 @@ public override ICollection GetTaskItems() if (_owner.Inbound.CanRevert) { result.Add(MethodTaskItem.CreateSeparator().SetUsage()); - result.Add(new MethodTaskItem("Revert", "Revert to Parent", string.Empty).SetUsage()); + result.Add(RevertTaskItem); } result.Add(MethodTaskItem.CreateSeparator().SetUsage()); @@ -138,7 +138,7 @@ public void Edit() [Obfuscation(Exclude = true)] public void Rename() { - _owner.Rename(); + _owner.RenameIn(); } [Obfuscation(Exclude = true)] @@ -186,7 +186,7 @@ public void EditOut() [Obfuscation(Exclude = true)] public void RenameOut() { - _owner.Rename(); + _owner.RenameOut(); } [Obfuscation(Exclude = true)] @@ -376,8 +376,14 @@ private void Import() { } - private void Rename() + private void RenameIn() { + Inbound.RenameInline(Inbound.SelectedItem); + } + + private void RenameOut() + { + Outbound.RenameInline(Outbound.SelectedItem); } public string Description { get; } diff --git a/JexusManager.Features.Rewrite/RewritePage.Designer.cs b/JexusManager.Features.Rewrite/RewritePage.Designer.cs index da0c7891..24f0e890 100644 --- a/JexusManager.Features.Rewrite/RewritePage.Designer.cs +++ b/JexusManager.Features.Rewrite/RewritePage.Designer.cs @@ -157,9 +157,9 @@ private void InitializeComponent() this.lvIn.TabIndex = 1; this.lvIn.UseCompatibleStateImageBehavior = false; this.lvIn.View = System.Windows.Forms.View.Details; - this.lvIn.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.LvInAfterLabelEdit); - this.lvIn.SelectedIndexChanged += new System.EventHandler(this.LvInSelectedIndexChanged); + this.lvIn.KeyDown += new System.Windows.Forms.KeyEventHandler(this.LvInKeyDown); this.lvIn.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.LvInMouseDoubleClick); + this.lvIn.SelectedIndexChanged += new System.EventHandler(this.LvInSelectedIndexChanged); // // chNameIn // @@ -223,8 +223,9 @@ private void InitializeComponent() this.lvOut.TabIndex = 0; this.lvOut.UseCompatibleStateImageBehavior = false; this.lvOut.View = System.Windows.Forms.View.Details; - this.lvOut.SelectedIndexChanged += new System.EventHandler(this.LvOutSelectedIndexChanged); + this.lvOut.KeyDown += new System.Windows.Forms.KeyEventHandler(this.LvInKeyDown); this.lvOut.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.LvOutMouseDoubleClick); + this.lvOut.SelectedIndexChanged += new System.EventHandler(this.LvOutSelectedIndexChanged); // // chNameOut // diff --git a/JexusManager.Features.Rewrite/RewritePage.cs b/JexusManager.Features.Rewrite/RewritePage.cs index ba4df1b4..1299f250 100644 --- a/JexusManager.Features.Rewrite/RewritePage.cs +++ b/JexusManager.Features.Rewrite/RewritePage.cs @@ -35,7 +35,7 @@ public override void ShowHelp() } } - private sealed class InboundRuleListViewItem : ListViewItem + private sealed class InboundRuleListViewItem : ListViewItem, IFeatureListViewItem { public InboundRule Item { get; } private readonly RewritePage _page; @@ -72,7 +72,7 @@ private static string ToString(long action) } } - private sealed class OutboundRuleListViewItem : ListViewItem + private sealed class OutboundRuleListViewItem : ListViewItem, IFeatureListViewItem { public OutboundRule Item { get; private set; } @@ -128,6 +128,40 @@ protected override void Initialize(object navigationData) _feature.Inbound.RewriteSettingsUpdated = InitializeInbound; _feature.Outbound.RewriteSettingsUpdated = InitializeOutbound; _feature.Load(); + + _feature.Inbound.HandleMouseClick(lvIn, (item, text) => + { + item.Name = text; + item.Apply(); + }, + text => + { + if (_feature.Inbound.FindDuplicate(item => item.Name, text)) + { + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + service.ShowMessage("The specific rule already exists", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + + return true; + }); + + _feature.Outbound.HandleMouseClick(lvOut, (item, text) => + { + item.Name = text; + item.Apply(); + }, + text => + { + if (_feature.Outbound.FindDuplicate(item => item.Name, text)) + { + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + service.ShowMessage("The specific rule already exists", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + + return true; + }); } protected override void InitializeListPage() @@ -188,12 +222,22 @@ protected override void Refresh() base.Refresh(); } + private void LvInMouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.Inbound.HandleMouseDoubleClick(lvIn); + } + + private void LvInKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + _feature.Inbound.Remove(); + } + } + private void LvInSelectedIndexChanged(object sender, EventArgs e) { - _feature.Inbound.SelectedItem = lvIn.SelectedItems.Count > 0 - ? ((InboundRuleListViewItem)lvIn.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) + _feature.Inbound.HandleSelectedIndexChanged(lvIn); Refresh(); } @@ -231,41 +275,23 @@ private void btnRenameIn_Click(object sender, EventArgs e) lvIn.SelectedItems[0].BeginEdit(); } - private void LvInAfterLabelEdit(object sender, LabelEditEventArgs e) + private void LvOutMouseDoubleClick(object sender, MouseEventArgs e) { - if (string.IsNullOrEmpty(e.Label)) - { - e.CancelEdit = true; - return; - } - - var element = (InboundRuleListViewItem)lvIn.Items[e.Item]; - element.Name = e.Label; + _feature.Outbound.HandleMouseDoubleClick(lvOut); } - private void LvInMouseDoubleClick(object sender, MouseEventArgs e) + private void LvOutKeyDown(object sender, KeyEventArgs e) { - if (lvIn.SelectedItems.Count > 0) + if (e.KeyCode == Keys.Delete) { - _feature.Inbound.Edit(); + _feature.Outbound.Remove(); } } private void LvOutSelectedIndexChanged(object sender, EventArgs e) { - _feature.Outbound.SelectedItem = lvOut.SelectedItems.Count > 0 - ? ((OutboundRuleListViewItem)lvOut.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) + _feature.Outbound.HandleSelectedIndexChanged(lvOut); Refresh(); } - - private void LvOutMouseDoubleClick(object sender, MouseEventArgs e) - { - if (lvIn.SelectedItems.Count > 0) - { - _feature.Outbound.Edit(); - } - } } } diff --git a/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsFeature.cs b/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsFeature.cs index f996d60c..ce575ce5 100644 --- a/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsFeature.cs +++ b/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsFeature.cs @@ -60,14 +60,13 @@ public override ICollection GetTaskItems() { result.Add(MethodTaskItem.CreateSeparator().SetUsage()); result.Add(new MethodTaskItem("Edit", "Edit...", string.Empty).SetUsage()); - result.Add(new MethodTaskItem("Rename", "Rename", string.Empty).SetUsage()); result.Add(RemoveTaskItem); } result.Add(MethodTaskItem.CreateSeparator().SetUsage(true, MethodTaskItemUsages.TaskList)); if (_owner.CanRevert) { - result.Add(new MethodTaskItem("Revert", "Revert to Parent", string.Empty).SetUsage()); + result.Add(RevertTaskItem); } result.Add(new MethodTaskItem("InOrder", "View Ordered List...", string.Empty).SetUsage()); @@ -101,12 +100,6 @@ public void Edit() _owner.Edit(); } - [Obfuscation(Exclude = true)] - public void Rename() - { - _owner.Rename(); - } - [Obfuscation(Exclude = true)] public override void MoveUp() { @@ -207,10 +200,10 @@ public void Remove() RemoveItem(); } - public void Edit() + protected override void DoubleClick(TraceFailedRequestsItem item) { var service = (IConfigurationService)GetService(typeof(IConfigurationService)); - using var dialog = new AddTraceWizard(Module, SelectedItem, service.GetSection("system.webServer/tracing/traceProviderDefinitions"), this); + using var dialog = new AddTraceWizard(Module, item, service.GetSection("system.webServer/tracing/traceProviderDefinitions"), this); if (dialog.ShowDialog() != DialogResult.OK) { return; @@ -219,8 +212,9 @@ public void Edit() EditItem(dialog.Item); } - public void Rename() + public void Edit() { + DoubleClick(SelectedItem); } public void MoveUp() diff --git a/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsPage.Designer.cs b/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsPage.Designer.cs index 2af82c3a..ea30ebb6 100644 --- a/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsPage.Designer.cs +++ b/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsPage.Designer.cs @@ -122,8 +122,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1KeyDown); this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1SelectedIndexChanged); // // chPath // diff --git a/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsPage.cs b/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsPage.cs index 9be3b249..3c95afef 100644 --- a/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsPage.cs +++ b/JexusManager.Features.TraceFailedRequests/TraceFailedRequestsPage.cs @@ -5,7 +5,6 @@ namespace JexusManager.Features.TraceFailedRequests { using System; - using System.Collections; using System.Reflection; using System.Windows.Forms; @@ -33,13 +32,11 @@ public override void ShowHelp() } } - private sealed class IsapiFiltersListViewItem : ListViewItem + private sealed class TraceFailedRequestsListViewItem : ListViewItem, IFeatureListViewItem { public TraceFailedRequestsItem Item { get; } - private readonly TraceFailedRequestsPage _page; - - public IsapiFiltersListViewItem(TraceFailedRequestsItem item, TraceFailedRequestsPage page) + public TraceFailedRequestsListViewItem(TraceFailedRequestsItem item, TraceFailedRequestsPage page) : base(item.Path) { Item = item; @@ -76,7 +73,7 @@ protected override void InitializeListPage() listView1.Items.Clear(); foreach (var file in _feature.Items) { - listView1.Items.Add(new IsapiFiltersListViewItem(file, this)); + listView1.Items.Add(new TraceFailedRequestsListViewItem(file, this)); } if (_feature.SelectedItem == null) @@ -85,7 +82,7 @@ protected override void InitializeListPage() return; } - foreach (IsapiFiltersListViewItem item in listView1.Items) + foreach (TraceFailedRequestsListViewItem item in listView1.Items) { if (item.Item == _feature.SelectedItem) { @@ -102,21 +99,23 @@ protected override void Refresh() private void ListView1SelectedIndexChanged(object sender, EventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((IsapiFiltersListViewItem)listView1.SelectedItems[0]).Item - : null; - // TODO: optimize refresh when null to not null (vice versa) + _feature.HandleSelectedIndexChanged(listView1); Refresh(); } - private void ListView1_MouseDoubleClick(object sender, MouseEventArgs e) + private void ListView1KeyDown(object sender, KeyEventArgs e) { - if (listView1.SelectedItems.Count > 0) + if (e.KeyCode == Keys.Delete) { - _feature.Edit(); + _feature.Remove(); } } + private void ListView1_MouseDoubleClick(object sender, MouseEventArgs e) + { + _feature.HandleMouseDoubleClick(listView1); + } + protected override bool ShowHelp() { _feature.ShowHelp(); diff --git a/JexusManager.Features.TraceFailedRequests/Wizards/AddTraceWizard/ProvidersPage.Designer.cs b/JexusManager.Features.TraceFailedRequests/Wizards/AddTraceWizard/ProvidersPage.Designer.cs index 3c4fcca0..d9d590c0 100644 --- a/JexusManager.Features.TraceFailedRequests/Wizards/AddTraceWizard/ProvidersPage.Designer.cs +++ b/JexusManager.Features.TraceFailedRequests/Wizards/AddTraceWizard/ProvidersPage.Designer.cs @@ -52,6 +52,7 @@ private void InitializeComponent() // // clbProviders // + this.clbProviders.CheckOnClick = true; this.clbProviders.FormattingEnabled = true; this.clbProviders.Location = new System.Drawing.Point(19, 32); this.clbProviders.Name = "clbProviders"; @@ -82,6 +83,7 @@ private void InitializeComponent() // // clbAreas // + this.clbAreas.CheckOnClick = true; this.clbAreas.FormattingEnabled = true; this.clbAreas.Location = new System.Drawing.Point(26, 96); this.clbAreas.Name = "clbAreas"; diff --git a/JexusManager.Shared/Features/DefaultTaskList.cs b/JexusManager.Shared/Features/DefaultTaskList.cs index f274a9f1..f62b051c 100644 --- a/JexusManager.Shared/Features/DefaultTaskList.cs +++ b/JexusManager.Shared/Features/DefaultTaskList.cs @@ -46,6 +46,14 @@ public MethodTaskItem RemoveTaskItem } } + public MethodTaskItem RevertTaskItem + { + get + { + return new MethodTaskItem("Revert", "Revert To Parent", string.Empty).SetUsage(); + } + } + public MethodTaskItem HelpTaskItem { get diff --git a/JexusManager.Shared/Features/FeatureBase.cs b/JexusManager.Shared/Features/FeatureBase.cs index 9bf20e9c..a40bff69 100644 --- a/JexusManager.Shared/Features/FeatureBase.cs +++ b/JexusManager.Shared/Features/FeatureBase.cs @@ -6,11 +6,12 @@ namespace JexusManager.Features { using System; using System.Collections.Generic; + using System.Drawing; using System.IO; using System.Linq; using System.Reflection; using System.Resources; - + using System.Windows.Forms; using JexusManager.Services; using Microsoft.Web.Administration; @@ -21,9 +22,13 @@ namespace JexusManager.Features public abstract class FeatureBase where T : class, IItem { + private TextBox _editBox; + private ListView _listView; + private ListViewItem? _lastSelectedItem = null; + protected FeatureBase(Module module) { - this.Module = module; + Module = module; Items = new List(); } @@ -41,16 +46,16 @@ public bool CanMoveUp { get { - return this.SelectedItem != null && this.Items.IndexOf(this.SelectedItem) > 0 - && this.Items.All(item => item.Element.IsLocked == "false" && item.Element.LockAttributes.Count == 0); + return SelectedItem != null && Items.IndexOf(SelectedItem) > 0 + && Items.All(item => item.Element.IsLocked == "false" && item.Element.LockAttributes.Count == 0); } } public bool CanMoveDown { get { - return this.SelectedItem != null && this.Items.IndexOf(this.SelectedItem) < this.Items.Count - 1 - && this.Items.All(item => item.Element.IsLocked == "false" && item.Element.LockAttributes.Count == 0); + return SelectedItem != null && Items.IndexOf(SelectedItem) < Items.Count - 1 + && Items.All(item => item.Element.IsLocked == "false" && item.Element.LockAttributes.Count == 0); } } @@ -58,12 +63,12 @@ public bool CanMoveDown protected object GetService(Type type) { - return (this.Module as IServiceProvider).GetService(type); + return (Module as IServiceProvider).GetService(type); } protected void DisplayErrorMessage(Exception ex, ResourceManager resourceManager) { - var service = (IManagementUIService)this.GetService(typeof(IManagementUIService)); + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); service.ShowError(ex, resourceManager?.GetString("General"), "", false); } @@ -71,9 +76,9 @@ protected void DisplayErrorMessage(Exception ex, ResourceManager resourceManager public virtual void LoadItems() { - this.Items.Clear(); - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); - ConfigurationElementCollection collection = this.GetCollection(service); + Items.Clear(); + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); + ConfigurationElementCollection collection = GetCollection(service); foreach (ConfigurationElement addElement in collection) { var type = typeof(T); @@ -84,8 +89,8 @@ public virtual void LoadItems() constructorInfo.Invoke( constructorInfo.GetParameters().Length == 1 ? new object[] { addElement } - : new object[] { addElement, true }); - this.Items.Add(item); + : [addElement, true]); + Items.Add(item); } var secondary = GetSecondaryCollection(service); @@ -101,23 +106,23 @@ public virtual void LoadItems() constructorInfo.Invoke( constructorInfo.GetParameters().Length == 1 ? new object[] { addElement } - : new object[] { addElement, false }); - this.Items.Add(item); + : [addElement, false]); + Items.Add(item); } } - this.OnSettingsSaved(); + OnSettingsSaved(); } public virtual void AddItem(T item) { - this.Items.Add(item); - this.SelectedItem = item; - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); - var collection = this.GetCollection(service, item); + Items.Add(item); + SelectedItem = item; + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); + var collection = GetCollection(service, item); item.AppendTo(collection); service.ServerManager.CommitChanges(); - this.OnSettingsSaved(); + OnSettingsSaved(); } private ConfigurationElementCollection GetCollection(IConfigurationService service, T item) @@ -133,23 +138,23 @@ private ConfigurationElementCollection GetCollection(IConfigurationService servi public virtual void InsertItem(int index, T item) { - this.Items.Insert(index, item); - this.SelectedItem = item; - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); - var collection = this.GetCollection(service); + Items.Insert(index, item); + SelectedItem = item; + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); + var collection = GetCollection(service); item.Element = collection.CreateElement(); item.Apply(); collection.AddAt(index, item.Element); service.ServerManager.CommitChanges(); - this.OnSettingsSaved(); + OnSettingsSaved(); } public virtual void EditItem(T newItem) { - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); if (newItem.Flag != "Local") { - ConfigurationElementCollection collection = this.GetCollection(service); + ConfigurationElementCollection collection = GetCollection(service); collection.Remove(newItem.Element); newItem.AppendTo(collection); newItem.Flag = "Local"; @@ -160,17 +165,17 @@ public virtual void EditItem(T newItem) } service.ServerManager.CommitChanges(); - this.OnSettingsSaved(); + OnSettingsSaved(); } public virtual void RemoveItem() { - this.Items.Remove(this.SelectedItem); - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); + Items.Remove(SelectedItem); + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); ConfigurationElementCollection collection = GetCollection(service, SelectedItem); try { - collection.Remove(this.SelectedItem.Element); + collection.Remove(SelectedItem.Element); } catch (FileLoadException ex) { @@ -180,50 +185,50 @@ public virtual void RemoveItem() service.ServerManager.CommitChanges(); - this.SelectedItem = default(T); - this.OnSettingsSaved(); + SelectedItem = default; + OnSettingsSaved(); } public virtual void MoveUpItem() { - int index = this.Items.IndexOf(this.SelectedItem); - this.Items.Remove(this.SelectedItem); - this.Items.Insert(index - 1, this.SelectedItem); + int index = Items.IndexOf(SelectedItem); + Items.Remove(SelectedItem); + Items.Insert(index - 1, SelectedItem); - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); var collection = GetCollection(service); var element = collection[index]; collection.Remove(element); collection.AddAt(index - 1, element); service.ServerManager.CommitChanges(); - this.OnSettingsSaved(); + OnSettingsSaved(); } public virtual void MoveDownItem() { - int index = this.Items.IndexOf(this.SelectedItem); - this.Items.Remove(this.SelectedItem); - this.Items.Insert(index + 1, this.SelectedItem); + int index = Items.IndexOf(SelectedItem); + Items.Remove(SelectedItem); + Items.Insert(index + 1, SelectedItem); - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); var collection = GetCollection(service); var element = collection[index]; collection.Remove(element); collection.AddAt(index + 1, element); service.ServerManager.CommitChanges(); - this.OnSettingsSaved(); + OnSettingsSaved(); } public virtual void RevertItems() { - var service = (IConfigurationService)this.GetService(typeof(IConfigurationService)); + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); var collection = GetCollection(service); collection.Revert(); service.ServerManager.CommitChanges(); - this.SelectedItem = null; + SelectedItem = null; LoadItems(); } @@ -231,5 +236,90 @@ protected virtual ConfigurationElementCollection GetSecondaryCollection(IConfigu { return null; } + + #region Event handlers + protected virtual void DoubleClick(T item) + { } + + public void HandleMouseDoubleClick(ListView listView) + { + if (listView.SelectedItems.Count == 0) + { + return; + } + + var item = (IFeatureListViewItem)listView.SelectedItems[0]; + DoubleClick(item.Item); + } + + public void HandleSelectedIndexChanged(ListView listView) + { + if (listView.SelectedItems.Count > 0) + { + var item = (IFeatureListViewItem)listView.SelectedItems[0]; + SelectedItem = item.Item; + } + else + { + _lastSelectedItem = null; + SelectedItem = null; + } + } + + public void HandleMouseClick(ListView listView1, Action updatePropertyAction, Func validateAction) + { + _listView = listView1; + listView1.LabelEdit = true; + listView1.AfterLabelEdit += (s, e) => + { + if (string.IsNullOrEmpty(e.Label)) + { + e.CancelEdit = true; + return; + } + + if (validateAction != null && !validateAction(e.Label)) + { + e.CancelEdit = true; + return; + } + + if (SelectedItem == null) + { + e.CancelEdit = true; + return; + } + + updatePropertyAction(SelectedItem, e.Label); + }; + + listView1.MouseClick += (s, e) => + { + var info = listView1.HitTest(e.Location); + if (info?.Item == null) + return; + + if (info.Item.Selected) + { + info.Item.BeginEdit(); + } + }; + } + + public void RenameInline(T item) + { + var index = Items.IndexOf(item); + if (index >= 0 && index < _listView.Items.Count) + { + _listView.Items[index].BeginEdit(); + } + } + + public bool FindDuplicate(Func value, string text) + { + return Items.Where(item => item != SelectedItem) + .Any(item => string.Equals(value(item), text, StringComparison.Ordinal)); + } + #endregion } } diff --git a/JexusManager.Shared/Features/IDuoItem.cs b/JexusManager.Shared/Features/IDuoItem.cs index de0a2171..f12cb2e8 100644 --- a/JexusManager.Shared/Features/IDuoItem.cs +++ b/JexusManager.Shared/Features/IDuoItem.cs @@ -2,6 +2,8 @@ // // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using Microsoft.Web.Administration; + namespace JexusManager.Features { public interface IDuoItem : IItem diff --git a/JexusManager.Shared/Features/IFeatureListViewItem.cs b/JexusManager.Shared/Features/IFeatureListViewItem.cs new file mode 100644 index 00000000..313d16e9 --- /dev/null +++ b/JexusManager.Shared/Features/IFeatureListViewItem.cs @@ -0,0 +1,11 @@ +// Copyright (c) Lex Li. All rights reserved. +// +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace JexusManager.Features +{ + public interface IFeatureListViewItem + { + IItem Item { get; } + } +} diff --git a/JexusManager.Shared/Features/IItem.cs b/JexusManager.Shared/Features/IItem.cs index 3c902be1..12beb56b 100644 --- a/JexusManager.Shared/Features/IItem.cs +++ b/JexusManager.Shared/Features/IItem.cs @@ -4,21 +4,8 @@ namespace JexusManager.Features { - using System; - using Microsoft.Web.Administration; - public interface IItem : IEquatable - { - string Flag { get; set; } - - void Apply(); - - ConfigurationElement Element { get; set; } - - bool Match(T other); - } - public static class ItemExtensions { public static void AppendTo(this IItem item, ConfigurationElementCollection collection) diff --git a/JexusManager/Features/Main/ApplicationPoolsFeature.cs b/JexusManager/Features/Main/ApplicationPoolsFeature.cs index 7ea85784..36665b4a 100644 --- a/JexusManager/Features/Main/ApplicationPoolsFeature.cs +++ b/JexusManager/Features/Main/ApplicationPoolsFeature.cs @@ -7,6 +7,7 @@ namespace JexusManager.Features.Main using System; using System.Collections; using System.Diagnostics; + using System.Linq; using System.Reflection; using System.Resources; using System.Windows.Forms; @@ -23,7 +24,7 @@ namespace JexusManager.Features.Main /// /// Description of DefaultDocumentFeature. /// - internal class ApplicationPoolsFeature + internal class ApplicationPoolsFeature : FeatureBase { private sealed class FeatureTaskList : DefaultTaskList { @@ -99,7 +100,7 @@ public void Rename() [Obfuscation(Exclude = true)] public void Basic() { - _owner.Basic(); + _owner.Edit(); } [Obfuscation(Exclude = true)] @@ -140,8 +141,8 @@ public void Advanced() } public ApplicationPoolsFeature(Module module) + : base(module) { - Module = module; } protected static readonly Version FxVersion10 = new Version("1.0"); @@ -149,17 +150,7 @@ public ApplicationPoolsFeature(Module module) protected static readonly Version FxVersion20 = new Version("2.0"); protected static readonly Version FxVersionNotRequired = new Version(); private FeatureTaskList _taskList; - - protected void DisplayErrorMessage(Exception ex, ResourceManager resourceManager) - { - var service = (IManagementUIService)GetService(typeof(IManagementUIService)); - service.ShowError(ex, resourceManager.GetString("General"), "", false); - } - - protected object GetService(Type type) - { - return (Module as IServiceProvider).GetService(type); - } + private ServerManager _serverManager; public TaskList GetTaskList() { @@ -169,13 +160,11 @@ public TaskList GetTaskList() public void Load() { var service = (IConfigurationService)GetService(typeof(IConfigurationService)); - Items = service.Server.ApplicationPools; + Items = service.Server.ApplicationPools.ToList(); + _serverManager = service.Server; OnApplicationPoolsSettingsSaved(); } - public ApplicationPoolCollection Items { get; set; } - public ApplicationPool SelectedItem { get; set; } - protected void OnApplicationPoolsSettingsSaved() { ApplicationPoolsSettingsUpdated?.Invoke(); @@ -189,24 +178,25 @@ public virtual bool ShowHelp() private void Add() { - using (var dialog = new ApplicationPoolBasicSettingsDialog(Module, null, Items.Parent.ApplicationPoolDefaults, Items)) + using (var dialog = new ApplicationPoolBasicSettingsDialog(Module, null, _serverManager.ApplicationPoolDefaults, _serverManager.ApplicationPools)) { if (dialog.ShowDialog() == DialogResult.OK) { - Items.Parent.CommitChanges(); + _serverManager.CommitChanges(); } SelectedItem = dialog.Pool; + Items = _serverManager.ApplicationPools.ToList(); } OnApplicationPoolsSettingsSaved(); } private void Set() { - using var dialog = new ApplicationPoolDefaultsSettingsDialog(Module, Items.Parent.ApplicationPoolDefaults); + using var dialog = new ApplicationPoolDefaultsSettingsDialog(Module, _serverManager.ApplicationPoolDefaults); if (dialog.ShowDialog() == DialogResult.OK) { - Items.Parent.CommitChanges(); + _serverManager.CommitChanges(); } } @@ -228,23 +218,25 @@ internal void Remove() return; } - var index = Items.IndexOf(SelectedItem); - Items.RemoveAt(index); - if (Items.Count == 0) + var index = _serverManager.ApplicationPools.IndexOf(SelectedItem); + _serverManager.ApplicationPools.RemoveAt(index); + if (_serverManager.ApplicationPools.Count == 0) { SelectedItem = null; } else { - SelectedItem = index > Items.Count - 1 ? Items[Items.Count - 1] : Items[index]; + SelectedItem = index > _serverManager.ApplicationPools.Count - 1 ? _serverManager.ApplicationPools[_serverManager.ApplicationPools.Count - 1] : _serverManager.ApplicationPools[index]; } - Items.Parent.CommitChanges(); + _serverManager.CommitChanges(); + Items = _serverManager.ApplicationPools.ToList(); OnApplicationPoolsSettingsSaved(); } private void Rename() { + RenameInline(SelectedItem); } private void Advanced() @@ -252,7 +244,7 @@ private void Advanced() using var dialog = new ApplicationPoolAdvancedSettingsDialog(Module, SelectedItem); if (dialog.ShowDialog() == DialogResult.OK) { - SelectedItem.Parent.Parent.CommitChanges(); + _serverManager.CommitChanges(); } } @@ -302,40 +294,44 @@ private void Applications() { } - internal void Basic() + internal void Edit() { - if (SelectedItem == null) - { - return; - } + DoubleClick(SelectedItem); + } - using (var dialog = new ApplicationPoolBasicSettingsDialog(Module, SelectedItem, null, Items)) + protected override void DoubleClick(ApplicationPool item) + { + using (var dialog = new ApplicationPoolBasicSettingsDialog(Module, item, null, _serverManager.ApplicationPools)) { if (dialog.ShowDialog() == DialogResult.OK) { - SelectedItem.Parent.Parent.CommitChanges(); + _serverManager.CommitChanges(); } } OnApplicationPoolsSettingsSaved(); } + protected override ConfigurationElementCollection GetCollection(IConfigurationService service) + { + return null; + } + + protected override void OnSettingsSaved() + { + OnApplicationPoolsSettingsSaved(); + } + public bool IsBusy { get; set; } public ApplicationPoolsSettingsSavedEventHandler ApplicationPoolsSettingsUpdated { get; set; } public string Description { get; } - public virtual bool IsFeatureEnabled - { - get { return true; } - } - public virtual Version MinimumFrameworkVersion { get { return FxVersionNotRequired; } } - public Module Module { get; } public string Name { get; } } } diff --git a/JexusManager/Features/Main/ApplicationPoolsPage.Designer.cs b/JexusManager/Features/Main/ApplicationPoolsPage.Designer.cs index 4ae0f959..e3846ec3 100644 --- a/JexusManager/Features/Main/ApplicationPoolsPage.Designer.cs +++ b/JexusManager/Features/Main/ApplicationPoolsPage.Designer.cs @@ -103,9 +103,9 @@ private void InitializeComponent() this.listView1.TabIndex = 1; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView2_SelectedIndexChanged); - this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView1_KeyDown); - this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseDoubleClick); + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1_KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1_SelectedIndexChanged); // // chName // diff --git a/JexusManager/Features/Main/ApplicationPoolsPage.cs b/JexusManager/Features/Main/ApplicationPoolsPage.cs index a7055882..ed7b696e 100644 --- a/JexusManager/Features/Main/ApplicationPoolsPage.cs +++ b/JexusManager/Features/Main/ApplicationPoolsPage.cs @@ -42,7 +42,7 @@ public void ShowHelp() } } - private sealed class ApplicationPoolsListViewItem : ListViewItem + private sealed class ApplicationPoolsListViewItem : ListViewItem, IFeatureListViewItem { public ApplicationPool Item { get; } private readonly ApplicationPoolsPage _page; @@ -83,6 +83,38 @@ protected override void Initialize(object navigationData) _feature = new ApplicationPoolsFeature(Module); _feature.ApplicationPoolsSettingsUpdated = InitializeListPage; _feature.Load(); + + _feature.HandleMouseClick(listView1, (item, text) => + { + item.Name = text; + item.Apply(); + }, + text => + { + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + if (_feature.FindDuplicate(item => item.Name, text)) + { + service.ShowMessage("An application pool with this name already exists", + Text, + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + return false; + } + + var forbidden = ApplicationPoolCollection.InvalidApplicationPoolNameCharacters(); + foreach (var ch in forbidden) + { + if (text.Contains(ch)) + { + service.ShowMessage( + $"The application pool name cannot contain the following characters: '{string.Join(", ", forbidden)}'.", + Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + } + + return true; + }); } protected override void InitializeListPage() @@ -141,15 +173,7 @@ protected override TaskListCollection Tasks } } - private void listView2_SelectedIndexChanged(object sender, EventArgs e) - { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((ApplicationPoolsListViewItem)listView1.SelectedItems[0]).Item - : null; - Refresh(); - } - - private void listView1_KeyDown(object sender, KeyEventArgs e) + private void ListView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) { @@ -157,9 +181,15 @@ private void listView1_KeyDown(object sender, KeyEventArgs e) } } - private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) + private void ListView1_MouseDoubleClick(object sender, MouseEventArgs e) { - _feature.Basic(); + _feature.HandleMouseDoubleClick(listView1); } + + private void ListView1_SelectedIndexChanged(object sender, EventArgs e) + { + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); + } } } diff --git a/JexusManager/Features/Main/SitesFeature.cs b/JexusManager/Features/Main/SitesFeature.cs index 65fcdcd4..de4b6afd 100644 --- a/JexusManager/Features/Main/SitesFeature.cs +++ b/JexusManager/Features/Main/SitesFeature.cs @@ -30,11 +30,11 @@ namespace JexusManager.Features.Main using Binding = Microsoft.Web.Administration.Binding; using Module = Microsoft.Web.Management.Client.Module; using System.Linq; - + /// /// Description of DefaultDocumentFeature. /// - internal class SitesFeature + internal class SitesFeature : FeatureBase { private sealed class FeatureTaskList : DefaultTaskList { @@ -219,8 +219,8 @@ public void Limits() } public SitesFeature(Module module) + : base(module) { - Module = module; } protected static readonly Version FxVersion10 = new Version("1.0"); @@ -228,17 +228,7 @@ public SitesFeature(Module module) protected static readonly Version FxVersion20 = new Version("2.0"); protected static readonly Version FxVersionNotRequired = new Version(); private FeatureTaskList _taskList; - - protected void DisplayErrorMessage(Exception ex, ResourceManager resourceManager) - { - var service = (IManagementUIService)GetService(typeof(IManagementUIService)); - service.ShowError(ex, resourceManager.GetString("General"), "", false); - } - - protected object GetService(Type type) - { - return (Module as IServiceProvider).GetService(type); - } + private ServerManager _serverManager; public TaskList GetTaskList() { @@ -248,13 +238,11 @@ public TaskList GetTaskList() public void Load() { var service = (IConfigurationService)GetService(typeof(IConfigurationService)); - Items = service.Server.Sites; + _serverManager = service.ServerManager; + Items = service.Server.Sites.ToList(); OnSitesSettingsSaved(); } - public SiteCollection Items { get; set; } - public Site SelectedItem { get; set; } - protected void OnSitesSettingsSaved() { SitesSettingsUpdated?.Invoke(); @@ -268,7 +256,7 @@ public virtual bool ShowHelp() private void Add() { - using var dialog = new NewSiteDialog(Module, Items); + using var dialog = new NewSiteDialog(Module, _serverManager.Sites); if (dialog.ShowDialog() != DialogResult.OK) { return; @@ -278,6 +266,7 @@ private void Add() dialog.NewSite.Applications[0].Save(); SelectedItem = dialog.NewSite; SelectedItem.Server.CommitChanges(); + Items = _serverManager.Sites.ToList(); var service = (IConfigurationService)GetService(typeof(IConfigurationService)); ((MainForm)service.Form).AddSiteNode(dialog.NewSite); } @@ -301,7 +290,7 @@ internal void Remove() return; } - var index = Items.IndexOf(SelectedItem); + var index = _serverManager.Sites.IndexOf(SelectedItem); Items.Remove(SelectedItem); SelectedItem.Server.CommitChanges(); var service = (IConfigurationService)GetService(typeof(IConfigurationService)); @@ -320,7 +309,7 @@ internal void Remove() private void Rename() { - // TODO: use service to find node and trigger rename. + RenameInline(SelectedItem); } private void Limits() @@ -465,6 +454,13 @@ private void Basic() OnSitesSettingsSaved(); } + protected override void DoubleClick(Site item) + { + var service = (IConfigurationService)GetService(typeof(IConfigurationService)); + var mainForm = service.Form as MainForm; + mainForm?.ShowSite(item); + } + private void Permissions() { var path = SelectedItem.PhysicalPath.ExpandIisExpressEnvironmentVariables(SelectedItem.Applications[0].GetActualExecutable()); @@ -497,22 +493,26 @@ private void Bindings() OnSitesSettingsSaved(); } + protected override ConfigurationElementCollection GetCollection(IConfigurationService service) + { + return null; + } + + protected override void OnSettingsSaved() + { + OnSitesSettingsSaved(); + } + public bool IsBusy { get; set; } public SitesSettingsSavedEventHandler SitesSettingsUpdated { get; set; } public string Description { get; } - public virtual bool IsFeatureEnabled - { - get { return true; } - } - public virtual Version MinimumFrameworkVersion { get { return FxVersionNotRequired; } } - public Module Module { get; } public string Name { get; } } diff --git a/JexusManager/Features/Main/SitesPage.Designer.cs b/JexusManager/Features/Main/SitesPage.Designer.cs index 4acd4381..db314f85 100644 --- a/JexusManager/Features/Main/SitesPage.Designer.cs +++ b/JexusManager/Features/Main/SitesPage.Designer.cs @@ -138,10 +138,9 @@ private void InitializeComponent() this.listView1.TabIndex = 0; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.listView1_AfterLabelEdit); - this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); - this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView1_KeyDown); - this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseDoubleClick); + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListView1_KeyDown); + this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDoubleClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1_SelectedIndexChanged); // // chName // diff --git a/JexusManager/Features/Main/SitesPage.cs b/JexusManager/Features/Main/SitesPage.cs index 91fc5846..61ceae40 100644 --- a/JexusManager/Features/Main/SitesPage.cs +++ b/JexusManager/Features/Main/SitesPage.cs @@ -48,7 +48,7 @@ public void ShowHelp() } } - private sealed class SitesListViewItem : ListViewItem + private sealed class SitesListViewItem : ListViewItem, IFeatureListViewItem { public Site Item { get; } private readonly SitesPage _page; @@ -96,6 +96,55 @@ protected override void Initialize(object navigationData) _feature = new SitesFeature(Module); _feature.SitesSettingsUpdated = InitializeListPage; _feature.Load(); + + _feature.HandleMouseClick(listView1, (item, text) => + { + item.Name = text; + item.Apply(); + _form.UpdateSiteNode(item); + item.Server.CommitChanges(); + }, + text => + { + var service = (IManagementUIService)GetService(typeof(IManagementUIService)); + Debug.Assert(service != null, "service != null"); + if (_feature.FindDuplicate(item => item.Name, text)) + { + service.ShowMessage( + "A site with this name already exists.", + Text, + MessageBoxButtons.OK, + MessageBoxIcon.Exclamation); + return false; + } + + var forbidden = SiteCollection.InvalidSiteNameCharacters(); + foreach (var ch in forbidden) + { + if (text.Contains(ch)) + { + service.ShowMessage( + $"The site name cannot contain the following characters: '{string.Join(", ", forbidden)}'.", + "Sites", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + } + + if (_feature.SelectedItem.Server.Mode == WorkingMode.Jexus) + { + foreach (var ch in SiteCollection.InvalidSiteNameCharactersJexus()) + { + if (text.Contains(ch) || text.StartsWith("~")) + { + service.ShowMessage("The site name cannot contain the following characters: '~, '.", Text, + MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + } + } + + return true; + }); } protected override void InitializeListPage() @@ -154,50 +203,6 @@ protected override TaskListCollection Tasks } } - private void actRename_Execute(object sender, EventArgs e) - { - listView1.SelectedItems[0].BeginEdit(); - } - - private void listView1_AfterLabelEdit(object sender, LabelEditEventArgs e) - { - if (string.IsNullOrEmpty(e.Label)) - { - e.CancelEdit = true; - return; - } - - var service = (IManagementUIService)GetService(typeof(IManagementUIService)); - Debug.Assert(service != null, "service != null"); - foreach (var ch in SiteCollection.InvalidSiteNameCharacters()) - { - if (e.Label.Contains(ch)) - { - service.ShowMessage( - "The site name cannot contain the following characters: '\\, /, ?, ;, :, @, &, =, +, $, ,, |, \", <, >'.", - "Sites", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - e.CancelEdit = true; - return; - } - } - - foreach (var ch in SiteCollection.InvalidSiteNameCharactersJexus()) - { - if (e.Label.Contains(ch) || e.Label.StartsWith("~")) - { - service.ShowMessage("The site name cannot contain the following characters: '~, '.", "Sites", - MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - e.CancelEdit = true; - return; - } - } - - var site = (Site)listView1.Items[e.Item].Tag; - site.Name = e.Label; - _form.UpdateSiteNode(site); - site.Server.CommitChanges(); - } - private void cbFilter_TextChanged(object sender, EventArgs e) { btnGo.Enabled = string.IsNullOrWhiteSpace(cbFilter.Text); @@ -208,28 +213,23 @@ private void btnShowAll_Click(object sender, EventArgs e) cbFilter.Text = string.Empty; } - private void listView1_SelectedIndexChanged(object sender, EventArgs e) + private void ListView1_KeyDown(object sender, KeyEventArgs e) { - _feature.SelectedItem = listView1.SelectedItems.Count > 0 - ? ((SitesListViewItem)listView1.SelectedItems[0]).Item - : null; - Refresh(); + if (e.KeyCode == Keys.Delete) + { + _feature.Remove(); + } } - private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) + private void ListView1_MouseDoubleClick(object sender, MouseEventArgs e) { - if (listView1.SelectedItems.Count > 0) - { - _form.ShowSite((Site)listView1.SelectedItems[0].Tag); - } + _feature.HandleMouseDoubleClick(listView1); } - private void listView1_KeyDown(object sender, KeyEventArgs e) + private void ListView1_SelectedIndexChanged(object sender, EventArgs e) { - if (e.KeyCode == Keys.Delete) - { - _feature.Remove(); - } + _feature.HandleSelectedIndexChanged(listView1); + Refresh(); } } } diff --git a/Microsoft.Web.Administration/ApplicationPool.cs b/Microsoft.Web.Administration/ApplicationPool.cs index f59c3ce1..c27ca147 100644 --- a/Microsoft.Web.Administration/ApplicationPool.cs +++ b/Microsoft.Web.Administration/ApplicationPool.cs @@ -6,7 +6,7 @@ namespace Microsoft.Web.Administration { - public sealed class ApplicationPool : ConfigurationElement + public sealed class ApplicationPool : ConfigurationElement, IItem { private ApplicationPoolProcessModel _processModel; private ApplicationPoolRecycling _recycling; @@ -154,6 +154,27 @@ public override string ToString() return Name; } + public void Apply() + { + } + + public bool Match(ApplicationPool other) + { + return Equals(other); + } + + public bool Equals(ApplicationPool other) + { + return other != null && Name.Equals(other.Name, StringComparison.OrdinalIgnoreCase); + } + internal int ApplicationCount { get; set; } + public string Flag { get; set; } = "Local"; + + public ConfigurationElement Element + { + get { return this; } + set { } + } } } diff --git a/Microsoft.Web.Administration/IItem.cs b/Microsoft.Web.Administration/IItem.cs new file mode 100644 index 00000000..9e4e8229 --- /dev/null +++ b/Microsoft.Web.Administration/IItem.cs @@ -0,0 +1,19 @@ +// Copyright (c) Lex Li. All rights reserved. +// +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace Microsoft.Web.Administration +{ + public interface IItem : IEquatable + { + string Flag { get; set; } + + void Apply(); + + ConfigurationElement Element { get; set; } + + bool Match(T other); + } +} diff --git a/Microsoft.Web.Administration/Site.cs b/Microsoft.Web.Administration/Site.cs index b9dc5150..61cef0f4 100644 --- a/Microsoft.Web.Administration/Site.cs +++ b/Microsoft.Web.Administration/Site.cs @@ -5,11 +5,12 @@ namespace Microsoft.Web.Administration { using System.Collections.Generic; + using System.Drawing.Design; using System.IO; using System.Threading.Tasks; using System.Xml; - public sealed class Site : ConfigurationElement + public sealed class Site : ConfigurationElement, IItem { private const string Command = "/config:\"{0}\" /siteid:{1} /systray:false /trace:error"; private ApplicationCollection _collection; @@ -185,6 +186,20 @@ internal void Save() } } + public void Apply() + { + } + + public bool Match(Site other) + { + return Equals(other); + } + + public bool Equals(Site other) + { + return other != null && Id == other.Id; + } + internal string PhysicalPath { get @@ -198,5 +213,13 @@ internal string PhysicalPath return path; } } + + public string Flag { get; set; } = "Local"; + + public ConfigurationElement Element + { + get { return this; } + set { } + } } }