Skip to content

Commit 64e09bd

Browse files
authored
Merge pull request #4896 from MDoerner/CommandHierarchyCanExecuteConditions
Command hierarchy can execute conditions
2 parents b5942fb + c409f6c commit 64e09bd

File tree

130 files changed

+1057
-630
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

130 files changed

+1057
-630
lines changed

Rubberduck.API/VBA/Parser.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,11 @@ internal Parser(object vbe) : this()
127127
//new RubberduckApiDeclarations(_state)
128128
}
129129
);
130-
var codePaneSourceCodeHandler = new CodePaneSourceCodeHandler(projectRepository);
130+
var codePaneComponentSourceCodeHandler = new CodeModuleComponentSourceCodeHandler();
131+
var codePaneSourceCodeHandler = new ComponentSourceCodeHandlerSourceCodeHandlerAdapter(codePaneComponentSourceCodeHandler, projectRepository);
131132
var sourceFileHandler = _vbe.TempSourceFileHandler;
132-
var attributesSourceCodeHandler = new SourceFileHandlerSourceCodeHandlerAdapter(sourceFileHandler, projectRepository);
133+
var attributeComponentSourceCodeHandler = new SourceFileHandlerComponentSourceCodeHandlerAdapter(sourceFileHandler);
134+
var attributesSourceCodeHandler = new ComponentSourceCodeHandlerSourceCodeHandlerAdapter(attributeComponentSourceCodeHandler, projectRepository);
133135
var moduleParser = new ModuleParser(
134136
codePaneSourceCodeHandler,
135137
attributesSourceCodeHandler,

Rubberduck.CodeAnalysis/QuickFixes/QuickFixProvider.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Rubberduck.Parsing.Inspections.Abstract;
77
using Rubberduck.Parsing.Rewriter;
88
using Rubberduck.Parsing.VBA.Parsing;
9+
using Rubberduck.Refactorings.Exceptions;
910
using Rubberduck.VBEditor;
1011

1112
namespace Rubberduck.Inspections.QuickFixes
@@ -78,19 +79,26 @@ public void Fix(IQuickFix fix, IInspectionResult result)
7879
}
7980

8081
var rewriteSession = RewriteSession(fix.TargetCodeKind);
81-
fix.Fix(result, rewriteSession);
82+
try
83+
{
84+
fix.Fix(result, rewriteSession);
85+
}
86+
catch (RewriteFailedException)
87+
{
88+
_failureNotifier.NotifyQuickFixExecutionFailure(rewriteSession.Status);
89+
}
8290
Apply(rewriteSession);
8391
}
8492

85-
private void Apply(IRewriteSession rewriteSession)
93+
private void Apply(IExecutableRewriteSession rewriteSession)
8694
{
8795
if (!rewriteSession.TryRewrite())
8896
{
8997
_failureNotifier.NotifyQuickFixExecutionFailure(rewriteSession.Status);
9098
}
9199
}
92100

93-
private IRewriteSession RewriteSession(CodeKind targetCodeKind)
101+
private IExecutableRewriteSession RewriteSession(CodeKind targetCodeKind)
94102
{
95103
switch (targetCodeKind)
96104
{

Rubberduck.CodeAnalysis/QuickFixes/RefactoringQuickFixBase.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ public override void Fix(IInspectionResult result, IRewriteSession rewriteSessio
2525
Refactor(result);
2626
}
2727
catch (RefactoringAbortedException)
28-
{ }
28+
{}
29+
catch (RewriteFailedException)
30+
{
31+
//We rethrow because this information is required by the QuickFixProvider to trigger the failure notiication.
32+
throw;
33+
}
2934
catch (RefactoringException exception)
3035
{
3136
//This is an error: the inspection returned an invalid result.

Rubberduck.Core/AutoComplete/ShowIntelliSenseCommand.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,14 @@ public class ShowIntelliSenseCommand : CommandBase, IShowIntelliSenseCommand
1717
{
1818
private readonly IVBE _vbe;
1919

20-
public ShowIntelliSenseCommand(IVBE vbe) : base(LogManager.GetCurrentClassLogger())
20+
public ShowIntelliSenseCommand(IVBE vbe)
2121
{
2222
_vbe = vbe;
23-
}
2423

25-
public void Execute()
26-
{
27-
OnExecute(null);
24+
AddToCanExecuteEvaluation(SpecialEvaluateCanExecute);
2825
}
2926

30-
protected override bool EvaluateCanExecute(object parameter)
27+
private bool SpecialEvaluateCanExecute(object parameter)
3128
{
3229
try
3330
{
@@ -39,6 +36,11 @@ protected override bool EvaluateCanExecute(object parameter)
3936
}
4037
}
4138

39+
public void Execute()
40+
{
41+
OnExecute(null);
42+
}
43+
4244
protected override void OnExecute(object parameter)
4345
{
4446
const int showIntelliSenseId = 2531;

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerViewModel.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,9 @@ public ICodeExplorerNode SelectedItem
113113
}
114114

115115
public bool AnyTemplatesCanExecute =>
116-
BuiltInTemplates.Concat(UserDefinedTemplates)
117-
.Any(template => AddTemplateCommand.CanExecuteForNode(SelectedItem));
116+
AddTemplateCommand.CanExecuteForNode(SelectedItem)
117+
&& BuiltInTemplates.Concat(UserDefinedTemplates)
118+
.Any(template => AddTemplateCommand.CanExecute((template.Name, SelectedItem)));
118119

119120
private CodeExplorerSortOrder _sortOrder = CodeExplorerSortOrder.Name;
120121
public CodeExplorerSortOrder SortOrder

Rubberduck.Core/Templates/Template.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public Template(string name, ITemplateFileHandler handler)
4343

4444
private static bool VerifyIfUserDefined(string name)
4545
{
46-
var builtInName = Resources.Templates.ResourceManager.GetString(name + "_Name");
47-
return builtInName == null || builtInName != name;
46+
var builtInCode = Resources.Templates.ResourceManager.GetString(name + "_Code");
47+
return builtInCode == null;
4848
}
4949

5050
private static void VerifyFile(string name, ITemplateFileHandler handler)

Rubberduck.Core/Templates/TemplateProvider.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,16 @@ public ITemplate Load(string templateName)
3030
private Lazy<IEnumerable<Template>> LazyList => new Lazy<IEnumerable<Template>>(() =>
3131
{
3232
var list = new List<Template>();
33-
var set = Rubberduck.Resources.Templates.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true);
33+
var set = Rubberduck.Resources.Templates.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
3434

3535
foreach (DictionaryEntry entry in set)
3636
{
3737
var key = (string)entry.Key;
38-
var value = (string) entry.Value;
3938
if (key.EndsWith("_Name"))
4039
{
41-
var handler = _provider.CreateTemplateFileHandler(value);
42-
list.Add(new Template(value, handler));
40+
var templateName = key.Substring(0, key.Length - "_Name".Length);
41+
var handler = _provider.CreateTemplateFileHandler(templateName);
42+
list.Add(new Template(templateName, handler));
4343
}
4444
}
4545

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
using System;
2+
using System.Linq;
3+
using System.Text;
4+
using Rubberduck.Navigation.CodeExplorer;
5+
using Rubberduck.Parsing.VBA;
6+
using Rubberduck.VBEditor.SafeComWrappers;
7+
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
8+
using Rubberduck.VBEditor.Utility;
9+
10+
namespace Rubberduck.UI.CodeExplorer
11+
{
12+
public class CodeExplorerAddComponentService : ICodeExplorerAddComponentService
13+
{
14+
private readonly IParseManager _parseManager;
15+
private readonly IAddComponentService _addComponentService;
16+
private readonly IVBE _vbe;
17+
18+
public CodeExplorerAddComponentService(IParseManager parseManager, IAddComponentService addComponentService, IVBE vbe)
19+
{
20+
_parseManager = parseManager;
21+
_addComponentService = addComponentService;
22+
_vbe = vbe;
23+
}
24+
25+
public void AddComponent(CodeExplorerItemViewModel node, ComponentType componentType, string code = null)
26+
{
27+
var projectId = ProjectId(node);
28+
if (projectId == null)
29+
{
30+
return;
31+
}
32+
33+
var prefixInModule = FolderAnnotation(node);
34+
35+
_parseManager.OnSuspendParser(
36+
this,
37+
Enum.GetValues(typeof(ParserState)).Cast<ParserState>(),
38+
() => _addComponentService.AddComponent(projectId, componentType, code, prefixInModule));
39+
}
40+
41+
public void AddComponentWithAttributes(CodeExplorerItemViewModel node, ComponentType componentType, string code, string additionalPrefixInModule = null)
42+
{
43+
var projectId = ProjectId(node);
44+
if (projectId == null)
45+
{
46+
return;
47+
}
48+
49+
var folderAnnotation = FolderAnnotation(node);
50+
var optionCompare = OptionCompareStatement();
51+
52+
var modulePrefix = new StringBuilder(folderAnnotation);
53+
if (optionCompare != null)
54+
{
55+
modulePrefix.Append(Environment.NewLine).Append(optionCompare);
56+
}
57+
if (additionalPrefixInModule != null)
58+
{
59+
modulePrefix.Append(Environment.NewLine).Append(additionalPrefixInModule);
60+
}
61+
var prefixInModule = modulePrefix.ToString();
62+
63+
_parseManager.OnSuspendParser(
64+
this,
65+
Enum.GetValues(typeof(ParserState)).Cast<ParserState>(),
66+
() => _addComponentService.AddComponentWithAttributes(projectId, componentType, code, prefixInModule));
67+
}
68+
69+
private string ProjectId(CodeExplorerItemViewModel node)
70+
{
71+
return node?.Declaration.ProjectId;
72+
}
73+
74+
private string FolderAnnotation(CodeExplorerItemViewModel node)
75+
{
76+
return (node is CodeExplorerCustomFolderViewModel folder)
77+
? folder.FolderAttribute
78+
: $"'@Folder(\"{Folder(node)}\")";
79+
}
80+
81+
private string Folder(CodeExplorerItemViewModel node)
82+
{
83+
var declaration = node?.Declaration;
84+
if (declaration == null)
85+
{
86+
return ActiveProjectFolder();
87+
}
88+
89+
var customFolder = declaration.CustomFolder;
90+
if (customFolder != null)
91+
{
92+
return customFolder.Replace("\"", string.Empty);
93+
}
94+
95+
return ProjectFolder(declaration.ProjectName);
96+
}
97+
98+
private string ActiveProjectFolder()
99+
{
100+
return ProjectFolder(ActiveProjectName());
101+
}
102+
103+
private string ActiveProjectName()
104+
{
105+
using (var activeProject = _vbe.ActiveVBProject)
106+
{
107+
return activeProject?.Name;
108+
}
109+
}
110+
111+
private static string ProjectFolder(string projectName)
112+
{
113+
return projectName;
114+
}
115+
116+
private string OptionCompareStatement()
117+
{
118+
using (var hostApp = _vbe.HostApplication())
119+
{
120+
return hostApp?.ApplicationName == "Access"
121+
? "Option Compare Database"
122+
: null;
123+
}
124+
}
125+
}
126+
}

Rubberduck.Core/UI/CodeExplorer/Commands/AddClassModuleCommand.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
using System.Collections.Generic;
22
using Rubberduck.VBEditor.SafeComWrappers;
3-
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
43

54
namespace Rubberduck.UI.CodeExplorer.Commands
65
{
76
public class AddClassModuleCommand : AddComponentCommandBase
87
{
9-
public AddClassModuleCommand(IVBE vbe) : base(vbe) { }
8+
public AddClassModuleCommand(ICodeExplorerAddComponentService addComponentService)
9+
: base(addComponentService)
10+
{}
1011

1112
public override IEnumerable<ProjectType> AllowableProjectTypes => ProjectTypes.All;
1213

0 commit comments

Comments
 (0)