Today we put the finishing touches on the search framework in SyntaxEditor for WPF. We’re really happy with what we have so far but definitely would like to get your additional feedback once the public beta is released.
I’d like to show off the main find/replace QuickStart in this blog post to illustrate some features.
|

And unmodified SyntaxEditor with one tool window containing the search UI control described in a previous blog post
|
The editor shows some C# code with XML doc comments. We’ve placed a EditorSearchView control in the tool window on the right. In case you missed it, that control is described in this previous blog post. We’ve click the Quick Replace button in the search control to switch to replace mode. This mode change reveals the replace UI controls via animation.
Note that for the QuickStart, we’ve pre-defined the find/replace text. We’re going to use a regular expression that looks for XML doc comment lines that start with a tag. Then we’re going to use regex substitution to put the text 123 after each occurrence. It’s a silly operation but this is just a sample. :)
|

A replace all operation is performed
|
Next we click the Replace All button. Note the line modification marks in the editor indicating lines that were changed. The Find Results tool window now displays information about the operation that took place.
Behind the scenes, there is an event that fires whenever a search operation is performed in the “view” search object model. This QuickStart handles that event and updates the Find Results tool window’s contents appropriately based on the ISearchResultSet that is passed.
The ISearchResultSet is a really handy object. It tells you what type of operation was performed (find next, replace all, etc.), the exact search options that were used (find text, replace text, match case, etc.), the collection of individual results, and whether wrapping occurred. Each individual ISearchResult gives you the regex captures that were made, the snapshot range of where text was found, and the snapshot range where it was replaced. From those you can determine the exact text that was found and replaced.
Back to this QuickStart… our results TextBox is read-only and on the first line says some general info about the operation that was performed, just like in Visual Studio. The remaining lines give the line/char of the match and the actual line of text that contains the result. All this information is populated from the ISearchResultSet.
|

The second result in the results TextBox is double-clicked
|
As an additional feature, we wanted to show off snapshot translation with this QuickStart. We’ve talked about that in past blog posts as well. Basically a snapshot is an immutable copy of the document at a certain time. Each ISearchResult stores a snapshot range, meaning it gives you the exact snapshot and range within that snapshot in which the match occurred.
In the screen above, I typed NEW TEXT TYPED HERE making the line/char results in the Find Results invalid. You can see the result from (9,2) is now on line 12.
Is this a problem for SyntaxEditor? No, you can double-click on the (9,2) result in the results TextBox and behind the scenes, the QuickStart grabs the ISearchResult for that particular result. It translates the snapshot range to the current snapshot in the active view. Then it uses the resulting range to select the replaced text in the SyntaxEditor. As you can see from the screenshot, the second result was properly selected even though we’ve made multiple edits above it since the actual replace all operation occurred.
You won’t find features like this anywhere else, and it’s touches like this that will make your application user experience much nicer for end users.
As a side note, the source for this QuickStart is included in the samples for SyntaxEditor. We are making sure we provide simple QuickStarts showing nearly every major feature of SyntaxEditor so that you have a great reference point when working in various feature areas.