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 ;
21
- using Rubberduck . Common . Hotkeys ;
20
+ using Rubberduck . UI . SourceControl ;
22
21
23
22
namespace Rubberduck
24
23
{
@@ -27,13 +26,15 @@ public sealed class App : IDisposable
27
26
private const string FILE_TARGET_NAME = "file" ;
28
27
private readonly VBE _vbe ;
29
28
private readonly IMessageBox _messageBox ;
30
- private readonly IRubberduckParser _parser ;
29
+ private IRubberduckParser _parser ;
31
30
private AutoSave . AutoSave _autoSave ;
32
31
private IGeneralConfigService _configService ;
33
- private IAppMenu _appMenus ;
32
+ private readonly IAppMenu _appMenus ;
34
33
private RubberduckCommandBar _stateBar ;
35
- private readonly IIndenter _indenter ;
36
34
private IRubberduckHooks _hooks ;
35
+ private bool _handleSinkEvents = true ;
36
+ private readonly BranchesViewViewModel _branchesVM ;
37
+ private readonly SourceControlViewViewModel _sourceControlPanelVM ;
37
38
38
39
private readonly Logger _logger ;
39
40
@@ -53,8 +54,8 @@ public App(VBE vbe, IMessageBox messageBox,
53
54
IGeneralConfigService configService ,
54
55
IAppMenu appMenus ,
55
56
RubberduckCommandBar stateBar ,
56
- IIndenter indenter ,
57
- IRubberduckHooks hooks )
57
+ IRubberduckHooks hooks ,
58
+ SourceControlDockablePresenter sourceControlPresenter )
58
59
{
59
60
_vbe = vbe ;
60
61
_messageBox = messageBox ;
@@ -63,10 +64,19 @@ public App(VBE vbe, IMessageBox messageBox,
63
64
_autoSave = new AutoSave . AutoSave ( _vbe , _configService ) ;
64
65
_appMenus = appMenus ;
65
66
_stateBar = stateBar ;
66
- _indenter = indenter ;
67
67
_hooks = hooks ;
68
68
_logger = LogManager . GetCurrentClassLogger ( ) ;
69
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
+
70
80
_hooks . MessageReceived += _hooks_MessageReceived ;
71
81
_configService . SettingsChanged += _configService_SettingsChanged ;
72
82
_configService . LanguageChanged += ConfigServiceLanguageChanged ;
@@ -88,6 +98,22 @@ public App(VBE vbe, IMessageBox messageBox,
88
98
UiDispatcher . Initialize ( ) ;
89
99
}
90
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
+
91
117
private void State_StatusMessageUpdate ( object sender , RubberduckStatusMessageEventArgs e )
92
118
{
93
119
var message = e . Message ;
@@ -169,6 +195,8 @@ public void Shutdown()
169
195
#region sink handlers. todo: move to another class
170
196
async void sink_ProjectRemoved ( object sender , DispatcherEventArgs < VBProject > e )
171
197
{
198
+ if ( ! _handleSinkEvents ) { return ; }
199
+
172
200
if ( e . Item . Protection == vbext_ProjectProtection . vbext_pp_locked )
173
201
{
174
202
_logger . Debug ( "Locked project '{0}' was removed." , e . Item . Name ) ;
@@ -206,6 +234,8 @@ async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
206
234
207
235
async void sink_ProjectAdded ( object sender , DispatcherEventArgs < VBProject > e )
208
236
{
237
+ if ( ! _handleSinkEvents ) { return ; }
238
+
209
239
_logger . Debug ( "Project '{0}' was added." , e . Item . Name ) ;
210
240
if ( e . Item . Protection == vbext_ProjectProtection . vbext_pp_locked )
211
241
{
@@ -261,6 +291,8 @@ private void RegisterComponentsEventSink(VBComponents components, string project
261
291
262
292
async void sink_ComponentSelected ( object sender , DispatcherEventArgs < VBComponent > e )
263
293
{
294
+ if ( ! _handleSinkEvents ) { return ; }
295
+
264
296
if ( ! _parser . State . AllDeclarations . Any ( ) )
265
297
{
266
298
return ;
@@ -272,29 +304,39 @@ async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent
272
304
273
305
async void sink_ComponentRenamed ( object sender , DispatcherRenamedEventArgs < VBComponent > e )
274
306
{
307
+ if ( ! _handleSinkEvents ) { return ; }
308
+
275
309
if ( ! _parser . State . AllDeclarations . Any ( ) )
276
310
{
277
311
return ;
278
312
}
279
313
314
+ _sourceControlPanelVM . HandleRenamedComponent ( e . Item , e . OldName ) ;
315
+
280
316
_logger . Debug ( "Component '{0}' was renamed to '{1}'." , e . OldName , e . Item . Name ) ;
281
317
282
318
_parser . State . RemoveRenamedComponent ( e . Item , e . OldName ) ;
283
319
}
284
320
285
321
async void sink_ComponentRemoved ( object sender , DispatcherEventArgs < VBComponent > e )
286
322
{
323
+ if ( ! _handleSinkEvents ) { return ; }
324
+
287
325
if ( ! _parser . State . AllDeclarations . Any ( ) )
288
326
{
289
327
return ;
290
328
}
291
329
330
+ _sourceControlPanelVM . HandleRemovedComponent ( e . Item ) ;
331
+
292
332
_logger . Debug ( "Component '{0}' was removed." , e . Item . Name ) ;
293
333
_parser . State . ClearStateCache ( e . Item , true ) ;
294
334
}
295
335
296
336
async void sink_ComponentReloaded ( object sender , DispatcherEventArgs < VBComponent > e )
297
337
{
338
+ if ( ! _handleSinkEvents ) { return ; }
339
+
298
340
if ( ! _parser . State . AllDeclarations . Any ( ) )
299
341
{
300
342
return ;
@@ -306,17 +348,23 @@ async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent
306
348
307
349
async void sink_ComponentAdded ( object sender , DispatcherEventArgs < VBComponent > e )
308
350
{
351
+ if ( ! _handleSinkEvents ) { return ; }
352
+
309
353
if ( ! _parser . State . AllDeclarations . Any ( ) )
310
354
{
311
355
return ;
312
356
}
313
357
358
+ _sourceControlPanelVM . HandleAddedComponent ( e . Item ) ;
359
+
314
360
_logger . Debug ( "Component '{0}' was added." , e . Item . Name ) ;
315
361
_parser . State . OnParseRequested ( sender , e . Item ) ;
316
362
}
317
363
318
364
async void sink_ComponentActivated ( object sender , DispatcherEventArgs < VBComponent > e )
319
365
{
366
+ if ( ! _handleSinkEvents ) { return ; }
367
+
320
368
if ( ! _parser . State . AllDeclarations . Any ( ) )
321
369
{
322
370
return ;
@@ -328,20 +376,25 @@ async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponen
328
376
329
377
async void sink_ProjectRenamed ( object sender , DispatcherRenamedEventArgs < VBProject > e )
330
378
{
379
+ if ( ! _handleSinkEvents ) { return ; }
380
+
331
381
if ( ! _parser . State . AllDeclarations . Any ( ) )
332
382
{
333
383
return ;
334
384
}
335
385
336
386
_logger . Debug ( "Project '{0}' (ID {1}) was renamed to '{2}'." , e . OldName , e . Item . HelpFile , e . Item . Name ) ;
337
387
338
- // note: if a bug is discovered with renaming a project, it may just need to be removed and readded.
388
+ _parser . State . RemoveProject ( e . Item . HelpFile ) ;
389
+ _parser . State . AddProject ( e . Item ) ;
339
390
340
391
_parser . State . OnParseRequested ( sender ) ;
341
392
}
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