/// <summary>
        /// 执行if框
        /// </summary>
        /// <param name="box"></param>
        /// <returns></returns>
        protected void DoIfFunction(ItemBox box, WriteStreamCallBack wrs, IScriptLayout ml)
        {
            ScriptInput si = new ScriptInput();

            foreach (var item in box.InputDatas)
            {
                if (item.PIEnum != ParaItemEnum.INPUT)
                {
                    si.SetValue(item.Name, GetValue(item as ParatItem));
                }
            }

            //检测是否需要断点停止
            checkScriptRunForStopPoint(box, si, null);

            if (Convert.ToBoolean(si.GetFirst()))
            {
                RunningFunction((box as ItemBox).Children[0], wrs, ml);
            }
            else
            {
                RunningFunction((box as ItemBox).Children[1], wrs, ml);
            }
            si.Dispose();
            si = null;
        }
        /// <summary>
        /// 从文件加载
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static IScriptLayout LoadOne(string filename)
        {
            string        exname = filename.Split('.').Last();
            IScriptLayout script = null;

            foreach (var item in exName)
            {
                if (item.Value == exname)
                {
                    //if(item.Key == typeof(MainLayout).Name)
                    //{
                    //    script = new MainLayout();
                    //}
                    if (item.Key == typeof(StackingMainLayout).Name)
                    {
                        //script = new StackingMainLayout();
                    }
                }
            }
            if (script == null)
            {
                return(null);
            }
            script.LoadFromJson(filename);
            return(script);
        }
        /// <summary>
        /// 加载
        /// </summary>
        /// <param name="slnpath">项目文件路径</param>
        public static IList <IScriptLayout> Load(string slnpath)
        {
            string json = "";

            using (FileStream fs = File.Open(slnpath, FileMode.Open))
            {
                byte[] datas = new byte[fs.Length];
                fs.Read(datas, 0, datas.Length);
                json  = System.Text.Encoding.UTF8.GetString(datas);
                datas = null;
            }
            JObject jobj                  = (JObject)JsonConvert.DeserializeObject(json);
            JToken  scriptpaths           = jobj[Scripts];
            string  directory             = Path.GetDirectoryName(slnpath);
            IList <IScriptLayout> scripts = new List <IScriptLayout>();

            foreach (var item in scriptpaths)
            {
                IScriptLayout script = ScriptHelp.LoadOne(Path.Combine(directory, item.ToString()));
                if (script != null)
                {
                    scripts.Add(script);
                }
            }
            return(scripts);
        }
        /// <summary>
        /// 运行脚本
        /// </summary>
        /// <param name="m"></param>
        public override Task <bool> RunScript(IScriptLayout m)
        {
            if (scriptRunThread != null && scriptRunThread.IsCompleted == false)
            {
                return(null);
            }

            scriptRunThread = new Task <bool>((obj) =>
            {
                IsRunning               = true;
                IScriptLayout ml        = obj as IScriptLayout;
                WriteStreamCallBack wrs = ml.ComipleMessageCall;

                try
                {
                    isStop = false;
                    //初始化flag
                    isDebugMode = false;
                    Init(ml);
                    wrs?.Invoke("赋值属性完成,开始执行脚本");
                    foreach (var currentbox in ml.Itemboxs)
                    {
                        //RunningFunction(currentbox, wrs, ml);
                        //ml.SetFunctionBoxRun(Colors.Red, currentbox);
                        if (currentbox.BoxType == ItemBoxEnum.FUNCTION)
                        {
                            Dofunction(currentbox, wrs, ml);
                        }
                        else if (currentbox.BoxType == ItemBoxEnum.IF)
                        {
                            DoIfFunction(currentbox, wrs, ml);
                        }
                        else if (currentbox.BoxType == ItemBoxEnum.WHILE)
                        {
                            DoWhileFunction(currentbox, wrs, ml);
                        }
                        //ml.SetFunctionBoxStop(Colors.White, currentbox);
                    }
                    return(true);
                }
                catch (Exception ex)
                {
                    wrs?.Invoke("脚本运行失败");
                    Log.ScriptLog.Log.Write(new LogMessage("脚本运行失败", ex));
                    return(false);
                }
                finally
                {
                    manager.Clear();
                    wrs?.Invoke("程序运行结束");
                    IsRunning = false;
                }
            }, m);
            scriptRunThread.Start();
            return(scriptRunThread);
        }
        /// <summary>
        /// 代码块被选中
        /// </summary>
        /// <param name="scriptLayout"></param>
        /// <param name="itembox"></param>
        public void IItemBoxSelected(IScriptLayout scriptLayout, IItemBox itembox)
        {
            ItemboxParamterCom itemboxParamterCom = new ItemboxParamterCom()
            {
                ScriptLayout = scriptLayout, ItemBox = itembox
            };

            FunctionParaItemList.DataContext = itemboxParamterCom;
            //FunctionParaItemList.DataContext = itembox;
        }
        /// <summary>
        /// 添加一个脚本
        /// </summary>
        /// <param name="script"></param>
        public StackingMainLayout AddScript()
        {
            IScriptLayout script = new IScriptLayout();

            script.ScriptName = GetScriptName();
            StackingMainLayout stackingMainLayout = StackingMainLayout.InstanceStackingMainLayout(script);

            Scripts.Add(stackingMainLayout);

            ItemAddEvent?.Invoke(stackingMainLayout);
            return(stackingMainLayout);
        }
 /// <summary>
 /// 初始化
 /// </summary>
 protected override void Init(IScriptLayout ml)
 {
     if (ml.IPropertys.Count > 0)
     {
         foreach (var item in ml.IPropertys)
         {
             ScriptOutput so = new ScriptOutput();
             so.SetValue(item.Name, item.Value);
             manager.SetValue(item.Id, so);
         }
     }
 }
        /// <summary>
        /// 拖拽事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TaskItem_Drop(object sender, DragEventArgs e)
        {
            if (tasks.SelectedItem == null)
            {
                return;
            }
            IScriptLayout scriptLayout = e.Data.GetData(typeof(IScriptLayout)) as IScriptLayout;

            (tasks.SelectedItem as ScriptTask).TaskItems.Add(new TaskItem()
            {
                ScriptLayout = scriptLayout
                , Times      = 0,
            });
        }
        /// <summary>
        /// 执行准确的函数
        /// </summary>
        /// <param name="box"></param>
        protected void Dofunction(ItemBox box, WriteStreamCallBack wrs, IScriptLayout ml)
        {
            if (isStop)
            {
                throw new Exception("主动停止了脚本!");
            }
            ml.SetFunctionBoxRun(box);
            ScriptInput si = new ScriptInput();

            foreach (var item in box.InputDatas)
            {
                if (item.PIEnum != ParaItemEnum.INPUT)
                {
                    si.SetValue(item.Name, GetValue(item as ParatItem));
                }
            }

            ScriptOutput so = RunScript(box, si);

            //ScriptOutput so = null;             ////////////////////////////////////待修改
            if (so != null)
            {
                if (so.LogMessage != null && so.LogMessage.Equals("") == false)
                {
                    wrs?.Invoke(so.LogMessage);
                }
                foreach (var item in box.OutDatas)
                {
                    if (item.PIEnum != ParaItemEnum.OUTPUT)
                    {
                        item.Value = so.GetValue(item.Name);
                        SetValue(item as ParatItem);
                    }
                }
            }
            //检测是否需要断点停止
            checkScriptRunForStopPoint(box, si, null);
            if (so != null)
            {
                so.Dispose();
                so = null;
            }
            si.Dispose();
            si = null;
            ml.SetFunctionBoxStop(box);
        }
        /// <summary>
        /// 加载脚本
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Load_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog();
            openFileDialog.Filter = "脚本项目文件 (*.sProject)|*.sProject";
            if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                ScriptConfig = JsonConvert.DeserializeObject <ScriptConfig>(openFileDialog.FileName.GetStringFromFile());

                string path = System.IO.Path.GetDirectoryName(openFileDialog.FileName);
                foreach (var item in ScriptConfig.ScriptFiles)
                {
                    IScriptLayout scriptLayout = new IScriptLayout();
                    scriptLayout.LoadFromJson(System.IO.Path.Combine(path, item + ".script"));
                    scriptContent.ScriptControl.AddScript(StackingMainLayout.InstanceStackingMainLayout(scriptLayout));
                }
            }
        }
 /// <summary>
 /// 选中执行的函数
 /// </summary>
 /// <param name="box"></param>
 /// <param name="wrs"></param>
 /// <param name="ml"></param>
 protected void RunningFunction(IItemBox box, WriteStreamCallBack wrs, IScriptLayout ml)
 {
     foreach (var currentbox in (box as ItemBox).Children)
     {
         ml.SetFunctionBoxRun(currentbox);
         if (currentbox.BoxType == ItemBoxEnum.FUNCTION)
         {
             Dofunction(currentbox, wrs, ml);
         }
         else if (currentbox.BoxType == ItemBoxEnum.IF)
         {
             DoIfFunction(currentbox, wrs, ml);
         }
         else if (currentbox.BoxType == ItemBoxEnum.WHILE)
         {
             DoWhileFunction(currentbox, wrs, ml);
         }
         ml.SetFunctionBoxStop(currentbox);
     }
 }
        /// <summary>
        /// 加载脚本
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Load_Script(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog();
            openFileDialog.Filter = "脚本项目文件 (*.sProject)|*.sProject";
            if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                ScriptConfig = JsonConvert.DeserializeObject <ScriptConfig>(openFileDialog.FileName.GetStringFromFile());

                string path = System.IO.Path.GetDirectoryName(openFileDialog.FileName);
                projectPath = System.IO.Path.GetDirectoryName(openFileDialog.FileName);
                foreach (var item in ScriptConfig.ScriptFiles)
                {
                    IScriptLayout scriptLayout = new IScriptLayout();
                    scriptLayout.LoadFromJson(System.IO.Path.Combine(path, item + ".script"));
                    scriptLayout.ComipleMessageCall += logBox.WritLog;
                    ScriptLayouts.Add(scriptLayout);
                }
                //加载任务
                if (System.IO.File.Exists(System.IO.Path.Combine(projectPath, "projectTask.task")))
                {
                    ObservableCollection <ScriptTask> scriptTasks = Newtonsoft.Json.JsonConvert.
                                                                    DeserializeObject <ObservableCollection <ScriptTask> >(System.IO.Path.Combine(projectPath, "projectTask.task")
                                                                                                                           .GetStringFromFile());
                    foreach (var listitem in scriptTasks)
                    {
                        foreach (var item in listitem.TaskItems)
                        {
                            IScriptLayout script = ScriptLayouts.FindOne(p => p.ScriptName == item.ScriptName);
                            if (script != null)
                            {
                                item.ScriptLayout = script;
                            }
                        }
                        TaskItems.Add(listitem);
                    }
                    scriptTasks.Clear();
                    scriptTasks = null;
                }
            }
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        public ScriptIntegrationForOne()
        {
            InitializeComponent();
            this.Loaded += ScriptIntegrationForOne_Loaded;
            TreeView     = FunctionDataList.FunctionView;

            PropertyItControl.ControlKey    = "全局变量";
            FunctionParaItemList.ControlKey = "函数的参数列表";
            ScriptControl.ControlKey        = "脚本列表";
            LogBox.ControlKey            = "输出";
            TreeView.ControlKey          = "代码工具箱";
            ScriptDebugWindow.ControlKey = "监视窗口";

            Controls.Add("全局变量");
            Controls.Add("函数的参数列表");
            Controls.Add("脚本列表");
            Controls.Add("输出");
            Controls.Add("代码工具箱");
            Controls.Add("监视窗口");

            mainContent.AddUserControl("全局变量", PropertyItControl, Layout.LeftUp, "全局变量");
            mainContent.AddUserControl("函数的参数列表", FunctionParaItemList, Layout.LeftDown, "函数的参数列表");
            mainContent.AddUserControl("脚本列表", ScriptControl, Layout.Right, "脚本列表");
            mainContent.AddUserControl("代码工具箱", TreeView, Layout.Buttom, "代码工具箱");
            mainContent.AddUserControl("输出", LogBox, Layout.Buttom, "输出");
            mainContent.AddUserControl("监视窗口", ScriptDebugWindow, Layout.Right, "监视窗口");


            AllFunctionData.Add(IScriptLayout.AddSystemBox());
            TreeView.MyData          = AllFunctionData;
            TreeView.CreateCallback += TreeView_CreateCallback;
            //AllFunctionData.Add(IScriptLayout.AddSystemBox());
            //AllFunctionData.Add(IScriptLayout.AddToolsFunction());
            ScriptControl.ItemMouseDoubleClickEvent += ScriptControl_ItemMouseDoubleClickEvent;
            ScriptControl.ItemAddEvent          += ScriptControl_ItemAddEvent;
            ScriptControl.ItemRemoveEvent       += ScriptControl_ItemRemoveEvent;
            ScriptControl.ItemScriptNameChanged += ScriptControl_ItemScriptNameChanged;
            //ScriptControl.AddScript(new StackingMainLayout() { ScriptName = "测试脚本" });
        }
        /// <summary>
        /// 停止运行当前激活的脚本
        /// </summary>
        public void StopActiveScript()
        {
            IScriptLayout script = (mainContent.GetActiveDocument() as StackingMainLayout).ScriptLayout;

            script.StopRun();
        }
        /// <summary>
        /// 保存到文件
        /// </summary>
        /// <param name="script"></param>
        /// <param name="directory"></param>
        public static void SaveOne(IScriptLayout script, string directory)
        {
            string path = directory + "//" + script.ScriptName + "." + exName[script.GetType().Name];

            script.SaveToJson(path);
        }
        /// <summary>
        /// 做循环
        /// </summary>
        /// <param name="box"></param>
        /// <returns></returns>
        protected void DoWhileFunction(ItemBox box, WriteStreamCallBack wrs, IScriptLayout ml)
        {
            ItemBox sbox = box as ItemBox;

            if (box.InputDatas.Count == 1)
            {
                if (box.InputDatas[0].PIEnum == ParaItemEnum.BOOL)
                {
                    ScriptInput si = GetFunctionInput(box);
                    //检测是否需要断点停止
                    checkScriptRunForStopPoint(box, si, null);
                    while (true)
                    {
                        if (Convert.ToBoolean(si.GetFirst()))
                        {
                            RunningFunction(box, wrs, ml);
                        }
                        else
                        {
                            return;
                        }
                        si.Dispose();
                        si = null;
                        si = GetFunctionInput(box);
                    }
                }
                else if (box.InputDatas[0].PIEnum == ParaItemEnum.DATETIME)
                {
                    ScriptInput si = GetFunctionInput(box);
                    //检测是否需要断点停止
                    checkScriptRunForStopPoint(box, si, null);
                    while (true)
                    {
                        if (Convert.ToDateTime(si.GetFirst()) > DateTime.Now)
                        {
                            RunningFunction(box, wrs, ml);
                        }
                        else
                        {
                            return;
                        }
                        si.Dispose();
                        si = null;
                        si = GetFunctionInput(box);
                    }
                }
            }
            else
            {
                ScriptInput si = GetFunctionInput(box);
                while (true)
                {
                    int idxs   = Convert.ToInt32(si.GetFirst());
                    int idxe   = Convert.ToInt32(si.GetSecond());
                    int boxidx = GetWhileBoxIdx(sbox, idxs);
                    //if (box.IsHasBreakPoint)
                    //{
                    //    ScriptOutput so = new ScriptOutput();
                    //    so.SetValue("Idx", boxidx);
                    //    ScriptBreakPoint?.Invoke(box, si, so);
                    //}
                    //检测是否需要断点停止
                    checkScriptRunForStopPoint(box, si, null);

                    if (boxidx > idxe)
                    {
                        return;
                    }
                    else
                    {
                        RunningFunction(box, wrs, ml);
                    }
                    si.Dispose();
                    si = null;
                    si = GetFunctionInput(box);
                }
            }
        }
 /// <summary>
 /// 重置用户函数
 /// </summary>
 public void RestFunctionData()
 {
     AllFunctionData.Clear();
     AllFunctionData.Add(IScriptLayout.AddSystemBox());
 }
        /// <summary>
        /// 运行当前激活的脚本
        /// </summary>
        public void RunActiveScript()
        {
            IScriptLayout script = (mainContent.GetActiveDocument() as StackingMainLayout).ScriptLayout;

            script.RunCompile();
        }
        /// <summary>
        /// 获取当前激活中的脚本
        /// </summary>
        /// <returns></returns>
        public IScriptLayout GetActiveScript()
        {
            IScriptLayout script = mainContent.GetActiveDocument() as IScriptLayout;

            return(script);
        }