view ServerMonitor/Controls/CheckControl.cs @ 31:88ca7e4fc023

Allow running a file check on a directory.
author Brad Greco <brad@bgreco.net>
date Sun, 16 Jun 2019 16:54:46 -0400
parents 7127d5b5ac75
children
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace ServerMonitorApp
{
    /// <summary>Base class for check controls.</summary>
    /// <remarks>This control should never be used directly, but marking it abstract causes problems with the designer.</remarks>
    public partial class CheckControl : UserControl
    {
        /// <summary>Type of the check this control can edit.</summary>
        public Type CheckType => GetCheckType(GetType());

        public CheckControl()
        {
            InitializeComponent();
        }

        private void CheckControl_Load(object sender, EventArgs e)
        {
            CheckGroupBox.Text = Helpers.GetDisplayName(CheckType);

            // Bind change listeners to checkboxes to enable or disable a panel of controls.
            // The leftmost checkbox is assumed to be the "master switch" for the panel.
            IEnumerable<Panel> panels = CheckGroupBox.Controls.OfType<Panel>();
            foreach (Panel panel in panels)
            {
                CheckBox mainCheckBox = panel.Controls.OfType<CheckBox>().OrderBy(c => c.Left).FirstOrDefault();
                if (mainCheckBox != null)
                {
                    mainCheckBox.CheckedChanged += CheckControl_CheckedChanged;
                    DisablePanelByCheckBox(mainCheckBox);
                }
            }
        }

        private void CheckControl_CheckedChanged(object sender, EventArgs e)
        {
            DisablePanelByCheckBox((CheckBox)sender);
        }

        /// <summary>Enables or disables all sibling controls of a checkbox.</summary>
        /// <param name="checkBox">The checkbox to disable or enable the sibling controls of.</param>
        private void DisablePanelByCheckBox(CheckBox checkBox)
        {
            foreach (Control control in checkBox.Parent.Controls)
            {
                if (control != checkBox)
                    control.Enabled = checkBox.Checked;
            }
        }

        /// <summary>Sets the values of the controls from a check's properties.</summary>
        /// <remarks>Subclasses should implement this method. Marking as abstract causes problems with the designer.</remarks>
        public virtual void LoadCheck(Check check) { }

        /// <summary>Updates the properties of a check from user input.</summary>
        /// <remarks>Subclasses should implement this method. Marking as abstract causes problems with the designer.</remarks>
        public virtual void UpdateCheck(Check check) { }

        /// <summary>Creates an instance of a check control based on a check type.</summary>
        public static CheckControl Create(Type CheckType)
        {
            // Use reflection to find a check control that declares it handles the given type.
            Type checkControlType = typeof(CheckControl).Assembly.GetTypes().FirstOrDefault(t => GetCheckType(t) == CheckType);
            // If one was found, instantiate it.
            return checkControlType == null ? null : (CheckControl)Activator.CreateInstance(checkControlType);
        }

        /// <summary>Gets the value of the CheckTypeAttribute for a type.</summary>
        private static Type GetCheckType(Type type)
        {
            return type.GetAttribute<CheckTypeAttribute>()?.CheckType;
        }
    }
}