Skip to content

Commit 235b8dd

Browse files
author
SlavaRa
authored
Merge pull request #143 from SlavaRa/feature/142
Goto previous|next member as IDEA
2 parents 00063c7 + d7561bf commit 235b8dd

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

QuickNavigate/Helpers/FormHelper.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,15 @@ where fileNames.Contains(fileName)
7676
return result;
7777
}
7878

79+
public static void Navigate([NotNull] MemberModel member)
80+
{
81+
string tag;
82+
if (member is ClassModel) tag = "class";
83+
else if ((member.Flags & FlagType.Import) > 0) tag = "import";
84+
else tag = $"{member.Name}@{member.LineFrom}";
85+
Navigate(new TreeNode(member.Name) {Tag = tag});
86+
}
87+
7988
public static void Navigate([NotNull] string fileName, [NotNull] TreeNode node)
8089
{
8190
ModelsExplorer.Instance.OpenFile(fileName);
@@ -124,6 +133,8 @@ class ShortcutId
124133
public const string ClassHierarchy = "QuickNavigate.ClassHierarchy";
125134
public const string RecentFiles = "QuickNavigate.RecentFiles";
126135
public const string RecentProjects = "QuickNavigate.RecentProjects";
136+
public const string GotoNextMember = "QuickNavigate.GotoNextMember";
137+
public const string GotoPreviousMember = "QuickNavigate.GotoPreviousMember";
127138
}
128139

129140
class QuickContextMenuItem

QuickNavigate/PluginMain.cs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.ComponentModel;
34
using System.Diagnostics;
45
using System.IO;
6+
using System.Linq;
57
using System.Windows.Forms;
68
using ASCompletion;
79
using ASCompletion.Completion;
@@ -16,6 +18,7 @@
1618
using ProjectManager.Projects;
1719
using QuickNavigate.Forms;
1820
using QuickNavigate.Helpers;
21+
using ScintillaNet;
1922

2023
namespace QuickNavigate
2124
{
@@ -119,6 +122,13 @@ public void HandleEvent(object sender, NotifyEvent e, HandlingPriority priority)
119122
#endregion
120123
}
121124
break;
125+
case EventType.Keys:
126+
var ke = e as KeyEvent;
127+
if (ke.Value == PluginBase.MainForm.GetShortcutItemKeys(ShortcutId.GotoPreviousMember))
128+
GotoPreviousMember();
129+
else if (ke.Value == PluginBase.MainForm.GetShortcutItemKeys(ShortcutId.GotoNextMember))
130+
GotoNextMember();
131+
break;
122132
}
123133
}
124134

@@ -151,7 +161,7 @@ void LoadSettings()
151161
/// </summary>
152162
void AddEventHandlers()
153163
{
154-
EventManager.AddEventHandler(this, EventType.UIStarted | EventType.FileSwitch | EventType.Command);
164+
EventManager.AddEventHandler(this, EventType.UIStarted | EventType.FileSwitch | EventType.Command | EventType.Keys);
155165
QuickContextMenuItem.SetDocumentClassMenuItem.Click += OnSetDocumentClassMenuClick;
156166
QuickContextMenuItem.GotoPositionOrLineMenuItem.Click += OnGotoPositionOrLineMenuClick;
157167
QuickContextMenuItem.ShowInQuickOutlineMenuItem.Click += OnShowInQuickOutlineMenuClick;
@@ -186,6 +196,8 @@ void CreateMenuItems()
186196
item = new ToolStripMenuItem("Recent Projects", PluginBase.MainForm.FindImage("274"), ShowRecentProjets);
187197
PluginBase.MainForm.RegisterShortcutItem(ShortcutId.RecentProjects, item);
188198
menu.DropDownItems.Add(item);
199+
PluginBase.MainForm.RegisterShortcutItem(ShortcutId.GotoNextMember, Keys.None);
200+
PluginBase.MainForm.RegisterShortcutItem(ShortcutId.GotoPreviousMember, Keys.None);
189201
}
190202

191203
/// <summary>
@@ -344,11 +356,43 @@ static void ShowInFileExplorer([NotNull] Form sender, [NotNull] MemberModel mode
344356
}));
345357
}
346358

359+
static void GotoPreviousMember()
360+
{
361+
var members = GetCurrentFileMembers();
362+
if (members.Count == 0) return;
363+
members.Reverse();
364+
var line = ASContext.Context.CurrentLine;
365+
var target = members.FirstOrDefault(member => member.LineFrom < line);
366+
if (target != null) FormHelper.Navigate(target);
367+
}
368+
369+
static void GotoNextMember()
370+
{
371+
var members = GetCurrentFileMembers();
372+
if (members.Count == 0) return;
373+
var line = ASContext.Context.CurrentLine;
374+
var target = members.FirstOrDefault(member => member.LineFrom > line);
375+
if (target != null) FormHelper.Navigate(target);
376+
}
377+
378+
[NotNull, ItemNotNull]
379+
static List<MemberModel> GetCurrentFileMembers()
380+
{
381+
var file = ASContext.Context.CurrentModel;
382+
var result = new List<MemberModel>(file.Members.Items);
383+
foreach (var it in file.Classes)
384+
{
385+
result.Add(it);
386+
result.AddRange(it.Members.Items);
387+
}
388+
return result;
389+
}
390+
347391
#endregion
348392

349393
static void SetDocumentClass([NotNull] MemberModel model)
350394
{
351-
var project = (Project) PluginBase.CurrentProject;
395+
var project = (Project)PluginBase.CurrentProject;
352396
project.SetDocumentClass(model.InFile.FileName, true);
353397
project.Save();
354398
var ui = FormHelper.GetProjectManagerPluginUI();

0 commit comments

Comments
 (0)