Browse Source

search: add some input error handling for regex

pull/23/head
Siegfried Pammer 14 years ago
parent
commit
07a12f69b3
  1. 10
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/DefaultSearchStrategy.cs
  2. 7
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/ISearchStrategy.cs
  3. 63
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.xaml
  4. 30
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.xaml.cs

10
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/DefaultSearchStrategy.cs

@ -31,6 +31,8 @@ namespace ICSharpCode.AvalonEdit.Search @@ -31,6 +31,8 @@ namespace ICSharpCode.AvalonEdit.Search
public static ISearchStrategy Create(string searchPattern, bool ignoreCase, bool useRegularExpressions, bool matchWholeWords)
{
if (searchPattern == null)
throw new ArgumentNullException("searchPattern");
RegexOptions options = RegexOptions.Compiled;
if (ignoreCase)
options |= RegexOptions.IgnoreCase;
@ -38,8 +40,12 @@ namespace ICSharpCode.AvalonEdit.Search @@ -38,8 +40,12 @@ namespace ICSharpCode.AvalonEdit.Search
searchPattern = Regex.Escape(searchPattern);
if (matchWholeWords)
searchPattern = "\\b" + searchPattern + "\\b";
Regex pattern = new Regex(searchPattern, options);
return new DefaultSearchStrategy(pattern);
try {
Regex pattern = new Regex(searchPattern, options);
return new DefaultSearchStrategy(pattern);
} catch (ArgumentException ex) {
throw new SearchPatternException(ex.Message, ex);
}
}
public IEnumerable<ISearchResult> FindAll(ITextSource document)

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

@ -19,4 +19,11 @@ namespace ICSharpCode.AvalonEdit.Search @@ -19,4 +19,11 @@ namespace ICSharpCode.AvalonEdit.Search
{
}
public class SearchPatternException : Exception
{
public SearchPatternException(string message, Exception exception) : base(message, exception)
{
}
}
}

63
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.xaml

@ -5,33 +5,40 @@ @@ -5,33 +5,40 @@
<BitmapImage x:Key="NextImage" UriSource="next.png" />
</UserControl.Resources>
<Border Background="White" BorderBrush="DimGray" BorderThickness="1" HorizontalAlignment="Right" VerticalAlignment="Top" Cursor="Arrow">
<StackPanel Orientation="Horizontal" Margin="3">
<TextBox Name="searchTextBox" Focusable="True" Width="100" Height="24" Margin="3,3,3,0" TextChanged="SearchTextBoxTextChanged" PreviewKeyDown="SearchLayerKeyDown" />
<local:DropDownButton Height="24">
<local:DropDownButton.DropDownContent>
<Popup StaysOpen="False">
<Border Background="White" BorderBrush="DimGray" BorderThickness="1">
<StackPanel Orientation="Vertical">
<CheckBox x:FieldModifier="private" x:Name="matchCase" Content="Match case" Margin="3" />
<CheckBox x:FieldModifier="private" x:Name="wholeWords" Content="Match whole words" Margin="3" />
<CheckBox x:FieldModifier="private" x:Name="useRegex" Content="Use Regular Expressions" Margin="3" />
</StackPanel>
</Border>
</Popup>
</local:DropDownButton.DropDownContent>
</local:DropDownButton>
<Button Margin="3" Height="24" Width="24" Command="local:SearchCommands.FindPrevious" ToolTip="Find Next (Ctrl+F3)">
<Image Width="16" Height="16" Stretch="Fill" Source="{StaticResource PrevImage}" />
</Button>
<Button Margin="3" Height="24" Width="24" Command="local:SearchCommands.FindNext" ToolTip="Find Next (F3)">
<Image Width="16" Height="16" Stretch="Fill" Source="{StaticResource NextImage}" />
</Button>
<Button Click="CloseClick" Margin="3" Height="16" Width="16" VerticalContentAlignment="Top" HorizontalContentAlignment="Left">
<Grid>
<Line X1="2" Y1="2" X2="8" Y2="8" Stroke="Black" StrokeThickness="1" />
<Line X1="8" Y1="2" X2="2" Y2="8" Stroke="Black" StrokeThickness="1" />
</Grid>
</Button>
</StackPanel>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Margin="3">
<TextBox Name="searchTextBox" Focusable="True" Width="100" Height="24" Margin="3,3,3,0" TextChanged="SearchTextBoxTextChanged" PreviewKeyDown="SearchLayerKeyDown" />
<local:DropDownButton Height="24">
<local:DropDownButton.DropDownContent>
<Popup StaysOpen="False">
<Border Background="White" BorderBrush="DimGray" BorderThickness="1">
<StackPanel Orientation="Vertical">
<CheckBox x:FieldModifier="private" x:Name="matchCase" Content="Match case" Margin="3" />
<CheckBox x:FieldModifier="private" x:Name="wholeWords" Content="Match whole words" Margin="3" />
<CheckBox x:FieldModifier="private" x:Name="useRegex" Content="Use Regular Expressions" Margin="3" />
</StackPanel>
</Border>
</Popup>
</local:DropDownButton.DropDownContent>
</local:DropDownButton>
<Button Margin="3" Height="24" Width="24" Command="local:SearchCommands.FindPrevious" ToolTip="Find Next (Ctrl+F3)">
<Image Width="16" Height="16" Stretch="Fill" Source="{StaticResource PrevImage}" />
</Button>
<Button Margin="3" Height="24" Width="24" Command="local:SearchCommands.FindNext" ToolTip="Find Next (F3)">
<Image Width="16" Height="16" Stretch="Fill" Source="{StaticResource NextImage}" />
</Button>
<Button Click="CloseClick" Margin="3" Height="16" Width="16" VerticalContentAlignment="Top" HorizontalContentAlignment="Left">
<Grid>
<Line X1="2" Y1="2" X2="8" Y2="8" Stroke="Black" StrokeThickness="1" />
<Line X1="8" Y1="2" X2="2" Y2="8" Stroke="Black" StrokeThickness="1" />
</Grid>
</Button>
</StackPanel>
<TextBlock Name="messageView" Grid.Row="1" Margin="3" Visibility="Collapsed" TextWrapping="Wrap" />
</Grid>
</Border>
</UserControl>

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

@ -102,21 +102,27 @@ namespace ICSharpCode.AvalonEdit.Search @@ -102,21 +102,27 @@ namespace ICSharpCode.AvalonEdit.Search
void DoSearch(bool changeSelection)
{
renderer.CurrentResults.Clear();
currentResult = null;
messageView.Visibility = Visibility.Collapsed;
if (!string.IsNullOrEmpty(searchTextBox.Text)) {
ISearchStrategy strategy = DefaultSearchStrategy.Create(searchTextBox.Text, !MatchCase, UseRegex, WholeWords);
currentResult = null;
int offset = textArea.Caret.Offset;
if (changeSelection) {
textArea.Selection = SimpleSelection.Empty;
}
foreach (SearchResult result in strategy.FindAll(textArea.Document)) {
if (currentResult == null && result.StartOffset >= offset) {
currentResult = result;
if (changeSelection) {
SetResult(result);
try {
ISearchStrategy strategy = DefaultSearchStrategy.Create(searchTextBox.Text, !MatchCase, UseRegex, WholeWords);
int offset = textArea.Caret.Offset;
if (changeSelection) {
textArea.Selection = SimpleSelection.Empty;
}
foreach (SearchResult result in strategy.FindAll(textArea.Document)) {
if (currentResult == null && result.StartOffset >= offset) {
currentResult = result;
if (changeSelection) {
SetResult(result);
}
}
renderer.CurrentResults.Add(result);
}
renderer.CurrentResults.Add(result);
} catch (SearchPatternException ex) {
messageView.Text = "Error: " + ex.Message;
messageView.Visibility = Visibility.Visible;
}
}
textArea.TextView.InvalidateLayer(KnownLayer.Selection);

Loading…
Cancel
Save