7
7
using Rubberduck . Parsing . Symbols ;
8
8
using Rubberduck . Parsing . VBA ;
9
9
using Rubberduck . Settings ;
10
- using Rubberduck . SmartIndenter ;
11
10
using Rubberduck . UI ;
12
11
using Rubberduck . UI . Command . MenuItems ;
13
12
using System ;
18
17
using System . Runtime . InteropServices . ComTypes ;
19
18
using System . Threading . Tasks ;
20
19
using System . Windows . Forms ;
20
+ using Rubberduck . UI . SourceControl ;
21
21
22
22
namespace Rubberduck
23
23
{
@@ -26,13 +26,15 @@ public sealed class App : IDisposable
26
26
private const string FILE_TARGET_NAME = "file" ;
27
27
private readonly VBE _vbe ;
28
28
private readonly IMessageBox _messageBox ;
29
- private readonly IRubberduckParser _parser ;
29
+ private IRubberduckParser _parser ;
30
30
private AutoSave . AutoSave _autoSave ;
31
31
private IGeneralConfigService _configService ;
32
- private IAppMenu _appMenus ;
32
+ private readonly IAppMenu _appMenus ;
33
33
private RubberduckCommandBar _stateBar ;
34
- private readonly IIndenter _indenter ;
35
34
private IRubberduckHooks _hooks ;
35
+ private bool _handleSinkEvents = true ;
36
+ private readonly BranchesViewViewModel _branchesVM ;
37
+ private readonly SourceControlViewViewModel _sourceControlPanelVM ;
36
38
37
39
private readonly Logger _logger ;
38
40
@@ -52,8 +54,8 @@ public App(VBE vbe, IMessageBox messageBox,
52
54
IGeneralConfigService configService ,
53
55
IAppMenu appMenus ,
54
56
RubberduckCommandBar stateBar ,
55
- IIndenter indenter ,
56
- IRubberduckHooks hooks )
57
+ IRubberduckHooks hooks ,
58
+ SourceControlDockablePresenter sourceControlPresenter )
57
59
{
58
60
_vbe = vbe ;
59
61
_messageBox = messageBox ;
@@ -62,10 +64,19 @@ public App(VBE vbe, IMessageBox messageBox,
62
64
_autoSave = new AutoSave . AutoSave ( _vbe , _configService ) ;
63
65
_appMenus = appMenus ;
64
66
_stateBar = stateBar ;
65
- _indenter = indenter ;
66
67
_hooks = hooks ;
67
68
_logger = LogManager . GetCurrentClassLogger ( ) ;
68
69
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
+
69
80
_hooks . MessageReceived += _hooks_MessageReceived ;
70
81
_configService . SettingsChanged += _configService_SettingsChanged ;
71
82
_configService . LanguageChanged += ConfigServiceLanguageChanged ;
@@ -87,6 +98,22 @@ public App(VBE vbe, IMessageBox messageBox,
87
98
UiDispatcher . Initialize ( ) ;
88
99
}
89
100
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
+
90
117
private void State_StatusMessageUpdate ( object sender , RubberduckStatusMessageEventArgs e )
91
118
{
92
119
var message = e . Message ;
@@ -168,6 +195,8 @@ public void Shutdown()
168
195
#region sink handlers. todo: move to another class
169
196
async void sink_ProjectRemoved ( object sender , DispatcherEventArgs < VBProject > e )
170
197
{
198
+ if ( ! _handleSinkEvents ) { return ; }
199
+
171
200
if ( e . Item . Protection == vbext_ProjectProtection . vbext_pp_locked )
172
201
{
173
202
_logger . Debug ( "Locked project '{0}' was removed." , e . Item . Name ) ;
@@ -205,6 +234,8 @@ async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
205
234
206
235
async void sink_ProjectAdded ( object sender , DispatcherEventArgs < VBProject > e )
207
236
{
237
+ if ( ! _handleSinkEvents ) { return ; }
238
+
208
239
_logger . Debug ( "Project '{0}' was added." , e . Item . Name ) ;
209
240
if ( e . Item . Protection == vbext_ProjectProtection . vbext_pp_locked )
210
241
{
@@ -260,6 +291,8 @@ private void RegisterComponentsEventSink(VBComponents components, string project
260
291
261
292
async void sink_ComponentSelected ( object sender , DispatcherEventArgs < VBComponent > e )
262
293
{
294
+ if ( ! _handleSinkEvents ) { return ; }
295
+
263
296
if ( ! _parser . State . AllDeclarations . Any ( ) )
264
297
{
265
298
return ;
@@ -271,29 +304,39 @@ async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent
271
304
272
305
async void sink_ComponentRenamed ( object sender , DispatcherRenamedEventArgs < VBComponent > e )
273
306
{
307
+ if ( ! _handleSinkEvents ) { return ; }
308
+
274
309
if ( ! _parser . State . AllDeclarations . Any ( ) )
275
310
{
276
311
return ;
277
312
}
278
313
314
+ _sourceControlPanelVM . HandleRenamedComponent ( e . Item , e . OldName ) ;
315
+
279
316
_logger . Debug ( "Component '{0}' was renamed to '{1}'." , e . OldName , e . Item . Name ) ;
280
317
281
318
_parser . State . RemoveRenamedComponent ( e . Item , e . OldName ) ;
282
319
}
283
320
284
321
async void sink_ComponentRemoved ( object sender , DispatcherEventArgs < VBComponent > e )
285
322
{
323
+ if ( ! _handleSinkEvents ) { return ; }
324
+
286
325
if ( ! _parser . State . AllDeclarations . Any ( ) )
287
326
{
288
327
return ;
289
328
}
290
329
330
+ _sourceControlPanelVM . HandleRemovedComponent ( e . Item ) ;
331
+
291
332
_logger . Debug ( "Component '{0}' was removed." , e . Item . Name ) ;
292
333
_parser . State . ClearStateCache ( e . Item , true ) ;
293
334
}
294
335
295
336
async void sink_ComponentReloaded ( object sender , DispatcherEventArgs < VBComponent > e )
296
337
{
338
+ if ( ! _handleSinkEvents ) { return ; }
339
+
297
340
if ( ! _parser . State . AllDeclarations . Any ( ) )
298
341
{
299
342
return ;
@@ -305,17 +348,23 @@ async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent
305
348
306
349
async void sink_ComponentAdded ( object sender , DispatcherEventArgs < VBComponent > e )
307
350
{
351
+ if ( ! _handleSinkEvents ) { return ; }
352
+
308
353
if ( ! _parser . State . AllDeclarations . Any ( ) )
309
354
{
310
355
return ;
311
356
}
312
357
358
+ _sourceControlPanelVM . HandleAddedComponent ( e . Item ) ;
359
+
313
360
_logger . Debug ( "Component '{0}' was added." , e . Item . Name ) ;
314
361
_parser . State . OnParseRequested ( sender , e . Item ) ;
315
362
}
316
363
317
364
async void sink_ComponentActivated ( object sender , DispatcherEventArgs < VBComponent > e )
318
365
{
366
+ if ( ! _handleSinkEvents ) { return ; }
367
+
319
368
if ( ! _parser . State . AllDeclarations . Any ( ) )
320
369
{
321
370
return ;
@@ -327,6 +376,8 @@ async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponen
327
376
328
377
async void sink_ProjectRenamed ( object sender , DispatcherRenamedEventArgs < VBProject > e )
329
378
{
379
+ if ( ! _handleSinkEvents ) { return ; }
380
+
330
381
if ( ! _parser . State . AllDeclarations . Any ( ) )
331
382
{
332
383
return ;
@@ -342,6 +393,8 @@ async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProje
342
393
343
394
async void sink_ProjectActivated ( object sender , DispatcherEventArgs < VBProject > e )
344
395
{
396
+ if ( ! _handleSinkEvents ) { return ; }
397
+
345
398
if ( ! _parser . State . AllDeclarations . Any ( ) )
346
399
{
347
400
return ;
@@ -395,13 +448,36 @@ private void LoadConfig()
395
448
}
396
449
397
450
private bool _disposed ;
451
+
398
452
public void Dispose ( )
399
453
{
400
454
if ( _disposed )
401
455
{
402
456
return ;
403
457
}
404
458
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
+
405
481
if ( _hooks != null )
406
482
{
407
483
_hooks . MessageReceived -= _hooks_MessageReceived ;
@@ -416,13 +492,6 @@ public void Dispose()
416
492
_configService = null ;
417
493
}
418
494
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
-
426
495
if ( _stateBar != null )
427
496
{
428
497
_stateBar . Refresh -= _stateBar_Refresh ;
@@ -465,6 +534,8 @@ public void Dispose()
465
534
item . Value . Item1 . Unadvise ( item . Value . Item2 ) ;
466
535
}
467
536
537
+ UiDispatcher . Shutdown ( ) ;
538
+
468
539
_disposed = true ;
469
540
}
470
541
}
0 commit comments