Browse Source

Fix performance problem with DerivedTypesTreeNode.

Once the DerivedTypesTreeNode was created, any change to the type definition was causing an expensive search for derived types; even if the DerivedTypesTreeNode was collapsed.
We now never perform this search on updates, and instead collapse the node.
pull/403/head
Daniel Grunwald 12 years ago
parent
commit
8990ebe04c
  1. 16
      src/Main/Base/Project/Dom/ClassBrowser/DerivedTypesTreeNode.cs
  2. 6
      src/Main/Base/Project/Dom/ModelCollectionTreeNode.cs

16
src/Main/Base/Project/Dom/ClassBrowser/DerivedTypesTreeNode.cs

@ -43,12 +43,18 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (definition == null) if (definition == null)
throw new ArgumentNullException("definition"); throw new ArgumentNullException("definition");
this.definition = definition; this.definition = definition;
this.definition.Updated += (sender, e) => UpdateDerivedTypes(); this.definition.Updated += OnDefinitionUpdated;
this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.DerivedTypes"); this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.DerivedTypes");
derivedTypes = new SimpleModelCollection<ITypeDefinitionModel>(); derivedTypes = new SimpleModelCollection<ITypeDefinitionModel>();
childrenLoaded = false; childrenLoaded = false;
} }
protected override void DetachEventHandlers()
{
this.definition.Updated -= OnDefinitionUpdated;
base.DetachEventHandlers();
}
protected override IModelCollection<object> ModelChildren { protected override IModelCollection<object> ModelChildren {
get { get {
if (!childrenLoaded) { if (!childrenLoaded) {
@ -59,6 +65,14 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
} }
void OnDefinitionUpdated(object sender, EventArgs e)
{
// Listing the derived types can be expensive; so it's better to switch back to lazy-loading
// (collapsing the node if necessary)
SwitchBackToLazyLoading();
childrenLoaded = false;
}
public override SharpTreeNode FindChildNodeRecursively(Func<SharpTreeNode, bool> predicate) public override SharpTreeNode FindChildNodeRecursively(Func<SharpTreeNode, bool> predicate)
{ {
// Don't search children of this node, because they are repeating type nodes from elsewhere // Don't search children of this node, because they are repeating type nodes from elsewhere

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

@ -51,7 +51,7 @@ namespace ICSharpCode.SharpDevelop.Dom
protected virtual void DetachEventHandlers() protected virtual void DetachEventHandlers()
{ {
// If children loaded, also detach the collection change event handler // If children loaded, also detach the collection change event handler
if (!LazyLoading) { if (listeningToCollectionChangedEvents) {
ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged; ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged;
listeningToCollectionChangedEvents = false; listeningToCollectionChangedEvents = false;
} }
@ -122,10 +122,12 @@ namespace ICSharpCode.SharpDevelop.Dom
InsertChildren(addedItems); InsertChildren(addedItems);
} }
void SwitchBackToLazyLoading() protected void SwitchBackToLazyLoading()
{ {
if (listeningToCollectionChangedEvents) {
ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged; ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged;
listeningToCollectionChangedEvents = false; listeningToCollectionChangedEvents = false;
}
Children.Clear(); Children.Clear();
LazyLoading = true; LazyLoading = true;
} }

Loading…
Cancel
Save