Browse Source

Fix: ModelCollectionTreeNode might add the same handler twice to CollectionChanged event.

newNR
Andreas Weizel 12 years ago
parent
commit
cd83809b1f
  1. 2
      src/Main/Base/Project/Dom/ModelCollectionChangedEvent.cs
  2. 10
      src/Main/Base/Project/Dom/ModelCollectionTreeNode.cs

2
src/Main/Base/Project/Dom/ModelCollectionChangedEvent.cs

@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public void AddHandler(ModelCollectionChangedEventHandler<T> handler) public void AddHandler(ModelCollectionChangedEventHandler<T> handler)
{ {
if ((handler != null) && !_handlers.Contains(handler)) if (handler != null)
_handlers.Add(handler); _handlers.Add(handler);
} }

10
src/Main/Base/Project/Dom/ModelCollectionTreeNode.cs

@ -13,6 +13,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public abstract class ModelCollectionTreeNode : SharpTreeNode public abstract class ModelCollectionTreeNode : SharpTreeNode
{ {
protected static readonly IComparer<SharpTreeNode> NodeTextComparer = KeyComparer.Create((SharpTreeNode n) => n.Text.ToString(), StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase); protected static readonly IComparer<SharpTreeNode> NodeTextComparer = KeyComparer.Create((SharpTreeNode n) => n.Text.ToString(), StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase);
protected bool listeningToCollectionChangedEvents;
protected ModelCollectionTreeNode() protected ModelCollectionTreeNode()
{ {
@ -37,6 +38,7 @@ namespace ICSharpCode.SharpDevelop.Dom
// If children loaded, also detach the collection change event handler // If children loaded, also detach the collection change event handler
if (!LazyLoading) { if (!LazyLoading) {
ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged; ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged;
listeningToCollectionChangedEvents = false;
} }
} }
@ -46,11 +48,15 @@ namespace ICSharpCode.SharpDevelop.Dom
if (IsVisible) { if (IsVisible) {
if (!LazyLoading) { if (!LazyLoading) {
if (!listeningToCollectionChangedEvents) {
ModelChildren.CollectionChanged += ModelChildrenCollectionChanged; ModelChildren.CollectionChanged += ModelChildrenCollectionChanged;
listeningToCollectionChangedEvents = true;
}
SynchronizeModelChildren(); SynchronizeModelChildren();
} }
} else { } else {
ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged; ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged;
listeningToCollectionChangedEvents = false;
} }
} }
@ -66,7 +72,10 @@ namespace ICSharpCode.SharpDevelop.Dom
if (IsSpecialNode()) if (IsSpecialNode())
InsertSpecialNodes(); InsertSpecialNodes();
InsertChildren(ModelChildren); InsertChildren(ModelChildren);
if (!listeningToCollectionChangedEvents) {
ModelChildren.CollectionChanged += ModelChildrenCollectionChanged; ModelChildren.CollectionChanged += ModelChildrenCollectionChanged;
listeningToCollectionChangedEvents = true;
}
} }
protected void InsertChildren(IEnumerable children) protected void InsertChildren(IEnumerable children)
@ -101,6 +110,7 @@ namespace ICSharpCode.SharpDevelop.Dom
void SwitchBackToLazyLoading() void SwitchBackToLazyLoading()
{ {
ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged; ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged;
listeningToCollectionChangedEvents = false;
Children.Clear(); Children.Clear();
LazyLoading = true; LazyLoading = true;
} }

Loading…
Cancel
Save