Skip to content

Commit f58113c

Browse files
committed
UI tweaks for ExtractInterface refactoring to work with transient viewmodel correctly. Removed the InterfaceMemberViewModel to simplify the binding and update the refactoring to work off the selection, rather than assuming that all members are used.
1 parent 9f8fef1 commit f58113c

File tree

7 files changed

+46
-73
lines changed

7 files changed

+46
-73
lines changed

Rubberduck.Core/UI/Refactorings/ExtractInterface/ExtractInterfaceView.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
<ColumnDefinition Width="auto" />
9696
</Grid.ColumnDefinitions>
9797

98-
<DataGrid ItemsSource="{Binding Members}"
98+
<DataGrid ItemsSource="{Binding Members, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
9999
Grid.Column="0"
100100
HorizontalAlignment="Stretch"
101101
AutoGenerateColumns="False"
@@ -122,7 +122,7 @@
122122
</DataGrid.CellStyle>
123123
<DataGrid.Columns>
124124
<DataGridCheckBoxColumn Width="Auto"
125-
Binding="{Binding IsSelected}" />
125+
Binding="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
126126
<DataGridTextColumn Binding="{Binding FullMemberSignature}"
127127
Width="*"
128128
IsReadOnly="True"

Rubberduck.Core/UI/Refactorings/ExtractInterface/ExtractInterfaceViewModel.cs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Collections.ObjectModel;
34
using System.Linq;
45
using NLog;
56
using Rubberduck.Parsing.Grammar;
67
using Rubberduck.Parsing.Symbols;
78
using Rubberduck.Refactorings.ExtractInterface;
89
using Rubberduck.UI.Command;
9-
using Rubberduck.UI.Refactorings.ExtractInterface;
1010

1111
namespace Rubberduck.UI.Refactorings
1212
{
@@ -22,23 +22,14 @@ public ExtractInterfaceViewModel(ExtractInterfaceModel model) : base(model)
2222
.Where(moduleDeclaration => moduleDeclaration.ProjectId == Model.TargetDeclaration.ProjectId)
2323
.Select(module => module.ComponentName)
2424
.ToList();
25-
_members = Model.Members.Select(m => m.ToViewModel()).ToList();
26-
UpdateModelMembers();
2725
}
2826

29-
private void UpdateModelMembers()
27+
public ObservableCollection<InterfaceMember> Members
3028
{
31-
Model.Members = _members.Where(m => m.IsSelected).Select(vm => vm.ToModel()).ToList();
32-
}
33-
34-
private List<InterfaceMemberViewModel> _members;
35-
public List<InterfaceMemberViewModel> Members
36-
{
37-
get => _members;
29+
get => Model.Members;
3830
set
3931
{
40-
_members = value;
41-
UpdateModelMembers();
32+
Model.Members = value;
4233
OnPropertyChanged();
4334
}
4435
}
@@ -76,7 +67,7 @@ private void ToggleSelection(bool value)
7667
{
7768
item.IsSelected = value;
7869
}
79-
UpdateModelMembers();
70+
OnPropertyChanged(nameof(Members));
8071
}
8172

8273
public CommandBase SelectAllCommand { get; }

Rubberduck.Core/UI/Refactorings/ExtractInterface/InterfaceMemberViewModel.cs

Lines changed: 0 additions & 40 deletions
This file was deleted.

Rubberduck.Refactorings/ExtractInterface/ExtractInterfaceModel.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Collections.ObjectModel;
23
using System.Linq;
34
using Rubberduck.Parsing.Symbols;
45
using Rubberduck.Parsing.VBA;
@@ -13,7 +14,9 @@ public class ExtractInterfaceModel
1314

1415
public string InterfaceName { get; set; }
1516

16-
public IEnumerable<InterfaceMember> Members { get; set; } = new List<InterfaceMember>();
17+
public ObservableCollection<InterfaceMember> Members { get; set; } = new ObservableCollection<InterfaceMember>();
18+
19+
public IEnumerable<InterfaceMember> SelectedMembers => Members.Where(m => m.IsSelected);
1720

1821
private static readonly DeclarationType[] ModuleTypes =
1922
{
@@ -47,14 +50,15 @@ public ExtractInterfaceModel(RubberduckParserState state, QualifiedSelection sel
4750

4851
InterfaceName = $"I{TargetDeclaration.IdentifierName}";
4952

50-
Members = declarations.Where(item => item.ProjectId == TargetDeclaration.ProjectId
51-
&& item.ComponentName == TargetDeclaration.ComponentName
52-
&& (item.Accessibility == Accessibility.Public || item.Accessibility == Accessibility.Implicit)
53-
&& MemberTypes.Contains(item.DeclarationType))
54-
.OrderBy(o => o.Selection.StartLine)
55-
.ThenBy(t => t.Selection.StartColumn)
56-
.Select(d => new InterfaceMember(d))
57-
.ToList();
53+
Members = new ObservableCollection<InterfaceMember>(declarations.Where(item =>
54+
item.ProjectId == TargetDeclaration.ProjectId
55+
&& item.ComponentName == TargetDeclaration.ComponentName
56+
&& (item.Accessibility == Accessibility.Public || item.Accessibility == Accessibility.Implicit)
57+
&& MemberTypes.Contains(item.DeclarationType))
58+
.OrderBy(o => o.Selection.StartLine)
59+
.ThenBy(t => t.Selection.StartColumn)
60+
.Select(d => new InterfaceMember(d))
61+
.ToList());
5862
}
5963
}
6064
}

Rubberduck.Refactorings/ExtractInterface/ExtractInterfaceRefactoring.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Linq;
43
using NLog;
54
using Rubberduck.Interaction;
@@ -175,12 +174,12 @@ private void AddInterfaceClass(Declaration implementingClass, string interfaceNa
175174
private void AddInterfaceMembersToClass(IModuleRewriter rewriter)
176175
{
177176
var implementInterfaceRefactoring = new ImplementInterfaceRefactoring(_vbe, _model.State, _messageBox, _rewritingManager);
178-
implementInterfaceRefactoring.Refactor(_model.Members.Select(m => m.Member).ToList(), rewriter, _model.InterfaceName);
177+
implementInterfaceRefactoring.Refactor(_model.SelectedMembers.Select(m => m.Member).ToList(), rewriter, _model.InterfaceName);
179178
}
180179

181180
private string GetInterfaceModuleBody()
182181
{
183-
return string.Join(Environment.NewLine, _model.Members.Select(m => m.Body));
182+
return string.Join(Environment.NewLine, _model.SelectedMembers.Select(m => m.Body));
184183
}
185184
}
186185
}

Rubberduck.Refactorings/ExtractInterface/InterfaceMember.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.ComponentModel;
34
using System.Linq;
5+
using System.Runtime.CompilerServices;
46
using Rubberduck.Parsing.Grammar;
57
using Rubberduck.Parsing.Symbols;
6-
using Rubberduck.UI;
78

89
namespace Rubberduck.Refactorings.ExtractInterface
910
{
@@ -19,14 +20,24 @@ public override string ToString()
1920
}
2021
}
2122

22-
public class InterfaceMember
23+
public class InterfaceMember : INotifyPropertyChanged
2324
{
2425
public Declaration Member { get; }
2526
public IEnumerable<Parameter> MemberParams { get; }
2627
private string Type { get; }
27-
2828
private string MemberType { get; set; }
2929

30+
private bool _isSelected;
31+
public bool IsSelected
32+
{
33+
get => _isSelected;
34+
set
35+
{
36+
_isSelected = value;
37+
OnPropertyChanged();
38+
}
39+
}
40+
3041
public string Identifier { get; }
3142

3243
public string FullMemberSignature
@@ -103,5 +114,11 @@ private void GetMethodType()
103114
}
104115

105116
public string Body => string.Format("Public {0}{1}End {2}{1}", FullMemberSignature, Environment.NewLine, MemberType.Split(' ').First());
117+
public event PropertyChangedEventHandler PropertyChanged;
118+
119+
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
120+
{
121+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
122+
}
106123
}
107124
}

RubberduckTests/Refactoring/ExtractInterfaceTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.ObjectModel;
12
using System.Linq;
23
using System.Windows.Forms;
34
using NUnit.Framework;
@@ -250,7 +251,8 @@ End Function
250251

251252
//Specify Params to remove
252253
var model = new ExtractInterfaceModel(state, qualifiedSelection);
253-
model.Members = model.Members.Where(member => !member.FullMemberSignature.Contains("Property")).ToList();
254+
model.Members = new ObservableCollection<InterfaceMember>(model.Members
255+
.Where(member => !member.FullMemberSignature.Contains("Property")).ToList());
254256

255257
//SetupFactory
256258
var factory = SetupFactory(model);
@@ -392,7 +394,7 @@ End Sub
392394

393395
//Specify Params to remove
394396
var model = new ExtractInterfaceModel(state, qualifiedSelection);
395-
model.Members = new[]{ model.Members.ElementAt(0) }.ToList();
397+
model.Members = new ObservableCollection<InterfaceMember>(new[] {model.Members.ElementAt(0)}.ToList());
396398

397399
//SetupFactory
398400
var factory = SetupFactory(model);

0 commit comments

Comments
 (0)