Index: src/Common/DelftTools.Controls.Swf/TreeViewControls/TreeView.cs =================================================================== diff -u -r3135c1081fb4f8e92eadebada2bceaf27077d63c -r65413d7212c51bc5fb428abb0a213a878285880c --- src/Common/DelftTools.Controls.Swf/TreeViewControls/TreeView.cs (.../TreeView.cs) (revision 3135c1081fb4f8e92eadebada2bceaf27077d63c) +++ src/Common/DelftTools.Controls.Swf/TreeViewControls/TreeView.cs (.../TreeView.cs) (revision 65413d7212c51bc5fb428abb0a213a878285880c) @@ -29,7 +29,6 @@ private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private readonly TreeNodeList nodes; - private bool isUpdateSuspended; private TreeViewController controller; private int dropAtLocation; private Point lastDragOverPoint; @@ -182,14 +181,6 @@ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ViewInfo ViewInfo { get; set; } - public bool IsUpdateSuspended - { - get - { - return isUpdateSuspended; - } - } - public bool SelectedNodeCanDelete() { return controller.CanDeleteNode(SelectedNode); @@ -366,24 +357,6 @@ } } - public new void BeginUpdate() - { - if (!isUpdateSuspended) - { - isUpdateSuspended = true; - base.BeginUpdate(); - } - } - - public new void EndUpdate() - { - if (isUpdateSuspended) - { - isUpdateSuspended = false; - base.EndUpdate(); - } - } - public IEnumerable GetAllLoadedNodes(ITreeNode currentNode) { var allChildNodes = new[] @@ -438,11 +411,6 @@ { e.DrawDefault = false; - if (isUpdateSuspended) - { - return; - } - var selected = (e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected; ((TreeNode) e.Node).DrawNode(e.Graphics, selected); Index: test/Common/DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewTest.cs =================================================================== diff -u -rd8e4bf47a1ff5b13a9d9e6eaf60b9ca9cd7c7555 -r65413d7212c51bc5fb428abb0a213a878285880c --- test/Common/DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewTest.cs (.../TreeViewTest.cs) (revision d8e4bf47a1ff5b13a9d9e6eaf60b9ca9cd7c7555) +++ test/Common/DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewTest.cs (.../TreeViewTest.cs) (revision 65413d7212c51bc5fb428abb0a213a878285880c) @@ -1,12 +1,17 @@ +using System; using System.Collections; +using System.Diagnostics; using System.Linq; +using System.Threading; +using System.Windows.Forms; using DelftTools.Controls; using DelftTools.Controls.Swf.TreeViewControls; using DelftTools.Tests.TestObjects; using DelftTools.TestUtils; using NUnit.Framework; using Rhino.Mocks; using SharpTestsEx; +using TreeView = DelftTools.Controls.Swf.TreeViewControls.TreeView; namespace DelftTools.Tests.Controls.Swf.TreeViewControls { @@ -305,8 +310,74 @@ treeView.Nodes[0].Nodes[0].IsExpanded.Should("node remains expanded").Be.True(); } - private class DynamicParentNodePresenter : TreeViewNodePresenterBase + [Test] + public void TreeViewUpdateOnManyPropertyChangesShouldBeFast() { + var parent = new Child + { + Name = "parent" + }; + + for (var i = 0; i < 100; i++) + { + parent.Children.Add(new Child + { + Name = i.ToString() + }); + } + + // measure time to perform action without tree view + Func processingAction = () => + { + var stopwatch = new Stopwatch(); + stopwatch.Start(); + var rnd = new Random(); + for (var i = 0; i < 99; i++) + { + var child = parent.Children[rnd.Next(99)]; + child.Name = i.ToString(); + } + stopwatch.Stop(); + + return stopwatch.ElapsedMilliseconds; + }; + + Console.WriteLine("Elapsed time to perform action without tree view: " + processingAction()); + + var treeView = new TreeView + { + NodePresenters = + { + new ChildNodePresenter() + }, + Data = parent + }; + + // expand / collapse / expand + treeView.ExpandAll(); + + double elapsedMillisecondsWithTreeView = 0; + Action
onShow = delegate + { + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + elapsedMillisecondsWithTreeView = processingAction(); + Console.WriteLine("Elapsed time to perform action with tree view: " + elapsedMillisecondsWithTreeView); + + treeView.WaitUntilAllEventsAreProcessed(); + + stopwatch.Stop(); + Console.WriteLine("Elapsed time to refresh tree view: " + stopwatch.ElapsedMilliseconds); + }; + + WindowsFormsTestHelper.ShowModal(treeView, onShow); + + TestHelper.AssertIsFasterThan(10, () => Thread.Sleep((int) elapsedMillisecondsWithTreeView)); + } + + public class DynamicParentNodePresenter : TreeViewNodePresenterBase + { public override void UpdateNode(ITreeNode parentNode, ITreeNode node, Parent nodeData) { node.Text = nodeData.Name;