Skip to content

Commit ac93ee8

Browse files
committed
closes #369, fixes #370
1 parent 9899856 commit ac93ee8

File tree

7 files changed

+85
-47
lines changed

7 files changed

+85
-47
lines changed

RetailCoder.VBE/UI/CodeExplorer/CodeExplorerDockablePresenter.cs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ private void RenameSelection(object sender, TreeNodeNavigateCodeEventArgs e)
6060
if (handler != null)
6161
{
6262
handler(this, e);
63+
RefreshExplorerTreeView();
64+
e.Node.EnsureVisible();
6365
}
6466
}
6567

@@ -155,16 +157,17 @@ private void AddComponent(object sender, AddComponentEventArgs e)
155157

156158
private void NavigateExplorerTreeNode(object sender, TreeNodeNavigateCodeEventArgs e)
157159
{
158-
if (e.Selection.StartLine != 0)
160+
var declaration = e.Declaration;
161+
if (declaration != null)
159162
{
160-
//hack: get around issue where a node's selection seems to ignore a procedure's (or enum's) signature
161-
//todo: determiner if this "temp fix" is still needed.
162-
var selection = new Selection(e.Selection.StartLine,
163-
1,
164-
e.Selection.EndLine,
165-
e.Selection.EndColumn == 1 ? 0 : e.Selection.EndColumn //fixes off by one error when navigating the module
166-
);
167-
VBE.SetSelection(new QualifiedSelection(e.QualifiedName, selection));
163+
////hack: get around issue where a node's selection seems to ignore a procedure's (or enum's) signature
164+
////todo: determiner if this "temp fix" is still needed.
165+
//var selection = new Selection(e.Selection.StartLine,
166+
// 1,
167+
// e.Selection.EndLine,
168+
// e.Selection.EndColumn == 1 ? 0 : e.Selection.EndColumn //fixes off by one error when navigating the module
169+
// );
170+
VBE.SetSelection(new QualifiedSelection(declaration.QualifiedName.QualifiedModuleName, declaration.Selection));
168171
}
169172
}
170173

@@ -203,7 +206,6 @@ await Task.Run(() =>
203206

204207
private void AddProjectNodes(VBProject project, TreeNode root)
205208
{
206-
var treeView = Control.SolutionTree;
207209
Control.Invoke((MethodInvoker)async delegate
208210
{
209211
root.Text = project.Name;
@@ -302,15 +304,15 @@ private async Task<IEnumerable<TreeNode>> CreateModuleNodesAsync(VBProject proje
302304
var node = new TreeNode(component.Name);
303305
node.ImageKey = ComponentTypeIcons[component.Type];
304306
node.SelectedImageKey = node.ImageKey;
305-
node.Tag = new QualifiedSelection(componentParseResult.QualifiedName, componentParseResult.Context.GetSelection());
307+
node.Tag = parseResult.Declarations.Items.SingleOrDefault(item => item.IdentifierName == component.Name && item.Project == project);
306308

307309
foreach (var declaration in members)
308310
{
309311
var text = GetNodeText(declaration);
310312
var child = new TreeNode(text);
311313
child.ImageKey = GetImageKeyForDeclaration(declaration);
312314
child.SelectedImageKey = child.ImageKey;
313-
child.Tag = new QualifiedSelection(declaration.QualifiedName.QualifiedModuleName, declaration.Selection);
315+
child.Tag = declaration;
314316

315317
if (declaration.DeclarationType == DeclarationType.UserDefinedType
316318
|| declaration.DeclarationType == DeclarationType.Enumeration)
@@ -322,7 +324,7 @@ private async Task<IEnumerable<TreeNode>> CreateModuleNodesAsync(VBProject proje
322324
var subChild = new TreeNode(subMember.IdentifierName);
323325
subChild.ImageKey = GetImageKeyForDeclaration(subMember);
324326
subChild.SelectedImageKey = subChild.ImageKey;
325-
subChild.Tag = new QualifiedSelection(subMember.QualifiedName.QualifiedModuleName, subMember.Selection);
327+
subChild.Tag = subMember;
326328
child.Nodes.Add(subChild);
327329
}
328330
}

RetailCoder.VBE/UI/CodeExplorer/CodeExplorerWindow.cs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Microsoft.Vbe.Interop;
44
using Rubberduck.Parsing;
55
using Rubberduck.Parsing.Listeners;
6+
using Rubberduck.Parsing.Symbols;
67
using Rubberduck.Properties;
78

89
namespace Rubberduck.UI.CodeExplorer
@@ -57,12 +58,9 @@ public CodeExplorerWindow()
5758
private void RenameContextButtonClick(object sender, EventArgs e)
5859
{
5960
var handler = Rename;
60-
if (handler != null)
61+
if (handler != null && SolutionTree.SelectedNode != null)
6162
{
62-
var selection = SolutionTree.SelectedNode != null && SolutionTree.SelectedNode.Tag != null
63-
? (QualifiedSelection) SolutionTree.SelectedNode.Tag
64-
: default(QualifiedSelection);
65-
handler(this, new TreeNodeNavigateCodeEventArgs(SolutionTree.SelectedNode, selection));
63+
handler(this, new TreeNodeNavigateCodeEventArgs(SolutionTree.SelectedNode));
6664
}
6765
}
6866

@@ -153,11 +151,7 @@ private void SolutionTreeClick(object sender, EventArgs e)
153151
return;
154152
}
155153

156-
var selection = node == null || node.Tag == null
157-
? default(QualifiedSelection)
158-
: (QualifiedSelection) node.Tag;
159-
160-
handler(this, new TreeNodeNavigateCodeEventArgs(node, selection));
154+
handler(this, new TreeNodeNavigateCodeEventArgs(node));
161155
}
162156

163157
private bool CanDeleteNode(TreeNode node)
@@ -279,8 +273,7 @@ private void SolutionTreeNodeMouseDoubleClicked(object sender, TreeNodeMouseClic
279273

280274
if (e.Node.Tag != null)
281275
{
282-
var qualifiedSelection = (QualifiedSelection)e.Node.Tag;
283-
handler(this, new TreeNodeNavigateCodeEventArgs(e.Node, qualifiedSelection));
276+
handler(this, new TreeNodeNavigateCodeEventArgs(e.Node));
284277
}
285278
}
286279

RetailCoder.VBE/UI/CodeExplorer/TreeNodeNavigateCodeEventArgs.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Windows.Forms;
22
using Rubberduck.Parsing;
3+
using Rubberduck.Parsing.Symbols;
34

45
namespace Rubberduck.UI.CodeExplorer
56
{
@@ -8,6 +9,12 @@ public class TreeNodeNavigateCodeEventArgs : NavigateCodeEventArgs
89
private readonly TreeNode _node;
910
public TreeNode Node { get { return _node; } }
1011

12+
public TreeNodeNavigateCodeEventArgs(TreeNode node)
13+
: base(node.Tag as Declaration)
14+
{
15+
_node = node;
16+
}
17+
1118
public TreeNodeNavigateCodeEventArgs(TreeNode node, QualifiedSelection selection)
1219
: base(selection)
1320
{

RetailCoder.VBE/UI/NavigateCodeEventArgs.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
using System;
22
using Antlr4.Runtime;
3-
using Rubberduck.Extensions;
4-
using Rubberduck.Inspections;
53
using Rubberduck.Parsing;
6-
using Rubberduck.VBA;
4+
using Rubberduck.Parsing.Symbols;
75

86
namespace Rubberduck.UI
97
{
@@ -21,11 +19,26 @@ public NavigateCodeEventArgs(QualifiedModuleName qualifiedModuleName, Selection
2119
_selection = selection;
2220
}
2321

22+
public NavigateCodeEventArgs(Declaration declaration)
23+
{
24+
if (declaration == null)
25+
{
26+
return;
27+
}
28+
29+
_declaration = declaration;
30+
_qualifiedName = declaration.QualifiedName.QualifiedModuleName;
31+
_selection = declaration.Selection;
32+
}
33+
2434
public NavigateCodeEventArgs(QualifiedSelection qualifiedSelection)
2535
:this(qualifiedSelection.QualifiedName, qualifiedSelection.Selection)
2636
{
2737
}
2838

39+
private readonly Declaration _declaration;
40+
public Declaration Declaration { get { return _declaration; } }
41+
2942
private readonly QualifiedModuleName _qualifiedName;
3043
public QualifiedModuleName QualifiedName { get { return _qualifiedName; } }
3144

RetailCoder.VBE/UI/RefactorMenu.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,15 @@ public void Rename(QualifiedSelection selection)
117117
}
118118
}
119119

120+
public void Rename(Declaration target)
121+
{
122+
using (var view = new RenameDialog())
123+
{
124+
var presenter = new RenamePresenter(IDE, view, _parser.Parse(IDE.ActiveVBProject).Declarations, new QualifiedSelection(target.QualifiedName.QualifiedModuleName, target.Selection));
125+
presenter.Show(target);
126+
}
127+
}
128+
120129
private CommandBarButton AddMenuButton(CommandBarPopup menu)
121130
{
122131
return menu.Controls.Add(MsoControlType.msoControlButton) as CommandBarButton;

RetailCoder.VBE/UI/Refactorings/Rename/RenamePresenter.cs

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ public void Show()
3838
}
3939
}
4040

41+
public void Show(Declaration target)
42+
{
43+
PromptIfTargetImplementsInterface(ref target);
44+
_view.Target = target;
45+
_view.ShowDialog();
46+
}
47+
4148
private static readonly DeclarationType[] ModuleDeclarationTypes =
4249
{
4350
DeclarationType.Class,
@@ -165,24 +172,8 @@ private void AcquireTarget(QualifiedSelection selection)
165172
.FirstOrDefault(item => IsSelectedDeclaration(selection, item)
166173
|| IsSelectedReference(selection, item));
167174

168-
var interfaceImplementation = _declarations.FindInterfaceImplementationMembers().SingleOrDefault(m => m.Equals(target));
169-
if (target != null && interfaceImplementation != null)
170-
{
171-
var interfaceMember = _declarations.FindInterfaceMember(interfaceImplementation);
172-
var message = string.Format(RubberduckUI.RenamePresenter_TargetIsInterfaceMemberImplementation, target.IdentifierName, interfaceMember.ComponentName, interfaceMember.IdentifierName);
173-
var confirm = MessageBox.Show(message, RubberduckUI.RenameDialog_TitleText, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);
174-
if (confirm == DialogResult.No)
175-
{
176-
_view.Target = null;
177-
return;
178-
}
179-
180-
_view.Target = interfaceMember;
181-
}
182-
else
183-
{
184-
_view.Target = target;
185-
}
175+
PromptIfTargetImplementsInterface(ref target);
176+
_view.Target = target;
186177

187178
if (_view.Target == null)
188179
{
@@ -201,6 +192,28 @@ private void AcquireTarget(QualifiedSelection selection)
201192
}
202193
}
203194

195+
private void PromptIfTargetImplementsInterface(ref Declaration target)
196+
{
197+
var declaration = target;
198+
var interfaceImplementation = _declarations.FindInterfaceImplementationMembers().SingleOrDefault(m => m.Equals(declaration));
199+
if (target == null || interfaceImplementation == null)
200+
{
201+
return;
202+
}
203+
204+
var interfaceMember = _declarations.FindInterfaceMember(interfaceImplementation);
205+
var message = string.Format(RubberduckUI.RenamePresenter_TargetIsInterfaceMemberImplementation, target.IdentifierName, interfaceMember.ComponentName, interfaceMember.IdentifierName);
206+
207+
var confirm = MessageBox.Show(message, RubberduckUI.RenameDialog_TitleText, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);
208+
if (confirm == DialogResult.No)
209+
{
210+
target = null;
211+
return;
212+
}
213+
214+
target = interfaceMember;
215+
}
216+
204217
private bool IsSelectedReference(QualifiedSelection selection, Declaration declaration)
205218
{
206219
return declaration.References.Any(r => r.Selection.ContainsFirstCharacter(selection.Selection));

RetailCoder.VBE/UI/RubberduckMenu.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Rubberduck.Config;
66
using Rubberduck.Inspections;
77
using Rubberduck.Parsing;
8+
using Rubberduck.Parsing.Symbols;
89
using Rubberduck.UI.CodeExplorer;
910
using Rubberduck.UI.CodeInspections;
1011
using Rubberduck.UI.Settings;
@@ -65,7 +66,7 @@ public RubberduckMenu(VBE vbe, AddIn addIn, IConfigurationService configService,
6566

6667
private void codePresenter_Rename(object sender, TreeNodeNavigateCodeEventArgs e)
6768
{
68-
_refactorMenu.Rename(new QualifiedSelection(e.QualifiedName, e.Selection));
69+
_refactorMenu.Rename(e.Node.Tag as Declaration);
6970
}
7071

7172
private void codePresenter_RunInspections(object sender, EventArgs e)

0 commit comments

Comments
 (0)