Browse Source

implement normal, wildcard and regex search modes in AE SearchStrateqy

pull/23/head
Siegfried Pammer 15 years ago
parent
commit
047b9b0c60
  1. 19
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/ISearchStrategy.cs
  2. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.xaml.cs
  3. 39
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchStrategyFactory.cs

19
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/ISearchStrategy.cs

@ -29,6 +29,25 @@ namespace ICSharpCode.AvalonEdit.Search
} }
/// <summary>
/// Defines supported search modes.
/// </summary>
public enum SearchType
{
/// <summary>
/// Standard search
/// </summary>
Normal,
/// <summary>
/// RegEx search
/// </summary>
RegEx,
/// <summary>
/// Wildcard search
/// </summary>
Wildcard
}
/// <inheritdoc/> /// <inheritdoc/>
public class SearchPatternException : Exception, ISerializable public class SearchPatternException : Exception, ISerializable
{ {

2
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.xaml.cs

@ -52,7 +52,7 @@ namespace ICSharpCode.AvalonEdit.Search
void UpdateSearch() void UpdateSearch()
{ {
messageView.IsOpen = false; messageView.IsOpen = false;
strategy = SearchStrategyFactory.Create(searchPattern ?? "", !MatchCase, UseRegex, WholeWords); strategy = SearchStrategyFactory.Create(searchPattern ?? "", !MatchCase, WholeWords, UseRegex ? SearchType.RegEx : SearchType.Normal);
DoSearch(true); DoSearch(true);
} }

39
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchStrategyFactory.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Windows.Controls; using System.Windows.Controls;
@ -15,15 +16,23 @@ namespace ICSharpCode.AvalonEdit.Search
/// <summary> /// <summary>
/// Creates a default ISearchStrategy with the given parameters. /// Creates a default ISearchStrategy with the given parameters.
/// </summary> /// </summary>
public static ISearchStrategy Create(string searchPattern, bool ignoreCase, bool useRegularExpressions, bool matchWholeWords) public static ISearchStrategy Create(string searchPattern, bool ignoreCase, bool matchWholeWords, SearchType searchType)
{ {
if (searchPattern == null) if (searchPattern == null)
throw new ArgumentNullException("searchPattern"); throw new ArgumentNullException("searchPattern");
RegexOptions options = RegexOptions.Compiled | RegexOptions.Multiline; RegexOptions options = RegexOptions.Compiled | RegexOptions.Multiline;
if (ignoreCase) if (ignoreCase)
options |= RegexOptions.IgnoreCase; options |= RegexOptions.IgnoreCase;
if (!useRegularExpressions)
searchPattern = Regex.Escape(searchPattern); switch (searchType) {
case SearchType.Normal:
searchPattern = Regex.Escape(searchPattern);
break;
case SearchType.Wildcard:
searchPattern = ConvertWildcardsToRegex(searchPattern);
break;
}
if (matchWholeWords) if (matchWholeWords)
searchPattern = "\\b" + searchPattern + "\\b"; searchPattern = "\\b" + searchPattern + "\\b";
try { try {
@ -33,5 +42,29 @@ namespace ICSharpCode.AvalonEdit.Search
throw new SearchPatternException(ex.Message, ex); throw new SearchPatternException(ex.Message, ex);
} }
} }
static string ConvertWildcardsToRegex(string searchPattern)
{
if (string.IsNullOrEmpty(searchPattern))
return "";
StringBuilder builder = new StringBuilder();
foreach (char ch in searchPattern) {
switch (ch) {
case '?':
builder.Append(".");
break;
case '*':
builder.Append(".*");
break;
default:
builder.Append(Regex.Escape(ch.ToString()));
break;
}
}
return builder.ToString();
}
} }
} }

Loading…
Cancel
Save