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); }
/// <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); }
/// <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); }
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); }
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); }
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); }