using AIMSBLL;
using AIMSExtension;
using AIMSModel;
using DrawGraph;
using HelperDB;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
namespace DrawGraphManagement
{
    public partial class Main : Form
    {
        TemplateManage templateManage = new TemplateManage();
        object operationRecor = new DrawGraph.OperationRecord();
        AreaManageBase areaManageBase = new AreaManageBase();
        public Main()
        {
            InitializeComponent();
        }
        private void Main_Load(object sender, EventArgs e)
        {
            HospitalInfo hospital = BHospitalInfo.SelectSingle(1);
            txtHospitalName.Text = hospital.HospitalName;
            Person PersonObj = BPerson.GetModelByNo("admin");
            AIMSExtension.PublicMethod.OperatorId = PersonObj.Id.Value;
            AIMSExtension.PublicMethod.OperatorNo = PersonObj.No;
            AIMSExtension.PublicMethod.OperatorName = PersonObj.Name;
            AIMSExtension.PublicMethod.RoleId = PersonObj.RoleId.Value;
            AIMSExtension.PublicMethod.DepId = PersonObj.DepId.Value;
            AIMSExtension.PublicMethod.DeptName = BDepartment.GetModel(PersonObj.DepId.Value).Name;
            Role role = BRole.GetModel(PersonObj.RoleId.Value);
            AIMSExtension.PublicMethod.PermissionLevel = role.PermissionLevel == null ? 0 : role.PermissionLevel.Value;
            AIMSExtension.PublicMethod.RoleName = BMenu.GetMenuRootListManageStr(AIMSExtension.PublicMethod.RoleId, "功能权限");
            myPanel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(panel1_MouseWheel);
            LoadManageList();
        }
        /// 
        /// 加载管理器列表
        /// 
        private void LoadManageList()
        {
            Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "DrawGraph.dll");//你的loadfile
            Type baseType = typeof(AreaManageBase);
            List types = assembly.GetTypes().Where(t => t.IsSubclassOf(baseType)).ToList();
            List viewTypes = types.Where(s => s.FullName.IndexOf(".document.") < 0).ToList();
            List wsTypes = types.Where(s => s.FullName.IndexOf(".document.") >= 0).ToList();
            cmbManageList.Items.Clear();
            foreach (Type t in viewTypes)
            {
                cmbManageList.Items.Add(t.Name);
            }
            cmbManageList.Items.Add("-------------------");
            foreach (Type t in wsTypes)
            {
                cmbManageList.Items.Add(t.Name);
            }
        }
        /// 
        /// 设置界面自适应
        /// 
        private void AutoSizeF()
        {
            #region 设置界面自适应
            if (templateManage.ZedControl == null) return;
            if (templateManage.Typesetting == TypesettingEnum.Horizontal)
            {
                //在此处可随时设置板子的属性
                templateManage.ZedControl.Height = templateManage.GetPageWidth();
                templateManage.ZedControl.Width = Convert.ToInt32(templateManage.ZedControl.Height * 1.414) + 2;
            }
            else
            {
                //在此处可随时设置板子的属性
                templateManage.ZedControl.Width = templateManage.GetPageWidth();// templateManage.ZedControl.Parent.Width - 54;
                templateManage.ZedControl.Height = Convert.ToInt32(templateManage.ZedControl.Width * 1.414) + 2;
            }
            templateManage.ZedControl.AxisChange();
            templateManage.ZedControl.Refresh();
            //最后还要调整图表进行自适应
            PackObjBase pack = templateManage.GetPackObjectOTag("PhysioDataManage_ChartPackObj_6");
            if (pack != null)
                pack.Draw();
            #endregion
        }
        /// 
        /// 全部刷新
        /// 
        private void AllRefresh()
        {
            treeView1.Nodes.Clear();
            foreach (AreaManageBase area in templateManage.ManageList)
            {
                //把管理器增加到树控件里
                InsertPackObjTree(area);
                List ables = area.PackManage.ListPob.Where(s => s is AbleEditPackObj).ToList();
                foreach (PackObjBase pack in ables)
                {
                    AbleEditPackObj ableEdit = pack as AbleEditPackObj;
                    if (ableEdit != null) ableEdit.IsVisible = false;
                }
            }
            //画区域
            drawArea();
        }
        /// 
        /// 新建管理器
        /// 
        /// 
        /// 
        private void btnCreate_Click(object sender, EventArgs e)
        {
            string instanceName = cmbManageList.Text.Trim();
            string name = txtManageName.Text.Trim();
            string projectName = txtProjectName.Text.Trim();
            if (instanceName == "" || name == "" || projectName == "")
            {
                MessageBox.Show("类名称及区域名称或项目名称不能为空!!!");
                return;
            }
            areaManageBase = BoardFormUtil.AreaManageFactory(instanceName, templateManage.OpeRecord, zedGraphMain, templateManage, name);
            bool isAddOk = templateManage.AddManage(areaManageBase);
            if (isAddOk)
            {
                templateManage.ProjectName = projectName;
                Point point = templateManage.GetBorderPackWH();
                AreaManageForm form = form = new AreaManageForm(areaManageBase, PageStatus.Create, point.X, point.Y);
                form.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.AreaManageForm_FormClosed);
                form.Show();
            }
            else
            {
                MessageBox.Show("不能增加重复的管理器名称或管理器类名称");
            }
        }
        /// 
        /// 插入指定树结点的管理器控件内容
        /// 
        /// 
        private void InsertPackObjTree(AreaManageBase areaManage)
        {
            TreeNode tnSub = new TreeNode();
            tnSub.Name = areaManage.Name;
            tnSub.Tag = areaManage;
            tnSub.Text = areaManage.ClassName + "-" + areaManage.Name;
            treeView1.Nodes.Add(tnSub);
            //treeView1.SelectedNode = tnSub;
            TreeNodeMouseClickEventArgs e = new TreeNodeMouseClickEventArgs(tnSub, 0, 0, 0, 0);
            //treeView1_NodeMouseClick(treeView1, e);
        }
        private void drawArea()
        {
            templateManage.ZedControl = zedGraphMain;
            templateManage.DrawArea();
        }
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                //选中点击的节点
                treeView1.SelectedNode = e.Node;
                //获取节点区域的右下角坐标值
                Point pos = new Point(e.Node.Bounds.X + e.Node.Bounds.Width, e.Node.Bounds.Y + e.Node.Bounds.Height);
                //在选中的节点的右下角,弹出右键菜单,并设定控制者为treeView
                contextMenuStrip1.Show(treeView1, pos);
            }
            if (e.Button == MouseButtons.Left)
            {
                TreeNode tn = e.Node;
                AreaManageBase area = (AreaManageBase)tn.Tag;
                if (area != null)
                {
                    txtAreaX.DataBindings.Clear();
                    txtAreaX.DataBindings.Add("text", area.PackManage, "X");
                    txtAreaY.DataBindings.Clear();
                    txtAreaY.DataBindings.Add("text", area.PackManage, "Y");
                }
            }
        }
        private void EditAreaMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode treeNode = treeView1.SelectedNode;
            AreaManageBase selectAreaManage = treeNode.Tag as AreaManageBase;
            Point point = templateManage.GetBorderPackWH();
            AreaManageForm form = new AreaManageForm(selectAreaManage, PageStatus.Edit, point.X, point.Y);
            form.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.AreaManageForm_FormClosed);
            form.Show();
        }
        private void AreaManageForm_FormClosed(object sender, EventArgs e)
        {
            AreaManageForm form = sender as AreaManageForm;
            if (form != null && form.pageStatus == PageStatus.Create)
            {
                InsertPackObjTree(areaManageBase);
            }
            //画区域
            drawArea();
            AutoSizeF();
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            bool reVal = templateManage.Save();
            if (reVal)
            {
                new frmMessageBox().Show();
            }
            else
            {
                MessageBox.Show(templateManage.MsgStr);
            }
        }
        /// 
        /// 删除区域
        /// 
        /// 
        /// 
        private void ToolStripMenuItem2_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("确认要删除所有内容吗", "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (result == DialogResult.Yes)
            {
                TreeNode node = treeView1.SelectedNode;
                if (node != null)
                {
                    AreaManageBase area = node.Tag as AreaManageBase;
                    if (area != null)
                    {
                        templateManage.DelManage(area);
                        treeView1.Nodes.Remove(node);
                        //画区域
                        drawArea();
                    }
                }
            }
        }
        private bool zedGraphMain_MouseDownEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.zedControl_MouseDownEvent(sender, e);
            }
            return default(bool);
        }
        private bool zedGraphMain_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.zedControl_MouseMoveEvent(sender, e);
            }
            return default(bool);
        }
        private bool zedGraphMain_MouseUpEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.zedControl_MouseUpEvent(sender, e);
            }
            return default(bool);
        }
        private void zedGraphMain_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (templateManage != null)
            {
                ZedGraphControl send = sender as ZedGraphControl;
                templateManage.zedControl_MouseDoubleClick(send, e);
            }
        }
        private void zedGraphMain_KeyUp(object sender, KeyEventArgs e)
        {
            if (templateManage != null)
            {
                ZedGraphControl send = sender as ZedGraphControl;
                templateManage.zedControl_KeyUp(send, e);
            }
        }
        private void BtnBind_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "") return;
            #region 绑定所有手术记录的值
            int id = 14;
            if (textBox1.Text != "") id = int.Parse(textBox1.Text);
            operationRecor = BOperationRecord.getRecord(new OperationRecord(), id, 1);
            templateManage.OpeRecord = operationRecor;
            //指定对象的所有值属性的绑定
            templateManage.BindOperationRecordValueAll(templateManage.OpeRecord);
            //非值对象的数据绑定
            templateManage.Bind();
            #endregion
            #region 单独赋值绑定
            //设置对象属性的值,单独属性付值
            //EntityObjectChangeNotifier.SetValue(templateManage.OpeRecord, "OperationRecord .MZQYY", "麻醉前用药文本", "麻醉前用药值");
            //EntityObjectChangeNotifier.SetValue(templateManage.OpeRecord, "PatientRef.Bed", "12", "12值");
            //EntityObjectChangeNotifier.SetValue(operationRecor, "OperationSiteId", "体位1", "TY1");
            //EntityObjectChangeNotifier.SetValue(operationRecor, "InRoomTime", "2020-08-20 16:09");
            //EntityObjectChangeNotifier.SetValue(operationRecor, "OperationApplyRef.ApplyDepartmentRef.HospitalName", "dep234");
            #endregion
            //templateManage.NotificationAreaBindingUpdate("备注区域").NotificationAreaBindingUpdate("监测区域");
            zedGraphMain.Refresh();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                this.Close();
                this.Close();
            }
            catch (Exception)
            {
            }
        }
        private void panel1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            templateManage.SetPYL();
        }
        private void myPanel1_Scroll(object sender, ScrollEventArgs e)
        {
            templateManage.SetPYL();
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            if (templateManage != null && templateManage.ManageList.Count > 0)
            {
                int OperationApplyId = 10;
                if (textBox1.Text.Trim() != "") OperationApplyId = int.Parse(textBox1.Text.Trim());
                DocumentParent documentParent = new DocumentParent();
                documentParent.OperationApplyId = OperationApplyId;
                //documentParent.OpeRecord = BOperationRecord.SelectSingle("OperationApplyId=@OperationApplyId", new ParameterList("@OperationApplyId", OperationApplyId), RecursiveType.Parent, 3);  
                if (templateManage.OpeRecord == null) return;
                //指定对象的所有值属性的绑定
                templateManage.BindOperationRecordValueAll(templateManage.OpeRecord);
                templateManage.SetPYL(); //得设置一下偏移量
                //非值对象的数据绑定
                templateManage.Bind();
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            string txtFont = txtFontSize.Text.Trim();
            foreach (AreaManageBase manage in templateManage.ManageList)
            {
                List ables = manage.PackManage.ListPob.Where(s => s is AbleEditPackObj).ToList();
                foreach (PackObjBase pack in ables)
                {
                    AbleEditPackObj ableEdit = pack as AbleEditPackObj;
                    ableEdit.EditFontSize = int.Parse(txtFont);
                }
            }
        }
        private void button4_Click(object sender, EventArgs e)
        {
            templateManage.BindDefaultValue();
        }
        private void button5_Click(object sender, EventArgs e)
        {
            templateManage.ClearEdit();
        }
        private void cmbTypesetting_SelectedValueChanged(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                string typeset = cmbTypesetting.Text;
                if (typeset == "横向")
                {
                    templateManage.Typesetting = TypesettingEnum.Horizontal;
                }
                else
                {
                    templateManage.Typesetting = TypesettingEnum.Vertical;
                }
                AutoSizeF();
            }
        }
        private void cmbPageType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                string pageType = cmbPageType.Text;
                if (pageType == "A4")
                {
                    templateManage.PageType = PageTypeEnum.A4;
                }
                else
                {
                    templateManage.PageType = PageTypeEnum.A3;
                }
                AutoSizeF();
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=1").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zedGraphMain;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 1;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
                //设置排版值
                if (templateManage.Typesetting == TypesettingEnum.Vertical)
                {
                    cmbTypesetting.Text = "竖向";
                }
                else
                {
                    cmbTypesetting.Text = "横向";
                }
                //设置纸张类型
                if (templateManage.PageType == PageTypeEnum.A4)
                {
                    cmbPageType.Text = "A4";
                }
                else
                {
                    cmbPageType.Text = "A3";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button6_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=10").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zedGraphMain;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 10;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
                //设置排版值
                if (templateManage.Typesetting == TypesettingEnum.Vertical)
                {
                    cmbTypesetting.Text = "竖向";
                }
                else
                {
                    cmbTypesetting.Text = "横向";
                }
                //设置纸张类型
                if (templateManage.PageType == PageTypeEnum.A4)
                {
                    cmbPageType.Text = "A4";
                }
                else
                {
                    cmbPageType.Text = "A3";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button7_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=20").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zedGraphMain;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 20;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
                //设置排版值
                if (templateManage.Typesetting == TypesettingEnum.Vertical)
                {
                    cmbTypesetting.Text = "竖向";
                }
                else
                {
                    cmbTypesetting.Text = "横向";
                }
                //设置纸张类型
                if (templateManage.PageType == PageTypeEnum.A4)
                {
                    cmbPageType.Text = "A4";
                }
                else
                {
                    cmbPageType.Text = "A3";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button9_Click(object sender, EventArgs e)
        { 
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            { 
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=50").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zedGraphMain;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 50;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
                //设置排版值
                if (templateManage.Typesetting == TypesettingEnum.Vertical)
                {
                    cmbTypesetting.Text = "竖向";
                }
                else
                {
                    cmbTypesetting.Text = "横向";
                }
                //设置纸张类型
                if (templateManage.PageType == PageTypeEnum.A4)
                {
                    cmbPageType.Text = "A4";
                }
                else
                {
                    cmbPageType.Text = "A3";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button8_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            { 
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=30").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zedGraphMain;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 30;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
                //设置排版值
                if (templateManage.Typesetting == TypesettingEnum.Vertical)
                {
                    cmbTypesetting.Text = "竖向";
                }
                else
                {
                    cmbTypesetting.Text = "横向";
                }
                //设置纸张类型
                if (templateManage.PageType == PageTypeEnum.A4)
                {
                    cmbPageType.Text = "A4";
                }
                else
                {
                    cmbPageType.Text = "A3";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button10_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=40").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zedGraphMain;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 40;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
                //设置排版值
                if (templateManage.Typesetting == TypesettingEnum.Vertical)
                {
                    cmbTypesetting.Text = "竖向";
                }
                else
                {
                    cmbTypesetting.Text = "横向";
                }
                //设置纸张类型
                if (templateManage.PageType == PageTypeEnum.A4)
                {
                    cmbPageType.Text = "A4";
                }
                else
                {
                    cmbPageType.Text = "A3";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button11_Click(object sender, EventArgs e)
        {
            frmTemplateD frmTemplateD = new frmTemplateD();
            frmTemplateD.Show();
        }
        private void button12_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=60").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zedGraphMain;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 60;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
                //设置排版值
                if (templateManage.Typesetting == TypesettingEnum.Vertical)
                {
                    cmbTypesetting.Text = "竖向";
                }
                else
                {
                    cmbTypesetting.Text = "横向";
                }
                //设置纸张类型
                if (templateManage.PageType == PageTypeEnum.A4)
                {
                    cmbPageType.Text = "A4";
                }
                else
                {
                    cmbPageType.Text = "A3";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
         
    }
}