Skip to content

Commit f63202e

Browse files
committed
Wire up references event handlers.
1 parent b1f3dc5 commit f63202e

File tree

11 files changed

+182
-53
lines changed

11 files changed

+182
-53
lines changed

Rubberduck.Core/AddRemoveReferences/ReferenceReconciler.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace Rubberduck.AddRemoveReferences
1414
{
1515
public interface IReferenceReconciler
1616
{
17-
void ReconcileReferences(IAddRemoveReferencesModel model);
17+
List<ReferenceModel> ReconcileReferences(IAddRemoveReferencesModel model);
1818
List<ReferenceModel> ReconcileReferences(IAddRemoveReferencesModel model, List<ReferenceModel> allReferences);
1919
ReferenceModel TryAddReference(IVBProject project, string path);
2020
ReferenceModel TryAddReference(IVBProject project, ReferenceModel reference);
@@ -35,14 +35,14 @@ public ReferenceReconciler(IMessageBox messageBox, IConfigProvider<ReferenceSett
3535
_tlbProvider = tlbProvider;
3636
}
3737

38-
public void ReconcileReferences(IAddRemoveReferencesModel model)
38+
public List<ReferenceModel> ReconcileReferences(IAddRemoveReferencesModel model)
3939
{
4040
if (model?.NewReferences is null || !model.NewReferences.Any())
4141
{
42-
return;
42+
return null;
4343
}
4444

45-
ReconcileReferences(model, model.NewReferences.ToList());
45+
return ReconcileReferences(model, model.NewReferences.ToList());
4646
}
4747

4848
//TODO test for simple adds.

Rubberduck.Core/Settings/ReferenceConfigProvider.cs

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,38 @@
11
using System;
22
using System.IO;
33
using System.Reflection;
4+
using System.Windows.Forms;
45
using Rubberduck.Resources.Registration;
56
using Rubberduck.SettingsProvider;
67
using Rubberduck.UI;
78
using Rubberduck.VBEditor;
9+
using Rubberduck.VBEditor.Events;
10+
using Rubberduck.VBEditor.SafeComWrappers;
811

912
namespace Rubberduck.Settings
1013
{
11-
public class ReferenceConfigProvider : IConfigProvider<ReferenceSettings>
14+
public class ReferenceConfigProvider : IConfigProvider<ReferenceSettings>, IDisposable
1215
{
16+
private static readonly string HostApplication = Path.GetFileName(Application.ExecutablePath).ToUpperInvariant();
17+
1318
private readonly IPersistanceService<ReferenceSettings> _persister;
1419
private readonly IEnvironmentProvider _environment;
20+
private readonly IVBEEvents _events;
21+
private bool _listening;
1522

16-
public ReferenceConfigProvider(IPersistanceService<ReferenceSettings> persister, IEnvironmentProvider environment)
23+
public ReferenceConfigProvider(IPersistanceService<ReferenceSettings> persister, IEnvironmentProvider environment, IVBEEvents events)
1724
{
1825
_persister = persister;
1926
_environment = environment;
27+
_events = events;
28+
29+
30+
var settings = Create();
31+
_listening = settings.AddToRecentOnReferenceEvents;
32+
if (_listening)
33+
{
34+
_events.ProjectReferenceAdded += ReferenceAddedHandler;
35+
}
2036
}
2137

2238
public ReferenceSettings Create()
@@ -63,7 +79,53 @@ public ReferenceSettings CreateDefaults()
6379

6480
public void Save(ReferenceSettings settings)
6581
{
82+
if (_listening && !settings.AddToRecentOnReferenceEvents)
83+
{
84+
_events.ProjectReferenceAdded -= ReferenceAddedHandler;
85+
_listening = false;
86+
}
87+
88+
if (_listening && !settings.AddToRecentOnReferenceEvents)
89+
{
90+
_events.ProjectReferenceAdded += ReferenceAddedHandler;
91+
_listening = true;
92+
}
93+
6694
_persister.Save(settings);
6795
}
96+
97+
private void ReferenceAddedHandler(object sender, ReferenceEventArgs e)
98+
{
99+
if (e is null || e.Reference.Equals(ReferenceInfo.Empty))
100+
{
101+
return;
102+
}
103+
104+
var settings = Create();
105+
settings.TrackUsage(e.Reference, e.Type == ReferenceKind.Project ? HostApplication : null);
106+
_persister.Save(settings);
107+
}
108+
109+
public void Dispose()
110+
{
111+
Dispose(true);
112+
GC.SuppressFinalize(this);
113+
}
114+
115+
private bool _disposed;
116+
protected virtual void Dispose(bool disposing)
117+
{
118+
if (_disposed)
119+
{
120+
return;
121+
}
122+
123+
if (disposing && _listening)
124+
{
125+
_events.ProjectReferenceAdded -= ReferenceAddedHandler;
126+
}
127+
128+
_disposed = true;
129+
}
68130
}
69131
}

Rubberduck.Core/UI/AddRemoveReferences/AddRemoveReferencesViewModel.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ public class AddRemoveReferencesViewModel : ViewModelBase
3232
{ "WINWORD.EXE", new [] {"docm","dotm","doc","dot"} },
3333
{ "MSACCESS.EXE", new [] {"accdb","mdb","mda","mde","accde"} },
3434
{ "POWERPNT.EXE", new [] {"ppam","ppa"} },
35-
// TODO
36-
//{ "OUTLOOK.EXE", new [] {"?"} },
35+
{ "OUTLOOK.EXE", new [] {"otm"} },
36+
{ "MSPUB.EXE", new [] {"pub"} },
37+
{ "VISIO.EXE", new [] {"vsd","vdx","vss","vst","vtx","vsw","vdw","vsdx","vsdm"} },
38+
// TODO
3739
//{ "WINPROJ.EXE", new [] {"?"} },
38-
//{ "MSPUB.EXE", new [] {"?"} },
39-
//{ "VISIO.EXE", new [] {"?"} },
4040
//{ "ACAD.EXE", new [] {"?"} },
4141
//{ "CORELDRW.EXE", new [] {"?"} }
4242
};
@@ -47,6 +47,9 @@ public class AddRemoveReferencesViewModel : ViewModelBase
4747
{ "WINWORD.EXE", string.Format(RubberduckUI.References_BrowseFilterWord, string.Join(";", HostFileFilters["WINWORD.EXE"].Select(_ => $"*.{_}"))) },
4848
{ "MSACCESS.EXE", string.Format(RubberduckUI.References_BrowseFilterAccess, string.Join(";", HostFileFilters["MSACCESS.EXE"].Select(_ => $"*.{_}"))) },
4949
{ "POWERPNT.EXE", string.Format(RubberduckUI.References_BrowseFilterPowerPoint, string.Join(";", HostFileFilters["POWERPNT.EXE"].Select(_ => $"*.{_}"))) },
50+
{ "OUTLOOK.EXE", string.Format(RubberduckUI.References_BrowseFilterOutlook, string.Join(";", HostFileFilters["OUTLOOK.EXE"].Select(_ => $"*.{_}"))) },
51+
{ "MSPUB.EXE", string.Format(RubberduckUI.References_BrowseFilterOutlook, string.Join(";", HostFileFilters["MSPUB.EXE"].Select(_ => $"*.{_}"))) },
52+
{ "VISIO.EXE", string.Format(RubberduckUI.References_BrowseFilterVisio, string.Join(";", HostFileFilters["VISIO.EXE"].Select(_ => $"*.{_}"))) },
5053
};
5154

5255
private static readonly List<string> FileFilters = new List<string>

Rubberduck.Resources/RubberduckUI.Designer.cs

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

Rubberduck.Resources/RubberduckUI.resx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,4 +1422,16 @@ NOTE: Restart is required for the setting to take effect.</value>
14221422
<data name="ReferenceSettings_TrackHostReferences" xml:space="preserve">
14231423
<value>Track references not added by Rubberduck</value>
14241424
</data>
1425+
<data name="References_BrowseFilterOutlook" xml:space="preserve">
1426+
<value>Outlook VBA Files ({0})|{0}</value>
1427+
<comment>{0} = semi-colon delimited extension list in the format of *.ext</comment>
1428+
</data>
1429+
<data name="References_BrowseFilterPublisher" xml:space="preserve">
1430+
<value>Publisher Files ({0}|{0}</value>
1431+
<comment>{0} = semi-colon delimited extension list in the format of *.ext</comment>
1432+
</data>
1433+
<data name="References_BrowseFilterVisio" xml:space="preserve">
1434+
<value>All Visio Files ({0})|{0}</value>
1435+
<comment>{0} = semi-colon delimited extension list in the format of *.ext</comment>
1436+
</data>
14251437
</root>

Rubberduck.VBEEditor/Events/IVbeEvents.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using Rubberduck.VBEditor.SafeComWrappers;
23

34
namespace Rubberduck.VBEditor.Events
45
{
@@ -14,6 +15,8 @@ public interface IVBEEvents
1415
event EventHandler<ComponentEventArgs> ComponentSelected;
1516
event EventHandler<ComponentEventArgs> ComponentActivated;
1617
event EventHandler<ComponentEventArgs> ComponentReloaded;
18+
event EventHandler<ReferenceEventArgs> ProjectReferenceAdded;
19+
event EventHandler<ReferenceEventArgs> ProjectReferenceRemoved;
1720
event EventHandler EventsTerminated;
1821
}
1922
}

Rubberduck.VBEEditor/Events/VbeEvents.cs

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public sealed class VBEEvents : IVBEEvents
1212
private static readonly object Lock = new object();
1313
private readonly IVBProjects _projects;
1414
private readonly Dictionary<string, IVBComponents> _components;
15+
private readonly Dictionary<string, IReferences> _references;
1516

1617
public static VBEEvents Initialize(IVBE vbe)
1718
{
@@ -43,6 +44,7 @@ public static void Terminate()
4344
private VBEEvents(IVBE vbe)
4445
{
4546
_components = new Dictionary<string, IVBComponents>();
47+
_references = new Dictionary<string, IReferences>();
4648

4749
if (_projects != null)
4850
{
@@ -60,12 +62,12 @@ private VBEEvents(IVBE vbe)
6062
using (project)
6163
{
6264
{
63-
RegisterComponents(project);
65+
RegisterProjectHandlers(project);
6466
}
6567
}
6668
}
6769

68-
private void RegisterComponents(string projectId, string projectName)
70+
private void RegisterProjectHandlers(string projectId, string projectName)
6971
{
7072
IVBProject project = null;
7173
foreach (var item in _projects)
@@ -84,10 +86,10 @@ private void RegisterComponents(string projectId, string projectName)
8486
return;
8587
}
8688

87-
RegisterComponents(project);
89+
RegisterProjectHandlers(project);
8890
}
8991

90-
private void RegisterComponents(IVBProject project)
92+
private void RegisterProjectHandlers(IVBProject project)
9193
{
9294
if (project.IsWrappingNullReference || project.Protection != ProjectProtection.Unprotected)
9395
{
@@ -106,9 +108,15 @@ private void RegisterComponents(IVBProject project)
106108
components.ComponentActivated += ComponentActivatedHandler;
107109
components.ComponentSelected += ComponentSelectedHandler;
108110
components.ComponentReloaded += ComponentReloadedHandler;
111+
112+
var references = project.References;
113+
_references.Add(project.ProjectId, references);
114+
references.AttachEvents();
115+
references.ItemAdded += ProjectReferenceAddedHandler;
116+
references.ItemRemoved += ProjectReferenceRemovedHandler;
109117
}
110118

111-
private void UnregisterComponents(string projectId)
119+
private void UnregisterProjectHandlers(string projectId)
112120
{
113121
if (!_components.ContainsKey(projectId))
114122
{
@@ -127,22 +135,30 @@ private void UnregisterComponents(string projectId)
127135

128136
_components.Remove(projectId);
129137
}
138+
139+
using (var references = _references[projectId])
140+
{
141+
references.ItemAdded -= ProjectReferenceAddedHandler;
142+
references.ItemRemoved -= ProjectReferenceRemovedHandler;
143+
references.DetachEvents();
144+
_references.Remove(projectId);
145+
}
130146
}
131147

132148
public event EventHandler<ProjectEventArgs> ProjectAdded;
133149
private void ProjectAddedHandler(object sender, ProjectEventArgs e)
134150
{
135151
if (!_components.ContainsKey(e.ProjectId))
136152
{
137-
RegisterComponents(e.ProjectId, e.ProjectName);
153+
RegisterProjectHandlers(e.ProjectId, e.ProjectName);
138154
}
139155
ProjectAdded?.Invoke(sender, e);
140156
}
141157

142158
public event EventHandler<ProjectEventArgs> ProjectRemoved;
143159
private void ProjectRemovedHandler(object sender, ProjectEventArgs e)
144160
{
145-
UnregisterComponents(e.ProjectId);
161+
UnregisterProjectHandlers(e.ProjectId);
146162
ProjectRemoved?.Invoke(sender, e);
147163
}
148164

@@ -188,12 +204,27 @@ private void ComponentSelectedHandler(object sender, ComponentEventArgs e)
188204
ComponentSelected?.Invoke(sender, e);
189205
}
190206

191-
public event EventHandler<ComponentEventArgs> ComponentReloaded;
207+
public event EventHandler<ComponentEventArgs> ComponentReloaded;
208+
192209
private void ComponentReloadedHandler(object sender, ComponentEventArgs e)
193210
{
194211
ComponentReloaded?.Invoke(sender, e);
195212
}
196213

214+
public event EventHandler<ReferenceEventArgs> ProjectReferenceAdded;
215+
216+
private void ProjectReferenceAddedHandler(object sender, ReferenceEventArgs e)
217+
{
218+
ProjectReferenceAdded?.Invoke(sender, e);
219+
}
220+
221+
public event EventHandler<ReferenceEventArgs> ProjectReferenceRemoved;
222+
223+
private void ProjectReferenceRemovedHandler(object sender, ReferenceEventArgs e)
224+
{
225+
ProjectReferenceRemoved?.Invoke(sender, e);
226+
}
227+
197228
public event EventHandler EventsTerminated;
198229

199230
#region IDisposable
@@ -214,7 +245,7 @@ private void Dispose(bool disposing)
214245
var projectIds = _components.Keys.ToArray();
215246
foreach (var projectid in projectIds)
216247
{
217-
UnregisterComponents(projectid);
248+
UnregisterProjectHandlers(projectid);
218249
}
219250

220251
_projects.ProjectActivated -= ProjectActivatedHandler;
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
using System;
2-
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
32

43
namespace Rubberduck.VBEditor.SafeComWrappers
54
{
65
public class ReferenceEventArgs : EventArgs
76
{
8-
public ReferenceEventArgs(IReference reference)
7+
public ReferenceEventArgs(ReferenceInfo reference, ReferenceKind type)
98
{
109
Reference = reference;
10+
Type = type;
1111
}
1212

13-
public IReference Reference { get; }
13+
public ReferenceInfo Reference { get; }
14+
public ReferenceKind Type { get; }
1415
}
1516
}

Rubberduck.VBEEditor/SafeComWrappers/VB/Abstract/IReferences.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Rubberduck.VBEditor.SafeComWrappers.Abstract
44
{
5-
public interface IReferences : ISafeComWrapper, IComCollection<IReference>, IEquatable<IReferences>
5+
public interface IReferences : ISafeEventedComWrapper, IComCollection<IReference>, IEquatable<IReferences>
66
{
77
event EventHandler<ReferenceEventArgs> ItemAdded;
88
event EventHandler<ReferenceEventArgs> ItemRemoved;

0 commit comments

Comments
 (0)