Browse Source

add group by project in SearchResults

pull/59/merge
Siegfried Pammer 12 years ago
parent
commit
c5acf9b1da
  1. 24
      data/resources/StringResources.nl.resx
  2. 9
      data/resources/StringResources.resx
  3. 30
      src/AddIns/Misc/SearchAndReplace/Project/Gui/DefaultSearchResult.cs
  4. 2
      src/AddIns/Misc/SearchAndReplace/Project/Gui/ObserverSearchResult.cs
  5. 10
      src/AddIns/Misc/SearchAndReplace/Project/Gui/ResultsTreeView.cs
  6. 40
      src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchFileNode.cs
  7. 50
      src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchRootNode.cs

24
data/resources/StringResources.nl.resx

@ -3740,6 +3740,12 @@ Noot: Dit beïnvloed eigen aangepaste opmaak niet.</value> @@ -3740,6 +3740,12 @@ Noot: Dit beïnvloed eigen aangepaste opmaak niet.</value>
<data name="ICSharpCode.SharpDevelop.DefaultEditor.IncrementalSearch.ReverseSearchStatusBarMessage" xml:space="preserve">
<value>Omgekeerd aanvullend zoeken:</value>
</data>
<data name="ICSharpCode.SharpDevelop.Dom.AssemblyInvalid" xml:space="preserve">
<value>{0} is ongeldig als .NET assembly</value>
</data>
<data name="ICSharpCode.SharpDevelop.Dom.AssemblyNotAccessible" xml:space="preserve">
<value>{0} is niet toegankelijk of bestaat niet meer.</value>
</data>
<data name="ICSharpCode.SharpDevelop.ErrorLoadingCodeCompletionInformation" xml:space="preserve">
<value>Fout bij laden van code-completering informatie voor ${Assembly} van ${Filename}:</value>
</data>
@ -4638,6 +4644,9 @@ Microsoft.Tools.WindowsInstallerXml.Extenties.NetFxCompiler, WixNetFxExtentie</v @@ -4638,6 +4644,9 @@ Microsoft.Tools.WindowsInstallerXml.Extenties.NetFxCompiler, WixNetFxExtentie</v
<data name="ICSharpCode.WixBinding.WixVisualStudioExtensionTitle" xml:space="preserve">
<value>Visual Studio extensie</value>
</data>
<data name="ICSharpCode.WpfDesign.AddIn.ThumbnailViewPad" xml:space="preserve">
<value>WPF ontwerper thumbnail overzicht</value>
</data>
<data name="ICSharpCode.WPFDesigner.ContextMenu.Copy" xml:space="preserve">
<value>Kopieëren</value>
</data>
@ -4938,6 +4947,9 @@ Microsoft.Tools.WindowsInstallerXml.Extenties.NetFxCompiler, WixNetFxExtentie</v @@ -4938,6 +4947,9 @@ Microsoft.Tools.WindowsInstallerXml.Extenties.NetFxCompiler, WixNetFxExtentie</v
<data name="MainWindow.Windows.BookmarksLabel" xml:space="preserve">
<value>Bladwijzers</value>
</data>
<data name="MainWindow.Windows.ClassBrowser.AddToWorkspace" xml:space="preserve">
<value>Toevoegen aan werkruimte</value>
</data>
<data name="MainWindow.Windows.ClassBrowser.BackButton.ToolTip" xml:space="preserve">
<value>Vorige</value>
</data>
@ -4977,9 +4989,21 @@ Microsoft.Tools.WindowsInstallerXml.Extenties.NetFxCompiler, WixNetFxExtentie</v @@ -4977,9 +4989,21 @@ Microsoft.Tools.WindowsInstallerXml.Extenties.NetFxCompiler, WixNetFxExtentie</v
<data name="MainWindow.Windows.ClassBrowser.NoResultsFound" xml:space="preserve">
<value>Géén zoekresultaten gevonden.</value>
</data>
<data name="MainWindow.Windows.ClassBrowser.OpenAssemblyButton.ToolTip" xml:space="preserve">
<value>Open assembly...</value>
</data>
<data name="MainWindow.Windows.ClassBrowser.OpenAssemblyFromFile" xml:space="preserve">
<value>Open assembly vanuit bestand...</value>
</data>
<data name="MainWindow.Windows.ClassBrowser.OpenAssemblyFromGAC" xml:space="preserve">
<value>Assembly openen vanuit GAK...</value>
</data>
<data name="MainWindow.Windows.ClassBrowser.SearchButton.ToolTip" xml:space="preserve">
<value>Zoeken in Klassen Overzicht</value>
</data>
<data name="MainWindow.Windows.ClassBrowser.Workspace" xml:space="preserve">
<value>Werkruimte {0}</value>
</data>
<data name="MainWindow.Windows.ClassScoutLabel" xml:space="preserve">
<value>Klassen Overzicht</value>
</data>

9
data/resources/StringResources.resx

@ -5778,6 +5778,9 @@ Shows the full callstack of the error.</comment> @@ -5778,6 +5778,9 @@ Shows the full callstack of the error.</comment>
<value>in</value>
<comment>used like this: occurrences IN files</comment>
</data>
<data name="MainWindow.Windows.SearchResultPanel.NoProject" xml:space="preserve">
<value>&lt;no project&gt;</value>
</data>
<data name="MainWindow.Windows.SearchResultPanel.OccurrencesCount" xml:space="preserve">
<value>${Count} occurrences</value>
</data>
@ -5793,6 +5796,12 @@ Shows the full callstack of the error.</comment> @@ -5793,6 +5796,12 @@ Shows the full callstack of the error.</comment>
<data name="MainWindow.Windows.SearchResultPanel.PerFile" xml:space="preserve">
<value>Per file</value>
</data>
<data name="MainWindow.Windows.SearchResultPanel.PerProject" xml:space="preserve">
<value>Per project</value>
</data>
<data name="MainWindow.Windows.SearchResultPanel.PerProjectAndFile" xml:space="preserve">
<value>Per project and file</value>
</data>
<data name="MainWindow.Windows.SearchResultPanel.SelectViewMode.ToolTip" xml:space="preserve">
<value>Select search list mode</value>
</data>

30
src/AddIns/Misc/SearchAndReplace/Project/Gui/DefaultSearchResult.cs

@ -49,13 +49,12 @@ namespace SearchAndReplace @@ -49,13 +49,12 @@ namespace SearchAndReplace
SD.MainThread.VerifyAccess();
if (resultsTreeViewInstance == null)
resultsTreeViewInstance = new ResultsTreeView();
rootNode.GroupResultsByFile(ResultsTreeView.GroupResultsByFile);
rootNode.GroupResultsBy(ResultsTreeView.GroupingKind);
resultsTreeViewInstance.ItemsSource = new object[] { rootNode };
return resultsTreeViewInstance;
}
static IList toolbarItems;
static MenuItem flatItem, perFileItem;
public virtual IList GetToolbarItems()
{
@ -71,17 +70,22 @@ namespace SearchAndReplace @@ -71,17 +70,22 @@ namespace SearchAndReplace
perFileDropDown.Content = new Image { Height = 16, Source = PresentationResourceService.GetBitmapSource("Icons.16x16.FindIcon") };
perFileDropDown.SetValueToExtension(DropDownButton.ToolTipProperty, new LocalizeExtension("MainWindow.Windows.SearchResultPanel.SelectViewMode.ToolTip"));
flatItem = new MenuItem();
MenuItem flatItem = new MenuItem();
flatItem.SetValueToExtension(MenuItem.HeaderProperty, new LocalizeExtension("MainWindow.Windows.SearchResultPanel.Flat"));
flatItem.Click += delegate { SetPerFile(false); };
flatItem.Click += delegate { SetResultGrouping(); };
perFileItem = new MenuItem();
MenuItem perFileItem = new MenuItem();
perFileItem.SetValueToExtension(MenuItem.HeaderProperty, new LocalizeExtension("MainWindow.Windows.SearchResultPanel.PerFile"));
perFileItem.Click += delegate { SetPerFile(true); };
perFileItem.Click += delegate { SetResultGrouping(SearchResultGroupingKind.PerFile); };
MenuItem perProjectItem = new MenuItem();
perProjectItem.SetValueToExtension(MenuItem.HeaderProperty, new LocalizeExtension("MainWindow.Windows.SearchResultPanel.PerProject"));
perProjectItem.Click += delegate { SetResultGrouping(SearchResultGroupingKind.PerProject); };
perFileDropDown.DropDownMenu = new ContextMenu();
perFileDropDown.DropDownMenu.Items.Add(flatItem);
perFileDropDown.DropDownMenu.Items.Add(perFileItem);
perFileDropDown.DropDownMenu.Items.Add(perProjectItem);
toolbarItems.Add(perFileDropDown);
toolbarItems.Add(new Separator());
@ -109,17 +113,25 @@ namespace SearchAndReplace @@ -109,17 +113,25 @@ namespace SearchAndReplace
}
}
static void SetPerFile(bool perFile)
static void SetResultGrouping(SearchResultGroupingKind grouping = SearchResultGroupingKind.Flat)
{
ResultsTreeView.GroupResultsByFile = perFile;
ResultsTreeView.GroupingKind = grouping;
if (resultsTreeViewInstance != null) {
foreach (SearchRootNode node in resultsTreeViewInstance.ItemsSource.OfType<SearchRootNode>()) {
node.GroupResultsByFile(perFile);
node.GroupResultsBy(grouping);
}
}
}
}
public enum SearchResultGroupingKind
{
Flat,
PerFile,
PerProject,
PerProjectAndFile
}
public class DefaultSearchResultFactory : ISearchResultFactory
{
public ISearchResult CreateSearchResult(string title, IEnumerable<SearchResultMatch> matches)

2
src/AddIns/Misc/SearchAndReplace/Project/Gui/ObserverSearchResult.cs

@ -32,7 +32,7 @@ namespace SearchAndReplace @@ -32,7 +32,7 @@ namespace SearchAndReplace
SD.MainThread.VerifyAccess();
if (resultsTreeViewInstance == null)
resultsTreeViewInstance = new ResultsTreeView();
rootNode.GroupResultsByFile(ResultsTreeView.GroupResultsByFile);
rootNode.GroupResultsBy(ResultsTreeView.GroupingKind);
resultsTreeViewInstance.ItemsSource = new object[] { rootNode };
return resultsTreeViewInstance;
}

10
src/AddIns/Misc/SearchAndReplace/Project/Gui/ResultsTreeView.cs

@ -38,13 +38,9 @@ namespace SearchAndReplace @@ -38,13 +38,9 @@ namespace SearchAndReplace
e.Handled = true;
}
public static bool GroupResultsByFile {
get {
return PropertyService.Get("SearchAndReplace.GroupResultsByFile", false);
}
set {
PropertyService.Set("SearchAndReplace.GroupResultsByFile", value);
}
public static SearchResultGroupingKind GroupingKind {
get { return PropertyService.Get("SearchAndReplace.GroupResults", SearchResultGroupingKind.Flat); }
set { PropertyService.Set("SearchAndReplace.GroupResults", value); }
}
}
}

40
src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchFileNode.cs

@ -8,7 +8,7 @@ using System.Windows.Documents; @@ -8,7 +8,7 @@ using System.Windows.Documents;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor.Search;
using ICSharpCode.SharpDevelop.Project;
namespace SearchAndReplace
{
@ -38,4 +38,42 @@ namespace SearchAndReplace @@ -38,4 +38,42 @@ namespace SearchAndReplace
FileService.OpenFile(FileName);
}
}
public class SearchProjectNode : SearchNode
{
public IProject Project { get; private set; }
public SearchProjectNode(IProject project, System.Collections.Generic.List<SearchResultNode> resultNodes)
{
this.Project = project;
this.Children = resultNodes;
this.IsExpanded = true;
}
protected override object CreateText()
{
string fileName = SD.ResourceService.GetString("MainWindow.Windows.SearchResultPanel.NoProject");
string directory = null;
if (Project != null) {
fileName = Path.GetFileNameWithoutExtension(Project.FileName);
directory = Path.GetDirectoryName(Project.FileName);
}
if (directory != null) {
return new TextBlock {
Inlines = {
new Bold(new Run(fileName)),
new Run(StringParser.Parse(" (${res:MainWindow.Windows.SearchResultPanel.In} ") + directory + ")")
}
};
}
return new TextBlock { Inlines = { new Bold(new Run(fileName)) } };
}
public override void ActivateItem()
{
}
}
}

50
src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchRootNode.cs

@ -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;
}

Loading…
Cancel
Save