using AIMSExtension;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
namespace DrawGraph
{
    /// 
    /// 实例类属性改变时进行通知
    /// 
    public class EntityObjectChangeNotifier
    {
        //public static event EventHandler ObjectChanged;
        //private static bool isSetOk = true; //设置值是否成功
        public static bool isCreateOk = false;
         
        public static object SubObjSetValue(object t, string propertyName, string value)
        {
            object oldValue = null;
            List propertys = new List();
            if (propertyName.IndexOf('.') > 0)
            {
                propertys = propertyName.Split('.').ToList();
            }
            else
            {
                propertys.Add(propertyName);
            }
            for (int i = 0; i < propertys.Count; i++)
            {
                string pro = propertys[i];
                if (i == propertys.Count - 1)
                {
                    //最后一个
                    PropertyInfo p = t.GetType().GetProperties().SingleOrDefault(x => x.Name == pro);
                    if (p == default(PropertyInfo))
                    {
                        //isSetOk = false;
                    }
                    else
                    {
                        Attribute[] attribs = Attribute.GetCustomAttributes(p);
                        Attribute attrib = attribs.FirstOrDefault(s => s is NoCreatControlAttributs);
                        //如果增加了NoCreatControlAttributs这个属性的属性则不生成列表
                        oldValue = p.GetValue(t, new object[] { });
                        //如果这个属性的标签是不取值的属性,则返回
                        if (attrib != null)
                        {
                            //isSetOk = false;
                            return oldValue;
                        }
                        if (p.PropertyType == typeof(System.DateTime) && value == "")
                        {
                        }
                        else
                        {
                            p.SetValue(t, ChanageType(value, p.PropertyType), new object[] { });
                        }
                        return oldValue;
                    }
                }
                else
                {
                    try
                    {
                        PropertyInfo p = t.GetType().GetProperties().SingleOrDefault(x => x.Name == pro);
                        if (p == default(PropertyInfo))
                        {
                            //isSetOk = false;
                        }
                        else
                        {
                            Attribute[] attribs = Attribute.GetCustomAttributes(p);
                            Attribute attrib = attribs.FirstOrDefault(s => s is NoCreatControlAttributs);
                            //如果增加了NoCreatControlAttributs这个属性的属性则不生成列表
                            object subObj = p.GetValue(t, new object[] { });
                            //如果这个属性的标签是不取值的属性,则返回
                            if (attrib != null)
                            {
                                //isSetOk = false;
                                return subObj;
                            }
                            string subProName = propertyName.Replace((pro + "."), "");
                            oldValue = SubObjSetValue(subObj, subProName, value);
                            //当循环得到值后后面的就不需要循环了
                            break;
                        }
                    }
                    catch (Exception)
                    {
                        //throw;
                    }
                }
            }
            return oldValue;
        }
        private static object ChanageType(object value, Type convertsionType)
        {
            //判断convertsionType类型是否为泛型,因为nullable是泛型类,
            if (convertsionType.IsGenericType &&
                //判断convertsionType是否为nullable泛型类
                convertsionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                if (value == null || value.ToString().Length == 0)
                {
                    return null;
                }
                //如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
                NullableConverter nullableConverter = new NullableConverter(convertsionType);
                //将convertsionType转换为nullable对的基础基元类型
                convertsionType = nullableConverter.UnderlyingType;
            }
            return Convert.ChangeType(value, convertsionType);
        }
    }
    public class ObjectChangedEventArgs : EventArgs
    {
        public string PropertyName { get; set; }
        public object OldValue { get; private set; }
        public object NewValue { get; private set; }
        public object NewText { get; private set; }
        public object ZedControl { get; private set; }
        public ObjectChangedEventArgs(string name, object oldvalue, Object newText, object newValue, ZedGraphControl zedControl = null)
        {
            PropertyName = name;
            OldValue = oldvalue;
            NewValue = newValue;
            NewText = newText;
            ZedControl = zedControl;
        }
    }
}