Skip to content

Commit 1a53373

Browse files
author
SlavaRa
authored
Merge pull request #149 from SlavaRa/develop
Ignore case in Outline Mode for Type Explorer
2 parents e3b3f3e + 22cc5ef commit 1a53373

File tree

11 files changed

+140
-136
lines changed

11 files changed

+140
-136
lines changed

QuickNavigate.Tests/Collections/ComparersTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ public void TestSortNameAndPackage0()
4040
"a.Sprite",
4141
"b.Sprite"
4242
});
43-
List<TypeNode> nodes = matches.Select(match => new TypeNode(new ClassModel() {InFile = FileModel.Ignore}, 0)
43+
var nodes = matches.Select(match => new ClassNode(new ClassModel {InFile = FileModel.Ignore}, 0)
4444
{
4545
Package = match.Substring(0, match.LastIndexOf(".")),
4646
Name = match.Substring(match.LastIndexOf(".") + 1)
4747
}).ToList();
48-
List<TypeNode> nodes0 = nodes.Where(node => node.Name.ToLower() == "sprite").ToList();
49-
List<TypeNode> nodes1 = nodes.Where(node => node.Name.ToLower() != "sprite" && node.Name.ToLower().StartsWith("sprite")).ToList();
50-
List<TypeNode> nodes2 = nodes.Where(node => node.Name.ToLower() != "sprite" && !node.Name.ToLower().StartsWith("sprite")).ToList();
48+
var nodes0 = nodes.Where(node => node.Name.ToLower() == "sprite").ToList();
49+
var nodes1 = nodes.Where(node => node.Name.ToLower() != "sprite" && node.Name.ToLower().StartsWith("sprite")).ToList();
50+
var nodes2 = nodes.Where(node => node.Name.ToLower() != "sprite" && !node.Name.ToLower().StartsWith("sprite")).ToList();
5151
nodes0.Sort(TypeExplorerNodeComparer.Package);
5252
Assert.AreEqual("Sprite", nodes0[0].Name);
5353
Assert.AreEqual("a", nodes0[0].Package);

QuickNavigate.Tests/Forms/TypeExplorerTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public void TestNewTypeNode()
1919
},
2020
Name = "TestClass"
2121
};
22-
TypeNode node = new TypeNode(model, 0);
22+
ClassNode node = new ClassNode(model, 0);
2323
Assert.AreEqual(model, node.Model);
2424
Assert.IsFalse(node.IsPrivate);
2525
Assert.IsNull(node.Module);
@@ -39,7 +39,7 @@ public void TestNewTypeNodeWithClassFromSWC()
3939
},
4040
Name = "DisplayObject"
4141
};
42-
TypeNode node = new TypeNode(model, 0);
42+
ClassNode node = new ClassNode(model, 0);
4343
Assert.AreEqual("playerglobal.swc", node.Module);
4444
Assert.AreEqual("DisplayObject", node.Text);
4545
Assert.AreEqual("flash.display", node.In);
@@ -58,7 +58,7 @@ public void TestNewTypeNodeWithPrivateClass()
5858
Name = "TestClass2",
5959
Access = Visibility.Private
6060
};
61-
TypeNode node = new TypeNode(model, 0);
61+
ClassNode node = new ClassNode(model, 0);
6262
Assert.IsTrue(node.IsPrivate);
6363
Assert.AreEqual("TestClass2", node.Text);
6464
Assert.AreEqual("test.TestClass", node.In);

QuickNavigate.Tests/QuickNavigate.Tests.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
<AppDesignerFolder>Properties</AppDesignerFolder>
99
<RootNamespace>QuickNavigate.Tests</RootNamespace>
1010
<AssemblyName>QuickNavigate.Tests</AssemblyName>
11-
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
11+
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
1212
<FileAlignment>512</FileAlignment>
1313
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
1414
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
1515
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
1616
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
1717
<IsCodedUITest>False</IsCodedUITest>
1818
<TestProjectType>UnitTest</TestProjectType>
19+
<TargetFrameworkProfile />
1920
</PropertyGroup>
2021
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
2122
<DebugSymbols>true</DebugSymbols>

QuickNavigate/Collections/Comparers.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace QuickNavigate.Collections
66
{
7-
public class NodeNameComparer : IComparer<TypeNode>
7+
public class NodeNameComparer : IComparer<ClassNode>
88
{
99
/// <summary>
1010
/// Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other.
@@ -14,13 +14,13 @@ public class NodeNameComparer : IComparer<TypeNode>
1414
/// Value Condition Less than zero<paramref name="x"/> is less than <paramref name="y"/>.Zero<paramref name="x"/> equals <paramref name="y"/>.Greater than zero<paramref name="x"/> is greater than <paramref name="y"/>.
1515
/// </returns>
1616
/// <param name="x">The first object to compare.</param><param name="y">The second object to compare.</param>
17-
public int Compare(TypeNode x, TypeNode y)
17+
public int Compare(ClassNode x, ClassNode y)
1818
{
1919
return StringComparer.Ordinal.Compare(x.Name.ToLower(), y.Name.ToLower());
2020
}
2121
}
2222

23-
public class NodePackageComparer : IComparer<TypeNode>
23+
public class NodePackageComparer : IComparer<ClassNode>
2424
{
2525
/// <summary>
2626
/// Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other.
@@ -30,15 +30,15 @@ public class NodePackageComparer : IComparer<TypeNode>
3030
/// Value Condition Less than zero<paramref name="x"/> is less than <paramref name="y"/>.Zero<paramref name="x"/> equals <paramref name="y"/>.Greater than zero<paramref name="x"/> is greater than <paramref name="y"/>.
3131
/// </returns>
3232
/// <param name="x">The first object to compare.</param><param name="y">The second object to compare.</param>
33-
public int Compare(TypeNode x, TypeNode y)
33+
public int Compare(ClassNode x, ClassNode y)
3434
{
3535
return x.Package.Length == y.Package.Length
3636
? StringComparer.Ordinal.Compare(x.Package, y.Package)
3737
: x.Package.Length.CompareTo(y.Package.Length);
3838
}
3939
}
4040

41-
public class NodeNamePackageComparer : IComparer<TypeNode>
41+
public class NodeNamePackageComparer : IComparer<ClassNode>
4242
{
4343
/// <summary>
4444
/// Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other.
@@ -48,7 +48,7 @@ public class NodeNamePackageComparer : IComparer<TypeNode>
4848
/// Value Condition Less than zero<paramref name="x"/> is less than <paramref name="y"/>.Zero<paramref name="x"/> equals <paramref name="y"/>.Greater than zero<paramref name="x"/> is greater than <paramref name="y"/>.
4949
/// </returns>
5050
/// <param name="x">The first object to compare.</param><param name="y">The second object to compare.</param>
51-
public int Compare(TypeNode x, TypeNode y) => StringComparer.OrdinalIgnoreCase.Compare($"{x.Name}{x.Package}", $"{y.Name}{y.Package}");
51+
public int Compare(ClassNode x, ClassNode y) => StringComparer.OrdinalIgnoreCase.Compare($"{x.Name}{x.Package}", $"{y.Name}{y.Package}");
5252
}
5353

5454
public static class TypeExplorerNodeComparer

QuickNavigate/Forms/ClassHierarchyForm.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ protected override void ShowContextMenu()
195195
protected override void ShowContextMenu(Point position)
196196
{
197197
if (SelectedNode == null) return;
198-
var classModel = ((TypeNode) SelectedNode).Model;
198+
var classModel = ((ClassNode) SelectedNode).Model;
199199
ContextMenuStrip.Items.Clear();
200200
ContextMenuStrip.Items.Add(QuickContextMenuItem.GotoPositionOrLineMenuItem);
201201
ContextMenuStrip.Items.Add(QuickContextMenuItem.ShowInQuickOutlineMenuItem);
@@ -251,7 +251,7 @@ protected override void OnKeyDown(KeyEventArgs e)
251251

252252
protected override void OnTreeNodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
253253
{
254-
var node = e.Node as TypeNode;
254+
var node = e.Node as ClassNode;
255255
if (node == null) return;
256256
tree.SelectedNode = node;
257257
base.OnTreeNodeMouseClick(sender, e);

QuickNavigate/Forms/Nodes.cs

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,83 @@
11
using System.IO;
22
using System.Text.RegularExpressions;
33
using System.Windows.Forms;
4+
using ASCompletion;
45
using ASCompletion.Model;
56
using JetBrains.Annotations;
67

78
namespace QuickNavigate.Forms
89
{
9-
public class TypeNode : TreeNode
10+
public class NodeFactory
11+
{
12+
public static TreeNode CreateTreeNode(FileModel inFile, bool isHaxe, MemberModel it)
13+
{
14+
var flags = it.Flags;
15+
var icon = PluginUI.GetIcon(flags, it.Access);
16+
var constrDecl = isHaxe && (flags & FlagType.Constructor) > 0 ? "new" : it.FullName;
17+
var node = new MemberNode(it.ToString(), icon, icon)
18+
{
19+
InFile = inFile,
20+
Tag = $"{constrDecl}@{it.LineFrom}"
21+
};
22+
return node;
23+
}
24+
25+
public static TreeNode CreateTreeNode(ClassModel classModel)
26+
{
27+
return new ClassNode(classModel, PluginUI.GetIcon(classModel.Flags, classModel.Access));
28+
}
29+
}
30+
31+
public class MemberNode : TreeNode
32+
{
33+
public FileModel InFile;
34+
35+
public MemberNode(string text, int imageIndex, int selectedImageIndex) : base(text, imageIndex, selectedImageIndex)
36+
{
37+
}
38+
}
39+
40+
public class ClassNode : TreeNode
1041
{
1142
public ClassModel Model;
43+
public FileModel InFile;
1244
public new string Name;
1345
public string In;
1446
public string NameInLowercase;
1547
public string Package;
1648
public string Module;
1749
public bool IsPrivate;
1850

19-
public TypeNode([NotNull] ClassModel model, int icon) : this(model, icon, icon)
51+
public ClassNode([NotNull] ClassModel model, int icon) : this(model, icon, icon)
2052
{
2153
}
2254

23-
public TypeNode([NotNull] ClassModel model, int imageIndex, int selectedImageIndex)
55+
public ClassNode([NotNull] ClassModel model, int imageIndex, int selectedImageIndex)
2456
{
2557
Model = model;
2658
Name = model.Name;
27-
var inFile = model.InFile;
28-
Package = inFile != null ? inFile.Package : string.Empty;
59+
InFile = model.InFile;
60+
Package = InFile != null ? InFile.Package : string.Empty;
2961
IsPrivate = (model.Access & Visibility.Private) > 0;
3062
Text = Name;
3163
Tag = "class";
3264
In = Package;
3365
if (!string.IsNullOrEmpty(Package))
3466
{
35-
if (IsPrivate) In = $"{Package}.{Path.GetFileNameWithoutExtension(inFile.FileName)}";
67+
if (IsPrivate) In = $"{Package}.{Path.GetFileNameWithoutExtension(InFile.FileName)}";
3668
}
37-
else if (IsPrivate) In = Path.GetFileNameWithoutExtension(inFile.FileName);
69+
else if (IsPrivate) In = Path.GetFileNameWithoutExtension(InFile.FileName);
3870
ImageIndex = imageIndex;
3971
SelectedImageIndex = selectedImageIndex;
40-
if (inFile == null) return;
41-
var match = Regex.Match(inFile.FileName, @"\S*.swc", RegexOptions.Compiled);
72+
if (InFile == null) return;
73+
var match = Regex.Match(InFile.FileName, @"\S*.swc", RegexOptions.Compiled);
4274
if (match.Success) Module = Path.GetFileName(match.Value);
4375
}
4476
}
4577

46-
public class MemberNode : TreeNode
47-
{
48-
public FileModel InFile;
49-
50-
public MemberNode(string text, int imageIndex, int selectedImageIndex) : base(text, imageIndex, selectedImageIndex)
51-
{
52-
}
53-
}
54-
55-
class ClassHierarchyNode : TypeNode
78+
class ClassHierarchyNode : ClassNode
5679
{
57-
public ClassHierarchyNode(ClassModel model, int imageIndex, int selectedImageIndex)
80+
public ClassHierarchyNode([NotNull] ClassModel model, int imageIndex, int selectedImageIndex)
5881
: base(model, imageIndex, selectedImageIndex)
5982
{
6083
Text = model.Type;

QuickNavigate/Forms/QuickOutlineForm.cs

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Drawing;
44
using System.Linq;
55
using System.Windows.Forms;
6-
using ASCompletion;
76
using ASCompletion.Context;
87
using ASCompletion.Model;
98
using JetBrains.Annotations;
@@ -101,86 +100,84 @@ void RefreshTree()
101100
{
102101
tree.BeginUpdate();
103102
tree.Nodes.Clear();
104-
FillTree();
103+
FillTree(input.Text.Trim());
105104
tree.ExpandAll();
106105
tree.EndUpdate();
107106
}
108107

109-
void FillTree()
108+
void FillTree(string search)
110109
{
111110
var isHaxe = InFile.haXe;
112-
if (InFile.Members.Count > 0) AddMembers(tree.Nodes, InFile.Members, isHaxe);
113-
foreach (var aClass in InFile.Classes)
111+
if (InFile.Members.Count > 0) FillNodes(tree.Nodes, InFile, InFile.Members, isHaxe, search);
112+
foreach (var classModel in InFile.Classes)
114113
{
115-
var icon = PluginUI.GetIcon(aClass.Flags, aClass.Access);
116-
TreeNode node = new TypeNode(aClass, icon);
114+
var node = NodeFactory.CreateTreeNode(classModel);
117115
tree.Nodes.Add(node);
118-
AddMembers(node.Nodes, aClass.Members, isHaxe, aClass.Equals(InClass));
116+
FillNodes(node.Nodes, InFile, classModel.Members, isHaxe, classModel.Equals(InClass), search);
119117
}
120118
if (SelectedNode != null || tree.Nodes.Count == 0) return;
121-
var search = input.Text.Trim();
122119
if (search.Length == 0)
123120
{
124-
if (InClass.Equals(ClassModel.VoidClass)) tree.SelectedNode = tree.Nodes[0];
125-
else tree.SelectedNode = tree.Nodes.OfType<TypeNode>().FirstOrDefault(it => it.Model.Equals(InClass));
121+
if (InClass.Equals(ClassModel.VoidClass)) tree.SelectedNode = tree.TopNode;
122+
else tree.SelectedNode = tree.Nodes.OfType<ClassNode>().FirstOrDefault(it => it.Model.Equals(InClass));
126123
}
127124
else
128125
{
129-
var nodes = tree.Nodes.OfType<TreeNode>().ToList().FindAll(it =>
126+
var nodes = tree.Nodes.OfType<ClassNode>().ToList().FindAll(it =>
130127
{
131-
var word = ((TypeNode) it).Model.QualifiedName;
128+
var word = it.Model.QualifiedName;
132129
var score = PluginCore.Controls.CompletionList.SmartMatch(word, search, search.Length);
133130
return score > 0 && score < 6;
134131
});
135132
tree.Nodes.Clear();
136133
if (nodes.Count == 0) return;
137134
tree.Nodes.AddRange(nodes.ToArray());
138-
tree.SelectedNode = tree.Nodes[0];
135+
tree.SelectedNode = tree.TopNode;
139136
}
140137
}
141138

142-
void AddMembers(TreeNodeCollection nodes, MemberList members, bool isHaxe)
139+
void FillNodes(TreeNodeCollection nodes, FileModel inFile, MemberList members, bool isHaxe, string search)
143140
{
144-
AddMembers(nodes, members, isHaxe, true);
141+
FillNodes(nodes, inFile, members, isHaxe, true, search);
145142
}
146143

147-
void AddMembers(TreeNodeCollection nodes, MemberList members, bool isHaxe, bool currentClass)
144+
void FillNodes(TreeNodeCollection nodes, FileModel inFile, MemberList members, bool isHaxe, bool currentClass, string search)
148145
{
149-
var items = members.Items.ToList();
150-
if (CurrentFilter != null)
151-
{
152-
var flags = (FlagType) CurrentFilter.Tag;
153-
items.RemoveAll(it => (it.Flags & flags) == 0);
154-
}
155-
var search = input.Text.Trim();
156-
var searchIsNotEmpty = search.Length > 0;
157-
if (searchIsNotEmpty) items = SearchUtil.FindAll(items, search);
146+
var items = FilterTypes(members.Items.ToList());
147+
items = SearchUtil.FindAll(items, search);
158148
foreach (var it in items)
159149
{
160-
var flags = it.Flags;
161-
var icon = PluginUI.GetIcon(flags, it.Access);
162-
var constrDecl = isHaxe && (flags & FlagType.Constructor) > 0 ? "new" : it.FullName;
163-
var node = new TreeNode(it.ToString(), icon, icon) {Tag = $"{constrDecl}@{it.LineFrom}"};
164-
nodes.Add(node);
150+
nodes.Add(NodeFactory.CreateTreeNode(inFile, isHaxe, it));
165151
}
166-
if ((searchIsNotEmpty && SelectedNode == null || currentClass) && nodes.Count > 0)
152+
if ((search.Length > 0 && SelectedNode == null || currentClass) && nodes.Count > 0)
167153
tree.SelectedNode = nodes[0];
168154
}
169155

156+
[NotNull]
157+
List<MemberModel> FilterTypes(List<MemberModel> list)
158+
{
159+
if (CurrentFilter != null)
160+
{
161+
var flags = (FlagType) CurrentFilter.Tag;
162+
list.RemoveAll(it => (it.Flags & flags) == 0);
163+
}
164+
return list;
165+
}
166+
170167
protected override void Navigate()
171168
{
172169
if (SelectedNode != null) DialogResult = DialogResult.OK;
173170
}
174171

175172
protected override void ShowContextMenu()
176173
{
177-
if (!(SelectedNode is TypeNode)) return;
174+
if (!(SelectedNode is ClassNode)) return;
178175
ShowContextMenu(new Point(SelectedNode.Bounds.X, SelectedNode.Bounds.Bottom));
179176
}
180177

181178
protected override void ShowContextMenu(Point position)
182179
{
183-
if (!(SelectedNode is TypeNode)) return;
180+
if (!(SelectedNode is ClassNode)) return;
184181
contextMenu.Items.Clear();
185182
contextMenu.Items.Add(QuickContextMenuItem.ShowInClassHierarchyMenuItem);
186183
contextMenu.Show(tree, position);
@@ -337,7 +334,7 @@ void OnInputKeyDown(object sender, KeyEventArgs e)
337334
protected override void OnTreeNodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
338335
{
339336
if (e.Button != MouseButtons.Right) return;
340-
TreeNode node = e.Node as TypeNode;
337+
TreeNode node = e.Node as ClassNode;
341338
if (node == null || (string) node.Tag != "class") return;
342339
tree.SelectedNode = node;
343340
ShowContextMenu(new Point(e.Location.X, node.Bounds.Bottom));
@@ -364,7 +361,7 @@ void OnTreeDrawNode(object sender, DrawTreeNodeEventArgs e)
364361
graphics.FillRectangle(new SolidBrush(fillBrush), x, bounds.Y, itemWidth, tree.ItemHeight);
365362
var text = e.Node.Text;
366363
graphics.DrawString(text, font, new SolidBrush(textBrush), bounds.Left, bounds.Top, StringFormat.GenericDefault);
367-
var node = e.Node as TypeNode;
364+
var node = e.Node as ClassNode;
368365
if (node == null) return;
369366
if (!string.IsNullOrEmpty(node.In))
370367
{

0 commit comments

Comments
 (0)