|
|
|
@ -4,12 +4,9 @@
@@ -4,12 +4,9 @@
|
|
|
|
|
using System; |
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
using System.Collections.ObjectModel; |
|
|
|
|
using System.Globalization; |
|
|
|
|
using System.Linq; |
|
|
|
|
using System.Windows; |
|
|
|
|
using System.Windows.Controls; |
|
|
|
|
using System.Windows.Documents; |
|
|
|
|
using System.Windows.Media; |
|
|
|
|
using ICSharpCode.Core; |
|
|
|
|
using ICSharpCode.SharpDevelop; |
|
|
|
|
using ICSharpCode.SharpDevelop.Editor.Search; |
|
|
|
@ -20,6 +17,8 @@ namespace SearchAndReplace
@@ -20,6 +17,8 @@ namespace SearchAndReplace
|
|
|
|
|
{ |
|
|
|
|
ObservableCollection<SearchResultNode> resultNodes; |
|
|
|
|
ObservableCollection<SearchFileNode> fileNodes; |
|
|
|
|
ObservableCollection<SearchProjectNode> projectNodes; |
|
|
|
|
ObservableCollection<SearchFileNode> projectAndFileNodes; |
|
|
|
|
|
|
|
|
|
public string Title { get; private set; } |
|
|
|
|
public bool WasCancelled { get; set; } |
|
|
|
@ -28,7 +27,14 @@ namespace SearchAndReplace
@@ -28,7 +27,14 @@ namespace SearchAndReplace
|
|
|
|
|
{ |
|
|
|
|
this.Title = title; |
|
|
|
|
this.resultNodes = new ObservableCollection<SearchResultNode>(results.Select(r => new SearchResultNode(r))); |
|
|
|
|
this.fileNodes = new ObservableCollection<SearchFileNode>(resultNodes.GroupBy(r => r.FileName).Select(g => new SearchFileNode(g.Key, g.ToList()))); |
|
|
|
|
this.fileNodes = new ObservableCollection<SearchFileNode>( |
|
|
|
|
resultNodes.GroupBy(r => r.FileName) |
|
|
|
|
.Select(g => new SearchFileNode(g.Key, g.ToList())) |
|
|
|
|
); |
|
|
|
|
this.projectNodes = new ObservableCollection<SearchProjectNode>( |
|
|
|
|
resultNodes.GroupBy(r => SD.ProjectService.FindProjectContainingFile(r.FileName)) |
|
|
|
|
.Select(g => new SearchProjectNode(g.Key, g.ToList())) |
|
|
|
|
); |
|
|
|
|
this.IsExpanded = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -37,15 +43,41 @@ namespace SearchAndReplace
@@ -37,15 +43,41 @@ namespace SearchAndReplace
|
|
|
|
|
var results = searchedFile.Matches.Select(m => new SearchResultNode(m)).ToList(); |
|
|
|
|
resultNodes.AddRange(results); |
|
|
|
|
this.fileNodes.Add(new SearchFileNode(searchedFile.FileName, results)); |
|
|
|
|
foreach (var g in results.GroupBy(r => SD.ProjectService.FindProjectContainingFile(r.FileName))) { |
|
|
|
|
var p = projectNodes.FirstOrDefault(n => n.Project == g.Key); |
|
|
|
|
if (p == null) { |
|
|
|
|
projectNodes.Add(new SearchProjectNode(g.Key, g.ToList())); |
|
|
|
|
} else { |
|
|
|
|
p.Children = new List<SearchNode>(p.Children.Concat(g.AsEnumerable())); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
InvalidateText(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void GroupResultsByFile(bool perFile) |
|
|
|
|
public void GroupResultsBy(SearchResultGroupingKind kind) |
|
|
|
|
{ |
|
|
|
|
if (perFile) |
|
|
|
|
this.Children = fileNodes; |
|
|
|
|
else |
|
|
|
|
this.Children = resultNodes; |
|
|
|
|
bool perFile = false; |
|
|
|
|
switch (kind) { |
|
|
|
|
case SearchResultGroupingKind.Flat: |
|
|
|
|
this.Children = resultNodes; |
|
|
|
|
perFile = false; |
|
|
|
|
break; |
|
|
|
|
case SearchResultGroupingKind.PerFile: |
|
|
|
|
this.Children = fileNodes; |
|
|
|
|
perFile = true; |
|
|
|
|
break; |
|
|
|
|
case SearchResultGroupingKind.PerProject: |
|
|
|
|
this.Children = projectNodes; |
|
|
|
|
perFile = false; |
|
|
|
|
break; |
|
|
|
|
case SearchResultGroupingKind.PerProjectAndFile: |
|
|
|
|
this.Children = projectAndFileNodes; |
|
|
|
|
perFile = true; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
throw new ArgumentOutOfRangeException(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
foreach (SearchResultNode node in resultNodes) { |
|
|
|
|
node.ShowFileName = !perFile; |
|
|
|
|
} |
|
|
|
|