using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DCSoft.Writer;
using DCSoft.Writer.Controls;
using DCSoft.Writer.Commands;
using DCSoft.Writer.Dom;
using DCSoft.Drawing;
using DCSoft.Writer.Data;
using DCSoft.Writer.Security;
using DCSoft.Common;
using DCSoft.Data;
using DCSoft.Writer.Printing;
using DCSoft.Writer.Extension.Data;
using DCSoft.Writer.Extension;
using DCSoft.Design;
using System.Linq;
using System.Xml;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
namespace DocumentManagement
{
    /// 
    /// 
    /// 
    public partial class frmTemplate : Form
    {
        
        public PrintTemplate model = new PrintTemplate();
        /// 
        /// 数据源树状列表控制器
        /// 
        private DataSourceTreeViewControler dstvControler = null;
        public WriterControl editControl { get { return this.myEditControl; } }
        public RichTextBox RTB_Click { get { return this.rtbClick; } }
        public RichTextBox RTB_Content { get { return this.rtbContent; } }
        /// 
        /// 元素事件窗体
        /// 
        //private frmElementEvents frmElementEvents;
        //private XTextDocument bakDoc = null;
        private XTextElementList tempList,tempChkList;
        private bool delFlag = true;
        private FlagXTextRangeProvider provider = new FlagXTextRangeProvider();
        //private CompilerResults cr;
        //private Type type;
        public frmTemplate()
        {
            InitializeComponent();     
            myEditControl.ServerObject = new ServerObjectSample(this);
            //myEditControl.ViewMode = Printing.PageViewMode.Normal;
            //myEditControl.Document.Options.EditOptions.AutoEditElementValue = true;
            //myEditControl.IsAdministrator = true;
            //myEditControl.Readonly = true;
            //myEditControl.KeyPress += new KeyPressEventHandler(myEditControl_KeyPress);
            myEditControl.DocumentControler = new MyDocumentControler();
            //myEditControl.IsAdministrator = true;
            //myEditControl.DocumentControler.DataFilter = new MyDataFilter();
            //myEditControl.HeaderFooterReadonly = true;
            myEditControl.AllowDragContent = true;
            //DocumentContentStyle style = myEditControl.Document.Style;
            //myEditControl.AutoSetDocumentDefaultFont = false;
            tabDataSource.Visible = false;
            this.spDataSource.Visible = false;
            myEditControl.MoveFocusHotKey = MoveFocusHotKeys.Tab;
        }
        private AppStartOptions _StartOptions = new AppStartOptions();
        public AppStartOptions StartOptions
        {
            get
            {
                return _StartOptions;
            }
            set
            {
                _StartOptions = value;
            }
        }
        private void frmTemplate_Load(object sender, EventArgs e)
        {
            this.myEditControl.EventCanInsertObject +=
                new DCSoft.Writer.CanInsertObjectEventHandler(this.myEditControl_EventCanInsertObject);
            this.myEditControl.EventInsertObject +=
                new DCSoft.Writer.InsertObjectEventHandler(this.myEditControl_EventInsertObject);
            //this.myEditControl.DocumentControler = new DocumentControlerExt();
            // 添加扩展编辑器命令模块对象
            myEditControl.AppHost.CommandContainer.Modules.Add(
                new DCSoft.Writer.Extension.WriterCommandModuleExtension());
            //DCSoft.Writer.Controls.TextWindowsFormsEditorHost.PopupFormSizeFix = new System.Drawing.Size(40, 20);
            myEditControl.Font = new Font(System.Windows.Forms.Control.DefaultFont.Name, 12);
            if (_StartOptions == null)
            {
                _StartOptions = new AppStartOptions();
            }
            //// 设置编辑器界面双缓冲
            //myEditControl.DoubleBuffering = _StartOptions.DoubleBuffering;
            // 初始化设置命令执行器
            myEditControl.CommandControler = myCommandControler;
            //myEditControl.CommandControler.UpdateBindingControlStatus();
            myCommandControler.Start();
            myEditControl.DocumentOptions = new DocumentOptions();
            // 设置文档处于调试模式
            myEditControl.DocumentOptions.BehaviorOptions.DebugMode = true;
            if (_StartOptions.EnablePermissionControl)
            {
                // Enable permission control
                // 允许逻辑删除
                myEditControl.DocumentOptions.SecurityOptions.EnableLogicDelete = true;
                // 启用授权控制
                myEditControl.DocumentOptions.SecurityOptions.EnablePermission = true;
                // 显示逻辑删除的内容
                myEditControl.DocumentOptions.SecurityOptions.ShowLogicDeletedContent = true;
                // 显示痕迹标记
                myEditControl.DocumentOptions.SecurityOptions.ShowPermissionMark = true;
                //mPermissionConfig.Enabled = true;
                //mLogin.Enabled = true;
                //myEditControl.AutoUserLogin = true;
                //myEditControl.AutoUserLoginInfo = _StartOptions.LoginInfo;
            }
            else
            {
                // Without permission control
                myEditControl.DocumentOptions.SecurityOptions.EnableLogicDelete = false;
                myEditControl.DocumentOptions.SecurityOptions.EnablePermission = false;
                myEditControl.DocumentOptions.SecurityOptions.ShowLogicDeletedContent = false;
                myEditControl.DocumentOptions.SecurityOptions.ShowPermissionMark = false;
                //mPermissionConfig.Enabled = false;
                //mLogin.Enabled = false;
                //myEditControl.AutoUserLogin = false;
            }
            //this.myEditControl_DocumentLoad(null, null);
            //model.Id = 2;
            if (model.Id != 0)
            {
                model = DocumentDAL.GetTemplatebyId(model.Id);
            }
            tempList = new XTextElementList();
            tempChkList = new XTextElementList();
            //DocumentDAL.LoadKBLibaray();
            myEditControl.ExecuteCommand("LoadKBLibrary", false, DocumentDAL.Lib);
            //string kbFile = System.IO.Path.Combine(Application.StartupPath + "\\PrintDC\\", "kblibrary.xml");
            //if (System.IO.File.Exists(kbFile))
            //{
            //     //自动加载默认的知识库
            //    //KBLibrary lib = (KBLibrary)myEditControl.ExecuteCommand("LoadKBLibrary", false, kbFile);
            //    // 设置加载知识库中模板使用的文件系统
            //    //myEditControl.AppHost.FileSystems[lib.TemplateFileSystemName]
            //    //    = EMR.EMRFileSystem.Instance;
            //}
            
            // 注册自定义的输入域下拉列表提供者
            myEditControl.AppHost.Services.AddService(
                typeof(IListItemsProvider),
                new MyListItemsProvider());
            mDataSourceList_Click(null, null);
            // 执行一次新增文件操作
            myEditControl.ExecuteCommand("FileNew", true, null);
            //byte[] array = Encoding.UTF8.GetBytes(strXML);
            //MemoryStream stream = new MemoryStream(array);             //convert stream 2 string      
            //StreamReader reader = new StreamReader(stream);
            //myEditControl.ExecuteCommand("FileOpen", false, reader);
            //reader.Close();
            //stream.Close();
            //myEditControl.ExecuteCommand("InsertXML", false, strXML);
            
            //document.Parameters.SetValue("title", System.Configuration.ConfigurationManager.AppSettings["HospitalName"].ToString());
            //myEditControl.RefreshDocument();
            //myEditControl.ExecuteCommand("UpdateViewForDataSource", false, null);
            //如果不为空,则“编辑”状态
            if (model.Id != 0)
            {
                myEditControl.LoadDocumentFromString(model.XmlFile, "xml");
                myEditControl.Document.FileName = model.XmlFileName;
                //bakDoc = new XTextDocument();
                //bakDoc.Fields.AddRange(myEditControl.Document.Fields.ToArray());
                tempList.AddRange(myEditControl.Document.Fields);
                //tempList.ToArray().ToList()
                //.ForEach(element =>
                //    listFields.Items.Add(
                //    new ListItem
                //    {
                //        Text = ((XTextInputFieldElementBase)element).BackgroundText
                //        ,
                //        Value = element.ID
                //    }));
                //listFields.DisplayMember = listFields.text;
                tempChkList.AddRange(myEditControl.Document.GetElementsByType(typeof(XTextCheckBoxElement)));
                myEditControl.DocumentContentChanged += new WriterEventHandler(myEditControl_DocumentContentChanged);
                //ImageList lg = new ImageList();
                //lg.Images.Add(this.toolStripButton2.Image);
                //lg.Images.Add(this.toolStripMenuItem12.Image);
                //listFields.SmallImageList = lg;
                //if (model.XmlStatic.Length > 0)
                //{
                //    XmlDocument doc = new XmlDocument();
                //    doc.LoadXml(model.XmlStatic);
                //    UpdateListView(doc);
                //}
                //else
                //{
                //    UpdateListView();
                //}
                UpdateListView();
            }
            else
            {
                /*
                //第一行页眉  医院民称
                XTextDocument document = this.myEditControl.Document;
                ContentBuilder bulder = new ContentBuilder(document.Header);
                XTextInputFieldElement title = new XTextInputFieldElement();
                title.BackgroundText = "医院名称";
                title.FieldSettings = new InputFieldSettings();
                //title.FieldSettings.EditStyle = InputFieldEditStyle.Text;
                //title.DisplayFormat = new ValueFormater();
                //title.ValueBinding = new DCSoft.Writer.Data.XDataBinding();
                //title.ValueBinding.DataSource = "title";//数据源的名称
                //title.ValueBinding.AutoUpdate = true;//是否自动更新数据
                bulder.Append(title);
                title.Style.Align = DCSoft.Drawing.DocumentContentAlignment.Center;
                DocumentContentStyle dcs2 = new DocumentContentStyle();
                dcs2.FontSize = 12;
                dcs2.Color = System.Drawing.Color.Black;
                dcs2.Align = DCSoft.Drawing.DocumentContentAlignment.Left;
                bulder.AppendParagraphFlag(dcs2);
                myEditControl.ExecuteCommand("InsertString", false, " ");
                //myEditControl.RefreshDocument();
                title.ID = "D_Title";
                //title.StyleIndex = 0;
                //title.Style.FontSize = 16;
                //title.Style.Color = System.Drawing.Color.Gray;
               */
            }
            //XTextInputFieldElement titleBase = (XTextInputFieldElement)myEditControl.Document.GetElementById("D_Title");
            //if (titleBase != null)
            //{
            //    titleBase.Text = System.Configuration.ConfigurationManager.AppSettings["HospitalName"].ToString();
            //}
            //dstvControler = new DataSourceTreeViewControler(tvwDataSource);
            //tvwDataSource.MouseDown += dstvControler.HandleTreeViewMouseDown;
            string fileName = System.IO.Path.Combine(
                Application.StartupPath,
                "DataSourceDescriptor.xml");
            if (System.IO.File.Exists(fileName))
            {
                dstvControler.LoadFile(fileName);
            }
            ////使checkbox居中显示
            //XTextElementList list = myEditControl.Document.GetElementsByType(typeof(XTextCheckBoxElement));
            //foreach (XTextElement el in list)
            //{
            //    ((XTextCheckBoxElement)el).Top = 15;
            //    //DCSoft.WinForms.ResizeableType ResizeableType = new DCSoft.WinForms.ResizeableType();
            //    //ResizeableType = DCSoft.WinForms.ResizeableType.WidthAndHeight;
            //    //((XTextCheckBoxElement)el).Resizeable = ResizeableType;
            //    //MessageBox.Show(((XTextCheckBoxElement)el).WidthHeightRate.ToString());
            //}
            //InitCodeCompiler();
        } 
        /// 
        /// Handle after load document
        /// 
        /// 
        /// 
        private void myEditControl_DocumentLoad(object sender, EventArgs e)
        {
            myEditControl.SetDocumentParameterValue(
                "当前时间",
                DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            //if (myEditControl.DocumentOptions.SecurityOptions.EnablePermission)
            //{
            //    // if enable permission 
            //    if (myEditControl.Document != null && _StartOptions.LoginInfo != null)
            //    {
            //        // User logon , add current user info to document.
            //        myEditControl.UserLogin(_StartOptions.LoginInfo , false );
            //    }
            //}
        }
        /// 
        /// Demo of server object in document
        /// 
        public class ServerObjectSample
        {
            public ServerObjectSample(frmTemplate frm)
            {
                _Form = frm;
            }
            private frmTemplate _Form = null;
            public frmTemplate Form
            {
                get
                {
                    return _Form;
                }
            }
            public string FormTitle
            {
                get
                {
                    return _Form.Text;
                }
            }
            public string AppPath
            {
                get
                {
                    return Application.StartupPath;
                }
            }
            private string _Name = "Zhang san";
            public string Name
            {
                get { return _Name; }
                set { _Name = value; }
            }
            private DateTime _Birthday = new DateTime(1990, 1, 1);
            public DateTime Birthday
            {
                get { return _Birthday; }
                set { _Birthday = value; }
            }
            private string _Nation = "China";
            public string Nation
            {
                get { return _Nation; }
                set { _Nation = value; }
            }
        }
        public class MyDocumentControler : DCSoft.Writer.Dom.DocumentControler
        {
            public override bool CanDelete(XTextElement element, DomAccessFlags flags)
            {
                //if (element is XTextInputFieldElement)
                //{
                //    return false;
                //}
                return base.CanDelete(element, flags);
            }
        }
        #region Click_Event
        private void menuClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
        }
        private void menuOpenXMLDemo_Click(object sender, EventArgs e)
        {
            HandleCommand(MyCommandNames.OpenXMLDemo);
        }
        private void menuOpenRTFDemo_Click(object sender, EventArgs e)
        {
            HandleCommand(MyCommandNames.OpenNursingRecordDemo);
        }
        private void mOpenFormViewDemo_Click(object sender, EventArgs e)
        {
            HandleCommand(MyCommandNames.OpenFormViewDemo);
        }
        private void mTest_Click(object sender, EventArgs e)
        {
        }
        private void mTestInsertField_Click(object sender, EventArgs e)
        {
            XTextInputFieldElement field = new XTextInputFieldElement();
            field.FieldSettings = new InputFieldSettings();
            field.FieldSettings.EditStyle = InputFieldEditStyle.DropdownList;
            //field.InitalizeText = "测试文本ABC";
            field.Name = "COUNTRY";
            field.BackgroundText = "Please select country";
            field.FieldSettings.MultiSelect = false;
            field.Attributes = new XAttributeList();
            field.Attributes.SetValue("Insert time", DateTime.Now.ToLongDateString());
            field.OwnerDocument = myEditControl.Document;
            field.SetInnerTextFast("测试文本ABC");
            XTextInputFieldElement newField = (XTextInputFieldElement)myEditControl.ExecuteCommand("InsertInputField", true, field);
            if (newField != null)
            {
                System.Console.WriteLine(newField.ToString());
            }
        }
        private void mTestInsertMedic_Click(object sender, EventArgs e)
        {
            XTextInputFieldElement field = new XTextInputFieldElement();
            field.FieldSettings = new InputFieldSettings();
            field.FieldSettings.EditStyle = InputFieldEditStyle.DropdownList;
            field.FieldSettings.ListSource = new ListSourceInfo();
            field.FieldSettings.ListSource.SourceName = "DOCEX";
            field.FieldSettings.ListSource.DisplayPath = "Name";
            field.FieldSettings.ListSource.ValuePath = "Name";
            field.FieldSettings.MultiSelect = false;
            field.Attributes = new XAttributeList();
            field.Attributes.SetValue("Insert Time", DateTime.Now.ToLongDateString());
            field.Name = "Docex";
            field.BackgroundText = "药品";
            myEditControl.ExecuteCommand("InsertInputField", true, field);
        }
        private void mTestInsertImage_Click(object sender, EventArgs e)
        {
            System.Drawing.Image img = Image.FromFile(System.IO.Path.Combine(Application.StartupPath, "About.jpg"));
            myEditControl.ExecuteCommand("InsertImage", false, img);
        }
        private void mTestInsertString_Click(object sender, EventArgs e)
        {
            myEditControl.ExecuteCommand("InsertString", false, "abc");
        }
        private void mTestInsertRTF_Click(object sender, EventArgs e)
        {
            myEditControl.ExecuteCommand("InsertRTF", false, @"{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}
{\colortbl ;\red255\green0\blue0;}
{\*\generator Msftedit 5.41.21.2510;}{\info{\horzdoc}{\*\lchars ([\'7b\'a1\'a4\'a1\'ae\'a1\'b0\'a1\'b4\'a1\'b6\'a1\'b8\'a1\'ba\'a1\'be\'a1\'b2\'a1\'bc\'a3\'a8\'a3\'ae\'a3\'db\'a3\'fb\'a1\'ea\'a3\'a4}{\*\fchars !),.:\'3b?]\'7d\'a1\'a7\'a1\'a4\'a1\'a6\'a1\'a5\'a8\'44\'a1\'ac\'a1\'af\'a1\'b1\'a1\'ad\'a1\'c3\'a1\'a2\'a1\'a3\'a1\'a8\'a1\'a9\'a1\'b5\'a1\'b7\'a1\'b9\'a1\'bb\'a1\'bf\'a1\'b3\'a1\'bd\'a3\'a1\'a3\'a2\'a3\'a7\'a3\'a9\'a3\'ac\'a3\'ae\'a3\'ba\'a3\'bb\'a3\'bf\'a3\'dd\'a3\'e0\'a3\'fc\'a3\'fd\'a1\'ab\'a1\'e9}}
\viewkind4\uc1\pard\sa200\sl276\slmult1\lang2052\f0\fs22 1\cf1 2\cf0 3\par
}");
        }
        private void mTestInsertXML_Click(object sender, EventArgs e)
        {
            myEditControl.XMLText = @"
  
    
      
        
          111
        
        
          111
        
        
          11
        
        
          1
        
        
          11
        
        
      
    
    
      
        
      
    
    
      
        
      
    
  
  
    2012-03-29T15:47:51.1032576+08:00
    2012-03-29T15:47:51.1042577+08:00
    1980-01-01T00:00:00
    DCSoft.Writer Version:1.0.1111.28434
  
  
    12
  
  
    
      宋体
      12
    
    
      
      
      
    
  
  Document
  
    0
    0
  
  
";
        }
        private void mTestUpdateData_Click(object sender, EventArgs e)
        {
            //XTextInputFieldElement field = (XTextInputFieldElement)myEditControl.GetCurrentElement(typeof(XTextInputFieldElement));
            //field.EditorTextExt = DateTime.Now.ToString();
            //return;
            //XTextElementList xTextElementList =  this.myEditControl.Document.GetSpecifyElements(typeof(XTextInputFieldElement));
            //myEditControl.IsAdministrator = true;
            //foreach (XTextFieldElement xTextInputFieldElement in xTextElementList)
            //{
            //    if (xTextInputFieldElement.Parent is XTextInputFieldElement || xTextInputFieldElement.Parent is XTextCheckBoxElement)
            //    {
            //        myEditControl.ExecuteCommand(StandardCommandNames.DeleteField, false, xTextInputFieldElement);
            //        //xTextInputFieldElement.EditorDelete(true);
            //    }
            //}
            //return;
            //using (dlgProperty dlg = new dlgProperty())
            //{
            //    dlg.InstanceToShow = myEditControl.ServerObject;
            //    dlg.Text = "This is values before update";
            //    dlg.ShowDialog(this);
            //    int result = this.myEditControl.WriteDataSource();
            //    if (result == 0)
            //    {
            //        MessageBox.Show("No changed");
            //    }
            //    else
            //    {
            //        dlg.Text = "This is values after update,modified " + result + " parts";
            //        dlg.InstanceToShow = myEditControl.ServerObject;
            //        dlg.ShowDialog(this);
            //    }
            //}
        }
        //private void mXML2RTF_Click(object sender, EventArgs e)
        //{
        //    MessageBox.Show("此处演示在后台将XDesigner.Writer格式的XML文档转换为RTF文档,不显示用户界面,可以运用在ASP.NET或Service程序中。");
        //    string sourceFileName = null;
        //    string descFileName = null;
        //    using (OpenFileDialog dlg = new OpenFileDialog())
        //    {
        //        dlg.Filter = "XML文件|*.xml";
        //        dlg.CheckFileExists = true;
        //        dlg.ShowReadOnly = false;
        //        dlg.Title = "请选择一个XDesigner.Writer程序保存的XML文件";
        //        if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
        //        {
        //            sourceFileName = dlg.FileName;
        //        }
        //        else
        //        {
        //            return;
        //        }
        //    }
        //    using (SaveFileDialog dlg = new SaveFileDialog())
        //    {
        //        dlg.Filter = "RTF文件(*.rtf)|*.rtf";
        //        dlg.CheckPathExists = true;
        //        dlg.OverwritePrompt = true;
        //        if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
        //        {
        //            descFileName = dlg.FileName;
        //        }
        //        else
        //        {
        //            return;
        //        }
        //    }
        //    XTextDocument document = new XTextDocument();
        //    document.Load(sourceFileName, "xml");
        //    using (System.Drawing.Graphics g = document.CreateGraphics())
        //    {
        //        document.RefreshSize(g);
        //        document.ExecuteLayout();
        //        document.RefreshPages();
        //        document.Save(descFileName, "rtf");
        //    }
        //    MessageBox.Show(string.Format("成功的将“{0}”转换为“{1}”。", sourceFileName, descFileName));
        //}
        /// 
        /// 文档内容发生改变事件
        /// 
        /// 
        /// 
        private void myEditControl_DocumentContentChanged(object sender, WriterEventArgs e)
        {
            //System.Console.WriteLine("");
            //System.Diagnostics.Debug.WriteLine(
            //    System.Environment.TickCount + ":" + myEditControl.DocumentContentVersion);
            //XTextInputFieldElement field = myEditControl.Document.CurrentField as XTextInputFieldElement;
            if (model.Id != 0 && delFlag)
            {
                if (tempList.Count > myEditControl.Document.Fields.Count
                    || tempChkList.Count > myEditControl.Document.GetElementsByType(typeof(XTextCheckBoxElement)).Count)
                {
                    if (MessageBox.Show("删除域将导致历史数据无法对应模板,是否继续?", "提示!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning,
                        MessageBoxDefaultButton.Button2) == DialogResult.No)
                    {
                        myEditControl.ExecuteCommand("Undo", false, false);
                        return;
                    }
                    else
                    {
                        //SetFiledID();
                    }
                }
            }
        }
        private void mTestSetInputFieldText_Click(object sender, EventArgs e)
        {
            XTextInputFieldElement field = (XTextInputFieldElement)myEditControl.GetCurrentElement(
                typeof(XTextInputFieldElement));
            if (field != null)
            {
                // 直接设置文本输入域的内容
                field.EditorTextExt = DateTime.Now.ToString();
            }
        }
        private void mTestInsertCheckBoxList_Click(object sender, EventArgs e)
        {
            myEditControl.ExecuteCommand("InsertCheckBoxList", true, null);
            //myEditControl.Document.GetSpecifyElements(typeof(XTextCheckBoxElement));
        }
        private void mTestSetStyle_Click(object sender, EventArgs e)
        {
            XTextInputFieldElement field = (XTextInputFieldElement)myEditControl.Document.GetCurrentElement(typeof(XTextInputFieldElement));
            if (field != null)
            {
                using (FontDialog dlg = new FontDialog())
                {
                    dlg.Font = field.RuntimeStyle.Font.Value;
                    dlg.Color = field.RuntimeStyle.Color;
                    dlg.ShowColor = true;
                    if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
                    {
                        DocumentContentStyle newStyle = new DocumentContentStyle();
                        newStyle.DisableDefaultValue = true;
                        newStyle.Font = new XFontValue(dlg.Font);
                        newStyle.Color = dlg.Color;
                        //newStyle.BackgroundColor = Color.Yellow;
                        field.EditorSetContentStyle(newStyle, true);
                        //field.EditorText = "";
                        //field.EditorText = DateTime.Now.ToString();
                    }
                }
            }
        }
        private void mTestChangeEditorTextExt_Click(object sender, EventArgs e)
        {
            XTextInputFieldElement field = (XTextInputFieldElement)myEditControl.GetCurrentElement(typeof(XTextInputFieldElement));
            if (field != null)
            {
                XTextElementList fields = myEditControl.Document.Fields;
                XTextInputFieldElement nextField = (XTextInputFieldElement)fields.GetNextElement(field);
                if (nextField != null)
                {
                    nextField.EditorTextExt = Guid.NewGuid().ToString();
                }
            }
        }
        private void mPermissionConfig_Click(object sender, EventArgs e)
        {
            //using (dlgPermissionConfig dlg = new dlgPermissionConfig())
            //{
            //    dlg.Document = this.myEditControl.Document;
            //    if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
            //    {
            //        myEditControl.RefreshDocument();
            //    }
            //}
        }
        private void mLogin_Click(object sender, EventArgs e)
        {
            //using (dlgLogin dlg = new dlgLogin())
            //{
            //    if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
            //    {
            //        myEditControl.UserLogin();
            //    }
            //}
        }
        private void mTestChangeParagraphFormat_Click(object sender, EventArgs e)
        {
            myEditControl.Document.ContentStyles.Default.SpacingBeforeParagraph = 90f;
            myEditControl.RefreshDocument();
        }
        private void mTestSetHeaderFooter_Click(object sender, EventArgs e)
        {
            //XTextDocument document = myEditControl.Document;
            //ContentBuilder bulder = new ContentBuilder(document.Header);
            //DocumentContentStyle dcs = new DocumentContentStyle();
            //dcs.FontSize = 20;
            //dcs.Color = System.Drawing.Color.Red;
            //bulder.Append("这是一段页眉    第 ", dcs);
            //XTextPageInfoElement pi = new XTextPageInfoElement();
            //pi.ValueType = PageInfoValueType.PageIndex;
            //pi.StyleIndex = document.ContentStyles.GetStyleIndex(dcs);
            //bulder.Append(pi);
            //bulder.Append("共 页", dcs);
            //XTextPageInfoElement pc = new XTextPageInfoElement();
            //pc.ValueType = PageInfoValueType.NumOfPages;
            //pc.StyleIndex = document.ContentStyles.GetStyleIndex(dcs);
            //bulder.Append(pc);
            //bulder.Append("页", dcs);
            //dcs = new DocumentContentStyle();
            //dcs.Align = DocumentContentAlignment.Center;
            ////dcs.BorderBottom = true;
            ////dcs.BorderSpacing = 10;
            ////dcs.BorderWidth = 1;
            //bulder.SetParagraphStyle(dcs);
            //bulder = new ContentBuilder(document.Body);
            //dcs = new DocumentContentStyle();
            //dcs.Color = System.Drawing.Color.Yellow;
            //bulder.Append("这是文档正文内容", dcs);
            //bulder.AppendParagraphFlag();
            //dcs = new DocumentContentStyle();
            //dcs.FontSize = 40;
            //bulder.Append("页面第二行", dcs);
            //bulder = new ContentBuilder(document.Footer);
            //dcs = new DocumentContentStyle();
            //dcs.FontSize = 30;
            //dcs.Color = System.Drawing.Color.Blue;
            //bulder.Append("这是页脚内容", dcs);
            myEditControl.Document.ContentStyles.Default.FontSize = 40;
            myEditControl.Document.ContentStyles.Default.Color = System.Drawing.Color.Tomato;
            myEditControl.Document.ContentStyles.Default.LineSpacingStyle = DCSoft.Drawing.LineSpacingStyle.SpaceSpecify;
            myEditControl.Document.ContentStyles.Default.LineSpacing = 60;
            myEditControl.RefreshDocument();
        }
        private void mTestInsertDocument_Click(object sender, EventArgs e)
        {
            myEditControl.ExecuteCommand("InsertXML", false, @"姓名:\r\n姓名: #xm#            住址:(单位)家庭住址\r\n性别: #xb#            职业: #zy#\r\n年龄: #nl#            婚姻: #hyzk# \r\n民族: #mz#            入院日期 #ryrq#\r\n出生地: #csd#         记录日期 \r\n病史陈述者:患者本人   可靠程度:\r\ntruetruetrue2012-09-19T14:03:29.4695325+08:002012-09-19T14:03:29.4695325+08:001980-01-01T00:00:00DCSoft.Writer Version:1.1.1111.282061false宋体12Document");
            //string fileName = null;
            //using (OpenFileDialog dlg = new OpenFileDialog())
            //{
            //    dlg.Filter = "*.xml|*.xml";
            //    dlg.CheckFileExists = true;
            //    if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
            //    {
            //        fileName = dlg.FileName;
            //    }
            //    else
            //    {
            //        return;
            //    }
            //}
            //XTextDocument document = new XTextDocument();
            //document.Load(fileName, FileFormat.XML);
            //XTextElementList list = document.Elements;
            //myEditControl.Document.ImportElements(list);
            //document.DocumentControler.InsertElements(list);
        }
        private void mInsertXML_Click(object sender, EventArgs e)
        {
            //            XTextElement element = myEditControl.Document.CurrentElement;
            //DocumentContentStyle style = new DocumentContentStyle();
            //style.Bold = true;
            //element.Style = style;
            //myEditControl.RefreshDocument();
            using (OpenFileDialog dlg = new OpenFileDialog())
            {
                dlg.Filter = "*.xml|*.xml";
                dlg.CheckFileExists = true;
                if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
                {
                    using (System.IO.Stream stream = dlg.OpenFile())
                    {
                        myEditControl.ExecuteCommand("InsertXML", false, stream);
                    }
                }
            }
        }
        private void mTestSetDefaultStyle_Click(object sender, EventArgs e)
        {
            myEditControl.ExecuteCommand(
                "SetDefaultStyle",
                false,
                "Align:Center;LineSpacingStyle:SpaceSpecify;LineSpacing:80");
        }
        /// 
        /// 使用本地文件系统
        /// 
        /// 
        /// 
        private void mLocalFileSystem_Click(object sender, EventArgs e)
        {
            //mLocalFileSystem.Checked = true;
            //mDBFileSystem.Checked = false;
            //// 更换后台的服务对象
            ////myEditControl.AppHost.SetDataProvider(new DefaultDataProvider());
            //myEditControl.AppHost.FileSystems.Docuemnt = DCSoft.Writer.Data.DefaultFileSystem.Instance;
            //myEditControl.AppHost.FileSystems.Template = DCSoft.Writer.Data.DefaultFileSystem.Instance;
        }
        /// 
        /// 使用数据库文件系统
        /// 
        /// 
        /// 
        private void mDBFileSystem_Click(object sender, EventArgs e)
        {
            //mLocalFileSystem.Checked = false;
            //mDBFileSystem.Checked = true;
            //// 更换后台的服务对象
            //DCSoft.Writer.WinFormDemo.EMR.EMRFileSystem p = DCSoft.Writer.WinFormDemo.EMR.EMRFileSystem.Instance;
            ////myEditControl.AppHost.SetDataProvider(p);
            //myEditControl.AppHost.FileSystems.Docuemnt = p;
            //myEditControl.AppHost.FileSystems.Template = p;
        }
        private void toolStripMenuItem11_Click(object sender, EventArgs e)
        {
            myEditControl.ExecuteCommand("InsertHtml", false, @"
    
    
    
    
        | 药品名称 | 用药途径 | 用药频次 | 
    
        | 苯磺酸氨氯地平片 | 口服 | 3/日 | 
    
        | 氯化钠注射液(0.9%) | 静脉注射 | 1/日 | 
    
        | 注射用氨曲南 | 静脉注射 | 1/日 | 
");
        }
        /// 
        /// 显示和隐藏数据源列表功能
        /// 
        /// 
        /// 
        private void mDataSourceList_Click(object sender, EventArgs e)
        {
            bool show = btnDataSourceList.Checked;
            if (show)
            {
            }
            this.spDataSource.Visible = show;
            this.tabDataSource.Visible = show;
            if (tabDataSource.Visible)
            {
                // 设置为设计器使用的文档控制器
                myEditControl.DocumentControler = new DocumentControlerExt();
            }
            else
            {
                // 设置为普通的文档控制器
                myEditControl.DocumentControler = new DocumentControler();
            }
        }
        private void mTestGenerateContent_Click(object sender, EventArgs e)
        {
            ////第一行页眉  医院民称
            //XTextDocument document = this.myEditControl.Document;
            //ContentBuilder bulder = new ContentBuilder(document.Header);
            //DocumentContentStyle dcs = new DocumentContentStyle();
            //dcs.FontSize = 16;
            //dcs.Color = System.Drawing.Color.Gray;
            //dcs.Align = DCSoft.Drawing.DocumentContentAlignment.Center;
            ////bulder.Append("XXXX人民医院\r\n", dcs);
            //bulder.Append(System.Configuration.ConfigurationManager.AppSettings["HospitalName"].ToString() + "\r\n", dcs);
            
            ////姓名文本输入域
            //XTextInputFieldElement name = new XTextInputFieldElement();
            //name.FieldSettings = new InputFieldSettings();
            //name.FieldSettings.EditStyle = InputFieldEditStyle.Text;
            //name.DisplayFormat = new ValueFormater();
            //name.ValidateStyle = new DCSoft.Common.ValueValidateStyle();
            ////自动绑定数据  
            //name.ValueBinding = new DCSoft.Writer.Data.XDataBinding();
            //name.ValueBinding.DataSource = "name";//数据源的名称
            //name.ValueBinding.AutoUpdate = true;//是否自动更新数据
            ////住院号文本输入域
            //XTextInputFieldElement inpno = new XTextInputFieldElement();
            //inpno.FieldSettings = new InputFieldSettings();
            //inpno.FieldSettings.EditStyle = InputFieldEditStyle.Text;
            //inpno.DisplayFormat = new ValueFormater();
            //inpno.ValidateStyle = new DCSoft.Common.ValueValidateStyle();
            ////自动绑定数据  
            //inpno.ValueBinding = new DCSoft.Writer.Data.XDataBinding();
            //inpno.ValueBinding.DataSource = "inpno";//数据源的名称
            //inpno.ValueBinding.AutoUpdate = true;//是否自动更新数据
            ////科室文本输入域
            //XTextInputFieldElement dept = new XTextInputFieldElement();
            //dept.FieldSettings = new InputFieldSettings();
            //dept.FieldSettings.EditStyle = InputFieldEditStyle.Text;
            //dept.DisplayFormat = new ValueFormater();
            //dept.ValidateStyle = new DCSoft.Common.ValueValidateStyle();
            ////自动绑定数据  
            //dept.ValueBinding = new DCSoft.Writer.Data.XDataBinding();
            //dept.ValueBinding.DataSource = "dept";//数据源的名称
            //dept.ValueBinding.AutoUpdate = true;//是否自动更新数据
            ////床号文本输入域
            //XTextInputFieldElement bedno = new XTextInputFieldElement();
            //bedno.FieldSettings = new InputFieldSettings();
            //bedno.FieldSettings.EditStyle = InputFieldEditStyle.Text;
            //bedno.DisplayFormat = new ValueFormater();
            //bedno.ValidateStyle = new DCSoft.Common.ValueValidateStyle();
            ////自动绑定数据  
            //bedno.ValueBinding = new DCSoft.Writer.Data.XDataBinding();
            //bedno.ValueBinding.DataSource = "bedno";//数据源的名称
            //bedno.ValueBinding.AutoUpdate = true;//是否自动更新数据
            ////第二行页眉  病人信息
            //DocumentContentStyle dcs2 = new DocumentContentStyle();
            //dcs2.FontSize = 12;
            //dcs2.Color = System.Drawing.Color.Gray;
            //dcs2.Align = DCSoft.Drawing.DocumentContentAlignment.Center;
            //bulder.Append("姓名:");
            //bulder.Append(name);
            //bulder.Append("\t");
            //bulder.Append("住院号:");
            //bulder.Append(inpno);
            //bulder.Append("\t");
            //bulder.Append("科室:");
            //bulder.Append(dept);
            //bulder.Append("\t");
            //bulder.Append("床号:");
            //bulder.Append(bedno);
            //bulder.SetParagraphStyle(dcs2);
            //myEditControl.Document.Parameters.SetValue("name", "张三");
            //myEditControl.Document.Parameters.SetValue("inpno", "0001");
            //myEditControl.Document.Parameters.SetValue("dept", "222");
            //myEditControl.Document.Parameters.SetValue("bedno", "333");
            //myEditControl.RefreshDocument();
            //myEditControl.ExecuteCommand("UpdateViewForDataSource", false, null);
        }
        private void mTestLoadKBFromURL_Click(object sender, EventArgs e)
        {
            //using (DCSoft.WinForms.Native.dlgInputUrl dlg = new WinForms.Native.dlgInputUrl())
            //{
            //    if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
            //    {
            //        string url = dlg.InputURL;
            //        // 注册自定义的输入域下拉列表提供者
            //        myEditControl.AppHost.Services.AddService(
            //            typeof(IListItemsProvider),
            //            new DCSoft.Writer.Data.DefaultListItemsProvider());
            //        myEditControl.ExecuteCommand("LoadKBLibrary", false, url);
            //    }
            //}
        }
        private void mLoadmodelSource_Click(object sender, EventArgs e)
        {
            string xml = @"
   233854
   00004613
   0
   
   
   00233854_0
   神经内科
   00233854
   种永安
   男
   1940-04-06 00:00:00 
   陕西扶风
   01
   003
   
   扶风县绛帐镇前进村一组
   扶风县绛帐镇前进村一组
   722206
   5281655
   扶风县绛帐镇前进村一组
   722206
   5281655
   种周强
   父子
   扶风县绛帐镇前进村一组
   5281655
   
   
   
   
   门诊
   
   脑梗死
   
   一般
   门诊
   2010-06-17 08:00:00 
   无
   05
   合疗
   00233854
   已婚
   02
   05
   
   05
   2010-07-10 15:15:19
   
   
   
   1901-01-01 00:00:00 
   000036
   正常
   000036
   2010-06-17 10:16:16 
   000036
   2010-10-10 15:15:19 
   ZYA
";
            myEditControl.SetDocumentParameterValueXml("EMR_Patients", xml);
            myEditControl.ExecuteCommand(
                "FileOpen",
                false,
                System.IO.Path.Combine(
                    Application.StartupPath,
                    @"EMR\TemplateDocument\InpatientInfo.xml"));
            myEditControl.ExecuteCommand("FormViewMode", false, null);
        }
        private void mGetmodelSource_Click(object sender, EventArgs e)
        {
            int result = (int)myEditControl.ExecuteCommand("UpdateDataSourceForView", false, null);
            string xml = myEditControl.GetDocumentParameterValueXml("EMR_Patients");
            System.Diagnostics.Debug.WriteLine(xml);
            MessageBox.Show(result.ToString());
        }
        private void mTestSomething_Click(object sender, EventArgs e)
        {
        }
        private void mInsertSimpleList_Click(object sender, EventArgs e)
        {
            XTextInputFieldElement field = new XTextInputFieldElement();
            field.BackgroundText = "请选择值";
            field.FieldSettings = new InputFieldSettings();
            field.FieldSettings.EditStyle = InputFieldEditStyle.DropdownList;
            field.FieldSettings.ListSource = new DCSoft.Writer.Data.ListSourceInfo();
            field.FieldSettings.ListSource.RuntimeItems = new ListItemCollection();
            field.FieldSettings.ListSource.RuntimeItems.AddByTextValue("列表项目1", "数值1");
            field.FieldSettings.ListSource.RuntimeItems.AddByTextValue("列表项目2", "数值2");
            field.FieldSettings.ListSource.RuntimeItems.AddByTextValue("列表项目3", "数值3");
            field.FieldSettings.ListSource.RuntimeItems.AddByTextValue("列表项目4", "数值4");
            field.FieldSettings.ListSource.RuntimeItems.AddByTextValue("列表项目5", "数值5");
            myEditControl.ExecuteCommand("InsertInputField", false, field);
        }
        //private void mPrintMultiDocument_Click(object sender, EventArgs e)
        //{
        //    using (DCSoft.Writer.Printing.WriterPrintDocument pd = new DCSoft.Writer.Printing.WriterPrintDocument())
        //    {
        //        while (true)
        //        {
        //            using (OpenFileDialog dlg = new OpenFileDialog())
        //            {
        //                dlg.Filter = "*.xml|*.xml";
        //                dlg.CheckFileExists = true;
        //                if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
        //                {
        //                    XTextDocument doc = new XTextDocument();
        //                    doc.Load(dlg.FileName, "xml");
        //                    using (Graphics g = doc.CreateGraphics())
        //                    {
        //                        doc.RefreshSize(g);
        //                    }
        //                    doc.ExecuteLayout();
        //                    doc.RefreshPages();
        //                    pd.Documents.Add(doc);
        //                }
        //                else
        //                {
        //                    break;
        //                }
        //            }
        //        }
        //        if (pd.Documents.Count > 0)
        //        {
        //            using (PrintPreviewDialog dlg = new PrintPreviewDialog())
        //            {
        //                dlg.Document = pd;
        //                pd.UpdateDocumentsState();
        //                dlg.ShowDialog(this);
        //                pd.RestoreDocumentsState();
        //            }
        //        }
        //    }
        //}
        private void mPrintDocumentBackground_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog dlg = new OpenFileDialog())
            {
                dlg.Filter = "*.xml|*.xml";
                dlg.CheckFileExists = true;
                if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
                {
                    // 后台加载文档
                    string fileName = dlg.FileName;
                    XTextDocument document = new XTextDocument();
                    document.Load(fileName, "xml");
                    // 创建后台打印器
                    DocumentPrinter dp = new DocumentPrinter();
                    // 添加要打印的文档,可以添加多个
                    dp.Documents.Add(document);
                    // 准备打印
                    dp.PreparePrintDocument();
                    // 执行后台打印
                    dp.PrintDocument(false);
                }
            }
        }
        private void mDocumentValidate_Click(object sender, EventArgs e)
        {
            ValueValidateResultList list = (ValueValidateResultList)myEditControl.ExecuteCommand("DocumentValueValidate", false, null);
            if (list != null && list.Count > 0)
            {
                // 校验不成功
                StringBuilder str = new StringBuilder();
                foreach (ValueValidateResult item in list)
                {
                    if (str.Length > 0)
                    {
                        str.Append(Environment.NewLine);
                    }
                    str.Append(item.Element.ID + ":" + item.Message);
                }
                MessageBox.Show(str.ToString());
            }
        }
        private void mViewSelectionXML_Click(object sender, EventArgs e)
        {
            string xmlSource = Convert.ToString(
                this.myEditControl.ExecuteCommand("GetSelectionContentText", true, "xml"));
            System.Diagnostics.Debug.WriteLine(xmlSource);
        }
        private void mViewSelectionRTF_Click(object sender, EventArgs e)
        {
            string rtfSource = Convert.ToString(
                this.myEditControl.ExecuteCommand("GetSelectionContentText", true, "rtf"));
            System.Diagnostics.Debug.WriteLine(rtfSource);
        }
        private void mInsertXmlFromClipboard_Click(object sender, EventArgs e)
        {
            string xml = Clipboard.GetText();
            if (string.IsNullOrEmpty(xml) == false)
            {
                myEditControl.ExecuteCommand("InsertXML", false, xml);
            }
        } 
        #endregion Click_Event
        /// 
        /// Handle commands
        /// 
        /// command name
        public void HandleCommand(string Command)
        {
            if (Command == null)
                return;
            Command = Command.Trim();
            try
            {
                switch (Command)
                {
                    case MyCommandNames.OpenXMLDemo:
                        myEditControl.ExecuteCommand("FormViewMode", false, false);
                        OpenDemoFile("DCSoft.Writer.WinFormDemo.DemoFile.demo.xml", "xml");
                        break;
                    case MyCommandNames.OpenFormViewDemo:
                        if (OpenDemoFile("DCSoft.Writer.WinFormDemo.DemoFile.FormViewModeDemo.xml", "xml"))
                        {
                            myEditControl.ExecuteCommand("FormViewMode", false, true);
                            myEditControl.AutoScrollPosition = new Point(0, 0);
                            myEditControl.UpdateTextCaret();
                        }
                        break;
                    case MyCommandNames.OpenNursingRecordDemo:
                        {
                            if (OpenDemoFile("DCSoft.Writer.WinFormDemo.DemoFile.NursingRecord.xml", "xml"))
                            {
                                myEditControl.ExecuteCommand("FormViewMode", false, false);
                            }
                        }
                        break;
                    default:
#if DEBUG
                        this.Alert("Bad command:" + Command);
#endif
                        break;
                }
            }
            catch (Exception ext)
            {
                //this.Alert(ResourceStrings._EXEERR + ext.ToString());
                //this.Status = ResourceStrings._EXEERR + ext.Message;
                this.Alert("执行命令错误:" + ext.ToString());
                this.Status = "错误:" + ext.Message;
            }
            this.UpdateFormText();
        }
        /// 
        /// Show a message box
        /// 
        /// message text
        private void Alert(string msg)
        {
            MessageBox.Show(this, msg, this.Text);
        }
        /// 
        /// get or set main status text
        /// 
        private string Status
        {
            get { return this.lblStatus.Text; }
            set { this.lblStatus.Text = value; this.Update(); }
        }
        private void UpdateFormText()
        {
            //string text = System.Configuration.ConfigurationManager.AppSettings["HospitalName"].ToString();
            string text = "";
            if (string.IsNullOrEmpty(this.myEditControl.Document.Info.Title) == false)
            {
                text = myEditControl.Document.Info.Title + "-" + text;
            }
            else if (string.IsNullOrEmpty(this.myEditControl.Document.FileName) == false)
            {
                text = myEditControl.Document.FileName + " - " + text;
            }
            if (myEditControl.Document.Modified)
            {
                text = text + " *";
            }
            this.Text = text;
        }
        private bool OpenDemoFile(string resourceName, string format)
        {
            this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
            try
            {
                System.IO.Stream stream = this.GetType().Assembly.GetManifestResourceStream(resourceName);
                if (stream != null)
                {
                    using (stream)
                    {
                        FileOpenCommandParameter fcp = new FileOpenCommandParameter();
                        fcp.Format = format;
                        //fcp.FileName = resourceName;
                        fcp.InputStream = stream;
                        bool result = (bool)myEditControl.ExecuteCommand("FileOpen", true, fcp);
                        if (result == false)
                        {
                            this.Status = fcp.Message;
                        }
                        return result;
                    }
                }
                return false;
            }
            finally
            {
                this.Cursor = System.Windows.Forms.Cursors.Default;
            }
        }
        /// 
        /// handle element hover event
        /// 
        /// 
        /// 
        private void myEditControl_HoverElementChanged(object sender, EventArgs e)
        {
            provider.Document = myEditControl.Document;
            provider.Prefix = '{';
            provider.Endfix = '}';
            XTextRange range;
            try
            {
                range = provider.GetRange(myEditControl.HoverElement);
            }
            catch (Exception  )
            {
                range = null;
            }
            if (range != null)
            {
                this.myEditControl.HighlightRange = new HighlightInfo(range);
            }
            else
            {
                this.myEditControl.HighlightRange = null;
            }
        }
        /// 
        /// Handle selection changed event in editor control
        /// 
        /// 
        /// 
        private void myEditControl_SelectionChanged(object sender, EventArgs e)
        {
            //XTextFieldElement field = (XTextFieldElement)myEditControl.Document.CurrentField;
            //field.EditorTextExt = "bbb";
            provider.Document = myEditControl.Document;
            provider.Prefix = '{';
            provider.Endfix = '}';
            XTextRange range = provider.GetRange(myEditControl.CurrentElement);
            if (range != null)
            {
                myEditControl.HighlightRange = new HighlightInfo(range);
            }
            else
            {
                myEditControl.HighlightRange = null;
            }
            XTextLine line = myEditControl.Document.CurrentContentElement.CurrentLine;
            if (line != null && line.OwnerPage != null)
            {
                string txt =
                    string.Format("第 {0} 页 第 {1} 行 第 {2} 列",
                    Convert.ToString(line.OwnerPage.PageIndex),
                    Convert.ToString(myEditControl.CurrentLineIndexInPage),
                    Convert.ToString(myEditControl.CurrentColumnIndex));
                if (myEditControl.Selection.Length != 0)
                {
                    txt = txt + string.Format(
                        " 选择了{0}个元素",
                        Math.Abs(myEditControl.Selection.Length));
                }
                Point p = myEditControl.SelectionStartPosition;
                this.lblPosition.Text = txt + " X:" + p.X + " Y:" + p.Y;
            }
            UpdateFormText();
            SetContextMenu();
            if (this.dstvControler != null)
            {
                this.dstvControler.UpdateCurrentDataSourceNode(myEditControl);
            }
            //this.Text = myEditControl.CaretPosition.ToString();
        }
        /// 
        /// 设置编辑器控件的快捷菜单
        /// 
        private void SetContextMenu()
        {
            if (Math.Abs(myEditControl.Selection.Length) == 1)
            {
                XTextElement element = this.myEditControl.Selection.ContentElements[0];
                if (element is XTextImageElement)
                {
                    this.myEditControl.ContextMenuStrip = this.cmImage;
                    return;
                }
            }
            bool isInCell = false;
            if (myEditControl.Selection.Cells != null && myEditControl.Selection.Cells.Count > 0)
            {
                isInCell = true;
            }
            else
            {
                XTextContainerElement c = null;
                int index = 0;
                myEditControl.Document.Content.GetCurrentPositionInfo(out c, out index);
                if (c is XTextTableCellElement || c.OwnerCell != null)
                {
                    isInCell = true;
                }
            }
            if (isInCell)
            {
                myEditControl.ContextMenuStrip = cmTableCell;
                return;
            }
            myEditControl.ContextMenuStrip = cmEdit;
        }
        public void frmTemplate_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (this.Text.Trim().EndsWith("*"))
            {
                DialogResult result = MessageBox.Show("文件已经修改,尚未保存,是否保存文件?", "系统提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question,
                        MessageBoxDefaultButton.Button1);
                switch(result)
                {
                    case DialogResult.Yes :
                        try
                        {
                            InsertOrUpdate();
                        }
                        catch (Exception exp)
                        {
                            MessageBox.Show(exp.Message);
                            e.Cancel = true;
                        }
                        break;
                    case DialogResult.No :
                        break;
                    case DialogResult.Cancel :
                        e.Cancel = true;
                        break;
                    default:
                        break;
                }
            }
            //bool b = (bool)myEditControl.ExecuteCommand("FileQueryExit", true, null);
            //if (b == false)
            //{
            //    e.Cancel = true;
            //}
        }
        private void myEditControl_StatusTextChanged(object sender, EventArgs e)
        {
            lblStatus.Text = myEditControl.StatusText;
            this.statusStrip1.Refresh();
        }
        /// 
        /// 编辑器中执行命令时的错误处理
        /// 
        /// 
        /// 
        private void myEditControl_CommandError(object sender, CommandErrorEventArgs args)
        {
            MessageBox.Show(
                this,
                args.CommandName + "\r\n" + args.Exception.ToString(),
                this.Text,
                MessageBoxButtons.OK,
                MessageBoxIcon.Exclamation);
        }
        private void myEditControl_AfterExecuteCommand(object sender, WriterCommandEventArgs args)
        {
            if (args.Name == "LoadKBLibrary")
            {
                tvwKB.KBLibrary = myEditControl.AppHost.KBLibrary;
                tvwKB.RefreshView();
            }
            //SetFiledID();
            //MessageBox.Show(args.Name);
        }
        #region 数据源树状列表操作相关的代码
        private void myEditControl_EventCanInsertObject(object sender, CanInsertObjectEventArgs args)
        {
            if (this.dstvControler != null)
            {
                this.dstvControler.HandleCanInsertObjectEvent(myEditControl, args);
            }
        }
        private void myEditControl_EventInsertObject(object sender, InsertObjectEventArgs args)
        {
            //if (this.dstvControler != null)
            //{
            //    this.dstvControler.HandleInsertObjectEvent(myEditControl, args);
            //}
            object obj = args.DataObject.GetData(args.DataObject.GetFormats()[0]);
            //SetFiledID();
        }
        #endregion
        /// 
        /// 保存
        /// 
        /// 
        /// 
        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            //SetFiledID();
            //myEditControl.Document.Style.RemoveSameStyle(myEditControl.Document.Style);
            //XTextElement elementTemp = myEditControl.Document.GetElementById("D201605091434574203336");
            //if (elementTemp != null)
            //{
            //    elementTemp.Text = "哎呀我去!";
            //    if (elementTemp is XTextCheckBoxElement)
            //    {
            //        ((XTextCheckBoxElement)elementTemp).Checked = true;
            //    }
            //}
            try
            {
                InsertOrUpdate();
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
                return;
            }
            //XTextElementList xlist = myEditControl.Document.Elements;
            //XTextElementList xchkList = myEditControl.Document.GetElementsByType(typeof(XTextCheckBoxElement));
            //foreach (XTextElement element in xchkList)
            //{
            //    XTextCheckBoxElement field = (XTextCheckBoxElement)element;
            //    field.ID = field.GroupName;
                
            //    Console.WriteLine(field.Name);
                
            //}
            //XTextElementList xlist = myEditControl.Document.Fields;
            //foreach(XTextElement element in xlist)
            //{
                
            //    if (element is XTextInputFieldElement)
            //    {
            //        XTextInputFieldElement field = (XTextInputFieldElement)element;
            //        //field.EditorTextExt = xlist.LastElement.Text;
            //        for (int i = 0; i < field.Elements.Count; i++)
            //        {
            //            field.Elements[i].StyleIndex = xlist.LastElement.Elements[i].StyleIndex;
            //            //Type type = typeof(ContentStyle);
            //            //DocumentContentStyle cstyle = new DocumentContentStyle();
            //            //System.Reflection.PropertyInfo prop = type.GetProperty("Bold");
            //            //prop.SetValue(cstyle, true, null);
            //            //object value = prop.GetValue(cstyle, null);
            //            //field.Elements[i].Style = cstyle;
            //        }
                    
                    
            //        //ContentStyle cstyle = field.RuntimeStyle;
            //        //string text = field.EditorTextExt;
            //        //DocumentContentStyle style =  field.Style;
            //        ////field.EditorTextExt = ((XTextInputFieldElement)(xlist.LastContentElement)).EditorTextExt;
            //        //field.EditorTextExt = xlist.LastElement.Text;
            //        //field.Style = xlist.LastElement.Style;
            //    }
            //}
            //ContentStyleList cslist = myEditControl.Document.ContentStyles.Styles;
            //foreach (ContentStyle element in cslist)
            //{
            //    element.ToString();
            //}
        }
        private void eet_ContentChanging(object sender, ContentChangingEventArgs args)
        {
            //if (args. == false)
            //{
            //    txtLog.AppendText(Environment.NewLine + "输入域 " + args.Element.ID + " 内容发生改变!");
            //}
            //MessageBox.Show(args.Element.ID);
        }
        public void InsertOrUpdate()
        {
            try
            {
                //frmTitle frmTitle = new frmTitle();
                //frmTitle.model = model;
                //if (frmTitle.ShowDialog() != DialogResult.OK)
                //{
                //    return;
                //}
                //model = frmTitle.model;
                if (model.XmlFileName == null || model.XmlFileName.Equals(string.Empty))
                {
                    return;
                }
                model.XmlFile = myEditControl.Document.XMLText;
                SetXMLStatic();
                //如果不为空,则“编辑”状态
                if (model.Id != 0)
                {
                    DocumentDAL.UpdateTemplate(model);
                }
                else
                {
                    DocumentDAL.InsertTemplate(model);
                }
                
                MessageBox.Show("保存成功!");
                myEditControl.Document.FileName = model.XmlFileName;
                myEditControl.Document.Modified = false;
                myEditControl.Document.OnSelectionChanged();
                //this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.frmTemplate_FormClosing);
                //Close();
            }
            catch (Exception exp)
            {
                throw exp;
            }
        }
        private void eetChk_MouseClick(object sender, ElementMouseEventArgs args)
        {
            
            if (args.Element is XTextCheckBoxElement || args.Element is XTextRadioBoxElement)
            {
                //var pName = args.Element.GetType().GetProperty("Name");
                //var name = pName.GetValue(args.Element, null) ?? "";
                //try
                //{
                //    Object rslt = type.InvokeMember(
                //               "MouseClickEvent",
                //             BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static,
                //                  null,
                //                  null, // for static class
                //                  new object[] { });
                //}
                //catch (Exception exp)
                //{
                //    MessageBox.Show(exp.StackTrace + ":" + exp.Message);
                //}
            }
        }
        /// 
        /// 创建ID
        /// 
        /// 
        /// 
        private string CreateID(object obj)
        {
            string id = string.Empty;
            id = "D" + DateTime.Now.ToString("yyyyMMddHHmmss") + obj.GetHashCode();
            return id;
        }
        /// 
        /// 设置ID
        /// 
        void SetFiledID()
        {
            if (tempList.Count != myEditControl.Document.Fields.Count)
            {
                if (tempList.Count < myEditControl.Document.Fields.Count)
                {
                    //XTextElementList cloneList = myEditControl.Document.Fields.Clone();
                    myEditControl.Document.Fields.ToArray().Except(tempList.ToArray())
                        .ToList().ForEach(element => element.ID = CreateID(element));
                }
                tempList.Clear();
                tempList.AddRange(myEditControl.Document.Fields);
            }
            if (tempChkList.Count != myEditControl.Document.GetElementsByType(typeof(XTextCheckBoxElement)).Count)
            {
                if (tempChkList.Count < myEditControl.Document.GetElementsByType(typeof(XTextCheckBoxElement)).Count)
                {
                    //XTextElementList cloneList = myEditControl.Document.Fields.Clone();
                    myEditControl.Document.GetElementsByType(typeof(XTextCheckBoxElement)).ToArray().Except(tempChkList.ToArray())
                        .ToList().ForEach(element => element.ID = CreateID(element));
                }
                tempChkList.Clear();
                tempChkList.AddRange(myEditControl.Document.GetElementsByType(typeof(XTextCheckBoxElement)));
            }
            myEditControl.Document.Fields.ToArray()
                        .ToList().Where(element => element.ID == null || element.ID==string.Empty).ToList().ForEach(element => element.ID = CreateID(element));
            tempChkList.ToArray()
                        .ToList().Where(element => element.ID == null || element.ID == string.Empty).ToList().ForEach(element => element.ID = CreateID(element));
            UpdateListView();
        }
        /// 
        /// 更新统计域
        /// 
        private void UpdateListView()
        {
            XmlDocument doc = new XmlDocument();
            if (model.XmlStatic!=null && model.XmlStatic.Length > 0)
            {
                doc.LoadXml(model.XmlStatic);
            }
            else
            {
                doc = null;
            }
            //this.listFields.BeginUpdate();
            //listFields.Items.Clear();
            //for (int i = 0; i < tempList.Count; i++)
            //{
            //    ListViewItem lvi = new ListViewItem();
            //    lvi.ImageIndex = 0;
            //    lvi.Text = ((XTextInputFieldElementBase)tempList[i]).BackgroundText;
            //    lvi.SubItems.Add(tempList[i].ID);
            //    if (doc != null)
            //    {
            //        lvi.SubItems.Add(doc.DocumentElement.SelectSingleNode("//Item[@Id='" + tempList[i].ID + "']") == null
            //            ? "" : doc.DocumentElement.SelectSingleNode("//Item[@Id='" + tempList[i].ID + "']").Attributes["Group"].Value);
            //    }
            //    listFields.Items.Add(lvi);
            //}
            //for (int i = 0; i < tempChkList.Count; i++)
            //{
            //    ListViewItem lvi = new ListViewItem();
            //    lvi.ImageIndex = 1;
            //    lvi.Text = ((XTextCheckBoxElement)tempChkList[i]).Name;
            //    lvi.SubItems.Add(tempChkList[i].ID);
            //    if (doc != null)
            //    {
            //        lvi.SubItems.Add(doc.DocumentElement.SelectSingleNode("//Item[@Id='" + tempChkList[i].ID + "']") == null
            //            ? "" : doc.DocumentElement.SelectSingleNode("//Item[@Id='" + tempChkList[i].ID + "']").Attributes["Group"].Value);
            //    }
            //    listFields.Items.Add(lvi);
            //}
            //this.listFields.EndUpdate();
        }
        private void tabDataSource_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tabDataSource.SelectedIndex == 0)
            {
                tabDataSource.Size = new Size(331, 560);
            }
            else if (tabDataSource.SelectedIndex == 1)
            {
                tabDataSource.Size = new Size(380, 560);
            }
        }
        //private void listFields_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
        //{
        //    //myEditControl.Document.HighlightManager.HighlightRange.a
        //    try
        //    {
        //        for (int i = 0; i < listFields.SelectedItems.Count; i++)
        //        {
        //            XTextElement element = myEditControl.Document.GetElementById(listFields.SelectedItems[i].SubItems[1].Text);
        //            if (element != null)
        //            {
        //                element.Visible = true;
        //                element.Focus();
        //                //XTextRange range = new XTextRange(element, 0, element.Elements.Count);
        //                //provider.Document = myEditControl.Document;
        //                //provider.Prefix = '{';
        //                //provider.Endfix = '}';
        //                //XTextRange range = provider.CreateRange(element);
        //                //if (range != null)
        //                //{
        //                //    myEditControl.HighlightRange = new HighlightInfo(range);
        //                //}
        //            }
        //        }
        //    }
        //    catch (Exception exp)
        //    {
        //        lblStatus.Text = exp.Message;
        //        return;
        //    }
        //}
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            //SetFiledID();
        }
        /// 
        /// 给XMLStatic赋值
        /// 
        private void SetXMLStatic()
        {
            XmlDocument doc = new XmlDocument();
            XmlElement rootNode = doc.CreateElement("Root");
            doc.AppendChild(rootNode);
            XmlElement clickEnventNode = doc.CreateElement("ClickEvent");
            clickEnventNode.InnerText = this.rtbClick.Text;
            XmlElement contentChangedEnventNode = doc.CreateElement("ContentChangedEnvent");
            contentChangedEnventNode.InnerText = this.rtbContent.Text;
            rootNode.AppendChild(clickEnventNode);
            rootNode.AppendChild(contentChangedEnventNode);
            //for (int i = 0; i < listFields.Items.Count; i++)
            //{
            //    if (listFields.Items[i].SubItems.Count < 3
            //        || listFields.Items[i].SubItems[2].Text.Trim().Equals(string.Empty))
            //    {
            //        continue;
            //    }
            //    else
            //    {
            //        XmlElement itemNode = doc.CreateElement("Item");
            //        itemNode.SetAttribute("Id", listFields.Items[i].SubItems[1].Text);
            //        itemNode.SetAttribute("Group", listFields.Items[i].SubItems[2].Text.Trim());
            //        rootNode.AppendChild(itemNode);
            //    }
            //}
            model.XmlStatic = doc.OuterXml;
            //if (doc.GetElementsByTagName("Item").Count > 0)
            //{
            //    model.XmlStatic = doc.OuterXml;
            //}
        }
        private void tsbPrint_Click(object sender, EventArgs e)
        {
           WriterControl wc = new WriterControl();
           SwapByRef(myEditControl);
            //myEditControl.Document.EditorControl.FreezeUI();
            //delFlag = false;
            //XTextElementList tempChkList = new XTextElementList();
            //tempChkList = wc.Document.GetElementsByType(typeof(XTextCheckBoxElementBase));
            //wc.FormView = FormViewMode.Disable;
            //for (int i = 0; i < tempChkList.Count; i++)
            //{
            //    ((XTextCheckBoxElementBase)tempChkList[i]).Deleteable = true;
            //    ((XTextCheckBoxElementBase)tempChkList[i]).Select();
               
            //    //
            //    wc.ExecuteCommand("Delete", false, tempChkList[i]);
            //    wc.ExecuteCommand("InsertImage", false, tempChkList[i].CreateContentImage());
            //    ((XTextCheckBoxElementBase)tempChkList[i]).EditorRefreshView();
            //}
            //delFlag = true;
            //wc.RefreshDocument();
            //wc.Dispose();
            //myEditControl.Document.EditorControl.ReleaseFreezeUI();
            //myEditControl.Document.EditorControl.UpdatePages();
        }
        void SwapByRef(WriterControl a)
        {
            delFlag = false;
            WriterControl wc = new WriterControl();
            wc.Document = a.Document;
            XTextElementList tempChkList = new XTextElementList();
            tempChkList = wc.Document.GetElementsByType(typeof(XTextCheckBoxElementBase));
            wc.FormView = FormViewMode.Disable;
            for (int i = 0; i < tempChkList.Count; i++)
            {
                ((XTextCheckBoxElementBase)tempChkList[i]).Deleteable = true;
                ((XTextCheckBoxElementBase)tempChkList[i]).Select();
                //
                wc.ExecuteCommand("Delete", false, tempChkList[i]);
                wc.ExecuteCommand("InsertImage", false, tempChkList[i].CreateContentImage());
                ((XTextCheckBoxElementBase)tempChkList[i]).EditorRefreshView();
            }
            delFlag = true;
            wc.RefreshDocument();
        }
        private void btnID_Click(object sender, EventArgs e)
        {
            //if (listFields.CheckedItems.Count == 0)
            //{
            //    MessageBox.Show("请选择数据!");
            //    return;
            //}
            //using (frmFieldsID frmFieldsID = new frmFieldsID())
            //{
            //    frmFieldsID.items = listFields.CheckedItems;
            //    frmFieldsID.FormClosing += new FormClosingEventHandler(frmFieldsID_FormClosing);
            //    frmFieldsID.ShowDialog();
            //}
        }
        private void frmFieldsID_FormClosing(object sender, FormClosingEventArgs e)
        {
             
        }
        private void tvEvent_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            try
            {
                TreeNode node = e.Node;
                XTextElement element = myEditControl.Document.GetElementById(node.Text);
                if (element != null)
                {
                    element.Visible = true;
                    element.Focus();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        private void btnNewEvent_Click(object sender, EventArgs e)
        {
            //frmElementEvents = frmElementEvents.CreateInstance(this.tvEvent);
            //frmElementEvents.IsNew = true;
            //frmElementEvents.StartPosition = FormStartPosition.CenterScreen;
            //frmElementEvents.FormClosing += new FormClosingEventHandler(frmElementEvents_FormClosing);
            //frmElementEvents.Show();
        }
        void frmElementEvents_FormClosing(object sender, FormClosingEventArgs e)
        {
            //if (frmElementEvents.returnNode.Text == "")
            //{
            //    return;
            //}
        }
    }
    public class PrintTemplate
    {
        public int Id { get; set; }
        public int ParentId { get; set; }
        public string XmlFileName { get; set; }
        public string XmlFile { get; set; }
        public string XmlStatic { get; set; }
        //public int PermissionLv { get; set { value = 0; } }
        public int TemplateOrder { get; set; }
        public int IsValid { get; set; }
        public string OperatorNo { get; set; }
        public DateTime OperatorDate { get; set; }
        public int PrintDocumentId { get; set; }
    }
    public class PrintDocument
    {
        public int Id { get; set; }
        public int PatientId { get; set; }
        public int TemplateId { get; set; }
        public string XmlFileName { get; set; }
        public string XmlFile { get; set; }
        public string XmlStatic { get; set; }
        public int IsValid { get; set; }
        public string OperatorNo { get; set; }
        public DateTime OperatorDate { get; set; }
        public string RecordId { get; set; }
        public string Remark { get; set; }
        public string OrderNo { get; set; }
    }
}