Skip to content

Commit 98a76a6

Browse files
committed
Move all queries for the selected declaration to ISelectedDeclarationService
1 parent 13a48b0 commit 98a76a6

File tree

14 files changed

+166
-135
lines changed

14 files changed

+166
-135
lines changed

Rubberduck.Core/UI/AddRemoveReferences/AddRemoveReferencesPresenter.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Windows.Forms;
33
using Rubberduck.AddRemoveReferences;
44
using Rubberduck.Parsing.Symbols;
5-
using Rubberduck.UI.Refactorings;
65

76
namespace Rubberduck.UI.AddRemoveReferences
87
{

Rubberduck.Core/UI/AddRemoveReferences/AddRemoveReferencesPresenterFactory.cs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,41 @@ private IEnumerable<ReferenceModel> GetUserProjectFolderModels(IReferenceSetting
188188

189189
public AddRemoveReferencesPresenter Create()
190190
{
191-
using (var pane = _vbe.ActiveCodePane)
191+
var selectedProject = SelectedProjectDeclaration();
192+
return selectedProject is null
193+
? null
194+
: Create(selectedProject);
195+
}
196+
197+
private ProjectDeclaration SelectedProjectDeclaration()
198+
{
199+
var projectId = SelectedProjectId();
200+
201+
if (projectId == null)
202+
{
203+
return null;
204+
}
205+
206+
return _state.DeclarationFinder
207+
.UserDeclarations(DeclarationType.Project)
208+
.OfType<ProjectDeclaration>()
209+
.FirstOrDefault(item => item.ProjectId.Equals(projectId));
210+
}
211+
212+
private string SelectedProjectId()
213+
{
214+
using (var selectedComponent = _vbe.SelectedVBComponent)
192215
{
193-
var selected = (ProjectDeclaration)Declaration.GetProjectParent(_state.DeclarationFinder.FindSelectedDeclaration(pane));
194-
return selected is null ? null : Create(selected);
216+
using (var project = selectedComponent.ParentProject)
217+
{
218+
219+
if (project == null || project.IsWrappingNullReference)
220+
{
221+
return null;
222+
}
223+
224+
return project.ProjectId;
225+
}
195226
}
196227
}
197228
}

Rubberduck.Core/UI/Command/ComCommands/FindAllReferencesCommand.cs

Lines changed: 36 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Rubberduck.Parsing.Symbols;
44
using Rubberduck.Parsing.VBA;
55
using Rubberduck.UI.Controls;
6-
using Rubberduck.VBEditor;
76
using Rubberduck.VBEditor.Events;
87
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
98

@@ -15,19 +14,25 @@ namespace Rubberduck.UI.Command.ComCommands
1514
[ComVisible(false)]
1615
public class FindAllReferencesCommand : ComCommandBase
1716
{
18-
private readonly RubberduckParserState _state;
17+
private readonly IParserStatusProvider _parserStatusProvider;
18+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
19+
private readonly ISelectedDeclarationService _selectedDeclarationService;
1920
private readonly IVBE _vbe;
2021
private readonly FindAllReferencesService _finder;
2122

2223
public FindAllReferencesCommand(
23-
RubberduckParserState state,
24+
IParserStatusProvider parserStatusProvider,
25+
IDeclarationFinderProvider declarationFinderProvider,
26+
ISelectedDeclarationService selectedDeclarationService,
2427
IVBE vbe,
2528
ISearchResultsWindowViewModel viewModel,
2629
FindAllReferencesService finder,
2730
IVbeEvents vbeEvents)
2831
: base(vbeEvents)
2932
{
30-
_state = state;
33+
_parserStatusProvider = parserStatusProvider;
34+
_declarationFinderProvider = declarationFinderProvider;
35+
_selectedDeclarationService = selectedDeclarationService;
3136
_vbe = vbe;
3237
_finder = finder;
3338

@@ -36,7 +41,7 @@ public FindAllReferencesCommand(
3641

3742
private bool SpecialEvaluateCanExecute(object parameter)
3843
{
39-
if (_state.Status != ParserState.Ready)
44+
if (_parserStatusProvider.Status != ParserState.Ready)
4045
{
4146
return false;
4247
}
@@ -61,7 +66,7 @@ private bool SpecialEvaluateCanExecute(object parameter)
6166

6267
protected override void OnExecute(object parameter)
6368
{
64-
if (_state.Status != ParserState.Ready)
69+
if (_parserStatusProvider.Status != ParserState.Ready)
6570
{
6671
return;
6772
}
@@ -84,63 +89,52 @@ private Declaration FindTarget(object parameter)
8489

8590
using (var activePane = _vbe.ActiveCodePane)
8691
{
87-
bool findDesigner;
8892
using (var selectedComponent = _vbe.SelectedVBComponent)
8993
{
90-
findDesigner = activePane != null && !activePane.IsWrappingNullReference
91-
&& (selectedComponent?.HasDesigner ?? false);
94+
if (activePane != null
95+
&& !activePane.IsWrappingNullReference
96+
&& (selectedComponent?.HasDesigner ?? false))
97+
{
98+
return FindFormDesignerTarget(selectedComponent);
99+
}
92100
}
93-
94-
return findDesigner
95-
? FindFormDesignerTarget()
96-
: FindCodePaneTarget(activePane);
97101
}
102+
103+
return FindCodePaneTarget();
98104
}
99105

100-
private Declaration FindCodePaneTarget(ICodePane codePane)
106+
private Declaration FindCodePaneTarget()
101107
{
102-
return _state.FindSelectedDeclaration(codePane);
108+
return _selectedDeclarationService.SelectedDeclaration();
103109
}
104110

105-
private Declaration FindFormDesignerTarget(QualifiedModuleName? qualifiedModuleName = null)
111+
//Assumes the component has a designer.
112+
private Declaration FindFormDesignerTarget(IVBComponent component)
106113
{
107-
if (qualifiedModuleName.HasValue)
108-
{
109-
return FindFormDesignerTarget(qualifiedModuleName.Value);
110-
}
111-
112114
string projectId;
113115
using (var activeProject = _vbe.ActiveVBProject)
114116
{
115117
projectId = activeProject.ProjectId;
116118
}
117119

118-
using (var component = _vbe.SelectedVBComponent)
120+
DeclarationType selectedType;
121+
string selectedName;
122+
using (var selectedControls = component.SelectedControls)
119123
{
120-
if (component?.HasDesigner ?? false)
124+
var selectedCount = selectedControls.Count;
125+
if (selectedCount > 1)
121126
{
122-
DeclarationType selectedType;
123-
string selectedName;
124-
using (var selectedControls = component.SelectedControls)
125-
{
126-
var selectedCount = selectedControls.Count;
127-
if (selectedCount > 1)
128-
{
129-
return null;
130-
}
131-
132-
(selectedType, selectedName) = GetSelectedName(component, selectedControls, selectedCount);
133-
}
134-
135-
return _state.DeclarationFinder
136-
.MatchName(selectedName)
137-
.SingleOrDefault(m => m.ProjectId == projectId
138-
&& m.DeclarationType.HasFlag(selectedType)
139-
&& m.ComponentName == component.Name);
127+
return null;
140128
}
141129

142-
return null;
130+
(selectedType, selectedName) = GetSelectedName(component, selectedControls, selectedCount);
143131
}
132+
133+
return _declarationFinderProvider.DeclarationFinder
134+
.MatchName(selectedName)
135+
.SingleOrDefault(m => m.ProjectId == projectId
136+
&& m.DeclarationType.HasFlag(selectedType)
137+
&& m.ComponentName == component.Name);
144138
}
145139

146140
private static (DeclarationType, string Name) GetSelectedName(IVBComponent component, IControls selectedControls, int selectedCount)
@@ -156,22 +150,5 @@ private static (DeclarationType, string Name) GetSelectedName(IVBComponent compo
156150
return (DeclarationType.Control, firstSelectedControl.Name);
157151
}
158152
}
159-
160-
private Declaration FindFormDesignerTarget(QualifiedModuleName qualifiedModuleName)
161-
{
162-
var projectId = qualifiedModuleName.ProjectId;
163-
var component = _state.ProjectsProvider.Component(qualifiedModuleName);
164-
165-
if (component?.HasDesigner ?? false)
166-
{
167-
return _state.DeclarationFinder
168-
.MatchName(qualifiedModuleName.Name)
169-
.SingleOrDefault(m => m.ProjectId == projectId
170-
&& m.DeclarationType.HasFlag(qualifiedModuleName.ComponentType)
171-
&& m.ComponentName == component.Name);
172-
}
173-
174-
return null;
175-
}
176153
}
177154
}

Rubberduck.Core/UI/Command/ComCommands/SyncCodeExplorerCommand.cs

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Rubberduck.Parsing.VBA;
55
using Rubberduck.VBEditor.Events;
66
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
7+
using Rubberduck.VBEditor.Utility;
78

89
namespace Rubberduck.UI.Command.ComCommands
910
{
@@ -30,33 +31,41 @@ public CodeExplorerSyncProvider(
3031

3132
public SyncCodeExplorerCommand GetSyncCommand(CodeExplorerViewModel explorer)
3233
{
33-
return new SyncCodeExplorerCommand(_vbe, _state, explorer, _vbeEvents);
34+
var selectionService = new SelectionService(_vbe, _state.ProjectsProvider);
35+
var selectedDeclarationService = new SelectedDeclarationService(selectionService, _state);
36+
return new SyncCodeExplorerCommand(_vbe, _state, _state, selectedDeclarationService, explorer, _vbeEvents);
3437
}
3538
}
3639

3740
public class SyncCodeExplorerCommand : ComCommandBase
3841
{
3942
private readonly IVBE _vbe;
40-
private readonly RubberduckParserState _state;
43+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
44+
private readonly ISelectedDeclarationService _selectedDeclarationService;
45+
private readonly IParserStatusProvider _parserStatusProvider;
4146
private readonly CodeExplorerViewModel _explorer;
4247

4348
public SyncCodeExplorerCommand(
44-
IVBE vbe,
45-
RubberduckParserState state,
49+
IVBE vbe,
50+
IDeclarationFinderProvider declarationFinderProvider,
51+
IParserStatusProvider parserStatusProvider,
52+
ISelectedDeclarationService selectedDeclarationService,
4653
CodeExplorerViewModel explorer,
4754
IVbeEvents vbeEvents)
4855
: base(vbeEvents)
4956
{
5057
_vbe = vbe;
51-
_state = state;
58+
_declarationFinderProvider = declarationFinderProvider;
59+
_selectedDeclarationService = selectedDeclarationService;
60+
_parserStatusProvider = parserStatusProvider;
5261
_explorer = explorer;
5362

5463
AddToCanExecuteEvaluation(SpecialEvaluateCanExecute);
5564
}
5665

5766
private bool SpecialEvaluateCanExecute(object parameter)
5867
{
59-
return _state.Status == ParserState.Ready
68+
return _parserStatusProvider.Status == ParserState.Ready
6069
&& !_explorer.IsBusy
6170
&& FindTargetNode() != null;
6271
}
@@ -75,28 +84,43 @@ protected override void OnExecute(object parameter)
7584

7685
private ICodeExplorerNode FindTargetNode()
7786
{
78-
using (var active = _vbe.ActiveCodePane)
87+
var targetDeclaration = FindTargetDeclaration();
88+
return targetDeclaration != null
89+
? _explorer.FindVisibleNodeForDeclaration(targetDeclaration)
90+
: null;
91+
}
92+
93+
private Declaration FindTargetDeclaration()
94+
{
95+
return _selectedDeclarationService.SelectedDeclaration()
96+
?? ActiveProjectDeclaration();
97+
}
98+
99+
private Declaration ActiveProjectDeclaration()
100+
{
101+
var projectId = ActiveProjectId();
102+
103+
if (projectId == null)
79104
{
80-
if (active == null || active.IsWrappingNullReference)
105+
return null;
106+
}
107+
108+
return _declarationFinderProvider.DeclarationFinder
109+
.UserDeclarations(DeclarationType.Project)
110+
.FirstOrDefault(item => item.ProjectId.Equals(projectId));
111+
}
112+
113+
private string ActiveProjectId()
114+
{
115+
using (var project = _vbe.ActiveVBProject)
116+
{
117+
if (project == null || project.IsWrappingNullReference)
81118
{
82-
using (var project = _vbe.ActiveVBProject)
83-
{
84-
if (project == null || project.IsWrappingNullReference)
85-
{
86-
return null;
87-
}
88-
89-
var declaration = _state.DeclarationFinder.UserDeclarations(DeclarationType.Project)
90-
.FirstOrDefault(item => item.ProjectId.Equals(project.ProjectId));
91-
92-
return _explorer.FindVisibleNodeForDeclaration(declaration);
93-
}
119+
return null;
94120
}
95121

96-
var selected = _state.DeclarationFinder?.FindSelectedDeclaration(active);
97-
98-
return selected == null ? null : _explorer.FindVisibleNodeForDeclaration(selected);
122+
return project.ProjectId;
99123
}
100-
}
124+
}
101125
}
102126
}

Rubberduck.Core/UI/Command/Refactorings/CodePaneRefactorRenameCommand.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,18 @@ namespace Rubberduck.UI.Command.Refactorings
1111
public class CodePaneRefactorRenameCommand : RefactorCodePaneCommandBase
1212
{
1313
private readonly RubberduckParserState _state;
14+
private readonly ISelectedDeclarationService _selectedDeclarationService;
1415

15-
public CodePaneRefactorRenameCommand(RenameRefactoring refactoring, RenameFailedNotifier renameFailedNotifier, RubberduckParserState state, ISelectionService selectionService)
16+
public CodePaneRefactorRenameCommand(
17+
RenameRefactoring refactoring,
18+
RenameFailedNotifier renameFailedNotifier,
19+
RubberduckParserState state,
20+
ISelectionService selectionService,
21+
ISelectedDeclarationService selectedDeclarationService)
1622
: base (refactoring, renameFailedNotifier, selectionService, state)
1723
{
1824
_state = state;
25+
_selectedDeclarationService = selectedDeclarationService;
1926

2027
AddToCanExecuteEvaluation(SpecializedEvaluateCanExecute);
2128
}
@@ -31,13 +38,7 @@ private bool SpecializedEvaluateCanExecute(object parameter)
3138

3239
private Declaration GetTarget()
3340
{
34-
var activeSelection = SelectionService.ActiveSelection();
35-
if (!activeSelection.HasValue)
36-
{
37-
return null;
38-
}
39-
40-
return _state.DeclarationFinder.FindSelectedDeclaration(activeSelection.Value);
41+
return _selectedDeclarationService.SelectedDeclaration();
4142
}
4243
}
4344
}

Rubberduck.Core/UI/Command/Refactorings/RefactorCodePaneCommandBase.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System;
2-
using NLog;
3-
using Rubberduck.Parsing.VBA;
1+
using Rubberduck.Parsing.VBA;
42
using Rubberduck.Refactorings;
53
using Rubberduck.Refactorings.Exceptions;
64
using Rubberduck.UI.Command.Refactorings.Notifiers;

0 commit comments

Comments
 (0)