Пример #1
0
        public int ReplaceAll(int startPos, int endPos, string searchString, string replaceString, SearchFlags flags, bool Mark, bool Highlight)
        {
            List <CharacterRange> Results = new List <CharacterRange>();

            _scintilla.IndicatorCurrent = Indicator.Index;

            int findCount = 0;
            int lastLine  = -1;

            _scintilla.BeginUndoAction();

            int diff = replaceString.Length - searchString.Length;

            while (true)
            {
                CharacterRange r = Find(startPos, endPos, searchString, flags);
                if (r.cpMin == r.cpMax)
                {
                    break;
                }
                else
                {
                    _scintilla.SelectionStart = r.cpMin;
                    _scintilla.SelectionEnd   = r.cpMax;
                    _scintilla.ReplaceSelection(replaceString);
                    r.cpMax = startPos = r.cpMin + replaceString.Length;
                    endPos += diff;

                    Results.Add(r);
                    findCount++;

                    if (Mark)
                    {
                        //	We can of course have multiple instances of a find on a single
                        //	line. We don't want to mark this line more than once.
                        Line line = new Line(_scintilla, _scintilla.LineFromPosition(r.cpMin));
                        if (line.Position > lastLine)
                        {
                            line.MarkerAdd(_marker.Index);
                        }
                        lastLine = line.Position;
                    }
                    if (Highlight)
                    {
                        _scintilla.IndicatorFillRange(r.cpMin, r.cpMax - r.cpMin);
                    }
                }
            }

            _scintilla.EndUndoAction();

            if (ReplaceAllResults != null)
            {
                ReplaceAllResults(this, new ReplaceResultsEventArgs(this, Results));
            }

            return(findCount);
        }
Пример #2
0
        /// <summary>
        /// Replace all matches in the <see cref="Scintilla"/> text with the given string, using the properties of this query object to search.
        /// </summary>
        /// <param name="editor"><see cref="Scintilla"/> control to search.</param>
        /// <param name="replaceString">String to replace any matches. Can be a regular expression pattern.</param>
        /// <returns><see cref="List{CharacterRange}"/> containing the locations of every match. Empty if none were found.</returns>
        public override List <CharacterRange> ReplaceAll(Scintilla editor, string replaceString)
        {
            List <CharacterRange> results = base.ReplaceAll(editor, replaceString);

            editor.BeginUndoAction();

            var replaceOffset = 0;
            var replaceCount  = 0;

            string text = editor.GetTextRange(SearchRange.cpMin, SearchRange.cpMax - SearchRange.cpMin + 1);

            SearchExpression.Replace(text,
                                     new MatchEvaluator(
                                         delegate(Match m) {
                string replacement = m.Result(replaceString);
                int start          = SearchRange.cpMin + m.Index + replaceOffset;
                int end            = start + m.Length;

                replaceCount++;
                editor.SelectionStart = start;
                editor.SelectionEnd   = end;
                editor.ReplaceSelection(replacement);
                results.Add(new CharacterRange(start, end));

                // The replacement has shifted the original match offsets
                replaceOffset += replacement.Length - m.Value.Length;

                return(replacement);
            }
                                         )
                                     );

            editor.EndUndoAction();
            return(results);
        }
Пример #3
0
        /// <summary>
        /// Replace all matches in the <see cref="Scintilla"/> text with the given string, using the properties of this query object to search.
        /// </summary>
        /// <param name="editor"><see cref="Scintilla"/> control to search.</param>
        /// <param name="replaceString">String to replace any matches.</param>
        /// <returns><see cref="List{CharacterRange}"/> containing the locations of every match. Empty if none were found.</returns>
        public override List <CharacterRange> ReplaceAll(Scintilla editor, string replaceString)
        {
            List <CharacterRange> results = base.ReplaceAll(editor, replaceString);
            int findCount = 0;

            editor.BeginUndoAction();
            int diff = replaceString.Length - SearchString.Length;

            while (true)
            {
                CharacterRange findRange = Find(editor);
                if (findRange.cpMin == findRange.cpMax)
                {
                    break;
                }
                else
                {
                    editor.SelectionStart = findRange.cpMin;
                    editor.SelectionEnd   = findRange.cpMax;
                    editor.ReplaceSelection(replaceString);
                    findRange.cpMax = findRange.cpMin + replaceString.Length;
                    SearchRange     = new CharacterRange(findRange.cpMax, SearchRange.cpMax + diff);

                    results.Add(findRange);
                    findCount++;
                }
            }

            editor.EndUndoAction();
            return(results);
        }
Пример #4
0
        public List <CharacterRange> ReplaceAll(int startPos, int endPos, string searchString, string replaceString, SearchFlags flags, bool mark, bool highlight)
        {
            var results = new List <CharacterRange>();

            Scintilla.IndicatorCurrent = Indicator.Index;

            var findCount = 0;
            var lastLine  = -1;

            Scintilla.BeginUndoAction();

            var diff = replaceString.Length - searchString.Length;

            while (true)
            {
                var r = Find(startPos, endPos, searchString, flags);
                if (r.MinPosition == r.MaxPosition)
                {
                    break;
                }

                Scintilla.SelectionStart = r.MinPosition;
                Scintilla.SelectionEnd   = r.MaxPosition;
                Scintilla.ReplaceSelection(replaceString);
                r       = new CharacterRange(r.MinPosition, startPos = r.MinPosition + replaceString.Length);
                endPos += diff;

                results.Add(r);
                findCount++;

                if (mark)
                {
                    //	We can of course have multiple instances of a find on a single
                    //	line. We don't want to mark this line more than once.
                    var line = new Line(Scintilla, Scintilla.LineFromPosition(r.MinPosition));
                    if (line.Position > lastLine)
                    {
                        line.MarkerAdd(Marker.Index);
                    }
                    lastLine = line.Position;
                }
                if (highlight)
                {
                    Scintilla.IndicatorFillRange(r.MinPosition, r.MaxPosition - r.MinPosition);
                }
            }

            Scintilla.EndUndoAction();

            ReplaceAllResults?.Invoke(this, new ResultsEventArgs(new FindResults(results)));

            return(results);
        }
Пример #5
0
        public List <CharacterRange> ReplaceAll(CharacterRange rangeToSearch, Regex findExpression, string replaceExpression, bool mark, bool highlight)
        {
            var results = new List <CharacterRange>();

            Scintilla.IndicatorCurrent = Indicator.Index;

            var lastLine = -1;

            Scintilla.BeginUndoAction();

            while (true)
            {
                var r = Find(rangeToSearch, findExpression);
                if (r.MinPosition == r.MaxPosition)
                {
                    break;
                }

                var findString    = Scintilla.GetTextRange(r.MinPosition, r.MaxPosition - r.MinPosition);
                var replaceString = findExpression.Replace(findString, replaceExpression);
                Scintilla.SelectionStart = r.MinPosition;
                Scintilla.SelectionEnd   = r.MaxPosition;
                Scintilla.ReplaceSelection(replaceString);
                r             = new CharacterRange(r.MinPosition, r.MinPosition + replaceString.Length);
                rangeToSearch = new CharacterRange(r.MaxPosition, rangeToSearch.MaxPosition + replaceString.Length - findString.Length);

                results.Add(r);

                if (mark)
                {
                    //	We can of course have multiple instances of a find on a single
                    //	line. We don't want to mark this line more than once.
                    var line = new Line(Scintilla, Scintilla.LineFromPosition(r.MinPosition));
                    if (line.Position > lastLine)
                    {
                        line.MarkerAdd(Marker.Index);
                    }
                    lastLine = line.Position;
                }
                if (highlight)
                {
                    Scintilla.IndicatorFillRange(r.MinPosition, r.MaxPosition - r.MinPosition);
                }
                rangeToSearch = new CharacterRange(r.MaxPosition, rangeToSearch.MaxPosition);
            }

            Scintilla.EndUndoAction();

            ReplaceAllResults?.Invoke(this, new ResultsEventArgs(new FindResults(results)));

            return(results);
        }
Пример #6
0
        private void PerformReplaceAll()
        {
            m_codeBox.TargetStart = 0;
            m_codeBox.TargetEnd   = m_codeBox.TextLength;
            m_codeBox.BeginUndoAction();
            int numChanges = 0;

            while (PerformFind())
            {
                PerformReplace();
                ++numChanges;
            }
            m_codeBox.EndUndoAction();
            MessageBox.Show(this,
                            string.Format("{0} replacement(s) were made.", numChanges), "Quick Replace",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }