コード例 #1
0
        /// <summary>
        /// 替换
        /// </summary>
        /// <param name="args">参数</param>
        /// <returns>操作的元素在文档中的序号</returns>
        public int Replace(SearchReplaceCommandArgs args)
        {
            int index = Search(args, true, -1);

            if (index >= 0)
            {
                // 找到内容了,执行替换操作
                this.Document.BeginLogUndo();

                bool insertModeBack = false;
                if (this.Document.EditorControl != null)
                {
                    insertModeBack = this.Document.EditorControl.InsertMode;
                    this.Document.EditorControl.InsertMode = false;
                }
                int selectionStart = this.Content.Selection.AbsStartIndex;
                if (string.IsNullOrEmpty(args.ReplaceString))
                {
                    this.Document.DocumentControler.Delete();
                }
                else
                {
                    this.Document.DocumentControler.InsertString(args.ReplaceString);
                }
                this.Content.SetSelection(selectionStart, args.ReplaceString.Length);
                if (this.Document.EditorControl != null)
                {
                    this.Document.EditorControl.InsertMode = insertModeBack;
                }
                this.Document.EndLogUndo();
            }
            return(index);
        }
コード例 #2
0
        /// <summary>
        /// 全局替换
        /// </summary>
        /// <param name="args">参数</param>
        /// <returns>替换的次数</returns>
        public int ReplaceAll(SearchReplaceCommandArgs args)
        {
            int        result = 0;
            List <int> indexs = new List <int>();
            SearchReplaceCommandArgs args2 = args.Clone();

            args2.Backward = false;
            int currentIndex = this.Content.Count - 1;

            this.Document.BeginLogUndo();
            DocumentControler controler = this.Document.DocumentControler;
            Dictionary <DomContentElement, int> startIndexs = new Dictionary <DomContentElement, int>();

            while (true)
            {
                int index = Search(args2, false, currentIndex);
                if (index >= 0)
                {
                    DomSelection mySelection = new DomSelection(this.Document.CurrentContentElement);
                    mySelection.Refresh(index, args.SearchString.Length);
                    DomContainerElement container = null;
                    int elementIndex = 0;
                    this.Content.GetPositonInfo(index, out container, out elementIndex, false);
                    DomContentElement contentElement = container.ContentElement;
                    int pi = contentElement.PrivateContent.IndexOf(this.Content[index]);
                    if (startIndexs.ContainsKey(contentElement))
                    {
                        startIndexs[contentElement] = Math.Min(startIndexs[contentElement], pi);
                    }
                    else
                    {
                        startIndexs[contentElement] = pi;
                    }
                    indexs.Add(index);
                    if (string.IsNullOrEmpty(args.ReplaceString))
                    {
                        this.Content.DeleteSelection(true, false, true, mySelection);
                    }
                    else
                    {
                        DomElementList newElements = this.Document.CreateTextElements(
                            args.ReplaceString,
                            (DocumentContentStyle)this.Document.CurrentParagraphStyle,
                            (DocumentContentStyle)this.Document.EditorCurrentStyle.Clone());
                        ReplaceElementsArgs args3 = new ReplaceElementsArgs(
                            container,
                            index,
                            0,
                            newElements,
                            true,
                            false,
                            true);
                        int repResult = this.Document.ReplaceElements(args3);
                    }
                    result++;
                }
                else
                {
                    break;
                }
                currentIndex = index + args2.SearchString.Length;
            }//while
            this.Document.EndLogUndo();
            if (startIndexs.Count > 0)
            {
                bool refreshPage = false;
                foreach (DomContentElement ce in startIndexs.Keys)
                {
                    ce.UpdateContentElements(true);
                    ce.UpdateContentVersion();
                    ce._NeedRefreshPage = false;
                    ce.RefreshPrivateContent(startIndexs[ce]);
                    if (ce._NeedRefreshPage)
                    {
                        refreshPage = true;
                    }
                }
                if (refreshPage)
                {
                    this.Document.RefreshPages();
                    if (this.Document.EditorControl != null)
                    {
                        this.Document.EditorControl.UpdatePages();
                        this.Document.EditorControl.UpdateTextCaret();
                        this.Document.EditorControl.Invalidate();
                    }
                }
            }
            return(startIndexs.Count);
        }
コード例 #3
0
        /// <summary>
        /// 执行查找
        /// </summary>
        /// <param name="args">参数</param>
        /// <param name="setSelection">找到后是否设置文档选择状态</param>
        /// <returns>找到的元素在文档中的序号</returns>
        public int Search(SearchReplaceCommandArgs args, bool setSelection, int startIndex)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }
            if (string.IsNullOrEmpty(args.SearchString))
            {
                return(-1);
            }
            DomContent content            = this.Content;
            int        searchStringLength = args.SearchString.Length;
            int        newStartIndex      = -1;

            if (args.Backward)
            {
                // 向后查找
                if (startIndex < 0)
                {
                    startIndex = content.Selection.AbsEndIndex;
                }
                int contentLength = content.Count;
                for (int iCount = startIndex; iCount < contentLength; iCount++)
                {
                    DomElement element = content[iCount];
                    if (element is DomCharElement)
                    {
                        char c = ((DomCharElement)element).CharValue;
                        if (EqualsChar(c, args.SearchString[0], args.IgnoreCase))
                        {
                            if (searchStringLength == 1)
                            {
                                newStartIndex = iCount;
                                break;
                            }
                            else if (contentLength - iCount >= searchStringLength)
                            {
                                for (int iCount2 = 1; iCount2 < searchStringLength; iCount2++)
                                {
                                    DomElement element2 = content[iCount + iCount2];
                                    if (element2 is DomCharElement)
                                    {
                                        if (EqualsChar(
                                                ((DomCharElement)element2).CharValue,
                                                args.SearchString[iCount2],
                                                args.IgnoreCase))
                                        {
                                            if (iCount2 == searchStringLength - 1)
                                            {
                                                newStartIndex = iCount;
                                                goto EndSetNewStartIndex;
                                            }
                                        }
                                        else
                                        {
                                            // 判断失败
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        // 不是字符元素,判断失败
                                        break;
                                    }
                                } //for
                            }     //else if
                        }
                    }             //if
                }                 //for
            }                     //if
            else
            {
                // 向前查找
                if (startIndex < 0)
                {
                    startIndex = content.Selection.AbsStartIndex;
                }
                char lastChar = args.SearchString[args.SearchString.Length - 1];
                for (int iCount = startIndex; iCount >= 0; iCount--)
                {
                    DomElement element = content[iCount];
                    if (element is DomCharElement)
                    {
                        char c = ((DomCharElement)element).CharValue;
                        if (EqualsChar(c, lastChar, args.IgnoreCase))
                        {
                            if (searchStringLength == 1)
                            {
                                newStartIndex = iCount;
                                break;
                            }
                            else if (iCount >= searchStringLength - 1)
                            {
                                for (int iCount2 = searchStringLength - 2; iCount2 >= 0; iCount2--)
                                {
                                    DomElement element2 = content[iCount - searchStringLength + iCount2 + 1];
                                    if (element2 is DomCharElement)
                                    {
                                        if (EqualsChar(
                                                ((DomCharElement)element2).CharValue,
                                                args.SearchString[iCount2],
                                                args.IgnoreCase))
                                        {
                                            if (iCount2 == 0)
                                            {
                                                newStartIndex = iCount - searchStringLength + 1;
                                                goto EndSetNewStartIndex;
                                            }
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }//for
            }
            EndSetNewStartIndex :;
            if (setSelection)
            {
                if (newStartIndex >= 0)
                {
                    content.SetSelection(newStartIndex, args.SearchString.Length);
                }
            }
            return(newStartIndex);
        }