-
Notifications
You must be signed in to change notification settings - Fork 296
/
AddTemplateCommand.cs
82 lines (68 loc) · 2.34 KB
/
AddTemplateCommand.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using Rubberduck.Navigation.CodeExplorer;
using Rubberduck.Templates;
using Rubberduck.VBEditor.SafeComWrappers;
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
namespace Rubberduck.UI.CodeExplorer.Commands
{
public class AddTemplateCommand : AddComponentCommandBase
{
private static readonly ProjectType[] Types = { ProjectType.HostProject, ProjectType.StandAlone, ProjectType.StandardExe, ProjectType.ActiveXExe };
private readonly ITemplateProvider _provider;
public AddTemplateCommand(IVBE vbe, ITemplateProvider provider) : base(vbe)
{
_provider = provider;
}
public override IEnumerable<ProjectType> AllowableProjectTypes => Types;
public override ComponentType ComponentType => ComponentType.Undefined;
public bool CanExecuteForNode(ICodeExplorerNode model)
{
return base.EvaluateCanExecute(model);
}
protected override bool EvaluateCanExecute(object parameter)
{
if (parameter is null)
{
return false;
}
try
{
// TODO this cast needs to be safer.
var data = ((string templateName, ICodeExplorerNode model))parameter;
return base.EvaluateCanExecute(data.model);
}
catch (Exception ex)
{
Logger.Trace(ex);
return false;
}
}
protected override void OnExecute(object parameter)
{
if (parameter is null)
{
return;
}
try
{
// TODO this cast needs to be safer.
var data = ((string templateName, ICodeExplorerNode node))parameter;
if (string.IsNullOrWhiteSpace(data.templateName) || !(data.node is CodeExplorerItemViewModel model))
{
return;
}
var moduleText = GetTemplate(data.templateName);
AddComponent(model, moduleText);
}
catch (Exception ex)
{
Logger.Trace(ex);
}
}
private string GetTemplate(string name)
{
return _provider.Load(name).Read();
}
}
}