using AIMSExtension;
using DevComponents.DotNetBar.Controls;
using DevComponents.Editors.DateTimeAdv;
using HelperDB;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection.Emit;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
namespace DrawGraph
{
    /// 
    /// 麻醉前访视单
    /// 
    public class AnalgesiaDataManage : AreaManageBase
    {
        private OperationRecord myOpeRecord = null;
        public AnalgesiaDataManage() { }
        public AnalgesiaDataManage(object _operationRecor, DrawGraph.ZedGraphControl _zedControl, TemplateManage _template, string _name) : base(_operationRecor, _zedControl, _template, _name)
        { }
        public void init()
        {
            //自己要用的手术对象
            myOpeRecord = OpeRecord as OperationRecord;
        }
        #region 重写的事件
        /// 
        /// 鼠标点击画板
        /// 
        /// 
        /// 
        public override void MouseDown(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public override void MouseMove(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public override void MouseUp(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public override void MouseDoubleClick(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public override void KeyUp(ZedGraphControl sender, KeyEventArgs e)
        {
        }
        public override void editAr_Click(object sender, EventArgs e)
        {
            SelectDictText.Hidden();
            ////传过来的数据是不是可编辑的
            //AbleEditPackObj aEdit1S = sender as AbleEditPackObj;
            //if (aEdit1S == null) return;
            ////找到这个组件
            //AbleEditPackObj aEdit1 = PackManage.ListPob.FirstOrDefault(s => s is AbleEditPackObj && s.PackTag == aEdit1S.PackTag) as AbleEditPackObj;
            //if (aEdit1 == null) return;
            //if (aEdit1.ControlTitleText == "手术" || aEdit1.ControlTitleText == "诊断" || aEdit1.ControlTitleText == "人员")
            //{
            //    Control conl = aEdit1.CControl;
            //    aEdit1.IsVisible = !aEdit1.IsVisible;
            //    conl.Leave -= new EventHandler(txt_Leave);
            //    aEdit1S.CControl.MouseDown -= new MouseEventHandler(CControl_MouseDown);
            //    aEdit1S.CControl.KeyUp -= new KeyEventHandler(CControl_KeyUp2);
            //    aEdit1S.CControl.TextChanged -= new EventHandler(CControl_TextChanged);
            //    aEdit1S.CControl.KeyPress -= new KeyPressEventHandler(CControl_KeyPress); ;
            //    //根据数据源名称进行不同的事件处理
            //    switch (aEdit1.ClassDataSourceName)
            //    {
            //        case "OperationRecord.Applydiagnose": //手术诊断 
            //            opeDisease_Click(aEdit1, e);
            //            break;
            //        case "OperationRecord.Applyoperation": //手术诊断 
            //            ope_Click(aEdit1, e);
            //            break;
            //    }
            //}
            ////txt_DoubleClick(aEdit1.CControl, null);
        }
        //得到当前页数
        private void GetcurrentPage()
        {
            DateTime EndTime = OperationRecord.getOpeMaxTime(myOpeRecord);
            EndTime = DateTime.Parse(EndTime.ToString("yyyy-MM-dd HH:mm"));
            TimeSpan tsp = (TimeSpan)(EndTime - myOpeRecord.sharpBegin);
            double db = tsp.TotalHours / 4;
            if (db == ((int)tsp.TotalHours / 4))
                myOpeRecord.currentPage = (int)db;
            else
                myOpeRecord.currentPage = (int)db + 1;
            if (myOpeRecord.currentPage == 0) myOpeRecord.currentPage = 1;
        }
        #region 初始化时间轴
        /// 
        /// 设置页面的开始时间和结束时间
        /// 
        /// 手术信息对象
        private void setPageTime(DateTime begin)
        {
            if (myOpeRecord.pageCount == 0)
            {
                myOpeRecord.pageCount = 1;
                myOpeRecord.sharpBegin = getSharpTime(begin);
                myOpeRecord.PageBegin = getPageBegin(begin, collectInterval, 120);
                myOpeRecord.lastPageBegin = myOpeRecord.PageBegin.AddHours(120 / 60);
                if (myOpeRecord.phListPack != null)
                {
                    Panel pan3 = myOpeRecord.phListPack.CControl as Panel;
                    if (pan3 != null)
                    {
                        pan3.Controls.Clear();
                    }
                }
            }
        }
        /// 
        /// 根据采集间隔,确定页面时间跨度和页面开始时间
        /// 
        /// 给定时间(文本)
        /// 采集间隔(分钟)
        /// 页面时间跨度
        /// 页面显示的开始时间
        private DateTime getPageBegin(DateTime dt, double collectInterval, double timeSpan)
        {
            try
            {
                DateTime pageBegin = dt.Date.AddHours(dt.Hour);
                int ci = (int)(collectInterval * 60);
                if (ci <= 30)
                {
                    if (dt.Minute >= 30)
                    {
                        pageBegin = pageBegin.AddMinutes(30);
                    }
                    timeSpan = 30;
                }
                else if (ci <= 60)
                {
                    timeSpan = 60;
                }
                else
                {
                    timeSpan = 120;
                    TimeSpan ts = pageBegin - myOpeRecord.sharpBegin;
                    int h = ts.Hours;
                    h /= 2;
                    pageBegin = myOpeRecord.sharpBegin.AddHours(h * 2);
                }
                return pageBegin;
            }
            catch (Exception exp)
            {
                throw exp;
            }
        }
        /// 
        /// 获取系统的整点时刻
        /// 
        /// 
        private DateTime getSharpTime(DateTime dt)
        {
            int ci = (int)dt.Minute;
            if (ci >= 50)
            {
                dt = DateTime.Parse(dt.ToString("yyyy-MM-dd HH:50:00"));
            }
            else if (ci >= 40)
            {
                dt = DateTime.Parse(dt.ToString("yyyy-MM-dd HH:40:00"));
            }
            else if (ci >= 30)
            {
                dt = DateTime.Parse(dt.ToString("yyyy-MM-dd HH:30:00"));
            }
            else if (ci >= 20)
            {
                dt = DateTime.Parse(dt.ToString("yyyy-MM-dd HH:20:00"));
            }
            else if (ci >= 10)
            {
                dt = DateTime.Parse(dt.ToString("yyyy-MM-dd HH:10:00"));
            }
            else if (ci < 10)
            {
                dt = DateTime.Parse(dt.ToString("yyyy-MM-dd HH:00:00"));
            }
            //if (ci >= 30)
            //{
            //    dt = DateTime.Parse(dt.ToString("yyyy-MM-dd HH:30:00")); 
            //}
            //else if (ci < 30)
            //{
            //    dt = DateTime.Parse(dt.ToString("yyyy-MM-dd HH:00:00"));
            //}
            return dt;
        }
        private void setXAxisTime(GraphPane myPane, DateTime begin, double pageSpan)
        {
            myPane.XAxis.Scale.Min = new XDate(begin);
            myPane.X2Axis.Scale.Min = myPane.XAxis.Scale.Min;
            myPane.XAxis.Scale.Max = new XDate(begin.AddMinutes(pageSpan));
            myPane.X2Axis.Scale.Max = myPane.XAxis.Scale.Max;
        }
        #endregion
        public SelectDictText aSyncSelectDict = null;
        public override void Bind()
        {
            base.Bind();
            init();
            aSyncSelectDict = SelectDictText.CreateInstance();
            myOpeRecord.clearAddObj(ZedControl);
            setPageTime(myOpeRecord.InRoomTime.Value);
            setXAxisTime(ZedControl.GraphPane, myOpeRecord.PageBegin, 120);
            GetcurrentPage();
            //SelectDictText.SetValue += ASyncSelectDict_SetValue;
            List ables = PackManage.ListPob.Where(s => s is AbleEditPackObj).ToList();
            foreach (PackObjBase pack in ables)
            {
                AbleEditPackObj ableEdit = pack as AbleEditPackObj;
                if (ableEdit != null)
                {
                    ableEdit.IsVisible = true;
                    ableEdit.CControl.Click -= new EventHandler(txt_Click);
                    ableEdit.CControl.Click += new EventHandler(txt_Click);
                    if (ableEdit.ControlType == EControlType.DateTimePicker)
                    {
                        ableEdit.CControl.Leave -= new EventHandler(txt_Leave);
                        ableEdit.CControl.Leave += new EventHandler(txt_Leave);
                    }
                    else if (ableEdit.ControlType == EControlType.Directory)
                    {
                        if (ableEdit.ControlTitleText == "手术" || ableEdit.ControlTitleText == "诊断" || ableEdit.ControlTitleText == "人员")
                        {
                            ableEdit.CControl.DoubleClick -= new EventHandler(txt_DoubleClick1);
                            ableEdit.CControl.DoubleClick += new EventHandler(txt_DoubleClick1);
                            ableEdit.CControl.MouseDown -= new MouseEventHandler(CControl_MouseDown);
                            ableEdit.CControl.MouseDown += new MouseEventHandler(CControl_MouseDown);
                            ableEdit.CControl.KeyUp -= new KeyEventHandler(CControl_KeyUp2);
                            ableEdit.CControl.KeyUp += new KeyEventHandler(CControl_KeyUp2);
                            ableEdit.CControl.KeyPress -= new KeyPressEventHandler(CControl_KeyPress);
                            ableEdit.CControl.KeyPress += new KeyPressEventHandler(CControl_KeyPress);
                        }
                        else
                        {
                            ableEdit.CControl.DoubleClick -= new EventHandler(txt_DoubleClick);
                            ableEdit.CControl.DoubleClick += new EventHandler(txt_DoubleClick);
                            ableEdit.CControl.Leave -= new EventHandler(txt_Leave);
                            ableEdit.CControl.Leave += new EventHandler(txt_Leave);
                        }
                    }
                    else if (ableEdit.ControlType == EControlType.Directorys)
                    {
                        DevComponents.DotNetBar.Controls.TokenEditor tokenEditor = ableEdit.CControl as DevComponents.DotNetBar.Controls.TokenEditor;
                        tokenEditor.EditTextBox.DoubleClick -= EditTextBox_DoubleClick;
                        tokenEditor.EditTextBox.DoubleClick += EditTextBox_DoubleClick;
                        tokenEditor.EditTextBox.TextChanged -= EditTextBox_TextChanged;
                        tokenEditor.EditTextBox.TextChanged += EditTextBox_TextChanged; 
                        tokenEditor.Leave -= TokenEditor_Leave;
                        tokenEditor.Leave += TokenEditor_Leave;
                        if ((PublicMethod.RoleName.Contains("增加诊断") && ableEdit.ControlTitleText == "诊断") || (AIMSExtension.PublicMethod.RoleName.Contains("增加手术") && ableEdit.ControlTitleText == "手术"))
                        {
                            tokenEditor.ValidateToken -= new DevComponents.DotNetBar.Controls.ValidateTokenEventHandler(this.tokenEditor_ValidateToken);
                            tokenEditor.ValidateToken += new DevComponents.DotNetBar.Controls.ValidateTokenEventHandler(this.tokenEditor_ValidateToken);
                            tokenEditor.DoubleClick -= EditTextBox2_DoubleClick;
                            tokenEditor.DoubleClick += EditTextBox2_DoubleClick;
                        }
                    }
                    else if (ableEdit.ControlType == EControlType.CheckBox)
                    {
                        Panel pan = ableEdit.CControl as Panel;
                        if (pan != null)
                        {
                            foreach (Control conl in pan.Controls)
                            {
                                CheckBox chBox = conl as CheckBox;
                                if (chBox != null)
                                {
                                    chBox.CheckedChanged -= new EventHandler(txt_Leave);
                                    chBox.CheckedChanged += new EventHandler(txt_Leave);
                                }
                            }
                        }
                    }
                    else if (ableEdit.ControlType == EControlType.RadioButtonList)
                    {
                        Panel pan = ableEdit.CControl as Panel;
                        if (pan != null)
                        {
                            foreach (Control conl in pan.Controls)
                            {
                                CheckBox chBox = conl as CheckBox;
                                if (chBox != null)
                                {
                                    chBox.CheckedChanged -= new EventHandler(txt_Leave);
                                    chBox.CheckedChanged += new EventHandler(txt_Leave);
                                }
                            }
                        }
                    }
                    else if (ableEdit.ControlType == EControlType.TextBox)
                    {
                        ableEdit.CControl.KeyDown -= new KeyEventHandler(text_keyDown);
                        ableEdit.CControl.KeyDown += new KeyEventHandler(text_keyDown);
                        ableEdit.CControl.GotFocus -= new EventHandler(txt_Focus);
                        ableEdit.CControl.GotFocus += new EventHandler(txt_Focus);
                        ((TextBox)ableEdit.CControl).BorderStyle = BorderStyle.Fixed3D;
                        ableEdit.CControl.MouseWheel += new MouseEventHandler(numericUpDown1_MouseWheel);
                        ableEdit.CControl.Leave -= new EventHandler(txt_Leave);
                        ableEdit.CControl.Leave += new EventHandler(txt_Leave);
                    }
                    else
                    {
                        ableEdit.CControl.Leave -= new EventHandler(txt_Leave);
                        ableEdit.CControl.Leave += new EventHandler(txt_Leave);
                    }
                    SetAbleEditView(ableEdit);
                }
            }
        }
        ////取消滚轮事件
        //void numericUpDown1_MouseWheel(object sender, MouseEventArgs e)
        //{
        //    base.MouseWheelParam();
        //}
        private void txt_Focus(object sender, EventArgs e)
        {
            TextBox control = (TextBox)sender;
            if (control == null) return;
            AbleEditPackObj ableEdit = control.Tag as AbleEditPackObj;
            if (ableEdit == null) return;
            if (control.Focused == true && (ableEdit.PackValue == ableEdit.DefaultValue || ableEdit.PackValue == ""))
                control.Clear();
        }
        private void text_keyDown(object sender, KeyEventArgs e)
        {
            ((TextBox)sender).Enabled = true;
            if (e.Modifiers.CompareTo(Keys.Control) == 0 && e.KeyCode == Keys.V)
            {
                string val = Clipboard.GetText();
                val = val.Replace("\r", "").Replace("\n", "");
                Clipboard.SetText(val);
            }
        }
        /// 
        /// 在画完表单后,显示多选单选的默认项
        /// 
        public override void FollowUpMethod()
        {
            base.FollowUpMethod();
            List ables = PackManage.ListPob.Where(s => s is AbleEditPackObj).ToList();
            foreach (PackObjBase pack in ables)
            {
                AbleEditPackObj ableEdit = pack as AbleEditPackObj;
                SetAbleEditView(ableEdit);
            }
        }
        public override void BindTempData()
        {
            List ables = PackManage.ListPob.Where(s => s is AbleEditPackObj).ToList();
            foreach (PackObjBase pack in ables)
            {
                pack.Draw();
            }
        }
        /// 
        /// 公共验证方法
        /// 
        /// 
        public override bool Verification()
        {
            List editPack = PackManage.ListPob.Where(s => s is AbleEditPackObj).ToList();
            foreach (PackObjBase pack in editPack)
            {
                AbleEditPackObj ablePack = pack as AbleEditPackObj;
                if (ablePack != null)
                {
                    if (ablePack.ValidType == EValidType.IsRequired)
                    {
                        if (ablePack.PackValue.Trim() == "")
                        {
                            MessageBox.Show(pack.Descript + "不能为空");
                            return false;
                        }
                    };
                    if (ablePack.PackValue != "" && ablePack.ValidType == EValidType.IsNumber)
                    {
                        try
                        {
                            int.Parse(ablePack.PackValue);
                        }
                        catch (Exception)
                        {
                            MessageBox.Show(pack.Descript + "不能为空且必须是数值型");
                            return false;
                        }
                    };
                    if (ablePack.TextLength != 0)
                    {
                        if (ablePack.PackValue.Length >= ablePack.TextLength)
                        {
                            MessageBox.Show(ablePack.Descript + "长度不能超过" + ablePack.TextLength + "字");
                        }
                    }
                }
            }
            return true;
        }
        #endregion 重写的事件结束
        /// 
        /// 设置可编辑组件的显示样式
        /// 
        /// 
        private void SetAbleEditView(AbleEditPackObj ableEdit, bool isUpdate = false)
        {
            string span = "";
            double spanSum = Math.Round((float)(ableEdit.OneUnitCount / 18));
            for (int i = 0; i < spanSum; i++)
            {
                if (ableEdit.IsHorizontal == ELineType.Horizontal)
                {
                    span += " ";
                }
                else
                {
                    span += "\n";
                }
            }
            string text = "", value = "";
            if (ableEdit != null && ableEdit.CControl != null)
            {
                switch (ableEdit.ControlType)
                {
                    case EControlType.RadioButtonList:
                        foreach (Control conl in ableEdit.CControl.Controls)
                        {
                            string spanT = span.Clone().ToString();
                            if (ableEdit.DfArrangement == EIsBool.True)
                            {
                                if (spanT.Length - conl.Text.Length >= conl.Text.Length)
                                {
                                    spanT = spanT.Remove(spanT.Length - conl.Text.Length, conl.Text.Length);
                                }
                            }
                            CheckBox radio = conl as CheckBox;
                            if (radio.Checked)
                            {
                                text += "☑" + conl.Text + spanT;
                                value = conl.Text;
                            }
                            else
                            {
                                text += "□" + conl.Text + spanT;
                            }
                        }
                        break;
                    case EControlType.CheckBox:
                        foreach (Control conl in ableEdit.CControl.Controls)
                        {
                            string spanT = span.Clone().ToString();
                            if (ableEdit.DfArrangement == EIsBool.True)
                            {
                                if (spanT.Length - conl.Text.Length >= conl.Text.Length)
                                {
                                    spanT = spanT.Remove(spanT.Length - conl.Text.Length, conl.Text.Length);
                                }
                            }
                            CheckBox radio = conl as CheckBox;
                            if (radio.Checked)
                            {
                                text += "☑" + conl.Text + spanT;
                                value += conl.Text + ",";
                            }
                            else
                            {
                                text += "□" + conl.Text + spanT;
                            }
                        }
                        value = value.TrimEnd(',');
                        break;
                    case EControlType.Directory:
                        value = ableEdit.PackValue;
                        if (ableEdit.ControlTitleText == "手术" || ableEdit.ControlTitleText == "诊断" || ableEdit.ControlTitleText == "人员")
                        {
                            text = DBManage.GetDictionaryValuesById(ableEdit.PackValue, ableEdit.ControlTitleText);
                        }
                        else
                        {
                            text = ableEdit.PackValue;
                        }
                        //设置属性的值
                        template.SetObjValue(OpeRecord, ableEdit.ClassDataSourceName, text, value);
                        break;
                    case EControlType.Directorys:
                        value = ableEdit.PackValue;
                        if (ableEdit.ControlTitleText == "手术" || ableEdit.ControlTitleText == "诊断" || ableEdit.ControlTitleText == "人员")
                        {
                            text = DBManage.GetDictionaryValuesById(ableEdit.PackValue, ableEdit.ControlTitleText);
                        }
                        else
                        {
                            text = ableEdit.PackValue;
                        }
                        //设置属性的值
                        template.SetObjValue(OpeRecord, ableEdit.ClassDataSourceName, text, value);
                        break;
                    default:
                        text = ableEdit.CControl.Text;
                        value = ableEdit.CControl.Text;
                        break;
                }
                //设置属性的值
                template.SetObjValue(OpeRecord, ableEdit.ClassDataSourceName, text, value, isUpdate);
                //如果有逻辑区域,则区域进行更新。
                template.NotificationAreaBindingUpdate(template.ProjectName + "逻辑");
            }
        }
        private void txt_DoubleClick(object sender, EventArgs e)
        {
            Control control = (Control)sender;
            if (control == null) return;
            AbleEditPackObj ableEdit = control.Tag as AbleEditPackObj;
            if (ableEdit == null) return;
            string DataSourceName = ableEdit.ClassDataSourceName;
            try
            {
                string text = "", value = "";
                switch (ableEdit.ControlType)
                {
                    case EControlType.DateTimePicker:
                        text = DateTime.Now.ToString();
                        value = DateTime.Now.ToString();
                        control.Text = text;
                        break;
                    case EControlType.Directory:
                        TYZD_Click(ableEdit, e, true);
                        break;
                    default:
                        text = ableEdit.CControl.Text;
                        value = ableEdit.CControl.Text;
                        break;
                }
            }
            catch (Exception ex)
            {
                PublicMethod.WriteLog(ex);
            }
            finally
            {
                template.ZedControl.Refresh();
            }
        }
        private void txt_DoubleClick1(object sender, EventArgs e)
        {
            Control control = (Control)sender;
            if (control == null) return;
            AbleEditPackObj aEdit1S = control.Tag as AbleEditPackObj;
            if (aEdit1S == null) return;
            //这句话很重要,只操作自己管理器里的组件
            AbleEditPackObj aEdit1 = PackManage.ListPob.FirstOrDefault(s => s.PackTag == aEdit1S.PackTag) as AbleEditPackObj;
            //指定的组件显示
            if (aEdit1 != null)
            {
                Control conl = aEdit1.CControl;
                conl.Leave -= new EventHandler(txt_Leave);
                aEdit1S.CControl.MouseDown -= new MouseEventHandler(CControl_MouseDown);
                aEdit1S.CControl.KeyUp -= new KeyEventHandler(CControl_KeyUp2);
                aEdit1S.CControl.TextChanged -= new EventHandler(CControl_TextChanged);
                aEdit1S.CControl.KeyPress -= new KeyPressEventHandler(CControl_KeyPress); ;
                //根据数据源名称进行不同的事件处理
                switch (aEdit1.ClassDataSourceName)
                {
                    case "OperationRecord.Applydiagnose": //手术诊断 
                        opeDisease_Click(aEdit1, e);
                        break;
                    case "OperationRecord.Applyoperation": //手术诊断 
                        ope_Click(aEdit1, e);
                        break;
                }
            }
        }
        private void CControl_MouseDown(object sender, MouseEventArgs e)
        {
            if (myOpeRecord != null)
            {
                TextBox conl = sender as TextBox;
                string leftStr = conl.Text.Substring(0, conl.SelectionStart);
                string rightStr = conl.Text.Substring(conl.SelectionStart, conl.Text.Length - conl.SelectionStart);
                int startIndex = 0;
                int endLength = conl.Text.Length;
                if (leftStr.Contains(","))
                {
                    int beginindex = leftStr.LastIndexOf(',');
                    startIndex = beginindex + 1;
                    if (rightStr.Contains(","))
                    {
                        endLength = rightStr.IndexOf(",") + (leftStr.Length - beginindex);
                    }
                }
                else
                {
                    if (rightStr.Contains(","))
                    {
                        endLength = rightStr.IndexOf(",") + leftStr.Length + 1;
                    }
                }
                conl.Select(startIndex, endLength);
            }
        }
        private void ope_Click(AbleEditPackObj sender, EventArgs e)
        {
            AbleEditPackObj ableEdit = sender;
            if (ableEdit == null) return;
            try
            {
                if (myOpeRecord != null)
                {
                    SelDict2(sender, e, ableEdit.ControlTitleText);
                }
            }
            catch (Exception ex)
            {
                AIMSExtension.PublicMethod.WriteLog(ex);
            }
        }
        private void opeDisease_Click(AbleEditPackObj sender, EventArgs e)
        {
            AbleEditPackObj ableEdit = sender;
            if (ableEdit == null) return;
            try
            {
                if (myOpeRecord != null)
                {
                    SelDict2(sender, e, ableEdit.ControlTitleText);
                }
            }
            catch (Exception ex)
            {
                AIMSExtension.PublicMethod.WriteLog(ex);
            }
        }
        private void txt_Click(object sender, EventArgs e)
        {
            Control control = (Control)sender;
            if (control == null) return;
            AbleEditPackObj ableEdit = control.Tag as AbleEditPackObj;
            if (ableEdit == null) return;
            string DataSourceName = ableEdit.ClassDataSourceName;
            if (SelectDictText.dgvZd.Visible == true)
            {
                SelectDictText.Hidden();
            }
        }
        private void txt_Leave(object sender, EventArgs e)
        {
            Control control = (Control)sender;
            if (control == null) return;
            AbleEditPackObj ableEdit = control.Tag as AbleEditPackObj;
            if (ableEdit == null) return;
            try
            {
                if (ableEdit.ControlType == EControlType.RadioButtonList)
                {
                    if ((sender as CheckBox).Checked == true)
                    {
                        foreach (CheckBox chk in (sender as CheckBox).Parent.Controls)
                        {
                            chk.CheckedChanged -= new EventHandler(txt_Leave);
                            if (chk != sender)
                            {
                                chk.Checked = false;
                            }
                            chk.CheckedChanged += new EventHandler(txt_Leave);
                        }
                    }
                }
                SetAbleEditView(ableEdit, true);
            }
            catch (Exception ex)
            {
                //写日志
                PublicMethod.WriteLog(ex);
            }
            finally
            {
            }
        }
        //设置打印模式,组件不显示
        public override void setPrint(bool isVisible)
        {
            //预览状态时所可编辑组件的组件隐藏
            List ables = PackManage.ListPob.Where(s => s is AbleEditPackObj).ToList();
            foreach (PackObjBase pack1 in ables)
            {
                AbleEditPackObj ableEdit = pack1 as AbleEditPackObj;
                if (ableEdit != null)
                {
                    ableEdit.IsVisible = isVisible;
                    if (isVisible == true)
                        ableEdit.IsViewBoard = EIsBool.True;
                    else
                        ableEdit.IsViewBoard = EIsBool.False;
                }
            }
        }
        //通用字典分组窗体打开
        private void TYZD_Click(AbleEditPackObj sender, EventArgs e, bool isRadio = false)
        {
            AbleEditPackObj ableEdit = sender;
            if (ableEdit == null) return;
            try
            {
                if (myOpeRecord != null)
                {
                    SelDict(sender, e, ableEdit.ControlTitleText, isRadio);
                }
            }
            catch (Exception ex)
            {
                AIMSExtension.PublicMethod.WriteLog(ex);
            }
        }
        private void SelDict(AbleEditPackObj sender, EventArgs e, string _DictType, bool isRadio = false)
        {
            AbleEditPackObj ableEdit = sender;
            if (ableEdit == null) return;
            ableEdit.CControl.Leave -= new EventHandler(txt_Leave);
            ableEdit.CControl.KeyUp -= new KeyEventHandler(CControl_KeyUp);
            ableEdit.CControl.KeyUp += new KeyEventHandler(CControl_KeyUp);
            ableEdit.CControl.KeyPress -= new KeyPressEventHandler(CControl_KeyPress);
            ableEdit.CControl.KeyPress += new KeyPressEventHandler(CControl_KeyPress);
            if (myOpeRecord != null)
            {
                Control conl = sender.CControl;
                if (conl is TextBox)
                {
                    ((TextBox)conl).BorderStyle = BorderStyle.Fixed3D;
                    ((TextBox)conl).Focus();
                    if (sender.PackValue != null && sender.PackValue.Trim() != "" && isRadio == false)
                    {
                        if (((TextBox)conl).Text.LastIndexOf(',') != sender.PackText.Length)
                            ((TextBox)conl).Text = ((TextBox)conl).Text + ",";
                    }
                        ((TextBox)conl).Select(((TextBox)conl).Text.Length, 1);
                }
                aSyncSelectDict.Show(template, OpeRecord, sender, _DictType, isRadio);
                ableEdit.CControl.Leave += new EventHandler(txt_Leave);
            }
        }
        //private void ASyncSelectDict_SetValue(string Text, string Key, AbleEditPackObj aEdit)
        //{
        //    if (aEdit.ControlTitleText == "手术" || aEdit.ControlTitleText == "诊断" || aEdit.ControlTitleText == "人员")
        //    {
        //        aEdit.PackValue = Key;
        //        aEdit.PackText = Text;
        //        template.SetObjValue(OpeRecord, aEdit.ClassDataSourceName, Text, Key, true);
        //    }
        //    else
        //    {
        //        aEdit.PackValue = Text;
        //        aEdit.PackText = Text;
        //        template.SetObjValue(OpeRecord, aEdit.ClassDataSourceName, Text, Text, true);
        //    }
        //    aEdit.CControl.Leave -= new EventHandler(txt_Leave);
        //    aEdit.CControl.Leave += new EventHandler(txt_Leave);
        //}
        private void CControl_KeyUp(object sender, KeyEventArgs e)
        {
            if (myOpeRecord != null)
            {
                Control conl = sender as Control;
                if (e.KeyCode == Keys.Down)
                {
                    if (SelectDictText.dgvZd.CurrentRow.Index + 1 != SelectDictText.dgvZd.Rows.Count - 1)
                    {
                        SelectDictText.dgvZd.CurrentCell = SelectDictText.dgvZd.Rows[SelectDictText.dgvZd.CurrentRow.Index + 1].Cells[1];
                    }
                }
                else if (e.KeyCode == Keys.Up)
                {
                    if (SelectDictText.dgvZd.CurrentRow.Index != 0)
                    {
                        SelectDictText.dgvZd.CurrentCell = SelectDictText.dgvZd.Rows[SelectDictText.dgvZd.CurrentRow.Index - 1].Cells[1];
                    }
                }
            }
        }
        private void CControl_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar.ToString() == "\r")
            {
                if (SelectDictText.dgvZd.SelectedRows.Count > 0)
                {
                    SelectDictText.SetContent(SelectDictText.dgvZd.SelectedRows[0].Index);
                }
            }
        }
        private void CControl_TextChanged(object sender, EventArgs e)
        {
            if (myOpeRecord != null)
            {
                Control conl = sender as Control;
                AbleEditPackObj aEdit1S = conl.Tag as AbleEditPackObj;
                if (aEdit1S == null) return;
                aSyncSelectDict.ShowSel(template, conl, OpeRecord, aEdit1S);
                //conl.KeyUp -= new KeyEventHandler(CControl_KeyUp2); 
            }
        }
        private void CControl_KeyUp2(object sender, KeyEventArgs e)
        {
            if (myOpeRecord != null)
            {
                Control conl = sender as Control;
                if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back)
                {
                    if (conl.Text != SelectDictText.Value && SelectDictText.ChageText == "")
                    {
                        AbleEditPackObj aEdit1S = conl.Tag as AbleEditPackObj;
                        if (aEdit1S == null) return;
                        aSyncSelectDict.DelSel(template, conl, OpeRecord, aEdit1S);
                        SelectDictText.ChageText = "";
                    }
                }
                else if (e.KeyCode == Keys.Down)
                {
                    if (SelectDictText.dgvZd.CurrentRow.Index + 1 != SelectDictText.dgvZd.Rows.Count - 1)
                    {
                        SelectDictText.dgvZd.CurrentCell = SelectDictText.dgvZd.Rows[SelectDictText.dgvZd.CurrentRow.Index + 1].Cells[1];
                    }
                }
                else if (e.KeyCode == Keys.Up)
                {
                    if (SelectDictText.dgvZd.CurrentRow.Index != 0)
                    {
                        SelectDictText.dgvZd.CurrentCell = SelectDictText.dgvZd.Rows[SelectDictText.dgvZd.CurrentRow.Index - 1].Cells[1];
                    }
                }
            }
        }
        private void SelDict2(AbleEditPackObj sender, EventArgs e, string _DictType, bool isRadio = false)
        {
            AbleEditPackObj ableEdit = sender;
            if (ableEdit == null) return;
            ableEdit.CControl.MouseDown -= new MouseEventHandler(CControl_MouseDown);
            ableEdit.CControl.MouseDown += new MouseEventHandler(CControl_MouseDown);
            ableEdit.CControl.KeyUp -= new KeyEventHandler(CControl_KeyUp2);
            ableEdit.CControl.KeyUp += new KeyEventHandler(CControl_KeyUp2);
            ableEdit.CControl.KeyPress -= new KeyPressEventHandler(CControl_KeyPress);
            ableEdit.CControl.KeyPress += new KeyPressEventHandler(CControl_KeyPress);
            SelectDictText.ChageText = "";
            if (myOpeRecord != null)
            {
                Control conl = sender.CControl;
                if (conl is TextBox)
                {
                    ((TextBox)conl).BorderStyle = BorderStyle.Fixed3D;
                    ((TextBox)conl).Focus();
                    if (sender.PackValue != null && sender.PackValue.Trim() != "" && isRadio == false)
                    {
                        if (((TextBox)conl).Text.LastIndexOf(',') != sender.PackText.Length && ((TextBox)conl).Text != "")
                            ((TextBox)conl).Text = ((TextBox)conl).Text + ",";
                    }
                        ((TextBox)conl).Select(((TextBox)conl).Text.Length, 1);
                }
                ableEdit.CControl.TextChanged -= new EventHandler(CControl_TextChanged);
                ableEdit.CControl.TextChanged += new EventHandler(CControl_TextChanged);
                aSyncSelectDict.Show(template, OpeRecord, sender, _DictType, isRadio);
            }
        }
        private void EditTextBox_DoubleClick(object sender, EventArgs e)
        {
            TextBox txt = sender as TextBox;
            TokenEditorManage.SelectDictList(OpeRecord as OperationRecord, txt);
        }
        private void EditTextBox_TextChanged(object sender, EventArgs e)
        {
            TextBox txt = sender as TextBox;
            TokenEditorManage.SelectDictList(OpeRecord as OperationRecord, txt);
        }
        private void tokenEditor_ValidateToken(object sender, DevComponents.DotNetBar.Controls.ValidateTokenEventArgs ea)
        {
            DevComponents.DotNetBar.Controls.TokenEditor tokenEditor = sender as DevComponents.DotNetBar.Controls.TokenEditor;
            AbleEditPackObj aEdit = tokenEditor.Tag as AbleEditPackObj;
            if (ea.IsNewToken)
            {
                tokenEditor.EditTextBox.TextChanged -= EditTextBox_TextChanged;
                string id = TokenEditorManage.GetOperationItemId(ea.Token.Value, aEdit);
                tokenEditor.SelectedTokens.Add(new EditToken(id, ea.Token.Value));
                ea.Token = null;
                tokenEditor.EditTextBox.Text = "";
                tokenEditor.IsPopupOpen = false;
                tokenEditor.EditTextBox.TextChanged += EditTextBox_TextChanged;
            }
        }
        private void TokenEditor_Leave(object sender, EventArgs e)
        {
            DevComponents.DotNetBar.Controls.TokenEditor tokenEditor = sender as DevComponents.DotNetBar.Controls.TokenEditor;
            AbleEditPackObj aEdit = tokenEditor.Tag as AbleEditPackObj;
            TokenEditorManage.SaveDictItem(template, OpeRecord as OperationRecord, tokenEditor, aEdit);
        }
        private void EditTextBox2_DoubleClick(object sender, EventArgs e)
        {
            DevComponents.DotNetBar.Controls.TokenEditor tokenEditor = ((DevComponents.DotNetBar.Controls.TokenEditor)sender);
            string text = tokenEditor.Text;
            if (text.Trim() != "")
            {
                tokenEditor.SelectedTokens.Clear();
                tokenEditor.EditTextBox.TextChanged -= EditTextBox_TextChanged;
                tokenEditor.EditTextBox.Text = text;
                tokenEditor.IsPopupOpen = false;
                tokenEditor.EditTextBox.TextChanged += EditTextBox_TextChanged;
            }
        }
    }
}