/// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="_lnvmodel">网络的显示模型</param>
 /// <param name="_element">要替换的列表元素</param>
 /// <param name="_command">替换命令</param>
 public NetworkReplaceElementsCommand_ForReplaceWindow
 (
     LadderNetworkViewModel _lnvmodel,
     ReplaceElement _element,
     NetworkReplaceElementsCommand _command
 )
 {
     lnvmodel = _lnvmodel;
     Element  = _element;
     BVM_old  = _command.OldElements.First();
     BVM_new  = _command.NewElements.First();
 }
        /// <summary>
        /// 将选定的指令替换
        /// </summary>
        /// <param name="showdialog">是否显示提示窗口</param>
        private void Replace(bool showdialog = true)
        {
            // 替换成功和失败的个数,以及详细的错误信息
            int    success  = 0;
            int    error    = 0;
            string errormsg = String.Empty;
            // 建立替换的命令集
            NetworkReplaceElementsCommandGroup commandall =
                new NetworkReplaceElementsCommandGroup(
                    this, Items.ToArray());

            // 处理所有在表中选择的元素
            foreach (ReplaceElement rele in DG_List.SelectedItems)
            {
                // 获得相关信息
                BaseViewModel          bvmodel  = rele.BVModel;
                LadderNetworkViewModel lnvmodel = rele.LNVModel;
                LadderDiagramViewModel ldvmodel = rele.LDVModel;
                ldvmodel.IsModify = true;
                int x = bvmodel.X;
                int y = bvmodel.Y;
                _cmdmanager.LDVModel = ldvmodel;
                // 建立对应的替换命令
                NetworkReplaceElementsCommand command = null;
                NetworkReplaceElementsCommand_ForReplaceWindow commandrw = null;
                try
                {
                    command = RF_Change.Replace(
                        RF_Input,
                        rele.Detail, x, y,
                        ldvmodel, lnvmodel);
                    commandrw = new NetworkReplaceElementsCommand_ForReplaceWindow(
                        lnvmodel, rele, command);
                    commandall.Add(commandrw);
                    success++;
                }
                catch (Exception exce2)
                {
                    error++;
                    if (Thread.CurrentThread.CurrentUICulture.Name.Contains("zh-Hans"))
                    {
                        errormsg += String.Format("在{0:s}的网络{1:d}的坐标({2:d},{3:d})处发生错误:{4:s}\r\n",
                                                  ldvmodel.ProgramName, lnvmodel.NetworkNumber, x, y, exce2.Message);
                    }
                    else
                    {
                        errormsg += String.Format("An error occurred at the coordinates({2:d},{3:d})of the network {1:d} of {0:s}: {4:s}\r\n",
                                                  ldvmodel.ProgramName, lnvmodel.NetworkNumber, x, y, exce2.Message);
                    }
                }
            }
            // 执行替换
            _cmdmanager.Execute(commandall);
            // 当需要显示结果,或者出现错误替换时显示
            if (showdialog || error > 0)
            {
                ReplaceReportWindow report = new ReplaceReportWindow();
                if (Thread.CurrentThread.CurrentUICulture.Name.Contains("zh-Hans"))
                {
                    report.TB_Subtitle.Text = String.Format("总共进行了{0:d}次替换,{1:d}次成功,{2:d}次错误。"
                                                            , success + error, success, error);
                }
                else
                {
                    report.TB_Subtitle.Text = string.Format("A total of {0:d} times, {1:d} success, {2:d} Fail."
                                                            , success + error, success, error);
                }
                report.TB_Message.Text       = errormsg;
                report.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                report.ShowDialog();
            }
        }
 /// <summary>
 /// 添加新的替换命令
 /// </summary>
 /// <param name="command">替换命令</param>
 public void Add(NetworkReplaceElementsCommand command)
 {
     items.Add(command);
 }
        /// <summary>
        /// 根据该格式进行替换操作,生成替换命令
        /// </summary>
        /// <param name="prototype">查找格式</param>
        /// <param name="input">指令文本</param>
        /// <param name="x">元件X坐标</param>
        /// <param name="y">元件Y坐标</param>
        /// <param name="ldvmodel">所属网络</param>
        /// <param name="lnvmodel">所属程序</param>
        /// <returns>替换命令</returns>
        public NetworkReplaceElementsCommand Replace
        (
            ReplaceFormat prototype,
            string input, int x, int y,
            LadderDiagramViewModel ldvmodel,
            LadderNetworkViewModel lnvmodel
        )
        {
            // 将指令文本转为正则格式
            ReplaceFormat iformat = new ReplaceFormat(input);
            // 要匹配的参数项
            ReplaceFormatArg arg;

            arg.Type   = ARG_INVAILD;
            arg.Low    = arg.High = arg.OLow = arg.OHigh = 0;
            arg.Offset = arg.Base = arg.Text = String.Empty;
            // 替换后的指令文本
            string output = String.Empty;

            // 检查原指令的每个参数
            for (int i = 0; i < iformat.ArgsCount; i++)
            {
                // 替换格式为寄存器格式
                if (prototype.Type == TYPE_REGISTER)
                {
                    // 查找格式也为寄存器格式,并且不匹配
                    if (Type == TYPE_REGISTER &&
                        !Match(prototype.GetArgs(0), iformat.GetArgs(i)))
                    {
                        // 保留原样
                        output += iformat.GetArgs(i).Text + " ";
                    }
                    else
                    {
                        arg.Type = ARG_INVAILD;
                        // 寄存器格式只读第一个参数
                        if (Type == TYPE_REGISTER)
                        {
                            arg = GetArgs(0);
                        }
                        // 指令格式读相应位置的参数
                        else if (i <= ArgsCount)
                        {
                            arg = GetArgs(i);
                        }
                        // 当前的参数格式
                        switch (arg.Type)
                        {
                        // 指令名称
                        case ARG_INSTRUCTION:
                            // 对应位置不是指令时保留原样
                            if (iformat.GetArgs(i).Type != ARG_INSTRUCTION)
                            {
                                output += iformat.GetArgs(i).Text + " ";
                                break;
                            }
                            // 替换对应的指令名称
                            output += arg.Text + " ";
                            break;

                        // 寄存器
                        case ARG_REGISTER:
                            // 对应位置不是寄存器时保留原样
                            if (iformat.GetArgs(i).Type != ARG_REGISTER &&
                                iformat.GetArgs(i).Type != ARG_UNDEFINED)
                            {
                                output += iformat.GetArgs(i).Text + " ";
                                break;
                            }
                            // 判断查找模型的这个参数是否制定唯一的寄存器
                            bool isunique = false;
                            isunique  = (!prototype.GetArgs(0).Base.Equals(arg.Base));
                            isunique |= (prototype.GetArgs(0).Low == prototype.GetArgs(0).High);
                            isunique |= (arg.Low == arg.High);
                            int baseid = arg.Low;
                            // 不是唯一的情况下需要地址转移
                            if (!isunique)
                            {
                                baseid += iformat.GetArgs(i).Low - prototype.GetArgs(0).Low;
                            }
                            // 得到对应的转换后的寄存器的文本
                            output += String.Format("{0:s}{1:d}",
                                                    arg.Base, baseid);
                            if (!arg.Offset.Equals(String.Empty))
                            {
                                output += String.Format("{0:s}{1:d}",
                                                        arg.Offset, arg.OLow);
                            }
                            output += " ";
                            break;

                        // 其他格式
                        default:
                            output += iformat.GetArgs(i).Text + " ";
                            break;
                        }
                    }
                    continue;
                }
                // 超出的部分保留原样
                if (i >= ArgsCount)
                {
                    output += iformat.GetArgs(i).Text + " ";
                    continue;
                }
                // 根据当前参数的格式
                switch (GetArgs(i).Type)
                {
                // 指令名称
                case ARG_INSTRUCTION:
                    output += GetArgs(i).Text + " ";
                    break;

                // 寄存器
                case ARG_REGISTER:
                    // 策略和上面一致
                    bool isunique = false;
                    isunique |= (i >= prototype.ArgsCount);
                    if (!isunique)
                    {
                        isunique  = (prototype.GetArgs(i).Low == prototype.GetArgs(i).High);
                        isunique |= (GetArgs(i).Low == GetArgs(i).High);
                    }
                    int baseid = GetArgs(i).Low;
                    if (!isunique)
                    {
                        baseid += iformat.GetArgs(i).Low - prototype.GetArgs(i).Low;
                    }
                    output += String.Format("{0:s}{1:d}",
                                            GetArgs(i).Base, baseid);
                    if (!GetArgs(i).Offset.Equals(String.Empty))
                    {
                        output += String.Format("{0:s}{1:d}",
                                                GetArgs(i).Offset, GetArgs(i).OLow);
                    }
                    output += " ";
                    break;

                // 其他格式
                default:
                    output += iformat.GetArgs(i).Text + " ";
                    break;
                }
            }
            // 建立命令并返回
            NetworkReplaceElementsCommand command = null;
            int rectX = ldvmodel.SelectionRect.X;

            ldvmodel.RegisterInstructionInput(
                output, x, y, lnvmodel, ref command, ref rectX);
            return(command);
        }