Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 8990ebe

Browse files
committed
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.
1 parent 2fdf239 commit 8990ebe

2 files changed

Lines changed: 21 additions & 5 deletions

File tree

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,18 @@ public DerivedTypesTreeNode(ITypeDefinitionModel definition)
4343
if (definition == null)
4444
throw new ArgumentNullException("definition");
4545
this.definition = definition;
46-
this.definition.Updated += (sender, e) => UpdateDerivedTypes();
46+
this.definition.Updated += OnDefinitionUpdated;
4747
this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.DerivedTypes");
4848
derivedTypes = new SimpleModelCollection<ITypeDefinitionModel>();
4949
childrenLoaded = false;
5050
}
5151

52+
protected override void DetachEventHandlers()
53+
{
54+
this.definition.Updated -= OnDefinitionUpdated;
55+
base.DetachEventHandlers();
56+
}
57+
5258
protected override IModelCollection<object> ModelChildren {
5359
get {
5460
if (!childrenLoaded) {
@@ -59,6 +65,14 @@ protected override IModelCollection<object> ModelChildren {
5965
}
6066
}
6167

68+
void OnDefinitionUpdated(object sender, EventArgs e)
69+
{
70+
// Listing the derived types can be expensive; so it's better to switch back to lazy-loading
71+
// (collapsing the node if necessary)
72+
SwitchBackToLazyLoading();
73+
childrenLoaded = false;
74+
}
75+
6276
public override SharpTreeNode FindChildNodeRecursively(Func<SharpTreeNode, bool> predicate)
6377
{
6478
// Don't search children of this node, because they are repeating type nodes from elsewhere

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ protected virtual void InsertSpecialNodes()
5151
protected virtual void DetachEventHandlers()
5252
{
5353
// If children loaded, also detach the collection change event handler
54-
if (!LazyLoading) {
54+
if (listeningToCollectionChangedEvents) {
5555
ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged;
5656
listeningToCollectionChangedEvents = false;
5757
}
@@ -122,10 +122,12 @@ void ModelChildrenCollectionChanged(IReadOnlyCollection<object> removedItems, IR
122122
InsertChildren(addedItems);
123123
}
124124

125-
void SwitchBackToLazyLoading()
125+
protected void SwitchBackToLazyLoading()
126126
{
127-
ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged;
128-
listeningToCollectionChangedEvents = false;
127+
if (listeningToCollectionChangedEvents) {
128+
ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged;
129+
listeningToCollectionChangedEvents = false;
130+
}
129131
Children.Clear();
130132
LazyLoading = true;
131133
}

0 commit comments

Comments
 (0)