using Bro.Common.Helper;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using static Bro.Common.Helper.EnumHelper;
namespace Bro.Common.Model
{
public class IOItem : IComplexDisplay, IEqualityComparer
{
///
/// IO点编号
///
[Category("IO配置")]
[Description("IO点编号")]
public virtual int IONum { get; set; }
///
/// IO点的值
///
[Category("IO配置")]
[Description("IO数值")]
public virtual int Value { get; set; }
///
/// IO点是in还是out
///
[Category("IO配置")]
[Description("IO类型")]
public virtual IOType IOType { get; set; }
public new bool Equals(object x, object y)
{
if (x is IOItem a && y is IOItem b)
{
return a.IOType == b.IOType && a.IONum == b.IONum;
}
return false;
}
public string GetDisplayText()
{
return $"{IOType.GetEnumDescription()}-{IONum}-{Value}";
}
public int GetHashCode(object obj)
{
return obj.GetHashCode();
}
}
public class IODefinition : IOItem
{
[Category("IO配置")]
[Description("IO用途描述")]
public string IODesc { get; set; }
[Category("IO配置")]
[Description("备注说明")]
public string Remark { get; set; }
[Browsable(false)]
[JsonIgnore]
public override int Value { get; set; }
public new string GetDisplayText()
{
return $"{IODesc} {IOType.GetEnumDescription()} {IONum}";
}
}
public class IORefrenceItem : IComplexDisplay
{
[Category("IO操作配置")]
[Description("需要操作的IO")]
[TypeConverter(typeof(IORefrenceItemSourceConverter))]
public IODefinition IOItem { get; set; } = new IODefinition();
[Category("IO操作配置")]
[Description("需要操作的IO的数值")]
public int CheckValue
{
get => IOItem.Value;
set => IOItem.Value = value;
}
[Browsable(false)]
[JsonIgnore]
public List IOItemSource { get; set; } = new List();
public string GetDisplayText()
{
return IOItem.IODesc + "-" + CheckValue;
}
}
public class IORefrenceItemSourceConverter : TypeConverter
{
Dictionary itemDict = new Dictionary();
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if (context.Instance is IORefrenceItem item)
{
item.IOItemSource.ForEach(i =>
{
itemDict[i] = i.IODesc + "-" + i.IOType.GetEnumDescription() + "-" + i.IONum;
});
return new StandardValuesCollection(itemDict.Keys);
}
return base.GetStandardValues(context);
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(String))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return base.CanConvertTo(context, destinationType);
}
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
{
return base.CreateInstance(context, propertyValues);
}
///
///
///
///
///
/// string
///
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var s = value.ToString().Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
if (s.Length == 3)
{
foreach (KeyValuePair pair in itemDict)
{
if (pair.Value == value.ToString())
{
return pair.Key;
}
}
IODefinition item = new IODefinition();
item.IODesc = s[0];
item.IOType = (IOType)Enum.Parse(typeof(IOType), s[1]);
item.IONum = int.Parse(s[2]);
return item;
}
return base.ConvertFrom(context, culture, value);
}
///
///
///
///
///
/// IOItem
///
///
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (value is IODefinition item)
{
foreach (KeyValuePair pair in itemDict)
{
if (pair.Key.IOType == item.IOType && pair.Key.IONum == item.IONum)
{
return pair.Value;
}
}
return item.IODesc + "-" + item.IOType.GetEnumDescription() + "-" + item.IONum;
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
}