Skip to content

Commit 1b3e259

Browse files
committed
Introduce option to fix all selected occurrences
1 parent 34ff6c4 commit 1b3e259

File tree

6 files changed

+139
-24
lines changed

6 files changed

+139
-24
lines changed

Rubberduck.Core/UI/Inspections/InspectionResultsControl.xaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,19 @@
2222
<codeInspections:InspectionImageSourceConverter x:Key="InspectionIconConverter" />
2323
<codeInspections:QuickFixImageSourceConverter x:Key="QuickFixIconConverter" />
2424
<codeInspections:InspectionsUIResourceKeyConverter x:Key="InspectionsUIResourceConverter" />
25+
<codeInspections:QuickFixCommandParametersToTupleConverter x:Key="QuickFixCommandParametersToTupleConverter" />
2526

2627
<Style TargetType="MenuItem" x:Key="QuickFixCommandStyle">
2728
<Setter Property="Header" Value="{Binding Key, Converter={StaticResource InspectionsUIResourceConverter}}" />
29+
<Setter Property="CommandParameter">
30+
<Setter.Value>
31+
<MultiBinding Converter="{StaticResource QuickFixCommandParametersToTupleConverter}">
32+
<Binding Path="Fix" />
33+
<Binding Path="SelectedItems" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type controls:GroupingGrid}}" />
34+
</MultiBinding>
35+
</Setter.Value>
36+
</Setter>
2837
<Setter Property="Command" Value="{Binding Command}"/>
29-
<Setter Property="CommandParameter" Value="{Binding Fix}"/>
3038
</Style>
3139

3240
<Style TargetType="MenuItem" x:Key="QuickFixItemStyle">

Rubberduck.Core/UI/Inspections/InspectionResultsViewModel.cs

Lines changed: 87 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ public InspectionResultsViewModel(
132132

133133
DisableInspectionCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteDisableInspectionCommand);
134134
QuickFixCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixCommand, CanExecuteQuickFixCommand);
135+
QuickFixSelectedItemsCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixForSelection, CanExecuteQuickFixForSelection);
135136
QuickFixInProcedureCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixInProcedureCommand, CanExecuteQuickFixInProcedure);
136137
QuickFixInModuleCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixInModuleCommand, CanExecuteQuickFixInModule);
137138
QuickFixInProjectCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteQuickFixInProjectCommand, CanExecuteQuickFixInProject);
@@ -144,6 +145,7 @@ public InspectionResultsViewModel(
144145
QuickFixCommands = new List<(ICommand command, string key)>
145146
{
146147
(QuickFixCommand,"QuickFix_Instance"),
148+
(QuickFixSelectedItemsCommand,"QuickFix_Selection"),
147149
(QuickFixInProcedureCommand,"QuickFix_ThisProcedure"),
148150
(QuickFixInModuleCommand,"QuickFix_ThisModule"),
149151
(QuickFixInProjectCommand,"QuickFix_ThisProject"),
@@ -339,6 +341,7 @@ private bool InspectionFilter(IInspectionResult result)
339341
public INavigateCommand NavigateCommand { get; }
340342
public CommandBase RefreshCommand { get; }
341343
public CommandBase QuickFixCommand { get; }
344+
public CommandBase QuickFixSelectedItemsCommand { get; }
342345
public CommandBase QuickFixInProcedureCommand { get; }
343346
public CommandBase QuickFixInModuleCommand { get; }
344347
public CommandBase QuickFixInProjectCommand { get; }
@@ -544,52 +547,92 @@ private void InvalidateStaleInspectionResults(ICollection<QualifiedModuleName> m
544547

545548
private void ExecuteQuickFixCommand(object parameter)
546549
{
547-
if (!(parameter is IQuickFix quickFix)
550+
if (!(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl)
548551
|| !(SelectedItem is IInspectionResult inspectionResult))
549552
{
550553
return;
551554
}
552555

556+
var (quickFix, _) = tpl;
557+
553558
_quickFixProvider.Fix(quickFix, inspectionResult);
554559
}
555560

556561
private bool CanExecuteQuickFixCommand(object parameter)
557562
{
558-
return !IsBusy
559-
&& parameter is IQuickFix
560-
&& _state.Status == ParserState.Ready;
563+
return !IsBusy
564+
&& _state.Status == ParserState.Ready
565+
&& parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>>;
566+
}
567+
568+
private void ExecuteQuickFixForSelection(object parameter)
569+
{
570+
if (!(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl))
571+
{
572+
return;
573+
}
574+
575+
var (quickFix, selectedItems) = tpl;
576+
577+
_quickFixProvider.Fix(
578+
quickFix,
579+
selectedItems);
580+
}
581+
582+
public bool CanExecuteQuickFixForSelection(object parameter)
583+
{
584+
if (!CanExecuteQuickFixCommand(parameter)
585+
|| !(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl))
586+
{
587+
return false;
588+
}
589+
590+
var (quickFix, selectedItems) = tpl;
591+
592+
return quickFix.CanFixMultiple
593+
&& (selectedItems?.All(result => _quickFixProvider.CanFix(quickFix, result)) ?? false);
561594
}
562595

563596
private void ExecuteQuickFixInProcedureCommand(object parameter)
564597
{
565-
if (!(parameter is IQuickFix quickFix)
598+
if (!(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl)
566599
|| !(SelectedItem is IInspectionResult inspectionResult))
567600
{
568601
return;
569602
}
570603

604+
var (quickFix, _) = tpl;
605+
571606
_quickFixProvider.FixInProcedure(
572-
quickFix,
607+
quickFix,
573608
inspectionResult.QualifiedMemberName,
574-
inspectionResult.Inspection.GetType(),
609+
inspectionResult.Inspection.GetType(),
575610
Results.OfType<IInspectionResult>());
576611
}
577612

578613
public bool CanExecuteQuickFixInProcedure(object parameter)
579614
{
580-
return CanExecuteQuickFixCommand(parameter)
581-
&& parameter is IQuickFix quickFix
582-
&& quickFix.CanFixInProcedure;
615+
if (!CanExecuteQuickFixCommand(parameter)
616+
|| !(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl))
617+
{
618+
return false;
619+
}
620+
621+
var (quickFix, _) = tpl;
622+
623+
return quickFix.CanFixInProcedure;
583624
}
584625

585626
private void ExecuteQuickFixInModuleCommand(object parameter)
586627
{
587-
if (!(parameter is IQuickFix quickFix)
628+
if (!(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl)
588629
|| !(SelectedItem is IInspectionResult inspectionResult))
589630
{
590631
return;
591632
}
592633

634+
var (quickFix, _) = tpl;
635+
593636
_quickFixProvider.FixInModule(
594637
quickFix,
595638
inspectionResult.QualifiedSelection,
@@ -599,19 +642,27 @@ private void ExecuteQuickFixInModuleCommand(object parameter)
599642

600643
public bool CanExecuteQuickFixInModule(object parameter)
601644
{
602-
return CanExecuteQuickFixCommand(parameter)
603-
&& parameter is IQuickFix quickFix
604-
&& quickFix.CanFixInModule;
645+
if (!CanExecuteQuickFixCommand(parameter)
646+
|| !(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl))
647+
{
648+
return false;
649+
}
650+
651+
var (quickFix, _) = tpl;
652+
653+
return quickFix.CanFixInModule;
605654
}
606655

607656
private void ExecuteQuickFixInProjectCommand(object parameter)
608657
{
609-
if (!(parameter is IQuickFix quickFix)
658+
if (!(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl)
610659
|| !(SelectedItem is IInspectionResult inspectionResult))
611660
{
612661
return;
613662
}
614663

664+
var (quickFix, _) = tpl;
665+
615666
_quickFixProvider.FixInProject(
616667
quickFix,
617668
inspectionResult.QualifiedSelection,
@@ -621,19 +672,27 @@ private void ExecuteQuickFixInProjectCommand(object parameter)
621672

622673
public bool CanExecuteQuickFixInProject(object parameter)
623674
{
624-
return CanExecuteQuickFixCommand(parameter)
625-
&& parameter is IQuickFix quickFix
626-
&& quickFix.CanFixInProject;
675+
if (!CanExecuteQuickFixCommand(parameter)
676+
|| !(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl))
677+
{
678+
return false;
679+
}
680+
681+
var (quickFix, _) = tpl;
682+
683+
return quickFix.CanFixInProject;
627684
}
628685

629686
private void ExecuteQuickFixInAllProjectsCommand(object parameter)
630687
{
631-
if (!(parameter is IQuickFix quickFix)
688+
if (!(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl)
632689
|| !(SelectedItem is IInspectionResult inspectionResult))
633690
{
634691
return;
635692
}
636693

694+
var (quickFix, _) = tpl;
695+
637696
_quickFixProvider.FixAll(
638697
quickFix,
639698
inspectionResult.Inspection.GetType(),
@@ -642,9 +701,15 @@ private void ExecuteQuickFixInAllProjectsCommand(object parameter)
642701

643702
public bool CanExecuteQuickFixAll(object parameter)
644703
{
645-
return CanExecuteQuickFixCommand(parameter)
646-
&& parameter is IQuickFix quickFix
647-
&& quickFix.CanFixAll;
704+
if (!CanExecuteQuickFixCommand(parameter)
705+
|| !(parameter is ValueTuple<IQuickFix, IEnumerable<IInspectionResult>> tpl))
706+
{
707+
return false;
708+
}
709+
710+
var (quickFix, _) = tpl;
711+
712+
return quickFix.CanFixAll;
648713
}
649714

650715
private void ExecuteDisableInspectionCommand(object parameter)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using System.Globalization;
5+
using System.Linq;
6+
using System.Windows.Data;
7+
using Rubberduck.CodeAnalysis.Inspections;
8+
using Rubberduck.CodeAnalysis.QuickFixes;
9+
10+
namespace Rubberduck.UI.Inspections
11+
{
12+
public class QuickFixCommandParametersToTupleConverter : IMultiValueConverter
13+
{
14+
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
15+
{
16+
(IQuickFix quickFix, IEnumerable<IInspectionResult> selectedResults) data = (
17+
values[0] as IQuickFix,
18+
((IEnumerable)values[1]).OfType<IInspectionResult>());
19+
return data;
20+
}
21+
22+
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
23+
{
24+
throw new NotImplementedException();
25+
}
26+
}
27+
}

Rubberduck.Resources/Inspections/InspectionsUI.Designer.cs

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

Rubberduck.Resources/Inspections/InspectionsUI.de.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@
202202
<value>Schweregrad</value>
203203
</data>
204204
<data name="QuickFix_Instance" xml:space="preserve">
205-
<value>Ausgewähltes Vorkommnis beheben</value>
205+
<value>Ausgewähltes Vorkommnis beheben</value>
206+
</data>
207+
<data name="QuickFix_Selection" xml:space="preserve">
208+
<value>Alle ausgewählten Vorkomnisse beheben</value>
206209
</data>
207210
</root>

Rubberduck.Resources/Inspections/InspectionsUI.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,7 @@
232232
<data name="QuickFix_Instance" xml:space="preserve">
233233
<value>Fix selected occurrence</value>
234234
</data>
235+
<data name="QuickFix_Selection" xml:space="preserve">
236+
<value>Fix all selected occurrences</value>
237+
</data>
235238
</root>

0 commit comments

Comments
 (0)