From 6abaa8615a6e9302a9b620cb3070bbcef55e256e Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Fri, 15 Nov 2024 11:03:29 +0100 Subject: [PATCH] add control manager for plugins --- .../ControlExecuteReason.cs | 10 ++ Pilz.Plugins.Advanced.UI/ControlFeature.cs | 4 +- Pilz.Plugins.Advanced.UI/ControlManager.cs | 107 ++++++++++++++++-- Pilz.Plugins.Advanced.UI/ControlParameters.cs | 6 + .../ControlFeatureCollectoinExtensions.cs | 27 ----- .../PluginFeatureControllerExtensions.cs | 39 +++---- Pilz.Plugins.Advanced.UI/IControlManager.cs | 6 + 7 files changed, 145 insertions(+), 54 deletions(-) create mode 100644 Pilz.Plugins.Advanced.UI/ControlExecuteReason.cs create mode 100644 Pilz.Plugins.Advanced.UI/ControlParameters.cs delete mode 100644 Pilz.Plugins.Advanced.UI/Extensions/ControlFeatureCollectoinExtensions.cs create mode 100644 Pilz.Plugins.Advanced.UI/IControlManager.cs diff --git a/Pilz.Plugins.Advanced.UI/ControlExecuteReason.cs b/Pilz.Plugins.Advanced.UI/ControlExecuteReason.cs new file mode 100644 index 0000000..3d3ff13 --- /dev/null +++ b/Pilz.Plugins.Advanced.UI/ControlExecuteReason.cs @@ -0,0 +1,10 @@ +namespace Pilz.Plugins.Advanced.UI; + +public enum ControlExecuteReason +{ + None, + Init, + Dispose, + Add, + Remove, +} diff --git a/Pilz.Plugins.Advanced.UI/ControlFeature.cs b/Pilz.Plugins.Advanced.UI/ControlFeature.cs index 65206ff..e6167e2 100644 --- a/Pilz.Plugins.Advanced.UI/ControlFeature.cs +++ b/Pilz.Plugins.Advanced.UI/ControlFeature.cs @@ -2,6 +2,8 @@ public abstract class ControlFeature : PluginFeature { + public bool ControlNameRegEx { get; } + public string? ControlName { get; } public ControlFeature(string? controlName, string type, string identifier) : base(type, identifier) @@ -14,5 +16,5 @@ public abstract class ControlFeature : PluginFeature ControlName = controlName; } - public abstract void Execute(Control control, PluginFunctionParameter? parameter); + public abstract void Execute(Control control, ControlExecuteReason reason, PluginFunctionParameter? parameter); } diff --git a/Pilz.Plugins.Advanced.UI/ControlManager.cs b/Pilz.Plugins.Advanced.UI/ControlManager.cs index 58a5727..27d4e43 100644 --- a/Pilz.Plugins.Advanced.UI/ControlManager.cs +++ b/Pilz.Plugins.Advanced.UI/ControlManager.cs @@ -1,17 +1,110 @@ -namespace Pilz.Plugins.Advanced.UI; +using Pilz.Plugins.Advanced.UI.Extensions; +using System.Text.RegularExpressions; -public class ControlManager(PluginFeatureController controller, bool autoTrack) +namespace Pilz.Plugins.Advanced.UI; + +internal class ControlManager(IEnumerable features, Control control, bool recursive) : IControlManager { - public PluginFeatureController Controller => controller; - public bool AutoTrack => autoTrack; + private bool isTracking; - public void RegisterControl(Control control) + public bool Recursive => recursive; + + public Control Control => control; + + public IEnumerable Features => features; + + internal void Track() { - + if (isTracking) + return; + Track(control); + isTracking = true; } - public void Execute(object mode) + protected void Track(Control control) { + control.Disposed += Control_Disposed; + control.ControlAdded += Control_ControlAdded; + control.ControlRemoved += Control_ControlRemoved; + if (!recursive) + return; + + foreach (var child in control.Controls) + { + if (child is Control childControl) + Track(childControl); + } + } + + private void Control_Disposed(object? sender, EventArgs e) + { + if (sender is not Control control) + return; + + Execute(control, ControlExecuteReason.Dispose, null, false); + + control.Disposed -= Control_Disposed; + control.ControlAdded -= Control_ControlAdded; + control.ControlRemoved -= Control_ControlRemoved; + } + + private void Control_ControlAdded(object? sender, ControlEventArgs e) + { + if (sender is not Control control) + return; + + if (e.Control is not null) + Track(e.Control); + + Execute(control, ControlExecuteReason.Add, new ControlParameters(e.Control), false); + } + + private void Control_ControlRemoved(object? sender, ControlEventArgs e) + { + if (sender is not Control control) + return; + + Execute(control, ControlExecuteReason.Remove, new ControlParameters(e.Control), false); + } + + protected internal void Initialize(PluginFunctionParameter? parameters) + { + Execute(ControlExecuteReason.Init, parameters); + } + + public void Execute(PluginFunctionParameter? parameters) + { + Execute(ControlExecuteReason.None, parameters); + } + + protected void Execute(ControlExecuteReason reason, PluginFunctionParameter? parameter) + { + Execute(control, reason, parameter, true); + } + + protected void Execute(Control control, ControlExecuteReason reason, PluginFunctionParameter? parameter, bool recursive) + { + execute(control); + void execute(Control control) + { + if (control.Name is string name) + { + foreach (var feature in features) + { + if (feature.ControlName is null || feature.ControlNameRegEx && Regex.IsMatch(control.Name, feature.ControlName) || feature.ControlName == control.Name) + feature.Execute(control, reason, parameter); + } + } + + if (!recursive) + return; + + foreach (var child in control.Controls) + { + if (child is Control childControl) + execute(childControl); + } + } } } diff --git a/Pilz.Plugins.Advanced.UI/ControlParameters.cs b/Pilz.Plugins.Advanced.UI/ControlParameters.cs new file mode 100644 index 0000000..7456a16 --- /dev/null +++ b/Pilz.Plugins.Advanced.UI/ControlParameters.cs @@ -0,0 +1,6 @@ +namespace Pilz.Plugins.Advanced.UI; + +public class ControlParameters(Control? control) : PluginFunctionParameter +{ + public Control? Control { get; } = control; +} diff --git a/Pilz.Plugins.Advanced.UI/Extensions/ControlFeatureCollectoinExtensions.cs b/Pilz.Plugins.Advanced.UI/Extensions/ControlFeatureCollectoinExtensions.cs deleted file mode 100644 index 7f9eb8d..0000000 --- a/Pilz.Plugins.Advanced.UI/Extensions/ControlFeatureCollectoinExtensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Windows.Forms; - -namespace Pilz.Plugins.Advanced.UI.Extensions; - -public static class ControlFeatureCollectoinExtensions -{ - public static void ExecuteControlFeatures(this IEnumerable @this, Control control, bool recursive, PluginFunctionParameter? parameter) - { - if (control.Name is string name) - { - foreach (var feature in @this) - { - if (feature.ControlName is null || feature.ControlName.Equals(control.Name)) - feature.Execute(control, parameter); - } - } - - if (recursive) - { - foreach (var child in control.Controls) - { - if (child is Control childControl) - ExecuteControlFeatures(@this, childControl, true, parameter); - } - } - } -} diff --git a/Pilz.Plugins.Advanced.UI/Extensions/PluginFeatureControllerExtensions.cs b/Pilz.Plugins.Advanced.UI/Extensions/PluginFeatureControllerExtensions.cs index 158f1e6..e677f1e 100644 --- a/Pilz.Plugins.Advanced.UI/Extensions/PluginFeatureControllerExtensions.cs +++ b/Pilz.Plugins.Advanced.UI/Extensions/PluginFeatureControllerExtensions.cs @@ -2,29 +2,30 @@ public static class PluginFeatureControllerExtensions { - public static ControlManager ApplyControlManager(this PluginFeatureController @this, Control control) + public static IControlManager ApplyControlManager(this PluginFeatureController @this, string featureType, Control control) { - return ApplyControlManager(@this, control, true, true); + return ApplyControlManager(@this, featureType, control, true, true); } - public static ControlManager ApplyControlManager(this PluginFeatureController @this, Control control, bool recursive, bool autoTrack) + public static IControlManager ApplyControlManager(this PluginFeatureController @this, string featureType, Control control, PluginFunctionParameter? parameter) { - var manager = new ControlManager(@this, autoTrack); - goThrow(control); + return ApplyControlManager(@this, featureType, control, true, true, parameter); + } + + public static IControlManager ApplyControlManager(this PluginFeatureController @this, string featureType, Control control, bool recursive, bool autoTrack) + { + return ApplyControlManager(@this, featureType, control, recursive, autoTrack, null); + } + + public static IControlManager ApplyControlManager(this PluginFeatureController @this, string featureType, Control control, bool recursive, bool autoTrack, PluginFunctionParameter? parameter) + { + var manager = new ControlManager(@this.Features.Get(featureType).OfType(), control, recursive); + + if (autoTrack) + manager.Track(); + + manager.Initialize(parameter); + return manager; - - void goThrow(Control control) - { - manager.RegisterControl(control); - - if (recursive) - { - foreach (var child in control.Controls) - { - if (child is Control childControl) - goThrow(childControl); - } - } - } } } diff --git a/Pilz.Plugins.Advanced.UI/IControlManager.cs b/Pilz.Plugins.Advanced.UI/IControlManager.cs new file mode 100644 index 0000000..a36f569 --- /dev/null +++ b/Pilz.Plugins.Advanced.UI/IControlManager.cs @@ -0,0 +1,6 @@ +namespace Pilz.Plugins.Advanced.UI; + +public interface IControlManager +{ + void Execute(PluginFunctionParameter? parameter); +}