Skip to content

Commit b440188

Browse files
committed
Closes #3260
1 parent 02c5750 commit b440188

File tree

12 files changed

+392
-5
lines changed

12 files changed

+392
-5
lines changed

RetailCoder.VBE/Root/RubberduckModule.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,8 @@ private IEnumerable<IMenuItem> GetFormDesignerContextMenuItems()
535535
{
536536
return new IMenuItem[]
537537
{
538-
KernelInstance.Get<FormDesignerRefactorRenameCommandMenuItem>()
538+
KernelInstance.Get<FormDesignerRefactorRenameCommandMenuItem>(),
539+
KernelInstance.Get<FormDesignerFindAllReferencesCommandMenuItem>()
539540
};
540541
}
541542

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,9 @@
472472
<Compile Include="UI\CodeExplorer\Commands\AddClassModuleCommand.cs" />
473473
<Compile Include="UI\CodeExplorer\Commands\AddStdModuleCommand.cs" />
474474
<Compile Include="UI\CodeExplorer\Commands\AddTestModuleCommand.cs" />
475+
<Compile Include="UI\Command\FormDesignerFindAllReferencesCommand.cs" />
475476
<Compile Include="UI\Command\IndentCurrentProjectCommand.cs" />
477+
<Compile Include="UI\Command\MenuItems\FormDesignerFindAllReferencesCommandMenuItem.cs" />
476478
<Compile Include="UI\Command\MenuItems\IndentCurrentProjectCommandMenuItem.cs" />
477479
<Compile Include="UI\EnvironmentProvider.cs" />
478480
<Compile Include="UI\ModernFolderBrowser.cs" />

RetailCoder.VBE/UI/Command/FindAllReferencesCommand.cs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,13 @@ private void UpdateTab()
8787

8888
protected override bool CanExecuteImpl(object parameter)
8989
{
90-
if (_vbe.ActiveCodePane == null || _state.Status != ParserState.Ready)
90+
if (_state.Status != ParserState.Ready ||
91+
(_vbe.ActiveCodePane == null
92+
&& (_vbe.SelectedVBComponent == null || !_vbe.SelectedVBComponent.HasDesigner)))
9193
{
9294
return false;
9395
}
94-
96+
9597
var target = FindTarget(parameter);
9698
var canExecute = target != null;
9799

@@ -153,6 +155,14 @@ private SearchResultsViewModel CreateViewModel(Declaration declaration)
153155
}
154156

155157
private Declaration FindTarget(object parameter)
158+
{
159+
var component = _vbe.SelectedVBComponent;
160+
return (component != null && component.HasDesigner)
161+
? FindFormTarget()
162+
: FindCodeTarget(parameter);
163+
}
164+
165+
private Declaration FindCodeTarget(object parameter)
156166
{
157167
var declaration = parameter as Declaration;
158168
if (declaration != null)
@@ -163,6 +173,30 @@ private Declaration FindTarget(object parameter)
163173
return _state.FindSelectedDeclaration(_vbe.ActiveCodePane);
164174
}
165175

176+
private Declaration FindFormTarget()
177+
{
178+
var project = _vbe.ActiveVBProject;
179+
var component = _vbe.SelectedVBComponent;
180+
181+
if (component != null && _vbe.SelectedVBComponent.HasDesigner)
182+
{
183+
var designer = ((dynamic)component.Target).Designer;
184+
var selectedCount = (int)designer.Selected.Count;
185+
186+
if (selectedCount > 1) { return null; }
187+
188+
var selectedType = selectedCount == 0 ? DeclarationType.ClassModule : DeclarationType.Control;
189+
string selectedName = selectedCount == 0 ? component.Name : designer.Selected[0].Name;
190+
191+
return _state.DeclarationFinder.MatchName(selectedName)
192+
.First(m => m.ProjectId == project.HelpFile
193+
&& m.DeclarationType.HasFlag(selectedType)
194+
&& m.ComponentName == component.Name);
195+
}
196+
return null;
197+
}
198+
199+
166200
public void Dispose()
167201
{
168202
if (_state != null)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System.Runtime.InteropServices;
2+
using NLog;
3+
using Rubberduck.Parsing.VBA;
4+
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
5+
6+
namespace Rubberduck.UI.Command
7+
{
8+
/// <summary>
9+
/// A command that locates all references to the active form designer component.
10+
/// </summary>
11+
[ComVisible(false)]
12+
public class FormDesignerFindAllReferencesCommand : CommandBase
13+
{
14+
private readonly FindAllReferencesCommand _findAllReferences;
15+
16+
public FormDesignerFindAllReferencesCommand(FindAllReferencesCommand findAllReferences)
17+
: base(LogManager.GetCurrentClassLogger())
18+
{
19+
_findAllReferences = findAllReferences;
20+
}
21+
22+
protected override bool CanExecuteImpl(object parameter)
23+
{
24+
return _findAllReferences.CanExecute(parameter);
25+
}
26+
27+
protected override void ExecuteImpl(object parameter)
28+
{
29+
_findAllReferences.Execute(parameter);
30+
}
31+
}
32+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using Rubberduck.Parsing.VBA;
2+
using Rubberduck.UI.Command.MenuItems.ParentMenus;
3+
4+
namespace Rubberduck.UI.Command.MenuItems
5+
{
6+
public class FormDesignerFindAllReferencesCommandMenuItem : CommandMenuItemBase
7+
{
8+
public FormDesignerFindAllReferencesCommandMenuItem(CommandBase command)
9+
: base(command)
10+
{
11+
}
12+
13+
public override bool BeginGroup { get { return true; } }
14+
public override string Key { get { return "ContextMenu_FindAllReferences"; } }
15+
public override int DisplayOrder { get { return (int)NavigationMenuItemDisplayOrder.FindAllReferences; } }
16+
17+
public override bool EvaluateCanExecute(RubberduckParserState state)
18+
{
19+
return state != null && Command.CanExecute(null);
20+
}
21+
}
22+
}

RetailCoder.VBE/UI/SelectionChangeService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ private void DispatchSelectedDesignerDeclaration(IVBComponent component)
123123
return;
124124
}
125125
var form =
126-
_parser.State.DeclarationFinder.UserDeclarations(DeclarationType.UserForm).SingleOrDefault(decl =>
126+
_parser.State.DeclarationFinder.UserDeclarations(DeclarationType.ClassModule).SingleOrDefault(decl =>
127127
decl.IdentifierName.Equals(component.Name) &&
128128
decl.ProjectId.Equals(component.ParentProject.ProjectId));
129129

@@ -166,7 +166,7 @@ private void DispatchSelectedProjectNodeDeclaration(IVBComponent component)
166166
private bool DeclarationChanged(Declaration current)
167167
{
168168
if ((_lastSelectedDeclaration == null && current == null) ||
169-
((_lastSelectedDeclaration != null && current != null) && !_lastSelectedDeclaration.Equals(current)))
169+
((_lastSelectedDeclaration != null && current != null) && _lastSelectedDeclaration.Equals(current)))
170170
{
171171
return false;
172172
}

Rubberduck.VBEEditor/Rubberduck.VBEditor.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@
128128
<Compile Include="Events\VBENativeServices.cs" />
129129
<Compile Include="Events\WindowChangedEventArgs.cs" />
130130
<Compile Include="Extensions\MSAccessComponentTypeExtensions.cs" />
131+
<Compile Include="SafeComWrappers\Abstract\IDesigner.cs" />
131132
<Compile Include="SafeComWrappers\Abstract\ISafeComWrapper.cs" />
132133
<Compile Include="SafeComWrappers\DispatcherEventArgs.cs" />
133134
<Compile Include="SafeComWrappers\MSAccessComponentType.cs" />
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
using System.Collections;
3+
4+
namespace Rubberduck.VBEditor.SafeComWrappers.Abstract
5+
{
6+
public interface IDesigner : ISafeComWrapper, IEquatable<IVBComponent>
7+
{
8+
IList Selected { get; }
9+
}
10+
}

Rubberduck.VBEEditor/SafeComWrappers/Abstract/IVBComponent.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public interface IVBComponent : ISafeComWrapper, IEquatable<IVBComponent>
1313
IControls Controls { get; }
1414
IControls SelectedControls { get; }
1515
bool IsSaved { get; }
16+
object Designer { get; }
1617
bool HasDesigner { get; }
1718
bool HasOpenDesigner { get; }
1819
string DesignerId { get; }

Rubberduck.VBEEditor/SafeComWrappers/VB6/VBComponent.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ public IControls SelectedControls
8686
}
8787
}
8888

89+
public object Designer
90+
{
91+
get { return (IsWrappingNullReference ? null : Target.Designer); }
92+
}
93+
8994
public bool HasDesigner
9095
{
9196
get

0 commit comments

Comments
 (0)