Index: Core/Common/src/Core.Common.Controls.TreeView/TreeNode.cs =================================================================== diff -u -r2fbd76129bb2bbc07cd625614b38012fbbf88cc4 -re868bbacfc273f272c5e85573bbdf7c125ae27ae --- Core/Common/src/Core.Common.Controls.TreeView/TreeNode.cs (.../TreeNode.cs) (revision 2fbd76129bb2bbc07cd625614b38012fbbf88cc4) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeNode.cs (.../TreeNode.cs) (revision e868bbacfc273f272c5e85573bbdf7c125ae27ae) @@ -11,7 +11,6 @@ { private readonly TreeNodeList nodes; private readonly TreeView treeView; - private bool isLoaded; private object tag; private IObservable observable; private readonly int maximumTextLength = 259; // Having very big strings causes problems by tree-view @@ -157,23 +156,10 @@ { get { - if (!isLoaded) - { - RefreshChildNodes(); - } - return nodes; } } - public bool IsLoaded - { - get - { - return isLoaded; - } - } - public bool ShowCheckBox { get; set; } public Color ForegroundColor @@ -192,19 +178,6 @@ public bool IsUpdating { get; private set; } - private void RefreshChildNodes(bool forcedRefresh = false) - { - if (IsUpdating && !forcedRefresh) - { - return; //prevent 're-entrancy' issues - } - - IsUpdating = true; - TreeView.RefreshChildNodes(this); - isLoaded = true; - IsUpdating = false; - } - /// /// Check if the node is a descendent of another node /// @@ -238,16 +211,6 @@ IsUpdating = false; } - public new void Expand() - { - if (!isLoaded) - { - TreeView.RefreshChildNodes(this); - } - - base.Expand(); - } - public TreeNode GetParentOfLevel(int level) { TreeNode node = this; Index: Core/Common/src/Core.Common.Controls.TreeView/TreeView.cs =================================================================== diff -u -r2fbd76129bb2bbc07cd625614b38012fbbf88cc4 -re868bbacfc273f272c5e85573bbdf7c125ae27ae --- Core/Common/src/Core.Common.Controls.TreeView/TreeView.cs (.../TreeView.cs) (revision 2fbd76129bb2bbc07cd625614b38012fbbf88cc4) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeView.cs (.../TreeView.cs) (revision e868bbacfc273f272c5e85573bbdf7c125ae27ae) @@ -297,9 +297,6 @@ { var selectedNodePath = SelectedNode == null ? string.Empty : SelectedNode.FullPath; - // sometimes collection results in full refresh, as a result root node does not get expanded - bool rootNodeIsLoaded = Nodes[0].IsLoaded; - //don't use allNodes since update of childnodes is done by parent. foreach (TreeNode node in Nodes) { @@ -318,7 +315,7 @@ } // expand root node if children were added - if (!rootNodeIsLoaded && Nodes.Count > 0 && Nodes[0].Nodes.Count > 0) + if (Nodes.Count > 0 && Nodes[0].Nodes.Count > 0) { Nodes[0].Expand(); } @@ -338,9 +335,7 @@ currentNode }; - return (currentNode.IsLoaded) - ? allChildNodes.Concat(currentNode.Nodes.SelectMany(GetAllLoadedNodes)) - : allChildNodes; + return allChildNodes.Concat(currentNode.Nodes.SelectMany(GetAllLoadedNodes)); } protected override void OnPaint(PaintEventArgs e) @@ -647,7 +642,7 @@ private TreeNode GetLastNode(TreeNode treeNode) { - if (treeNode.IsLoaded && treeNode.Nodes.Count > 0) + if (treeNode.Nodes.Count > 0) { return GetLastNode(treeNode.Nodes.Last()); } @@ -729,9 +724,7 @@ return rootNode; } - return rootNode.IsLoaded || !skipUnLoadedNodes - ? rootNode.Nodes.Select(n => GetNodeByTag(n, tag, skipUnLoadedNodes)).FirstOrDefault(node => node != null) - : null; + return rootNode.Nodes.Select(n => GetNodeByTag(n, tag, skipUnLoadedNodes)).FirstOrDefault(node => node != null); } /// Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewController.cs =================================================================== diff -u -r5fa6d278e3763a01d20799215bec6f6e398ee417 -re868bbacfc273f272c5e85573bbdf7c125ae27ae --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewController.cs (.../TreeViewController.cs) (revision 5fa6d278e3763a01d20799215bec6f6e398ee417) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewController.cs (.../TreeViewController.cs) (revision e868bbacfc273f272c5e85573bbdf7c125ae27ae) @@ -172,7 +172,6 @@ return; } - bool wasLoaded = treeNode.IsLoaded; if (!ReferenceEquals(treeNode.Tag, tag)) { treeNode.Tag = tag; @@ -187,11 +186,6 @@ treeNode.HasChildren = count > 0; - if (!treeNode.IsLoaded && !wasLoaded) - { - return; - } - if (treeNode.Nodes.Count != count) { RefreshChildNodes(treeNode); @@ -252,26 +246,21 @@ { var newNode = treeView.NewNode(); - newNode.Tag = nodeData; - if (treeView.CheckBoxes) { newNode.Checked = parentNode.Checked; } UpdateNode(parentNode, newNode, nodeData); - //if (newNode.IsVisible) + if (insertionIndex != -1) { - if (insertionIndex != -1) - { - parentNode.Nodes.Insert(insertionIndex, newNode); - } - else - { - parentNode.Nodes.Add(newNode); - } + parentNode.Nodes.Insert(insertionIndex, newNode); } + else + { + parentNode.Nodes.Add(newNode); + } newNode.HasChildren = HasChildren(newNode); } @@ -316,11 +305,6 @@ private IEnumerable GetAllLoadedChildNodes(TreeNode node, string[] forceNodeLoad = null) { - if (!node.IsLoaded && (forceNodeLoad == null || !forceNodeLoad.Contains(node.FullPath))) - { - yield break; - } - foreach (var childNode in node.Nodes) { yield return childNode; @@ -394,10 +378,10 @@ Tag = data }; - treeView.Nodes.Add(rootNode); - UpdateNode(null, rootNode, data); + treeView.Nodes.Add(rootNode); + if (HasChildren(rootNode)) { rootNode.HasChildren = true; @@ -443,6 +427,7 @@ node.Tag = nodeData; presenter.UpdateNode(parentNode, node, nodeData); + RefreshChildNodes(node); } /// Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewNodePresenterBase.cs =================================================================== diff -u -r5fa6d278e3763a01d20799215bec6f6e398ee417 -re868bbacfc273f272c5e85573bbdf7c125ae27ae --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewNodePresenterBase.cs (.../TreeViewNodePresenterBase.cs) (revision 5fa6d278e3763a01d20799215bec6f6e398ee417) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewNodePresenterBase.cs (.../TreeViewNodePresenterBase.cs) (revision e868bbacfc273f272c5e85573bbdf7c125ae27ae) @@ -79,11 +79,6 @@ public virtual void OnNodeChecked(TreeNode node) { - if (!node.IsLoaded) - { - return; - } - foreach (var childNode in node.Nodes) { childNode.Checked = node.Checked; Index: Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControllerTest.cs =================================================================== diff -u -r2f45fd13d134ed6bdfcdb0967d07516beb30409c -re868bbacfc273f272c5e85573bbdf7c125ae27ae --- Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControllerTest.cs (.../TreeViewControllerTest.cs) (revision 2f45fd13d134ed6bdfcdb0967d07516beb30409c) +++ Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControllerTest.cs (.../TreeViewControllerTest.cs) (revision e868bbacfc273f272c5e85573bbdf7c125ae27ae) @@ -166,7 +166,7 @@ LastCall.On(treeview).IgnoreArguments(); Expect.Call(nodePresenter.NodeTagType).Return(typeof(object)).Repeat.Any(); - Expect.Call(nodePresenter.GetChildNodeObjects(null)).IgnoreArguments().Return(Enumerable.Empty()); + Expect.Call(nodePresenter.GetChildNodeObjects(null)).IgnoreArguments().Return(Enumerable.Empty()).Repeat.Any(); Expect.Call(() => nodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); mocks.ReplayAll(); @@ -204,110 +204,6 @@ } [Test] - public void TestRegisterAndUnRegisterOnPropertyChangedOnSetData() - { - var mocks = new MockRepository(); - - var treeview = mocks.StrictMock(); - var nodePresenter = mocks.StrictMock(); - var nodes = new List(); - var parent = new Parent(); - - nodePresenter.TreeView = treeview; - - Expect.Call(treeview.GetNodeByTag(parent)).Return(nodes.FirstOrDefault(n => n.Tag == parent)).Repeat.Any(); - Expect.Call(treeview.Nodes).Return(nodes).Repeat.Any(); - Expect.Call(treeview.Refresh).IgnoreArguments().Repeat.Any(); - treeview.SelectedNode = null; - LastCall.On(treeview).IgnoreArguments(); - - Expect.Call(nodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); - Expect.Call(nodePresenter.GetChildNodeObjects(null)).IgnoreArguments().Return(Enumerable.Empty()); - Expect.Call(() => nodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); - - mocks.ReplayAll(); - - var controller = new TreeViewController(treeview); - controller.RegisterNodePresenter(nodePresenter); - - controller.OnTreeViewHandleCreated(); - - controller.Data = parent; - - // generate property changed with listeners enabled - parent.Name = "Test"; - - controller.Data = null; - - // generate property changed with listeners disabled - parent.Name = "Test 2"; - - mocks.VerifyAll(); - } - - [Test] - public void TestRegisterAndUnRegisterOnCollectionChangedOnSetData() - { - var mocks = new MockRepository(); - - var treeview = mocks.StrictMock(); - var parentNodePresenter = mocks.StrictMock(); - var childNodePresenter = mocks.StrictMock(); - - var controller = new TreeViewController(treeview); - var treeViewNodes = new List(); - - var parent = new Parent(); - var child1 = new Child(); - var child2 = new Child(); - - parent.Children.AddRange(new[] - { - child1, - child2 - }); - treeview.Expect(tv => tv.RefreshChildNodes(null)).IgnoreArguments(); - treeview.Expect(tv => tv.BeginUpdate()).IgnoreArguments().Repeat.Any(); - treeview.Expect(tv => tv.Refresh()).IgnoreArguments().Repeat.Any(); - - treeview.SelectedNode = null; - LastCall.On(treeview).IgnoreArguments(); - - Expect.Call(treeview.Nodes).Return(treeViewNodes).Repeat.Any(); - Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); - - parentNodePresenter.TreeView = treeview; - Expect.Call(parentNodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); - Expect.Call(parentNodePresenter.GetChildNodeObjects(null)).IgnoreArguments().Return(new[] - { - child1, - child2 - }); - Expect.Call(() => parentNodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); - - childNodePresenter.TreeView = treeview; - Expect.Call(childNodePresenter.NodeTagType).Return(typeof(Child)).Repeat.Any(); - - mocks.ReplayAll(); - - controller.OnTreeViewHandleCreated(); - - controller.RegisterNodePresenter(parentNodePresenter); - controller.RegisterNodePresenter(childNodePresenter); - controller.Data = parent; - - // generate collection changed with listeners enabled - parent.Children.Remove(child2); - - controller.Data = null; - - // generate collection changed with listeners disabled - parent.Children.Add(child2); - - mocks.VerifyAll(); - } - - [Test] public void TestRefreshChildNodesOfNodeWithoutChildren() { var mocks = new MockRepository(); @@ -322,7 +218,6 @@ var nodes = new List(); Expect.Call(treeView.Nodes).Return(nodes).Repeat.Any(); Expect.Call(treeView.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); - treeView.Expect(tv => tv.RefreshChildNodes(null)).IgnoreArguments(); Expect.Call(parentNodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); Expect.Call(parentNodePresenter.GetChildNodeObjects(null)).IgnoreArguments().Return(Enumerable.Empty()).Repeat.Twice(); @@ -364,7 +259,7 @@ childNodePresenter.TreeView = treeview; Expect.Call(childNodePresenter.NodeTagType).Return(typeof(Child)).Repeat.Any(); - Expect.Call(() => childNodePresenter.UpdateNode(null, null, null)).IgnoreArguments().Repeat.Times(5); + Expect.Call(() => childNodePresenter.UpdateNode(null, null, null)).IgnoreArguments().Repeat.Times(3); Expect.Call(childNodePresenter.GetChildNodeObjects(parent)).Return(parent.Children).Repeat.Any(); Expect.Call(childNodePresenter.GetChildNodeObjects(null)).IgnoreArguments().Return(Enumerable.Empty()).Repeat.Any(); @@ -422,7 +317,7 @@ childNodePresenter.TreeView = treeview; Expect.Call(childNodePresenter.NodeTagType).Return(typeof(Child)).Repeat.Any(); - Expect.Call(() => childNodePresenter.UpdateNode(null, null, null)).IgnoreArguments().Repeat.Times(6); + Expect.Call(() => childNodePresenter.UpdateNode(null, null, null)).IgnoreArguments().Repeat.Times(4); Expect.Call(childNodePresenter.GetChildNodeObjects(null)).IgnoreArguments().Return(Enumerable.Empty()).Repeat.Any(); mocks.ReplayAll(); @@ -444,46 +339,6 @@ } [Test] - public void TestRefreshUnLoadedNode() - { - var mocks = new MockRepository(); - - var treeNode = mocks.StrictMock(); - var treeview = mocks.StrictMock(); - var nodePresenter = mocks.StrictMock(); - - var tag = new object(); - - Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); - Expect.Call(treeview.BeginUpdate).IgnoreArguments().Repeat.Any(); - Expect.Call(treeview.EndUpdate).IgnoreArguments().Repeat.Any(); - Expect.Call(treeview.InvokeRequired).Return(false).Repeat.Any(); - - treeNode.HasChildren = true; - Expect.Call(treeNode.Tag).Return(tag).Repeat.Any(); - Expect.Call(treeNode.IsLoaded).Return(false).Repeat.Any(); - Expect.Call(treeNode.Parent).Return(null); - Expect.Call(treeNode.Presenter).Return(nodePresenter).Repeat.Any(); - - nodePresenter.TreeView = treeview; - Expect.Call(nodePresenter.NodeTagType).Return(typeof(object)).Repeat.Any(); - Expect.Call(nodePresenter.GetChildNodeObjects(tag)).IgnoreArguments().Return(new[] - { - new object() - }); - Expect.Call(() => nodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); - - mocks.ReplayAll(); - - var presenter = new TreeViewController(treeview); - presenter.RegisterNodePresenter(nodePresenter); - - presenter.UpdateNode(treeNode); - - mocks.VerifyAll(); - } - - [Test] public void TestRefreshLoadedNode() { var mocks = new MockRepository(); @@ -508,14 +363,12 @@ parentTreeNode.HasChildren = true; Expect.Call(parentTreeNode.Tag).Return(parent).Repeat.Any(); - Expect.Call(parentTreeNode.IsLoaded).Return(true).Repeat.Any(); Expect.Call(parentTreeNode.Parent).Return(null); Expect.Call(parentTreeNode.Nodes).Return(subNodes).Repeat.Any(); Expect.Call(parentTreeNode.Presenter).Return(parentNodePresenter).Repeat.Any(); childTreeNode.HasChildren = false; Expect.Call(childTreeNode.Tag).Return(child).Repeat.Any(); - Expect.Call(childTreeNode.IsLoaded).Return(false).Repeat.Any(); Expect.Call(childTreeNode.Parent).Return(parentTreeNode).Repeat.Any(); Expect.Call(childTreeNode.Nodes).Return(new List()).Repeat.Any(); Expect.Call(childTreeNode.Presenter).Return(childNodePresenter).Repeat.Any(); Index: Core/Plugins/src/Core.Plugins.SharpMapGis.Gui/Forms/MapLegendView/MapTreeViewNodePresenter.cs =================================================================== diff -u -r2fbd76129bb2bbc07cd625614b38012fbbf88cc4 -re868bbacfc273f272c5e85573bbdf7c125ae27ae --- Core/Plugins/src/Core.Plugins.SharpMapGis.Gui/Forms/MapLegendView/MapTreeViewNodePresenter.cs (.../MapTreeViewNodePresenter.cs) (revision 2fbd76129bb2bbc07cd625614b38012fbbf88cc4) +++ Core/Plugins/src/Core.Plugins.SharpMapGis.Gui/Forms/MapLegendView/MapTreeViewNodePresenter.cs (.../MapTreeViewNodePresenter.cs) (revision e868bbacfc273f272c5e85573bbdf7c125ae27ae) @@ -49,16 +49,8 @@ public override void UpdateNode(TreeNode parentNode, TreeNode node, Map map) { SetNodeText(node, map); - node.Image = MapIcon; - if (!node.IsLoaded) - { - node.Expand(); - foreach (var subNode in node.Nodes) - { - subNode.Expand(); - } - } + node.Image = MapIcon; } public override IEnumerable GetChildNodeObjects(Map map)