Skip to content

Commit f2f8f9e

Browse files
committed
2 parents 304be32 + f997f89 commit f2f8f9e

File tree

447 files changed

+70652
-41041
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

447 files changed

+70652
-41041
lines changed

RetailCoder.VBE/App.cs

Lines changed: 171 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,30 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
24
using System.Globalization;
35
using System.Linq;
6+
using System.Runtime.InteropServices.ComTypes;
47
using System.Threading.Tasks;
58
using System.Windows.Forms;
69
using Microsoft.Vbe.Interop;
710
using NLog;
8-
using Rubberduck.AutoSave;
911
using Rubberduck.Common;
10-
using Rubberduck.Inspections;
1112
using Rubberduck.Parsing;
1213
using Rubberduck.Parsing.VBA;
1314
using Rubberduck.Settings;
1415
using Rubberduck.SmartIndenter;
1516
using Rubberduck.UI;
1617
using Rubberduck.UI.Command.MenuItems;
17-
using Rubberduck.UI.ParserErrors;
18-
using Rubberduck.VBEditor.Extensions;
1918
using Infralution.Localization.Wpf;
19+
using Rubberduck.Common.Dispatch;
2020

2121
namespace Rubberduck
2222
{
2323
public class App : IDisposable
2424
{
2525
private readonly VBE _vbe;
2626
private readonly IMessageBox _messageBox;
27-
private readonly IParserErrorsPresenterFactory _parserErrorsPresenterFactory;
2827
private readonly IRubberduckParser _parser;
29-
private readonly IInspectorFactory _inspectorFactory;
3028
private readonly AutoSave.AutoSave _autoSave;
3129
private readonly IGeneralConfigService _configService;
3230
private readonly IAppMenu _appMenus;
@@ -38,10 +36,14 @@ public class App : IDisposable
3836

3937
private Configuration _config;
4038

39+
private readonly IConnectionPoint _projectsEventsConnectionPoint;
40+
private readonly int _projectsEventsCookie;
41+
42+
private readonly IDictionary<VBComponents, Tuple<IConnectionPoint, int>> _componentsEventsConnectionPoints =
43+
new Dictionary<VBComponents, Tuple<IConnectionPoint, int>>();
44+
4145
public App(VBE vbe, IMessageBox messageBox,
42-
IParserErrorsPresenterFactory parserErrorsPresenterFactory,
4346
IRubberduckParser parser,
44-
IInspectorFactory inspectorFactory,
4547
IGeneralConfigService configService,
4648
IAppMenu appMenus,
4749
RubberduckCommandBar stateBar,
@@ -50,25 +52,170 @@ public App(VBE vbe, IMessageBox messageBox,
5052
{
5153
_vbe = vbe;
5254
_messageBox = messageBox;
53-
_parserErrorsPresenterFactory = parserErrorsPresenterFactory;
5455
_parser = parser;
55-
_inspectorFactory = inspectorFactory;
56-
_autoSave = new AutoSave.AutoSave(_vbe, new AutoSaveSettings());
5756
_configService = configService;
57+
_autoSave = new AutoSave.AutoSave(_vbe, _configService);
5858
_appMenus = appMenus;
5959
_stateBar = stateBar;
6060
_indenter = indenter;
6161
//_hooks = hooks;
6262
_logger = LogManager.GetCurrentClassLogger();
6363

6464
//_hooks.MessageReceived += hooks_MessageReceived;
65-
_configService.SettingsChanged += _configService_SettingsChanged;
65+
_configService.LanguageChanged += ConfigServiceLanguageChanged;
6666
_parser.State.StateChanged += Parser_StateChanged;
6767
_stateBar.Refresh += _stateBar_Refresh;
6868

69+
var sink = new VBProjectsEventsSink();
70+
var connectionPointContainer = (IConnectionPointContainer)_vbe.VBProjects;
71+
var interfaceId = typeof (_dispVBProjectsEvents).GUID;
72+
connectionPointContainer.FindConnectionPoint(ref interfaceId, out _projectsEventsConnectionPoint);
73+
74+
sink.ProjectAdded += sink_ProjectAdded;
75+
sink.ProjectRemoved += sink_ProjectRemoved;
76+
sink.ProjectActivated += sink_ProjectActivated;
77+
sink.ProjectRenamed += sink_ProjectRenamed;
78+
79+
_projectsEventsConnectionPoint.Advise(sink, out _projectsEventsCookie);
80+
6981
UiDispatcher.Initialize();
7082
}
7183

84+
async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
85+
{
86+
Debug.WriteLine(string.Format("Project '{0}' was removed.", e.Item.Name));
87+
Tuple<IConnectionPoint, int> value;
88+
if (_componentsEventsConnectionPoints.TryGetValue(e.Item.VBComponents, out value))
89+
{
90+
value.Item1.Unadvise(value.Item2);
91+
_componentsEventsConnectionPoints.Remove(e.Item.VBComponents);
92+
93+
_parser.State.ClearDeclarations(e.Item);
94+
}
95+
}
96+
97+
async void sink_ProjectAdded(object sender, DispatcherEventArgs<VBProject> e)
98+
{
99+
if (!_parser.State.AllDeclarations.Any())
100+
{
101+
// forces menus to evaluate their CanExecute state:
102+
Parser_StateChanged(this, new ParserStateEventArgs(ParserState.Pending));
103+
_stateBar.SetStatusText();
104+
return;
105+
}
106+
107+
Debug.WriteLine(string.Format("Project '{0}' was added.", e.Item.Name));
108+
var connectionPointContainer = (IConnectionPointContainer)e.Item.VBComponents;
109+
var interfaceId = typeof(_dispVBComponentsEvents).GUID;
110+
111+
IConnectionPoint connectionPoint;
112+
connectionPointContainer.FindConnectionPoint(ref interfaceId, out connectionPoint);
113+
114+
var sink = new VBComponentsEventsSink();
115+
sink.ComponentActivated += sink_ComponentActivated;
116+
sink.ComponentAdded += sink_ComponentAdded;
117+
sink.ComponentReloaded += sink_ComponentReloaded;
118+
sink.ComponentRemoved += sink_ComponentRemoved;
119+
sink.ComponentRenamed += sink_ComponentRenamed;
120+
sink.ComponentSelected += sink_ComponentSelected;
121+
122+
int cookie;
123+
connectionPoint.Advise(sink, out cookie);
124+
125+
_componentsEventsConnectionPoints.Add(e.Item.VBComponents, Tuple.Create(connectionPoint, cookie));
126+
_parser.State.OnParseRequested(sender);
127+
}
128+
129+
async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent> e)
130+
{
131+
if (!_parser.State.AllDeclarations.Any())
132+
{
133+
return;
134+
}
135+
136+
Debug.WriteLine(string.Format("Component '{0}' was selected.", e.Item.Name));
137+
// do something?
138+
}
139+
140+
async void sink_ComponentRenamed(object sender, DispatcherRenamedEventArgs<VBComponent> e)
141+
{
142+
if (!_parser.State.AllDeclarations.Any())
143+
{
144+
return;
145+
}
146+
147+
Debug.WriteLine(string.Format("Component '{0}' was renamed.", e.Item.Name));
148+
149+
_parser.State.OnParseRequested(sender, e.Item);
150+
}
151+
152+
async void sink_ComponentRemoved(object sender, DispatcherEventArgs<VBComponent> e)
153+
{
154+
if (!_parser.State.AllDeclarations.Any())
155+
{
156+
return;
157+
}
158+
159+
Debug.WriteLine(string.Format("Component '{0}' was removed.", e.Item.Name));
160+
_parser.State.ClearDeclarations(e.Item);
161+
}
162+
163+
async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent> e)
164+
{
165+
if (!_parser.State.AllDeclarations.Any())
166+
{
167+
return;
168+
}
169+
170+
Debug.WriteLine(string.Format("Component '{0}' was reloaded.", e.Item.Name));
171+
_parser.State.OnParseRequested(sender, e.Item);
172+
}
173+
174+
async void sink_ComponentAdded(object sender, DispatcherEventArgs<VBComponent> e)
175+
{
176+
if (!_parser.State.AllDeclarations.Any())
177+
{
178+
return;
179+
}
180+
181+
Debug.WriteLine(string.Format("Component '{0}' was added.", e.Item.Name));
182+
_parser.State.OnParseRequested(sender, e.Item);
183+
}
184+
185+
async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponent> e)
186+
{
187+
if (!_parser.State.AllDeclarations.Any())
188+
{
189+
return;
190+
}
191+
192+
Debug.WriteLine(string.Format("Component '{0}' was activated.", e.Item.Name));
193+
// do something?
194+
}
195+
196+
async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProject> e)
197+
{
198+
if (!_parser.State.AllDeclarations.Any())
199+
{
200+
return;
201+
}
202+
203+
Debug.WriteLine(string.Format("Project '{0}' was renamed.", e.Item.Name));
204+
_parser.State.ClearDeclarations(e.Item);
205+
_parser.State.OnParseRequested(sender);
206+
}
207+
208+
async void sink_ProjectActivated(object sender, DispatcherEventArgs<VBProject> e)
209+
{
210+
if (!_parser.State.AllDeclarations.Any())
211+
{
212+
return;
213+
}
214+
215+
Debug.WriteLine(string.Format("Project '{0}' was activated.", e.Item.Name));
216+
// do something?
217+
}
218+
72219
private Keys _firstStepHotKey;
73220
private bool _isAwaitingTwoStepKey;
74221
private bool _skipKeyUp;
@@ -143,11 +290,12 @@ private async void hooks_MessageReceived(object sender, HookEventArgs e)
143290

144291
private void _stateBar_Refresh(object sender, EventArgs e)
145292
{
146-
_parser.State.OnParseRequested();
293+
_parser.State.OnParseRequested(sender);
147294
}
148295

149-
private void Parser_StateChanged(object sender, ParserStateEventArgs e)
296+
private void Parser_StateChanged(object sender, EventArgs e)
150297
{
298+
Debug.WriteLine("App handles StateChanged ({0}), evaluating menu states...", _parser.State.Status);
151299
_appMenus.EvaluateCanExecute(_parser.State);
152300
}
153301

@@ -158,13 +306,6 @@ public void Startup()
158306
_appMenus.Initialize();
159307
_appMenus.Localize();
160308

161-
// delay to allow the VBE to properly load. HostApplication is null until then.
162-
Task.Delay(1000).ContinueWith(t =>
163-
{
164-
_parser.State.AddBuiltInDeclarations(_vbe.HostApplication());
165-
_parser.State.OnParseRequested();
166-
});
167-
168309
//_hooks.AddHook(new LowLevelKeyboardHook(_vbe));
169310
//_hooks.AddHook(new HotKey((IntPtr)_vbe.MainWindow.HWnd, "%^R", Keys.R));
170311
//_hooks.AddHook(new HotKey((IntPtr)_vbe.MainWindow.HWnd, "%^I", Keys.I));
@@ -174,10 +315,9 @@ public void Startup()
174315
private void CleanReloadConfig()
175316
{
176317
LoadConfig();
177-
Setup();
178318
}
179319

180-
private void _configService_SettingsChanged(object sender, EventArgs e)
320+
private void ConfigServiceLanguageChanged(object sender, EventArgs e)
181321
{
182322
CleanReloadConfig();
183323
}
@@ -202,19 +342,19 @@ private void LoadConfig()
202342
}
203343
}
204344

205-
private void Setup()
206-
{
207-
_inspectorFactory.Create();
208-
_parserErrorsPresenterFactory.Create();
209-
}
210-
211345
public void Dispose()
212346
{
213-
//_hooks.MessageReceived -= hooks_MessageReceived;
214-
_configService.SettingsChanged -= _configService_SettingsChanged;
347+
_configService.LanguageChanged -= ConfigServiceLanguageChanged;
215348
_parser.State.StateChanged -= Parser_StateChanged;
216349
_autoSave.Dispose();
217350

351+
_projectsEventsConnectionPoint.Unadvise(_projectsEventsCookie);
352+
foreach (var item in _componentsEventsConnectionPoints)
353+
{
354+
item.Value.Item1.Unadvise(item.Value.Item2);
355+
}
356+
357+
//_hooks.MessageReceived -= hooks_MessageReceived;
218358
//_hooks.Dispose();
219359
}
220360
}

RetailCoder.VBE/AutoSave/AutoSave.cs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,45 @@
11
using System;
2-
using System.ComponentModel;
32
using System.IO;
43
using System.Linq;
54
using System.Timers;
65
using Microsoft.Vbe.Interop;
6+
using Rubberduck.Settings;
77

88
namespace Rubberduck.AutoSave
99
{
1010
public class AutoSave : IDisposable
1111
{
1212
private readonly VBE _vbe;
13-
private readonly IAutoSaveSettings _settings;
13+
private readonly IGeneralConfigService _configService;
1414
private readonly Timer _timer = new Timer();
15+
private Configuration _config;
1516

1617
private const int VbeSaveCommandId = 3;
1718

18-
public AutoSave(VBE vbe, IAutoSaveSettings settings)
19+
public AutoSave(VBE vbe, IGeneralConfigService configService)
1920
{
2021
_vbe = vbe;
21-
_settings = settings;
22+
_configService = configService;
23+
_config = _configService.LoadConfiguration();
2224

23-
_settings.PropertyChanged += _settings_PropertyChanged;
25+
_configService.SettingsChanged += ConfigServiceSettingsChanged;
2426

25-
_timer.Enabled = _settings.IsEnabled;
26-
_timer.Interval = _settings.TimerDelay;
27+
_timer.Enabled = _config.UserSettings.GeneralSettings.AutoSaveEnabled
28+
&& _config.UserSettings.GeneralSettings.AutoSavePeriod != 0;
2729

28-
_timer.Elapsed += _timer_Elapsed;
30+
if (_config.UserSettings.GeneralSettings.AutoSavePeriod != 0)
31+
{
32+
_timer.Interval = _config.UserSettings.GeneralSettings.AutoSavePeriod * 1000;
33+
_timer.Elapsed += _timer_Elapsed;
34+
}
2935
}
3036

31-
private void _settings_PropertyChanged(object sender, PropertyChangedEventArgs e)
37+
void ConfigServiceSettingsChanged(object sender, EventArgs e)
3238
{
33-
switch (e.PropertyName)
34-
{
35-
case "IsEnabled":
36-
_timer.Enabled = _settings.IsEnabled;
37-
break;
38-
case "TimerDelay":
39-
_timer.Interval = _settings.TimerDelay;
40-
break;
41-
}
39+
_config = _configService.LoadConfiguration();
40+
41+
_timer.Enabled = _config.UserSettings.GeneralSettings.AutoSaveEnabled;
42+
_timer.Interval = _config.UserSettings.GeneralSettings.AutoSavePeriod * 1000;
4243
}
4344

4445
private void _timer_Elapsed(object sender, ElapsedEventArgs e)
@@ -61,7 +62,7 @@ private void _timer_Elapsed(object sender, ElapsedEventArgs e)
6162

6263
public void Dispose()
6364
{
64-
_settings.PropertyChanged -= _settings_PropertyChanged;
65+
_configService.LanguageChanged -= ConfigServiceSettingsChanged;
6566
_timer.Elapsed -= _timer_Elapsed;
6667

6768
_timer.Dispose();

0 commit comments

Comments
 (0)