Skip to content

Commit f306582

Browse files
authored
Merge pull request #1782 from rubberduck-vba/next
v2.0.1b
2 parents d726201 + e00aa64 commit f306582

Some content is hidden

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

43 files changed

+4934
-3915
lines changed

RetailCoder.VBE/App.cs

Lines changed: 85 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using Rubberduck.Parsing.Symbols;
88
using Rubberduck.Parsing.VBA;
99
using Rubberduck.Settings;
10-
using Rubberduck.SmartIndenter;
1110
using Rubberduck.UI;
1211
using Rubberduck.UI.Command.MenuItems;
1312
using System;
@@ -18,6 +17,7 @@
1817
using System.Runtime.InteropServices.ComTypes;
1918
using System.Threading.Tasks;
2019
using System.Windows.Forms;
20+
using Rubberduck.UI.SourceControl;
2121

2222
namespace Rubberduck
2323
{
@@ -26,13 +26,15 @@ public sealed class App : IDisposable
2626
private const string FILE_TARGET_NAME = "file";
2727
private readonly VBE _vbe;
2828
private readonly IMessageBox _messageBox;
29-
private readonly IRubberduckParser _parser;
29+
private IRubberduckParser _parser;
3030
private AutoSave.AutoSave _autoSave;
3131
private IGeneralConfigService _configService;
32-
private IAppMenu _appMenus;
32+
private readonly IAppMenu _appMenus;
3333
private RubberduckCommandBar _stateBar;
34-
private readonly IIndenter _indenter;
3534
private IRubberduckHooks _hooks;
35+
private bool _handleSinkEvents = true;
36+
private readonly BranchesViewViewModel _branchesVM;
37+
private readonly SourceControlViewViewModel _sourceControlPanelVM;
3638

3739
private readonly Logger _logger;
3840

@@ -52,8 +54,8 @@ public App(VBE vbe, IMessageBox messageBox,
5254
IGeneralConfigService configService,
5355
IAppMenu appMenus,
5456
RubberduckCommandBar stateBar,
55-
IIndenter indenter,
56-
IRubberduckHooks hooks)
57+
IRubberduckHooks hooks,
58+
SourceControlDockablePresenter sourceControlPresenter)
5759
{
5860
_vbe = vbe;
5961
_messageBox = messageBox;
@@ -62,10 +64,19 @@ public App(VBE vbe, IMessageBox messageBox,
6264
_autoSave = new AutoSave.AutoSave(_vbe, _configService);
6365
_appMenus = appMenus;
6466
_stateBar = stateBar;
65-
_indenter = indenter;
6667
_hooks = hooks;
6768
_logger = LogManager.GetCurrentClassLogger();
6869

70+
var sourceControlPanel = (SourceControlPanel) sourceControlPresenter.Window();
71+
_sourceControlPanelVM = (SourceControlViewViewModel) sourceControlPanel.ViewModel;
72+
_branchesVM = (BranchesViewViewModel) _sourceControlPanelVM.TabItems.Single(t => t.ViewModel.Tab == SourceControlTab.Branches).ViewModel;
73+
74+
_sourceControlPanelVM.OpenRepoStarted += DisableSinkEventHandlers;
75+
_sourceControlPanelVM.OpenRepoCompleted += EnableSinkEventHandlersAndUpdateCache;
76+
77+
_branchesVM.LoadingComponentsStarted += DisableSinkEventHandlers;
78+
_branchesVM.LoadingComponentsCompleted += EnableSinkEventHandlersAndUpdateCache;
79+
6980
_hooks.MessageReceived += _hooks_MessageReceived;
7081
_configService.SettingsChanged += _configService_SettingsChanged;
7182
_configService.LanguageChanged += ConfigServiceLanguageChanged;
@@ -87,6 +98,22 @@ public App(VBE vbe, IMessageBox messageBox,
8798
UiDispatcher.Initialize();
8899
}
89100

101+
private void EnableSinkEventHandlersAndUpdateCache(object sender, EventArgs e)
102+
{
103+
_handleSinkEvents = true;
104+
105+
// update cache
106+
_parser.State.RemoveProject(_vbe.ActiveVBProject.HelpFile);
107+
_parser.State.AddProject(_vbe.ActiveVBProject);
108+
109+
_parser.State.OnParseRequested(this);
110+
}
111+
112+
private void DisableSinkEventHandlers(object sender, EventArgs e)
113+
{
114+
_handleSinkEvents = false;
115+
}
116+
90117
private void State_StatusMessageUpdate(object sender, RubberduckStatusMessageEventArgs e)
91118
{
92119
var message = e.Message;
@@ -168,6 +195,8 @@ public void Shutdown()
168195
#region sink handlers. todo: move to another class
169196
async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
170197
{
198+
if (!_handleSinkEvents) { return; }
199+
171200
if (e.Item.Protection == vbext_ProjectProtection.vbext_pp_locked)
172201
{
173202
_logger.Debug("Locked project '{0}' was removed.", e.Item.Name);
@@ -205,6 +234,8 @@ async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
205234

206235
async void sink_ProjectAdded(object sender, DispatcherEventArgs<VBProject> e)
207236
{
237+
if (!_handleSinkEvents) { return; }
238+
208239
_logger.Debug("Project '{0}' was added.", e.Item.Name);
209240
if (e.Item.Protection == vbext_ProjectProtection.vbext_pp_locked)
210241
{
@@ -260,6 +291,8 @@ private void RegisterComponentsEventSink(VBComponents components, string project
260291

261292
async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent> e)
262293
{
294+
if (!_handleSinkEvents) { return; }
295+
263296
if (!_parser.State.AllDeclarations.Any())
264297
{
265298
return;
@@ -271,29 +304,39 @@ async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent
271304

272305
async void sink_ComponentRenamed(object sender, DispatcherRenamedEventArgs<VBComponent> e)
273306
{
307+
if (!_handleSinkEvents) { return; }
308+
274309
if (!_parser.State.AllDeclarations.Any())
275310
{
276311
return;
277312
}
278313

314+
_sourceControlPanelVM.HandleRenamedComponent(e.Item, e.OldName);
315+
279316
_logger.Debug("Component '{0}' was renamed to '{1}'.", e.OldName, e.Item.Name);
280317

281318
_parser.State.RemoveRenamedComponent(e.Item, e.OldName);
282319
}
283320

284321
async void sink_ComponentRemoved(object sender, DispatcherEventArgs<VBComponent> e)
285322
{
323+
if (!_handleSinkEvents) { return; }
324+
286325
if (!_parser.State.AllDeclarations.Any())
287326
{
288327
return;
289328
}
290329

330+
_sourceControlPanelVM.HandleRemovedComponent(e.Item);
331+
291332
_logger.Debug("Component '{0}' was removed.", e.Item.Name);
292333
_parser.State.ClearStateCache(e.Item, true);
293334
}
294335

295336
async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent> e)
296337
{
338+
if (!_handleSinkEvents) { return; }
339+
297340
if (!_parser.State.AllDeclarations.Any())
298341
{
299342
return;
@@ -305,17 +348,23 @@ async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent
305348

306349
async void sink_ComponentAdded(object sender, DispatcherEventArgs<VBComponent> e)
307350
{
351+
if (!_handleSinkEvents) { return; }
352+
308353
if (!_parser.State.AllDeclarations.Any())
309354
{
310355
return;
311356
}
312357

358+
_sourceControlPanelVM.HandleAddedComponent(e.Item);
359+
313360
_logger.Debug("Component '{0}' was added.", e.Item.Name);
314361
_parser.State.OnParseRequested(sender, e.Item);
315362
}
316363

317364
async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponent> e)
318365
{
366+
if (!_handleSinkEvents) { return; }
367+
319368
if (!_parser.State.AllDeclarations.Any())
320369
{
321370
return;
@@ -327,6 +376,8 @@ async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponen
327376

328377
async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProject> e)
329378
{
379+
if (!_handleSinkEvents) { return; }
380+
330381
if (!_parser.State.AllDeclarations.Any())
331382
{
332383
return;
@@ -342,6 +393,8 @@ async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProje
342393

343394
async void sink_ProjectActivated(object sender, DispatcherEventArgs<VBProject> e)
344395
{
396+
if (!_handleSinkEvents) { return; }
397+
345398
if (!_parser.State.AllDeclarations.Any())
346399
{
347400
return;
@@ -395,13 +448,36 @@ private void LoadConfig()
395448
}
396449

397450
private bool _disposed;
451+
398452
public void Dispose()
399453
{
400454
if (_disposed)
401455
{
402456
return;
403457
}
404458

459+
if (_sourceControlPanelVM != null)
460+
{
461+
_sourceControlPanelVM.OpenRepoStarted -= DisableSinkEventHandlers;
462+
_sourceControlPanelVM.OpenRepoCompleted -= EnableSinkEventHandlersAndUpdateCache;
463+
}
464+
465+
if (_branchesVM != null)
466+
{
467+
_branchesVM.LoadingComponentsStarted -= DisableSinkEventHandlers;
468+
_branchesVM.LoadingComponentsCompleted -= EnableSinkEventHandlersAndUpdateCache;
469+
}
470+
471+
_handleSinkEvents = false;
472+
473+
if (_parser != null && _parser.State != null)
474+
{
475+
_parser.State.StateChanged -= Parser_StateChanged;
476+
_parser.State.StatusMessageUpdate -= State_StatusMessageUpdate;
477+
_parser.Dispose();
478+
// I won't set this to null because other components may try to release things
479+
}
480+
405481
if (_hooks != null)
406482
{
407483
_hooks.MessageReceived -= _hooks_MessageReceived;
@@ -416,13 +492,6 @@ public void Dispose()
416492
_configService = null;
417493
}
418494

419-
if (_parser != null && _parser.State != null)
420-
{
421-
_parser.State.StateChanged -= Parser_StateChanged;
422-
_parser.State.StatusMessageUpdate -= State_StatusMessageUpdate;
423-
// I won't set this to null because other components may try to release things
424-
}
425-
426495
if (_stateBar != null)
427496
{
428497
_stateBar.Refresh -= _stateBar_Refresh;
@@ -465,6 +534,8 @@ public void Dispose()
465534
item.Value.Item1.Unadvise(item.Value.Item2);
466535
}
467536

537+
UiDispatcher.Shutdown();
538+
468539
_disposed = true;
469540
}
470541
}

RetailCoder.VBE/AppMenu.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using Rubberduck.Parsing.VBA;
45
using Rubberduck.UI.Command.MenuItems;
56
using Rubberduck.UI.Command.MenuItems.ParentMenus;
@@ -43,6 +44,7 @@ public void Dispose()
4344
{
4445
foreach (var menu in _menus)
4546
{
47+
menu.RemoveChildren();
4648
if (menu.Item != null)
4749
{
4850
menu.Item.Delete();

RetailCoder.VBE/Inspections/InspectionResultBase.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ public override string ToString()
102102
InspectionsUI.QualifiedSelectionInspection,
103103
Inspection.Severity,
104104
Description,
105-
module.ProjectId,
105+
"(" + module.ProjectDisplayName + ")",
106+
module.ProjectName,
106107
module.ComponentName,
107108
QualifiedSelection.Selection.StartLine);
108109
}

RetailCoder.VBE/Inspections/InspectionsUI.Designer.cs

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

RetailCoder.VBE/Inspections/InspectionsUI.de.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@
501501
<value>Kontexttyp '{0}' ist nicht gültig für {1}.</value>
502502
</data>
503503
<data name="QualifiedSelectionInspection" xml:space="preserve">
504-
<value>{0}: {1} - {2}.{3}, Zeile {4}</value>
504+
<value>{0}: {1} - {2} {3}.{4}, Zeile {5}</value>
505505
</data>
506506
<data name="SetObjectVariableQuickFix" xml:space="preserve">
507507
<value>Benutze das Schlüsselwort 'Set'</value>

RetailCoder.VBE/Inspections/InspectionsUI.fr.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@
501501
<value>Utiliser le mot-clé 'Set'</value>
502502
</data>
503503
<data name="QualifiedSelectionInspection">
504-
<value>{0}: {1} - {2},{3}, ligne {4}</value>
504+
<value>{0}: {1} - {2} {3}.{4}, ligne {5}</value>
505505
</data>
506506
<data name="ObjectVariableNotSetInspectionName">
507507
<value>L'assignation d'une référence d'objet requiert le mot-clé 'Set'</value>

RetailCoder.VBE/Inspections/InspectionsUI.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@
507507
<value>Context type '{0}' is not valid for {1}.</value>
508508
</data>
509509
<data name="QualifiedSelectionInspection" xml:space="preserve">
510-
<value>{0}: {1} - {2}.{3}, line {4}</value>
510+
<value>{0}: {1} - {2} {3}.{4}, line {5}</value>
511511
</data>
512512
<data name="ObjectVariableNotSetInspectionMeta" xml:space="preserve">
513513
<value>As far as Rubberduck can tell, this variable is an object variable, assigned without the 'Set' keyword. This causes run-time error 91 'Object or With block variable not set'.</value>

0 commit comments

Comments
 (0)