Skip to content

Commit 091b637

Browse files
committed
Recognize pre-existing ObjectStateUDT
If an existing ObjectStateUDT (from a prior encapuslate field operation) can be found, then setup the refactoring to add to the ObjectStateUDT.
1 parent 42a7bab commit 091b637

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

Rubberduck.Core/UI/Refactorings/EncapsulateField/EncapsulateFieldViewModel.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,14 @@ private void ManageEncapsulationFlagsAndSelectedItem(object param = null)
367367
var selected = _lastCheckedBoxes.FirstOrDefault();
368368
if (_lastCheckedBoxes.Count == EncapsulationFields.Where(f => f.EncapsulateFlag).Count())
369369
{
370+
_lastCheckedBoxes = EncapsulationFields.Where(f => f.EncapsulateFlag).ToList();
371+
if (EncapsulationFields.Where(f => f.EncapsulateFlag).Count() == 0
372+
&& EncapsulationFields.Count() > 0)
373+
{
374+
SetSelectedField(EncapsulationFields.First());
375+
return;
376+
}
377+
SetSelectedField(_lastCheckedBoxes.First());
370378
return;
371379
}
372380

@@ -390,6 +398,11 @@ private void ManageEncapsulationFlagsAndSelectedItem(object param = null)
390398

391399
_lastCheckedBoxes = EncapsulationFields.Where(ef => ef.EncapsulateFlag).ToList();
392400

401+
SetSelectedField(selected);
402+
}
403+
404+
private void SetSelectedField(IEncapsulatedFieldViewData selected)
405+
{
393406
_masterDetail.SelectionTargetID = selected?.TargetID ?? null;
394407
OnPropertyChanged(nameof(SelectedField));
395408
if (_masterDetail.DetailUpdateRequired)

Rubberduck.Refactorings/EncapsulateField/EncapsulateFIeldResources.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ namespace Rubberduck.Refactorings.EncapsulateField
1212
public class EncapsulateFieldResources
1313
{
1414
public static string PreviewEndOfChangesMarker
15-
=> "'<===== No Changes below this line =====>";
15+
=> "'<===== Property and Declaration changes above this line =====>";
1616

1717
public static string DefaultPropertyParameter => "value";
1818

1919
public static string DefaultStateUDTFieldName => "this";
2020

21+
//TODO: Is it meaningful to change the Type prefix for different cultures?
22+
//If not, remove this declaration
2123
public static string StateUserDefinedTypeIdentifierPrefix => "T";
2224

2325
public static string GroupBoxHeaderSuffix = "Encapsulation Property Name:";

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public bool ConvertFieldsToUDTMembers
6666

6767
public string PreviewRefactoring() => _previewDelegate(this);
6868

69-
private List<IObjectStateUDT> _objStateCandidates;
69+
private HashSet<IObjectStateUDT> _objStateCandidates;
7070
public IEnumerable<IObjectStateUDT> ObjectStateUDTCandidates
7171
{
7272
get
@@ -76,7 +76,7 @@ public IEnumerable<IObjectStateUDT> ObjectStateUDTCandidates
7676
return _objStateCandidates;
7777
}
7878

79-
_objStateCandidates = new List<IObjectStateUDT>();
79+
_objStateCandidates = new HashSet<IObjectStateUDT>();
8080
foreach (var candidate in UDTFieldCandidates.Where(udt => udt.CanBeObjectStateUDT))
8181
{
8282
_objStateCandidates.Add(new ObjectStateUDT(candidate));

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldRefactoring.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,13 @@ protected override EncapsulateFieldModel InitializeModel(Declaration target)
9292
var selected = candidates.Single(c => c.Declaration == target);
9393
selected.EncapsulateFlag = true;
9494

95-
if (!TryRetrieveExistingObjectStateUDT(target, candidates, out var objectStateUDT))
95+
var forceUseOfObjectStateUDT = false;
96+
if (TryRetrieveExistingObjectStateUDT(target, candidates, out var objectStateUDT))
97+
{
98+
objectStateUDT.IsSelected = true;
99+
forceUseOfObjectStateUDT = true;
100+
}
101+
else
96102
{
97103
objectStateUDT = _encapsulationCandidateFactory.CreateStateUDTField();
98104
objectStateUDT.IsSelected = true;
@@ -110,6 +116,7 @@ protected override EncapsulateFieldModel InitializeModel(Declaration target)
110116
.OrderBy(c => c.Selection)
111117
.FirstOrDefault()?.Context.Start.TokenIndex ?? null;
112118

119+
Model.ConvertFieldsToUDTMembers = forceUseOfObjectStateUDT;
113120
return Model;
114121
}
115122

0 commit comments

Comments
 (0)