using DesktopTools.Interfaces;
using ModuleTools.Extensions;
using System;
using System.Windows.Forms;
namespace DesktopTools.BaseControls
{
///
/// Описание контрола для работы со значением свойства класса
///
public partial class AbstractBaseControl : UserControl
{
///
/// Фнукции для основного контрола
///
protected IBaseControl _baseControl;
///
/// Оригинальное значение (требуется при откате изменений)
///
protected object _originalValue;
///
/// Необходимость проверки при получении данных
///
protected bool _mustFilling;
///
/// Название свойства, по которму идет отображение
///
protected string _propertyName;
#region Событие изменения значения
///
/// Событие изменения значения в контроле
///
private event Action OnValueChange;
///
/// Событие изменения значения в контроле
///
public event Action OnValueChangeEvent { add { OnValueChange += value; } remove { OnValueChange -= value; } }
///
/// Вызов события в дочерних контролах
///
protected void CallOnValueChangeEvent() => OnValueChange?.Invoke();
#endregion
///
/// Конструктор
///
/// Название свойстваДолжно ли оно быть заполненным обязательно
/// Устанвока контрола в режим только просмотра
public AbstractBaseControl(string propertyName, bool mustFilling, bool readOnly)
{
InitializeComponent();
Name = $"Control{propertyName}";
_propertyName = propertyName;
_mustFilling = mustFilling;
panelControl.Enabled = !readOnly;
_baseControl?.SetDefaultValue();
}
#region Работа с заголовком
///
/// Установка заголовка
///
///
/// Ширину полученного загаловка
public int SetTitle(string title)
{
labelTitle.Text = title;
labelTitle.AutoSize = true;
return labelTitle.Width;
}
///
/// Установка ширины заголовка (вызывается через событие, чтобы у всех заголовков получилась одна ширина)
///
///
public void SetTitleWidth(int width)
{
labelTitle.AutoSize = false;
labelTitle.Width = width;
}
#endregion
#region Работа со значением
///
/// Извлечение значения из свойства объекта
///
///
public void SetValue(object obj)
{
if (obj != null && _propertyName.IsNotEmpty())
{
var property = obj.GetType().GetProperty(_propertyName);
if (property != null)
{
_originalValue = property.GetValue(obj);
_baseControl?.SetValueToControl(_originalValue);
}
}
}
///
/// Сброс значения
///
public void DropValue() => _baseControl?.DropValueForControl();
///
/// Проверка на заполненность
///
///
public bool CheckValue() => _baseControl?.CheckValueForControl() ?? false;
///
/// Заполнение свойства объекта значением из контрола
///
///
public void GetValue(object obj)
{
if (obj != null && _propertyName.IsNotEmpty())
{
var property = obj.GetType().GetProperty(_propertyName);
if (property != null)
{
property.SetValue(obj, _baseControl?.GetValueFromControl());
}
}
}
#endregion
}
}