Skip to content

Commit 3da94e9

Browse files
committed
WIP
1 parent 1c9a6b9 commit 3da94e9

File tree

12 files changed

+205
-28
lines changed

12 files changed

+205
-28
lines changed

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerViewModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,8 @@ private void ExecuteRemoveCommand(object param)
386386
public ImportCommand ImportCommand { get; set; }
387387
public ExportCommand ExportCommand { get; set; }
388388
public ExportAllCommand ExportAllCommand { get; set; }
389+
// public ExcludeCommand ExcludeCommand { get; set; }
390+
public OpenCommand DeleteCommand { get; set; } // TODO
389391
public CommandBase RemoveCommand { get; }
390392
public PrintCommand PrintCommand { get; set; }
391393
public AddRemoveReferencesCommand AddRemoveReferencesCommand { get; set; }

Rubberduck.Core/UI/CodeExplorer/CodeExplorerControl.xaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,19 @@
475475
<Image Source="{StaticResource RemoveImage}" Style="{StaticResource ToolbarImageOpacity}" />
476476
</MenuItem.Icon>
477477
</MenuItem>
478+
<MenuItem Header="{Resx ResxName=Rubberduck.Resources.CodeExplorer.CodeExplorerUI, Key=CodeExplorer_Exclude}"
479+
Command="{Binding RemoveCommand}"
480+
CommandParameter="{Binding SelectedItem, Mode=OneWay}"
481+
Visibility="{Binding VB6Visibility}">
482+
</MenuItem>
483+
<MenuItem Header="{Resx ResxName=Rubberduck.Resources.CodeExplorer.CodeExplorerUI, Key=CodeExplorer_Delete}"
484+
Command="{Binding DeleteCommand}"
485+
CommandParameter="{Binding SelectedItem, Mode=OneWay}"
486+
Visibility="{Binding VB6Visibility}">
487+
<MenuItem.Icon>
488+
<Image Source="{StaticResource RemoveImage}" Style="{StaticResource ToolbarImageOpacity}" />
489+
</MenuItem.Icon>
490+
</MenuItem>
478491
<Separator />
479492
<MenuItem Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=Find}">
480493
<MenuItem.Icon>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace Rubberduck.UI.CodeExplorer.Commands
5+
{
6+
public class DeleteCommand : CodeExplorerCommandBase
7+
{
8+
public DeleteCommand()
9+
{
10+
// TODO
11+
}
12+
13+
protected override void OnExecute(object parameter)
14+
{
15+
// TODO
16+
}
17+
18+
public override IEnumerable<Type> ApplicableNodeTypes => new List<Type>(); // TODO!!
19+
}
20+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//using System;
2+
//using System.Collections.Generic;
3+
//using System.Linq;
4+
//using System.Threading;
5+
//using Rubberduck.Interaction;
6+
//using Rubberduck.Navigation.CodeExplorer;
7+
//using Rubberduck.Parsing.VBA;
8+
//using Rubberduck.Resources.CodeExplorer;
9+
//using Rubberduck.VBEditor.ComManagement;
10+
//using Rubberduck.VBEditor.SafeComWrappers;
11+
//using Rubberduck.VBEditor.SafeComWrappers.Abstract;
12+
13+
//namespace Rubberduck.UI.CodeExplorer.Commands
14+
//{
15+
// public class ExcludeCommand : CodeExplorerCommandBase
16+
// {
17+
// private readonly IParseManager _parseManager;
18+
// private readonly IProjectsRepository _projectsRepository;
19+
// private readonly IMessageBox _messageBox;
20+
// private readonly IVBE _vbe;
21+
22+
// private static readonly Type[] ApplicableNodes =
23+
// {
24+
// typeof(CodeExplorerComponentViewModel)
25+
// };
26+
27+
28+
// public ExcludeCommand(IParseManager parseManager, IProjectsRepository projectsRepository, IMessageBox messageBox, IVBE vbe)
29+
// {
30+
// _parseManager = parseManager;
31+
// _projectsRepository = projectsRepository;
32+
// _messageBox = messageBox;
33+
// _vbe = vbe;
34+
// }
35+
36+
// public override IEnumerable<Type> ApplicableNodeTypes => ApplicableNodes;
37+
38+
// protected override void OnExecute(object parameter)
39+
// {
40+
// if (!(parameter is CodeExplorerComponentViewModel node) ||
41+
// node.Declaration == null ||
42+
// node.Declaration.QualifiedName.QualifiedModuleName.ComponentType == ComponentType.Document)
43+
// {
44+
// return;
45+
// }
46+
47+
// var qualifiedModuleName = node.Declaration.QualifiedName.QualifiedModuleName;
48+
49+
// try
50+
// {
51+
// _projectsRepository.RemoveComponent(qualifiedModuleName);
52+
// }
53+
// catch (Exception ex)
54+
// {
55+
// _messageBox.NotifyWarn(ex.Message, string.Format(CodeExplorerUI.RemoveError_Caption, qualifiedModuleName.ComponentName)); // TODO
56+
// }
57+
// }
58+
// }
59+
//}

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Rubberduck.VBEditor;
99
using Rubberduck.VBEditor.ComManagement;
1010
using Rubberduck.VBEditor.SafeComWrappers;
11+
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
1112

1213
namespace Rubberduck.UI.CodeExplorer.Commands
1314
{
@@ -22,18 +23,20 @@ public class ExportCommand : CommandBase
2223
};
2324

2425
private readonly IFileSystemBrowserFactory _dialogFactory;
26+
private readonly IVBE _vbe;
2527

26-
public ExportCommand(IFileSystemBrowserFactory dialogFactory, IMessageBox messageBox, IProjectsProvider projectsProvider)
28+
public ExportCommand(IFileSystemBrowserFactory dialogFactory, IMessageBox messageBox, IProjectsRepository projectsRepository, IVBE vbe)
2729
{
2830
_dialogFactory = dialogFactory;
31+
_vbe = vbe;
2932
MessageBox = messageBox;
30-
ProjectsProvider = projectsProvider;
33+
ProjectsRepository = projectsRepository;
3134

3235
AddToCanExecuteEvaluation(SpecialEvaluateCanExecute);
3336
}
3437

3538
protected IMessageBox MessageBox { get; }
36-
protected IProjectsProvider ProjectsProvider { get; }
39+
protected IProjectsRepository ProjectsRepository { get; }
3740

3841
private bool SpecialEvaluateCanExecute(object parameter)
3942
{
@@ -43,6 +46,11 @@ private bool SpecialEvaluateCanExecute(object parameter)
4346
return false;
4447
}
4548

49+
if (_vbe.Kind != VBEKind.Hosted)
50+
{
51+
return false;
52+
}
53+
4654
var componentType = node.Declaration.QualifiedName.QualifiedModuleName.ComponentType;
4755
return ExportableFileExtensions.Select(s => s.Key).Contains(componentType);
4856
}
@@ -58,7 +66,7 @@ protected override void OnExecute(object parameter)
5866
PromptFileNameAndExport(node.Declaration.QualifiedName.QualifiedModuleName);
5967
}
6068

61-
protected bool PromptFileNameAndExport(QualifiedModuleName qualifiedModule)
69+
public bool PromptFileNameAndExport(QualifiedModuleName qualifiedModule)
6270
{
6371
if (!ExportableFileExtensions.TryGetValue(qualifiedModule.ComponentType, out var extension))
6472
{
@@ -76,7 +84,7 @@ protected bool PromptFileNameAndExport(QualifiedModuleName qualifiedModule)
7684
return false;
7785
}
7886

79-
var component = ProjectsProvider.Component(qualifiedModule);
87+
var component = ProjectsRepository.Component(qualifiedModule);
8088
try
8189
{
8290
component.Export(dialog.FileName);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,15 @@ private bool SpecialEvaluateCanExecute(object parameter)
3737
try
3838
{
3939
var component = _projectsProvider.Component(node.Declaration.QualifiedName.QualifiedModuleName);
40+
if (component is null)
41+
{
42+
return false;
43+
}
4044
using (var codeModule = component.CodeModule)
4145
{
4246
return codeModule.CountOfLines != 0;
4347
}
48+
4449
}
4550
catch (COMException)
4651
{

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

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,36 @@
22
using Rubberduck.Interaction;
33
using Rubberduck.Navigation.CodeExplorer;
44
using Rubberduck.Resources.CodeExplorer;
5+
using Rubberduck.UI.Command;
56
using Rubberduck.VBEditor.ComManagement;
67
using Rubberduck.VBEditor.SafeComWrappers;
8+
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
79

810
namespace Rubberduck.UI.CodeExplorer.Commands
911
{
10-
public class RemoveCommand : ExportCommand
12+
public class RemoveCommand : CommandBase
1113
{
12-
public RemoveCommand(IFileSystemBrowserFactory dialogFactory, IMessageBox messageBox, IProjectsProvider projectsProvider)
13-
: base(dialogFactory, messageBox, projectsProvider)
14+
private readonly ExportCommand _exportCommand;
15+
private readonly IProjectsRepository _projectsRepository;
16+
private readonly IMessageBox _messageBox;
17+
private readonly IVBE _vbe;
18+
19+
public RemoveCommand(ExportCommand exportCommand, IProjectsRepository projectsRepository, IMessageBox messageBox, IVBE vbe)
1420
{
21+
_exportCommand = exportCommand;
22+
_projectsRepository = projectsRepository;
23+
_messageBox = messageBox;
24+
_vbe = vbe;
1525

1626
AddToCanExecuteEvaluation(SpecialEvaluateCanExecute);
1727
}
1828

1929
private bool SpecialEvaluateCanExecute(object parameter)
2030
{
21-
return ((CodeExplorerComponentViewModel) parameter).Declaration.QualifiedName.QualifiedModuleName
22-
.ComponentType != ComponentType.Document;
23-
}
31+
return _vbe.Kind == VBEKind.Standalone ||
32+
_exportCommand.CanExecute(parameter) &&
33+
((CodeExplorerComponentViewModel)parameter).Declaration.QualifiedName.QualifiedModuleName.ComponentType != ComponentType.Document;
34+
}
2435

2536
protected override void OnExecute(object parameter)
2637
{
@@ -32,31 +43,38 @@ protected override void OnExecute(object parameter)
3243
}
3344

3445
var qualifiedModuleName = node.Declaration.QualifiedName.QualifiedModuleName;
35-
var message = string.Format(CodeExplorerUI.ExportBeforeRemove_Prompt, node.Name);
46+
var projectId = qualifiedModuleName.ProjectId;
47+
var projectType = _projectsRepository.Project(projectId).Type;
3648

37-
switch (MessageBox.Confirm(message, CodeExplorerUI.ExportBeforeRemove_Caption, ConfirmationOutcome.Yes))
49+
if (projectType == ProjectType.HostProject) // Prompt for export for VBA only
3850
{
39-
case ConfirmationOutcome.Yes:
40-
if (!PromptFileNameAndExport(qualifiedModuleName))
41-
{
51+
var message = string.Format(CodeExplorerUI.ExportBeforeRemove_Prompt, node.Name);
52+
53+
switch(_messageBox.Confirm(message, CodeExplorerUI.ExportBeforeRemove_Caption, ConfirmationOutcome.Yes))
54+
{
55+
case ConfirmationOutcome.Yes:
56+
if (!_exportCommand.PromptFileNameAndExport(qualifiedModuleName))
57+
{
58+
return; // Don't remove if export was cancelled
59+
}
60+
break;
61+
62+
case ConfirmationOutcome.Cancel:
4263
return;
43-
}
44-
break;
45-
case ConfirmationOutcome.No:
46-
break;
47-
case ConfirmationOutcome.Cancel:
48-
return;
64+
65+
case ConfirmationOutcome.No:
66+
break;
4967
}
68+
}
5069

5170
// No file export or file successfully exported--now remove it
52-
var components = ProjectsProvider.ComponentsCollection(qualifiedModuleName.ProjectId);
5371
try
5472
{
55-
components?.Remove(ProjectsProvider.Component(qualifiedModuleName));
73+
_projectsRepository.RemoveComponent(qualifiedModuleName);
5674
}
5775
catch (Exception ex)
5876
{
59-
MessageBox.NotifyWarn(ex.Message, string.Format(CodeExplorerUI.RemoveError_Caption, qualifiedModuleName.ComponentName));
77+
_messageBox.NotifyWarn(ex.Message, string.Format(CodeExplorerUI.RemoveError_Caption, qualifiedModuleName.ComponentName));
6078
}
6179
}
6280
}

Rubberduck.Refactorings/Rename/RenameRefactoring.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ private void CheckWhetherValidTarget(Declaration target)
114114
if (target.DeclarationType.HasFlag(DeclarationType.Control))
115115
{
116116
var component = _projectsProvider.Component(target.QualifiedName.QualifiedModuleName);
117+
if (component is null)
118+
{
119+
throw new TargetControlNotFoundException(target);
120+
}
117121
using (var controls = component.Controls)
118122
{
119123
using (var control = controls.FirstOrDefault(item => item.Name == target.IdentifierName))

Rubberduck.Resources/CodeExplorer/CodeExplorerUI.Designer.cs

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Resources/CodeExplorer/CodeExplorerUI.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,4 +418,10 @@
418418
<data name="CodeExplorer_AddExistingFileText" xml:space="preserve">
419419
<value>Existing file...</value>
420420
</data>
421+
<data name="CodeExplorer_Delete" xml:space="preserve">
422+
<value>Delete</value>
423+
</data>
424+
<data name="CodeExplorer_Exclude" xml:space="preserve">
425+
<value>Exclude from project</value>
426+
</data>
421427
</root>

0 commit comments

Comments
 (0)