using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
namespace DrawGraph
{
    [Serializable, JsonObject(MemberSerialization.OptOut)]
    /// 
    /// 区域管理类的基础类
    /// 
    public class AreaManageBase : IEquatable
    {
        /// 
        /// 当前手术状态
        /// 
        public DoAnesOpeStatus AnesOpeStatue = DoAnesOpeStatus.VIEW;
        /// 
        /// 生理数据的时间间隔
        /// 
        public int collectInterval = 5;
        /// 
        ///  分页绘图的页时间间隔,以分钟为单位 
        /// 
        public double EVERY_PAGE_TIME_SPAN = 240.0;   //minutes 
        public AreaManageBase()
        {
            OpeRecord = new object();
        }
        public AreaManageBase(object _operationRecor, ZedGraphControl _zedControl, TemplateManage _template, string _name)
        {
            OpeRecord = _operationRecor;
            ZedControl = _zedControl;
            template = _template;
            Name = _name;
        }
        #region 属性
        [JsonIgnore]
        protected TemplateManage template = new TemplateManage(); //根的模板管理器对象
        [JsonIgnore]
        private PackObjManager packManage = new PackObjManager();
        [JsonIgnore]
        private ZedGraphControl zedControl = null;
        [JsonIgnore]
        private object opeRecord = null;
        [JsonIgnore]
        private string packManagerFileName = "";
        private string name = "";
        private string className = "";
        private string msgStr = "";
        private string direct = "";
        private int id;
        private bool isSelfFresh = true; //仅自己改动时可以刷新
        private string dllName = "";
        private string nameSpace = "";
        private string instanceName = "";
        public delegate void MouseWheelHandler(object sender, MouseEventArgs e);
        public event MouseWheelHandler MouseWheelParam;
        [JsonIgnore]
        [XmlIgnore]
        /// 
        /// 手术记录
        /// 
        public object OpeRecord
        {
            get { return opeRecord; }
            set { opeRecord = value; }
        }
        [JsonIgnore]
        [XmlIgnore]
        /// 
        /// 画板组件包管理器
        /// 
        public PackObjManager PackManage
        {
            get { return packManage; }
            set { packManage = value; }
        }
        [JsonIgnore]
        [XmlIgnore]
        /// 
        /// 消息内容
        /// 
        public string MsgStr
        {
            get
            {
                return msgStr;
            }
            set
            {
                msgStr = value;
            }
        }
        [JsonIgnore]
        [XmlIgnore]
        /// 
        /// 画板的组件
        /// 
        public ZedGraphControl ZedControl
        {
            get
            {
                return zedControl;
            }
            set
            {
                zedControl = value;
            }
        }
        [JsonIgnore]
        [XmlIgnore]
        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
        [JsonIgnore]
        [XmlIgnore]
        public string Direct
        {
            get
            {
                return direct;
            }
            set
            {
                direct = value;
            }
        }
        /// 
        /// 画板组件包管理器原件
        /// 
        public string PackManagerFileName
        {
            get
            {
                return packManagerFileName;
            }
            set
            {
                packManagerFileName = value;
            }
        }
        /// 
        /// 区域管理器中文名称
        /// 
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
                if (packManage != null)
                {
                    packManage.Name = name;
                }
            }
        }
        /// 
        /// 类名称
        /// 
        public string ClassName
        {
            get
            {
                return className;
            }
            set
            {
                className = value;
                if (packManage != null)
                {
                    packManage.ClassName = className;
                }
            }
        }
        /// 
        /// 仅自己改动时可以刷新
        /// 
        public bool IsSelfFresh
        {
            get
            {
                return isSelfFresh;
            }
            set
            {
                isSelfFresh = value;
                foreach (PackObjBase packObj in packManage.ListPob)
                {
                    packObj.IsSelfFresh = value;
                }
            }
        }
        public string DllName
        {
            get
            {
                return dllName.Trim();
            }
            set
            {
                dllName = value;
            }
        }
        public string NameSpace
        {
            get
            {
                return nameSpace.Trim();
            }
            set
            {
                nameSpace = value;
            }
        }
        public string InstanceName
        {
            get
            {
                return instanceName.Trim();
            }
            set
            {
                instanceName = value;
            }
        }
        #endregion 属性结束
        #region 子类需要重写的事件
        public virtual void MouseMove(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public virtual void MouseDown(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public virtual void MouseUp(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public virtual void MouseDoubleClick(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public virtual void KeyUp(ZedGraphControl sender, KeyEventArgs e)
        {
        }
        /// 
        /// 验证数据,正确返回真,如果子类不继承就直接返回真
        /// 
        /// 
        public virtual bool Verification()
        {
            return true;
        }
        //取消滚轮事件
        public void numericUpDown1_MouseWheel(object sender, MouseEventArgs e)
        {
            MouseWheelParam(sender,e);
        }
        /// 
        /// 把OperationRecord 里的数据绑定到到画板上
        /// 
        public virtual void Bind()
        {
        }
        public virtual void initChart()
        {
        }
        public virtual void BindTempData()
        {
        }
        #endregion
        /// 
        /// 格式画到板上,没有数据的格式
        /// 
        public void Draw(bool isNoDrwsBoard = false)
        {
            if (packManage != null)
            {
                //先组件自己的刷新关闭
                IsSelfFresh = false;
                //画的前置方法
                PrepositiveMethod();
                packManage.DrawPackObj(isNoDrwsBoard);
                //画完的后续方法
                FollowUpMethod();
                //组件自己的刷新打开
                IsSelfFresh = true;
            }
        }
        /// 
        /// 后续方法
        /// 
        public virtual void FollowUpMethod()
        {
        }
        /// 
        /// 前置方法
        /// 
        public virtual void PrepositiveMethod()
        {
        }
        public virtual void clearSelectCouve_Click()
        {
        }
        public virtual void frmInstance_ConfigParam()
        {
        }
        /// 
        /// 根据标签查找指定的绘图组件
        /// 
        /// 标签名,使用类.属性就可以了
        /// 
        public PackObjBase GetPackObjectOTag(string tagName)
        {
            PackObjBase pack = null;
            if (packManage != null)
            {
                pack = PackManage.ListPob.FirstOrDefault(s => s.PackTag.EndsWith(tagName.Replace('.', '_')));
            }
            return pack;
        }
        public List GetPackObjeOfParentName(string parentName)
        {
            List subPobs = PackManage.ListPob.FindAll((c) => { return c.ParentName == parentName; });
            return subPobs;
        }
        /// 
        /// 保存
        /// 
        /// 
        public bool Save()
        {
            bool reVal = false;
            if (packManage != null)
            {
                GetFileName();
                reVal = packManage.SaveFile(packManagerFileName, Id);
                msgStr = packManage.MsgStr;
            }
            return reVal;
        }
        /// 
        /// 获取文件名
        /// 
        private void GetFileName()
        {
            packManagerFileName = this.className + BoardUtil.tagFlag + this.name;
        }
        public int ParentId { get; set; }
        /// 
        /// 加载实例
        /// 
        public bool Load(int parentId)
        {
            bool reVal = true;
            try
            {
                GetFileName();
                ParentId = parentId;
                packManage = new PackObjManager(zedControl);
                packManage.AllClear();
                reVal = packManage.LoadContent(packManagerFileName, ParentId);
                packManage.ClassName = className;
                msgStr = packManage.MsgStr;
            }
            catch (Exception exp)
            {
                msgStr = exp.Message;
                reVal = false;
            }
            return reVal;
        }
        /// 
        /// 设置画板组件,因为在打开区域管理器窗体时,使用自己窗体里的画板组件,但在返回父窗体时要把所有区域画到主窗体里,这里要更改画板组件
        /// 
        public void SetZedControl(ZedGraphControl _zedControl)
        {
            if (packManage != null)
            {
                zedControl = _zedControl;
                packManage.SetZedControl(zedControl);
            }
        }
        public bool Equals(AreaManageBase other)
        {
            if (null == other) return false;
            if (ReferenceEquals(this, other)) return true;
            return this.Name.Equals(other.Name) && this.ClassName.Equals(other.ClassName);
        }
        public override int GetHashCode()
        {
            int hashCode = this.ClassName.GetHashCode() + this.Name.GetHashCode();
            return hashCode;
        }
        /// 
        /// 响应可编辑组件的单击事件,由具体区域实现
        /// 
        /// 
        /// 
        public virtual void editAr_Click(object sender, EventArgs e)
        {
        }
        /// 
        /// false为打印模式
        /// 
        /// 
        public virtual void setPrint(bool isVisible) { }
    }
    public class PropertyObject
    {
        public PropertyObject()
        {
            subPropertyList = new List();
            parentProperty = null;
        }
        private string key = "";
        private string text = "";
        private string value = "";
        private string description = "";
        private List subPropertyList = new List();
        private PropertyObject parentProperty = null;
        public string Key
        {
            get
            {
                return key;
            }
            set
            {
                key = value;
            }
        }
        /// 
        /// 子属性列表
        /// 
        public List SubPropertyList
        {
            get
            {
                return subPropertyList;
            }
            set
            {
                foreach (PropertyObject obj in value)
                {
                    obj.ParentProperty = this;
                }
                subPropertyList = value;
            }
        }
        public string Description
        {
            get
            {
                return description;
            }
            set
            {
                description = value;
            }
        }
        /// 
        /// 显示到树组件里的文本
        /// 
        public string ViewTreeNode
        {
            get
            {
                return description + ":" + key;
            }
        }
        /// 
        /// 显示到设计组件的TAG上
        /// 
        public string ViewDesignTag()
        {
            return ((parentProperty != null) ? (parentProperty.ViewDesignTag() + BoardUtil.tagFlag) : "") + key;
        }
        /// 
        /// 父属性对象
        /// 
        public PropertyObject ParentProperty
        {
            get
            {
                return parentProperty;
            }
            set
            {
                parentProperty = value;
            }
        }
        /// 
        /// 真正用的值
        /// 
        public string Value
        {
            get
            {
                return value;
            }
            set
            {
                this.value = value;
            }
        }
        /// 
        /// 显示的文本
        /// 
        public string Text
        {
            get
            {
                return text;
            }
            set
            {
                text = value;
            }
        }
    }
}