Browse Source

Filtering performance improvement.

pull/10/head
Daniel Grunwald 15 years ago
parent
commit
c2e909a386
  1. 3
      ILSpy/ILSpy.csproj
  2. 37
      ILSpy/TreeNodes/ILSpyTreeNode.cs
  3. 29
      SharpTreeView/SharpTreeNode.cs

3
ILSpy/ILSpy.csproj

@ -224,5 +224,8 @@ @@ -224,5 +224,8 @@
<Folder Include="TreeNodes" />
<Folder Include="TextView" />
</ItemGroup>
<ItemGroup>
<Content Include="ProfilingSessions\Session20110214_003955.sdps" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

37
ILSpy/TreeNodes/ILSpyTreeNode.cs

@ -32,6 +32,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -32,6 +32,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
abstract class ILSpyTreeNode : SharpTreeNode
{
FilterSettings filterSettings;
bool childrenNeedFiltering;
public FilterSettings FilterSettings {
get { return filterSettings; }
@ -86,8 +87,12 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -86,8 +87,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
protected override void OnChildrenChanged(NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null) {
foreach (ILSpyTreeNode node in e.NewItems)
ApplyFilterToChild(node);
if (IsVisible) {
foreach (ILSpyTreeNode node in e.NewItems)
ApplyFilterToChild(node);
} else {
childrenNeedFiltering = true;
}
}
base.OnChildrenChanged(e);
}
@ -109,12 +114,12 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -109,12 +114,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
break;
case FilterResult.Recurse:
child.FilterSettings = this.FilterSettings;
child.EnsureLazyChildren();
child.EnsureChildrenFiltered();
child.IsHidden = child.Children.All(c => c.IsHidden);
break;
case FilterResult.MatchAndRecurse:
child.FilterSettings = StripSearchTerm(this.FilterSettings);
child.EnsureLazyChildren();
child.EnsureChildrenFiltered();
child.IsHidden = child.Children.All(c => c.IsHidden);
break;
default:
@ -136,8 +141,28 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -136,8 +141,28 @@ namespace ICSharpCode.ILSpy.TreeNodes
protected virtual void OnFilterSettingsChanged()
{
RaisePropertyChanged("Text");
foreach (ILSpyTreeNode node in this.Children.OfType<ILSpyTreeNode>())
ApplyFilterToChild(node);
if (IsVisible) {
foreach (ILSpyTreeNode node in this.Children.OfType<ILSpyTreeNode>())
ApplyFilterToChild(node);
} else {
childrenNeedFiltering = true;
}
}
protected override void OnIsVisibleChanged()
{
base.OnIsVisibleChanged();
EnsureChildrenFiltered();
}
void EnsureChildrenFiltered()
{
EnsureLazyChildren();
if (childrenNeedFiltering) {
childrenNeedFiltering = false;
foreach (ILSpyTreeNode node in this.Children.OfType<ILSpyTreeNode>())
ApplyFilterToChild(node);
}
}
}

29
SharpTreeView/SharpTreeNode.cs

@ -26,6 +26,7 @@ namespace ICSharpCode.TreeView @@ -26,6 +26,7 @@ namespace ICSharpCode.TreeView
bool newIsVisible = parentIsVisible && !isHidden;
if (isVisible != newIsVisible) {
isVisible = newIsVisible;
// invalidate the augmented data
SharpTreeNode node = this;
while (node != null && node.totalListLength >= 0) {
@ -49,6 +50,8 @@ namespace ICSharpCode.TreeView @@ -49,6 +50,8 @@ namespace ICSharpCode.TreeView
var flattener = GetListRoot().treeFlattener;
if (flattener != null) {
flattener.NodesRemoved(GetVisibleIndexForNode(this), removedNodes);
foreach (var n in removedNodes)
n.OnIsVisibleChanged();
}
}
// Tell the flattener about the new nodes:
@ -56,11 +59,15 @@ namespace ICSharpCode.TreeView @@ -56,11 +59,15 @@ namespace ICSharpCode.TreeView
var flattener = GetListRoot().treeFlattener;
if (flattener != null) {
flattener.NodesInserted(GetVisibleIndexForNode(this), VisibleDescendantsAndSelf());
foreach (var n in VisibleDescendantsAndSelf())
n.OnIsVisibleChanged();
}
}
}
}
protected virtual void OnIsVisibleChanged() {}
void UpdateChildIsVisible(bool updateFlattener)
{
if (modelChildren != null && modelChildren.Count > 0) {
@ -125,14 +132,22 @@ namespace ICSharpCode.TreeView @@ -125,14 +132,22 @@ namespace ICSharpCode.TreeView
if (modelParent != null)
UpdateIsVisible(modelParent.isVisible && modelParent.isExpanded, true);
RaisePropertyChanged("IsHidden");
if (Parent != null)
Parent.RaisePropertyChanged("ShowExpander");
}
}
}
/// <summary>
/// Return true when this node is not hidden and when all parent nodes are expanded and not hidden.
/// </summary>
public bool IsVisible {
get { return isVisible; }
}
bool isSelected;
public bool IsSelected
{
public bool IsSelected {
get { return isSelected; }
set {
if (isSelected != value) {
@ -220,7 +235,7 @@ namespace ICSharpCode.TreeView @@ -220,7 +235,7 @@ namespace ICSharpCode.TreeView
public virtual bool ShowExpander
{
get { return Children.Count > 0 || LazyLoading; }
get { return LazyLoading || Children.Any(c => !c.isHidden); }
}
bool isExpanded;
@ -232,15 +247,21 @@ namespace ICSharpCode.TreeView @@ -232,15 +247,21 @@ namespace ICSharpCode.TreeView
{
if (isExpanded != value) {
isExpanded = value;
UpdateChildIsVisible(true);
if (isExpanded) {
EnsureLazyChildren();
OnExpanding();
} else {
OnCollapsing();
}
UpdateChildIsVisible(true);
RaisePropertyChanged("IsExpanded");
}
}
}
protected virtual void OnExpanding() {}
protected virtual void OnCollapsing() {}
bool lazyLoading;
public bool LazyLoading

Loading…
Cancel
Save