1
1
using System ;
2
2
using System . Collections ;
3
+ using System . Collections . Concurrent ;
3
4
using System . Collections . Generic ;
4
5
using System . IO ;
5
6
using System . Linq ;
@@ -14,6 +15,8 @@ namespace Rubberduck.VBEditor.SafeComWrappers.VBA
14
15
public class VBComponents : SafeComWrapper < VB . VBComponents > , IVBComponents
15
16
{
16
17
private static readonly Guid VBComponentsEventsGuid = new Guid ( "0002E116-0000-0000-C000-000000000046" ) ;
18
+ private static HashSet < VB . VBComponents > _handlers = new HashSet < VB . VBComponents > ( ) ;
19
+ private static object _lockObject = new object ( ) ;
17
20
18
21
private enum ComponentEventDispId
19
22
{
@@ -27,7 +30,7 @@ private enum ComponentEventDispId
27
30
28
31
public VBComponents ( VB . VBComponents target ) : base ( target )
29
32
{
30
- AttachEvents ( ) ;
33
+ AttachEvents ( Target ) ;
31
34
}
32
35
33
36
public int Count
@@ -96,7 +99,7 @@ public override void Release(bool final = false)
96
99
{
97
100
if ( ! IsWrappingNullReference )
98
101
{
99
- DetatchEvents ( ) ;
102
+ DetatchEvents ( Target ) ;
100
103
for ( var i = 1 ; i <= Count ; i ++ )
101
104
{
102
105
this [ i ] . Release ( ) ;
@@ -192,99 +195,108 @@ public void RemoveSafely(IVBComponent component)
192
195
193
196
#region Events
194
197
195
- private bool _eventsAttached ;
196
- private void AttachEvents ( )
198
+ private static void AttachEvents ( VB . VBComponents components )
197
199
{
198
- if ( ! _eventsAttached && ! IsWrappingNullReference )
200
+ lock ( _lockObject )
199
201
{
200
- _componentAdded = OnComponentAdded ;
201
- _componentRemoved = OnComponentRemoved ;
202
- _componentRenamed = OnComponentRenamed ;
203
- _componentSelected = OnComponentSelected ;
204
- _componentActivated = OnComponentActivated ;
205
- _componentReloaded = OnComponentReloaded ;
206
- ComEventsHelper . Combine ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemAdded , _componentAdded ) ;
207
- ComEventsHelper . Combine ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemRemoved , _componentRemoved ) ;
208
- ComEventsHelper . Combine ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemRenamed , _componentRenamed ) ;
209
- ComEventsHelper . Combine ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemSelected , _componentSelected ) ;
210
- ComEventsHelper . Combine ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemActivated , _componentActivated ) ;
211
- ComEventsHelper . Combine ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemReloaded , _componentReloaded ) ;
212
- _eventsAttached = true ;
202
+ if ( ! _handlers . Contains ( components ) )
203
+ {
204
+ _componentAdded = OnComponentAdded ;
205
+ _componentRemoved = OnComponentRemoved ;
206
+ _componentRenamed = OnComponentRenamed ;
207
+ _componentSelected = OnComponentSelected ;
208
+ _componentActivated = OnComponentActivated ;
209
+ _componentReloaded = OnComponentReloaded ;
210
+ ComEventsHelper . Combine ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemAdded , _componentAdded ) ;
211
+ ComEventsHelper . Combine ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemRemoved , _componentRemoved ) ;
212
+ ComEventsHelper . Combine ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemRenamed , _componentRenamed ) ;
213
+ ComEventsHelper . Combine ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemSelected , _componentSelected ) ;
214
+ ComEventsHelper . Combine ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemActivated , _componentActivated ) ;
215
+ ComEventsHelper . Combine ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemReloaded , _componentReloaded ) ;
216
+ _handlers . Add ( components ) ;
217
+ }
213
218
}
214
219
}
215
220
216
- private void DetatchEvents ( )
221
+ private static void DetatchEvents ( VB . VBComponents components )
217
222
{
218
- if ( ! _eventsAttached && ! IsWrappingNullReference )
223
+ lock ( _lockObject )
219
224
{
220
- ComEventsHelper . Remove ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemAdded , _componentAdded ) ;
221
- ComEventsHelper . Remove ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemRemoved , _componentRemoved ) ;
222
- ComEventsHelper . Remove ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemRenamed , _componentRenamed ) ;
223
- ComEventsHelper . Remove ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemSelected , _componentSelected ) ;
224
- ComEventsHelper . Remove ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemActivated , _componentActivated ) ;
225
- ComEventsHelper . Remove ( Target , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemReloaded , _componentReloaded ) ;
226
- _eventsAttached = false ;
225
+ if ( _handlers . Contains ( components ) )
226
+ {
227
+ ComEventsHelper . Remove ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemAdded , _componentAdded ) ;
228
+ ComEventsHelper . Remove ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemRemoved , _componentRemoved ) ;
229
+ ComEventsHelper . Remove ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemRenamed , _componentRenamed ) ;
230
+ ComEventsHelper . Remove ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemSelected , _componentSelected ) ;
231
+ ComEventsHelper . Remove ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemActivated , _componentActivated ) ;
232
+ ComEventsHelper . Remove ( components , VBComponentsEventsGuid , ( int ) ComponentEventDispId . ItemReloaded , _componentReloaded ) ;
233
+ _handlers . Remove ( components ) ;
234
+ }
227
235
}
228
236
}
229
237
230
238
private delegate void ItemAddedDelegate ( VB . VBComponent vbComponent ) ;
231
- private ItemAddedDelegate _componentAdded ;
232
- public event EventHandler < ComponentEventArgs > ComponentAdded ;
233
- private void OnComponentAdded ( VB . VBComponent vbComponent )
239
+ private static ItemAddedDelegate _componentAdded ;
240
+ public static event EventHandler < ComponentEventArgs > ComponentAdded ;
241
+ private static void OnComponentAdded ( VB . VBComponent vbComponent )
234
242
{
235
243
OnDispatch ( ComponentAdded , vbComponent ) ;
236
244
}
237
245
238
246
private delegate void ItemRemovedDelegate ( VB . VBComponent vbComponent ) ;
239
- private ItemRemovedDelegate _componentRemoved ;
240
- public event EventHandler < ComponentEventArgs > ComponentRemoved ;
241
- private void OnComponentRemoved ( VB . VBComponent vbComponent )
247
+ private static ItemRemovedDelegate _componentRemoved ;
248
+ public static event EventHandler < ComponentEventArgs > ComponentRemoved ;
249
+ private static void OnComponentRemoved ( VB . VBComponent vbComponent )
242
250
{
243
251
OnDispatch ( ComponentRemoved , vbComponent ) ;
244
252
}
245
253
246
254
private delegate void ItemRenamedDelegate ( VB . VBComponent vbComponent , string oldName ) ;
247
- private ItemRenamedDelegate _componentRenamed ;
248
- public event EventHandler < ComponentRenamedEventArgs > ComponentRenamed ;
249
- private void OnComponentRenamed ( VB . VBComponent vbComponent , string oldName )
255
+ private static ItemRenamedDelegate _componentRenamed ;
256
+ public static event EventHandler < ComponentRenamedEventArgs > ComponentRenamed ;
257
+ private static void OnComponentRenamed ( VB . VBComponent vbComponent , string oldName )
250
258
{
251
259
var handler = ComponentRenamed ;
252
260
if ( handler != null )
253
261
{
254
- handler . Invoke ( this , new ComponentRenamedEventArgs ( Parent . ProjectId , Parent , new VBComponent ( vbComponent ) , oldName ) ) ;
262
+ var component = new VBComponent ( vbComponent ) ;
263
+ var project = component . Collection . Parent ;
264
+ handler . Invoke ( component , new ComponentRenamedEventArgs ( project . ProjectId , project , new VBComponent ( vbComponent ) , oldName ) ) ;
255
265
}
256
266
}
257
267
258
268
private delegate void ItemSelectedDelegate ( VB . VBComponent vbComponent ) ;
259
- private ItemSelectedDelegate _componentSelected ;
260
- public event EventHandler < ComponentEventArgs > ComponentSelected ;
261
- private void OnComponentSelected ( VB . VBComponent vbComponent )
269
+ private static ItemSelectedDelegate _componentSelected ;
270
+ public static event EventHandler < ComponentEventArgs > ComponentSelected ;
271
+ private static void OnComponentSelected ( VB . VBComponent vbComponent )
262
272
{
263
273
OnDispatch ( ComponentSelected , vbComponent ) ;
264
274
}
265
275
266
276
private delegate void ItemActivatedDelegate ( VB . VBComponent vbComponent ) ;
267
- private ItemActivatedDelegate _componentActivated ;
268
- public event EventHandler < ComponentEventArgs > ComponentActivated ;
269
- private void OnComponentActivated ( VB . VBComponent vbComponent )
277
+ private static ItemActivatedDelegate _componentActivated ;
278
+ public static event EventHandler < ComponentEventArgs > ComponentActivated ;
279
+ private static void OnComponentActivated ( VB . VBComponent vbComponent )
270
280
{
271
281
OnDispatch ( ComponentActivated , vbComponent ) ;
272
282
}
273
283
274
284
private delegate void ItemReloadedDelegate ( VB . VBComponent vbComponent ) ;
275
- private ItemReloadedDelegate _componentReloaded ;
276
- public event EventHandler < ComponentEventArgs > ComponentReloaded ;
277
- private void OnComponentReloaded ( VB . VBComponent vbComponent )
285
+ private static ItemReloadedDelegate _componentReloaded ;
286
+ public static event EventHandler < ComponentEventArgs > ComponentReloaded ;
287
+ private static void OnComponentReloaded ( VB . VBComponent vbComponent )
278
288
{
279
289
OnDispatch ( ComponentReloaded , vbComponent ) ;
280
290
}
281
291
282
- private void OnDispatch ( EventHandler < ComponentEventArgs > dispatched , VB . VBComponent component )
292
+ private static void OnDispatch ( EventHandler < ComponentEventArgs > dispatched , VB . VBComponent vbComponent )
283
293
{
284
294
var handler = dispatched ;
285
295
if ( handler != null )
286
296
{
287
- handler . Invoke ( this , new ComponentEventArgs ( Parent . ProjectId , Parent , new VBComponent ( component ) ) ) ;
297
+ var component = new VBComponent ( vbComponent ) ;
298
+ var project = component . Collection . Parent ;
299
+ handler . Invoke ( component , new ComponentEventArgs ( project . ProjectId , project , component ) ) ;
288
300
}
289
301
}
290
302
0 commit comments