Skip to content

Commit 5a74fe0

Browse files
Slava BuynovSlava Buynov
authored andcommitted
Fixed of sorting
1 parent 6a71c77 commit 5a74fe0

File tree

4 files changed

+95
-199
lines changed

4 files changed

+95
-199
lines changed

QuickNavigate.Tests/Collections/ComparersTests.cs

Lines changed: 0 additions & 72 deletions
This file was deleted.

QuickNavigate/Collections/Comparers.cs

Lines changed: 0 additions & 62 deletions
This file was deleted.

QuickNavigate/Forms/Nodes.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using ASCompletion;
77
using ASCompletion.Model;
88
using JetBrains.Annotations;
9-
using PluginCore.Managers;
109

1110
namespace QuickNavigate.Forms
1211
{
@@ -25,10 +24,7 @@ public static TreeNode CreateTreeNode(FileModel inFile, bool isHaxe, MemberModel
2524
return node;
2625
}
2726

28-
public static TreeNode CreateTreeNode(ClassModel classModel)
29-
{
30-
return new ClassNode(classModel, PluginUI.GetIcon(classModel.Flags, classModel.Access));
31-
}
27+
public static TreeNode CreateTreeNode(ClassModel classModel) => new ClassNode(classModel, PluginUI.GetIcon(classModel.Flags, classModel.Access));
3228
}
3329

3430
public class MemberNode : TreeNode

QuickNavigate/Forms/TypeExplorerForm.cs

Lines changed: 94 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
using JetBrains.Annotations;
1212
using PluginCore;
1313
using ProjectManager.Projects;
14-
using QuickNavigate.Collections;
1514
using QuickNavigate.Helpers;
1615

1716
namespace QuickNavigate.Forms
@@ -166,92 +165,77 @@ void RefreshTree()
166165
tree.EndUpdate();
167166
}
168167

169-
void FillNodes(TreeNodeCollection nodes)
168+
void FillNodes([NotNull] TreeNodeCollection nodes)
170169
{
171170
var types = FilterTypes(openedTypes.ToList());
172-
if (types.Count > 0) nodes.AddRange(CreateNodes(types, string.Empty).ToArray());
171+
if (types.Count > 0) nodes.AddRange(types.Select(it => (ClassNode) NodeFactory.CreateTreeNode(TypeToClassModel[it])).ToArray());
173172
}
174173

175-
void FillNodes(TreeNodeCollection nodes, string search)
174+
void FillNodes([NotNull] TreeNodeCollection nodes, [NotNull] string search)
176175
{
177176
var openedTypes = FilterTypes(this.openedTypes.ToList());
178177
var closedTypes = FilterTypes(this.closedTypes.ToList());
179178
var maxItems = Settings.MaxItems;
180-
var openedMatches = openedTypes.Count > 0 ? SearchUtil.FindAll(openedTypes, search) : new List<string>();
181-
var closedMatches = new List<string>();
179+
if (openedTypes.Count > 0) openedTypes = SearchUtil.FindAll(openedTypes, search);
180+
TreeNode[] openedNodes;
181+
TreeNode[] closedNodes;
182182
if (maxItems > 0)
183183
{
184-
if (openedMatches.Count >= maxItems) openedMatches = openedMatches.GetRange(0, maxItems);
185-
maxItems -= openedMatches.Count;
186-
if (maxItems > 0)
187-
{
188-
closedMatches = SearchUtil.FindAll(closedTypes, search);
189-
if (closedMatches.Count >= maxItems) closedMatches = closedMatches.GetRange(0, maxItems);
190-
}
184+
openedNodes = CreateClassNodes(search, openedTypes, maxItems);
185+
maxItems -= openedTypes.Count;
186+
closedNodes = maxItems > 0 ? CreateClassNodes(search, SearchUtil.FindAll(closedTypes, search), maxItems) : new TreeNode[0];
191187
}
192-
else closedMatches = SearchUtil.FindAll(closedTypes, search);
193-
var hasOpenedMatches = openedMatches.Count > 0;
194-
var hasClosedMatches = closedMatches.Count > 0;
195-
if (hasOpenedMatches) nodes.AddRange(CreateNodes(openedMatches, search).ToArray());
196-
if (Settings.EnableItemSpacer && hasOpenedMatches && hasClosedMatches)
197-
nodes.Add(Settings.ItemSpacer);
198-
if (hasClosedMatches) nodes.AddRange(CreateNodes(closedMatches, search).ToArray());
199-
}
200-
201-
static void FillNodes(TreeNodeCollection nodes, ClassModel inClass, string search)
202-
{
203-
var inFile = inClass.InFile;
204-
var isHaxe = inFile.haXe;
205-
var items = SearchUtil.FindAll(inClass.Members.Items, search);
206-
foreach (var it in items)
188+
else
207189
{
208-
nodes.Add(NodeFactory.CreateTreeNode(inFile, isHaxe, it));
190+
openedNodes = CreateClassNodes(search, openedTypes);
191+
closedNodes = CreateClassNodes(search, SearchUtil.FindAll(closedTypes, search));
209192
}
193+
var hasOpenedMatches = openedNodes.Length > 0;
194+
var hasClosedMatches = closedNodes.Length > 0;
195+
if (hasOpenedMatches) nodes.AddRange(openedNodes);
196+
if (Settings.EnableItemSpacer && hasOpenedMatches && hasClosedMatches) nodes.Add(Settings.ItemSpacer);
197+
if (hasClosedMatches) nodes.AddRange(closedNodes);
210198
}
211199

212200
[NotNull]
213-
List<string> FilterTypes(List<string> list)
201+
static TreeNode[] CreateClassNodes([NotNull] string search, [NotNull] IEnumerable<string> sources)
214202
{
215-
if (CurrentFilter != null)
216-
{
217-
var flags = (FlagType) CurrentFilter.Tag;
218-
list.RemoveAll(it => (TypeToClassModel[it].Flags & flags) == 0);
219-
}
220-
return list;
203+
return sources
204+
.Select(it => TypeToClassModel[it])
205+
.SortModels(search)
206+
.Select(NodeFactory.CreateTreeNode)
207+
.ToArray();
221208
}
222209

223210
[NotNull]
224-
static IEnumerable<ClassNode> CreateNodes([NotNull] IEnumerable<string> matches, [NotNull] string search)
211+
static TreeNode[] CreateClassNodes([NotNull] string search, [NotNull] IEnumerable<string> sources, int count)
225212
{
226-
var nodes = matches.Select(CreateNode);
227-
return SortNodes(nodes, search);
213+
return sources
214+
.Select(it => TypeToClassModel[it])
215+
.SortModels(search)
216+
.Take(count)
217+
.Select(NodeFactory.CreateTreeNode)
218+
.ToArray();
228219
}
229220

230-
[NotNull]
231-
static ClassNode CreateNode([NotNull] string type)
221+
static void FillNodes([NotNull] TreeNodeCollection nodes, [NotNull] ClassModel inClass, [NotNull] string search)
232222
{
233-
var classModel = TypeToClassModel[type];
234-
return (ClassNode) NodeFactory.CreateTreeNode(classModel);
223+
var inFile = inClass.InFile;
224+
var isHaxe = inFile.haXe;
225+
var items = SearchUtil.FindAll(inClass.Members.Items, search);
226+
foreach (var it in items)
227+
{
228+
nodes.Add(NodeFactory.CreateTreeNode(inFile, isHaxe, it));
229+
}
235230
}
236231

237232
[NotNull]
238-
static IEnumerable<ClassNode> SortNodes([NotNull] IEnumerable<ClassNode> nodes, [NotNull] string search)
233+
List<string> FilterTypes([NotNull] List<string> list)
239234
{
240-
search = search.ToLower();
241-
var nodes0 = new List<ClassNode>();
242-
var nodes1 = new List<ClassNode>();
243-
var nodes2 = new List<ClassNode>();
244-
foreach (var node in nodes)
245-
{
246-
var name = node.Name.ToLower();
247-
if (name == search) nodes0.Add(node);
248-
else if (name.StartsWith(search)) nodes1.Add(node);
249-
else nodes2.Add(node);
250-
}
251-
nodes0.Sort(TypeExplorerNodeComparer.Package);
252-
nodes1.Sort(TypeExplorerNodeComparer.NameIgnoreCase);
253-
nodes2.Sort(TypeExplorerNodeComparer.NamePackageIgnoreCase);
254-
return nodes0.Concat(nodes1).Concat(nodes2);
235+
if (CurrentFilter == null) return list;
236+
var flags = (FlagType) CurrentFilter.Tag;
237+
list.RemoveAll(it => (TypeToClassModel[it].Flags & flags) == 0);
238+
return list;
255239
}
256240

257241
protected override void ShowContextMenu()
@@ -324,7 +308,7 @@ public void AddFilter(int imageIndex, FlagType flag, Keys shortcut, string enabl
324308
}
325309
}
326310

327-
void RefreshFilterTip(Button filter)
311+
void RefreshFilterTip([NotNull] Button filter)
328312
{
329313
var text = filter == CurrentFilter ? filterToDisabledTip[filter] : filterToEnabledTip[filter];
330314
if (filterToolTip == null) filterToolTip = new ToolTip();
@@ -548,4 +532,54 @@ void OnTimerTick(object sender, EventArgs e)
548532

549533
#endregion
550534
}
535+
536+
internal static class ListExtensions
537+
{
538+
static readonly List<ClassModel> Nodes0 = new List<ClassModel>();
539+
static readonly List<ClassModel> Nodes1 = new List<ClassModel>();
540+
static readonly List<ClassModel> Nodes2 = new List<ClassModel>();
541+
542+
public static List<ClassModel> SortModels(this IEnumerable<ClassModel> list, string search)
543+
{
544+
Nodes0.Clear();
545+
Nodes1.Clear();
546+
Nodes2.Clear();
547+
search = search.ToLower();
548+
foreach (var it in list)
549+
{
550+
var name = it.Name.ToLower();
551+
if (name == search) Nodes0.Add(it);
552+
else if (name.StartsWith(search)) Nodes1.Add(it);
553+
else Nodes2.Add(it);
554+
}
555+
Nodes0.Sort(ClassModelComparers.Package);
556+
Nodes1.Sort(ClassModelComparers.Name);
557+
Nodes2.Sort(ClassModelComparers.NamePackage);
558+
Nodes0.AddRange(Nodes1);
559+
Nodes0.AddRange(Nodes2);
560+
return Nodes0;
561+
}
562+
}
563+
564+
internal static class ClassModelComparers
565+
{
566+
internal static IComparer<ClassModel> Name = new NameComparer();
567+
internal static IComparer<ClassModel> Package = new PackageComparer();
568+
internal static IComparer<ClassModel> NamePackage = new NamePackageComparer();
569+
570+
public class NameComparer : IComparer<ClassModel>
571+
{
572+
public int Compare(ClassModel x, ClassModel y) => CaseSensitiveImportComparer.CompareImports(x.Name, y.Name);
573+
}
574+
575+
public class PackageComparer : IComparer<ClassModel>
576+
{
577+
public int Compare(ClassModel x, ClassModel y) => CaseSensitiveImportComparer.CompareImports(x.InFile.Package, y.InFile.Package);
578+
}
579+
580+
public class NamePackageComparer : IComparer<ClassModel>
581+
{
582+
public int Compare(ClassModel x, ClassModel y) => CaseSensitiveImportComparer.CompareImports(x.Name + "." + x.InFile.Package, y.Name + "." + y.InFile.Package);
583+
}
584+
}
551585
}

0 commit comments

Comments
 (0)