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 11 years ago
parent
commit
8990ebe04c
  1. 16
      src/Main/Base/Project/Dom/ClassBrowser/DerivedTypesTreeNode.cs
  2. 10
      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 @@ -43,12 +43,18 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (definition == null)
throw new ArgumentNullException("definition");
this.definition = definition;
this.definition.Updated += (sender, e) => UpdateDerivedTypes();
this.definition.Updated += OnDefinitionUpdated;
this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.DerivedTypes");
derivedTypes = new SimpleModelCollection<ITypeDefinitionModel>();
childrenLoaded = false;
}
protected override void DetachEventHandlers()
{
this.definition.Updated -= OnDefinitionUpdated;
base.DetachEventHandlers();
}
protected override IModelCollection<object> ModelChildren {
get {
if (!childrenLoaded) {
@ -59,6 +65,14 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -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)
{
// Don't search children of this node, because they are repeating type nodes from elsewhere

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

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

Loading…
Cancel
Save