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 @@
<Folder Include="TreeNodes" /> <Folder Include="TreeNodes" />
<Folder Include="TextView" /> <Folder Include="TextView" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="ProfilingSessions\Session20110214_003955.sdps" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project> </Project>

37
ILSpy/TreeNodes/ILSpyTreeNode.cs

@ -32,6 +32,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
abstract class ILSpyTreeNode : SharpTreeNode abstract class ILSpyTreeNode : SharpTreeNode
{ {
FilterSettings filterSettings; FilterSettings filterSettings;
bool childrenNeedFiltering;
public FilterSettings FilterSettings { public FilterSettings FilterSettings {
get { return filterSettings; } get { return filterSettings; }
@ -86,8 +87,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
protected override void OnChildrenChanged(NotifyCollectionChangedEventArgs e) protected override void OnChildrenChanged(NotifyCollectionChangedEventArgs e)
{ {
if (e.NewItems != null) { if (e.NewItems != null) {
foreach (ILSpyTreeNode node in e.NewItems) if (IsVisible) {
ApplyFilterToChild(node); foreach (ILSpyTreeNode node in e.NewItems)
ApplyFilterToChild(node);
} else {
childrenNeedFiltering = true;
}
} }
base.OnChildrenChanged(e); base.OnChildrenChanged(e);
} }
@ -109,12 +114,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
break; break;
case FilterResult.Recurse: case FilterResult.Recurse:
child.FilterSettings = this.FilterSettings; child.FilterSettings = this.FilterSettings;
child.EnsureLazyChildren(); child.EnsureChildrenFiltered();
child.IsHidden = child.Children.All(c => c.IsHidden); child.IsHidden = child.Children.All(c => c.IsHidden);
break; break;
case FilterResult.MatchAndRecurse: case FilterResult.MatchAndRecurse:
child.FilterSettings = StripSearchTerm(this.FilterSettings); child.FilterSettings = StripSearchTerm(this.FilterSettings);
child.EnsureLazyChildren(); child.EnsureChildrenFiltered();
child.IsHidden = child.Children.All(c => c.IsHidden); child.IsHidden = child.Children.All(c => c.IsHidden);
break; break;
default: default:
@ -136,8 +141,28 @@ namespace ICSharpCode.ILSpy.TreeNodes
protected virtual void OnFilterSettingsChanged() protected virtual void OnFilterSettingsChanged()
{ {
RaisePropertyChanged("Text"); RaisePropertyChanged("Text");
foreach (ILSpyTreeNode node in this.Children.OfType<ILSpyTreeNode>()) if (IsVisible) {
ApplyFilterToChild(node); 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
bool newIsVisible = parentIsVisible && !isHidden; bool newIsVisible = parentIsVisible && !isHidden;
if (isVisible != newIsVisible) { if (isVisible != newIsVisible) {
isVisible = newIsVisible; isVisible = newIsVisible;
// invalidate the augmented data // invalidate the augmented data
SharpTreeNode node = this; SharpTreeNode node = this;
while (node != null && node.totalListLength >= 0) { while (node != null && node.totalListLength >= 0) {
@ -49,6 +50,8 @@ namespace ICSharpCode.TreeView
var flattener = GetListRoot().treeFlattener; var flattener = GetListRoot().treeFlattener;
if (flattener != null) { if (flattener != null) {
flattener.NodesRemoved(GetVisibleIndexForNode(this), removedNodes); flattener.NodesRemoved(GetVisibleIndexForNode(this), removedNodes);
foreach (var n in removedNodes)
n.OnIsVisibleChanged();
} }
} }
// Tell the flattener about the new nodes: // Tell the flattener about the new nodes:
@ -56,11 +59,15 @@ namespace ICSharpCode.TreeView
var flattener = GetListRoot().treeFlattener; var flattener = GetListRoot().treeFlattener;
if (flattener != null) { if (flattener != null) {
flattener.NodesInserted(GetVisibleIndexForNode(this), VisibleDescendantsAndSelf()); flattener.NodesInserted(GetVisibleIndexForNode(this), VisibleDescendantsAndSelf());
foreach (var n in VisibleDescendantsAndSelf())
n.OnIsVisibleChanged();
} }
} }
} }
} }
protected virtual void OnIsVisibleChanged() {}
void UpdateChildIsVisible(bool updateFlattener) void UpdateChildIsVisible(bool updateFlattener)
{ {
if (modelChildren != null && modelChildren.Count > 0) { if (modelChildren != null && modelChildren.Count > 0) {
@ -125,14 +132,22 @@ namespace ICSharpCode.TreeView
if (modelParent != null) if (modelParent != null)
UpdateIsVisible(modelParent.isVisible && modelParent.isExpanded, true); UpdateIsVisible(modelParent.isVisible && modelParent.isExpanded, true);
RaisePropertyChanged("IsHidden"); 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; bool isSelected;
public bool IsSelected public bool IsSelected {
{
get { return isSelected; } get { return isSelected; }
set { set {
if (isSelected != value) { if (isSelected != value) {
@ -220,7 +235,7 @@ namespace ICSharpCode.TreeView
public virtual bool ShowExpander public virtual bool ShowExpander
{ {
get { return Children.Count > 0 || LazyLoading; } get { return LazyLoading || Children.Any(c => !c.isHidden); }
} }
bool isExpanded; bool isExpanded;
@ -232,15 +247,21 @@ namespace ICSharpCode.TreeView
{ {
if (isExpanded != value) { if (isExpanded != value) {
isExpanded = value; isExpanded = value;
UpdateChildIsVisible(true);
if (isExpanded) { if (isExpanded) {
EnsureLazyChildren(); EnsureLazyChildren();
OnExpanding();
} else {
OnCollapsing();
} }
UpdateChildIsVisible(true);
RaisePropertyChanged("IsExpanded"); RaisePropertyChanged("IsExpanded");
} }
} }
} }
protected virtual void OnExpanding() {}
protected virtual void OnCollapsing() {}
bool lazyLoading; bool lazyLoading;
public bool LazyLoading public bool LazyLoading

Loading…
Cancel
Save