From d549367395969c22f0cf0d13f78fc6e543f74e9a Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 17 Aug 2013 16:49:18 +0200 Subject: [PATCH] add group by project and file in SearchResults --- .../Project/Gui/DefaultSearchResult.cs | 5 ++++ .../Project/Gui/SearchFileNode.cs | 5 ++-- .../Project/Gui/SearchRootNode.cs | 23 ++++++++++++++++--- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Gui/DefaultSearchResult.cs b/src/AddIns/Misc/SearchAndReplace/Project/Gui/DefaultSearchResult.cs index 26d3e72fed..b07d446e21 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Gui/DefaultSearchResult.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Gui/DefaultSearchResult.cs @@ -82,10 +82,15 @@ namespace SearchAndReplace perProjectItem.SetValueToExtension(MenuItem.HeaderProperty, new LocalizeExtension("MainWindow.Windows.SearchResultPanel.PerProject")); perProjectItem.Click += delegate { SetResultGrouping(SearchResultGroupingKind.PerProject); }; + MenuItem perProjectAndFileItem = new MenuItem(); + perProjectAndFileItem.SetValueToExtension(MenuItem.HeaderProperty, new LocalizeExtension("MainWindow.Windows.SearchResultPanel.PerProjectAndFile")); + perProjectAndFileItem.Click += delegate { SetResultGrouping(SearchResultGroupingKind.PerProjectAndFile); }; + perFileDropDown.DropDownMenu = new ContextMenu(); perFileDropDown.DropDownMenu.Items.Add(flatItem); perFileDropDown.DropDownMenu.Items.Add(perFileItem); perFileDropDown.DropDownMenu.Items.Add(perProjectItem); + perFileDropDown.DropDownMenu.Items.Add(perProjectAndFileItem); toolbarItems.Add(perFileDropDown); toolbarItems.Add(new Separator()); diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchFileNode.cs b/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchFileNode.cs index 83706df729..b0a1a851ad 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchFileNode.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchFileNode.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using System.IO; using System.Windows.Controls; using System.Windows.Documents; @@ -16,7 +17,7 @@ namespace SearchAndReplace { public FileName FileName { get; private set; } - public SearchFileNode(FileName fileName, System.Collections.Generic.List resultNodes) + public SearchFileNode(FileName fileName, IList resultNodes) { this.FileName = fileName; this.Children = resultNodes; @@ -43,7 +44,7 @@ namespace SearchAndReplace { public IProject Project { get; private set; } - public SearchProjectNode(IProject project, System.Collections.Generic.List resultNodes) + public SearchProjectNode(IProject project, IList resultNodes) { this.Project = project; this.Children = resultNodes; diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchRootNode.cs b/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchRootNode.cs index 2e9314995a..d11f2b6fba 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchRootNode.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchRootNode.cs @@ -18,7 +18,7 @@ namespace SearchAndReplace ObservableCollection resultNodes; ObservableCollection fileNodes; ObservableCollection projectNodes; - ObservableCollection projectAndFileNodes; + ObservableCollection projectAndFileNodes; public string Title { get; private set; } public bool WasCancelled { get; set; } @@ -33,7 +33,11 @@ namespace SearchAndReplace ); this.projectNodes = new ObservableCollection( resultNodes.GroupBy(r => SD.ProjectService.FindProjectContainingFile(r.FileName)) - .Select(g => new SearchProjectNode(g.Key, g.ToList())) + .Select(g => new SearchProjectNode(g.Key, g.OfType().ToList())) + ); + this.projectAndFileNodes = new ObservableCollection( + resultNodes.GroupBy(r => SD.ProjectService.FindProjectContainingFile(r.FileName)) + .Select(g => new SearchProjectNode(g.Key, g.GroupBy(r => r.FileName).Select(g2 => new SearchFileNode(g2.Key, g2.ToList())).OfType().ToList())) ); this.IsExpanded = true; } @@ -45,11 +49,24 @@ namespace SearchAndReplace 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); + var p2 = projectAndFileNodes.FirstOrDefault(n => n.Project == g.Key); if (p == null) { - projectNodes.Add(new SearchProjectNode(g.Key, g.ToList())); + projectNodes.Add(new SearchProjectNode(g.Key, g.OfType().ToList())); } else { p.Children = new List(p.Children.Concat(g.AsEnumerable())); } + if (p2 == null) { + projectAndFileNodes.Add(new SearchProjectNode(g.Key, g.GroupBy(r => r.FileName).Select(g2 => new SearchFileNode(g2.Key, g2.ToList())).OfType().ToList())); + } else { + var f = p2.Children.OfType().FirstOrDefault(n => n.FileName == searchedFile.FileName); + if (f == null) { + var list = new List(p2.Children); + list.Add(new SearchFileNode(searchedFile.FileName, g.ToList())); + p2.Children = list; + } else { + f.Children = new List(f.Children.Concat(g.AsEnumerable())); + } + } } InvalidateText(); }