Began building logic to build a TreeView from a connection tree model

This commit is contained in:
David Sparer
2016-08-19 12:46:49 -06:00
parent 23dcb3e823
commit 3baaf8bda4
5 changed files with 299 additions and 0 deletions

View File

@@ -0,0 +1,195 @@
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.UI;
using NUnit.Framework;
namespace mRemoteNGTests.UI
{
public class ConnectionTreeViewBuilderTests
{
private ConnectionTreeModel _connectionTreeModel;
private ConnectionTreeViewBuilder _connectionTreeViewBuilder;
[SetUp]
public void Setup()
{
_connectionTreeModel = new ConnectionTreeModel();
_connectionTreeViewBuilder = new ConnectionTreeViewBuilder(_connectionTreeModel);
}
[TearDown]
public void Teardown()
{
_connectionTreeModel = null;
_connectionTreeViewBuilder = null;
}
[Test]
public void RootNodeGetsAddedToTreeView()
{
CreateRootNode();
_connectionTreeViewBuilder.Build();
var tree = _connectionTreeViewBuilder.TreeView;
Assert.That(tree.Nodes.Count, Is.EqualTo(1));
}
[Test]
public void BuildTreeWithSingleConnection()
{
/**
* Root
* -- con1
*/
var root = CreateRootNode();
var con1 = new ConnectionInfo();
root.Add(con1);
_connectionTreeViewBuilder.Build();
var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0];
Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(con1));
}
[Test]
public void BuildTreeWithSingleFolder()
{
/**
* Root
* -- folder1
*/
var root = CreateRootNode();
var folder1 = new ContainerInfo();
root.Add(folder1);
_connectionTreeViewBuilder.Build();
var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0];
Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1));
}
[Test]
public void BuildTreeWithTwoConnectionsUnderRoot()
{
/**
* Root
* -- con1
* -- con2
*/
var root = CreateRootNode();
var con1 = new ConnectionInfo();
var con2 = new ConnectionInfo();
root.AddRange(new []{con1, con2});
_connectionTreeViewBuilder.Build();
var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0];
Assert.That(GetTreeNodeTags(rootTreeNode.Nodes), Is.EquivalentTo(new[] { con1, con2 }));
}
[Test]
public void BuildTreeWithConnectionInFolder()
{
/*
* Root
* -- folder1
* ---- con1
*/
var root = CreateRootNode();
var folder1 = new ContainerInfo();
var con1 = new ConnectionInfo();
root.Add(folder1);
folder1.Add(con1);
_connectionTreeViewBuilder.Build();
var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0];
Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1));
Assert.That(rootTreeNode.Nodes[0].Nodes[0].Tag, Is.EqualTo(con1));
}
[Test]
public void BuildTreeWithTwoFoldersAndFolderOneHasAConnection()
{
/**
* Root
* -- folder1
* ---- con1
* -- folder2
*/
var root = CreateRootNode();
var folder1 = new ContainerInfo();
var con1 = new ConnectionInfo();
var folder2 = new ContainerInfo();
root.Add(folder1);
folder1.Add(con1);
root.Add(folder2);
_connectionTreeViewBuilder.Build();
var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0];
Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1));
Assert.That(rootTreeNode.Nodes[0].Nodes[0].Tag, Is.EqualTo(con1));
Assert.That(rootTreeNode.Nodes[1].Tag, Is.EqualTo(folder2));
}
[Test]
public void BuildTreeWithConnectionNestedTwoLevelsDeep()
{
/**
* Root
* -- folder1
* ---- folder2
* ------ con1
*/
var root = CreateRootNode();
var folder1 = new ContainerInfo();
var folder2 = new ContainerInfo();
var con1 = new ConnectionInfo();
root.Add(folder1);
folder1.Add(folder2);
folder2.Add(con1);
_connectionTreeViewBuilder.Build();
var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0];
Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1));
}
[Test]
public void BuildTreeWithMultipleDeepRecursion()
{
/**
* Root
* -- folder1
* ---- folder2
* ------ con1
* -- folder3
* ---- folder4
* ------ con2
*/
var root = CreateRootNode();
var folder1 = new ContainerInfo();
var folder2 = new ContainerInfo();
var con1 = new ConnectionInfo();
var folder3 = new ContainerInfo();
var folder4 = new ContainerInfo();
var con2 = new ConnectionInfo();
root.Add(folder1);
folder1.Add(folder2);
folder2.Add(con1);
root.Add(folder3);
folder3.Add(folder4);
folder4.Add(con2);
_connectionTreeViewBuilder.Build();
var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0];
Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1));
Assert.That(rootTreeNode.Nodes[1].Nodes[0].Nodes[0].Tag, Is.EqualTo(con2));
}
private IEnumerable<ConnectionInfo> GetTreeNodeTags(TreeNodeCollection treeNodes)
{
return (from TreeNode node in treeNodes select (ConnectionInfo) node.Tag).ToList();
}
private RootNodeInfo CreateRootNode()
{
var root = new RootNodeInfo(RootNodeType.Connection);
_connectionTreeModel.AddRootNode(root);
return root;
}
}
}

View File

@@ -117,6 +117,7 @@
<Compile Include="Security\CryptographyProviderFactoryTests.cs" />
<Compile Include="Security\EncryptedSecureStringTests.cs" />
<Compile Include="Security\LegacyRijndaelCryptographyProviderTests.cs" />
<Compile Include="UI\ConnectionTreeViewBuilderTests.cs" />
<Compile Include="UI\Controls\CustomListViewTests.cs" />
<Compile Include="UI\Controls\TestForm.cs">
<SubType>Form</SubType>

View File

@@ -0,0 +1,16 @@
using System.Collections.Generic;
using mRemoteNG.Container;
namespace mRemoteNG.Tree
{
public class ConnectionTreeModel
{
public List<ContainerInfo> RootNodes { get; } = new List<ContainerInfo>();
public void AddRootNode(ContainerInfo rootNode)
{
RootNodes.Add(rootNode);
}
}
}

View File

@@ -0,0 +1,85 @@
using System.Linq;
using System.Windows.Forms;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.UI
{
public class ConnectionTreeViewBuilder
{
private ConnectionTreeModel _connectionTreeModel;
public TreeView TreeView { get; private set; }
public ConnectionList ConnectionList { get; set; }
public ContainerList ContainerList { get; set; }
public ConnectionTreeViewBuilder(ConnectionTreeModel connectionTreeModel)
{
_connectionTreeModel = connectionTreeModel;
TreeView = new TreeView();
ConnectionList = new ConnectionList();
ContainerList = new ContainerList();
}
public void Build()
{
var rootNodeInfo = _connectionTreeModel.RootNodes.First(a => a is RootNodeInfo);
BuildTreeViewFromConnectionTree(rootNodeInfo, InitRootNode((RootNodeInfo)rootNodeInfo));
}
private TreeNode InitRootNode(RootNodeInfo rootNodeInfo)
{
var rootNode = new TreeNode(rootNodeInfo.Name);
TreeView.Nodes.Add(rootNode);
return rootNode;
}
private void BuildTreeViewFromConnectionTree(ContainerInfo parentContainer, TreeNode parentTreeNode)
{
if (parentContainer.Children.Any())
{
foreach (var child in parentContainer.Children)
{
var treeNode = new TreeNode(child.Name);
parentTreeNode.Nodes.Add(treeNode);
if (child is ContainerInfo)
{
AddContainerToList((ContainerInfo) child, treeNode);
BuildTreeViewFromConnectionTree((ContainerInfo)child, treeNode);
}
else
{
AddConnectionToList(child, treeNode);
}
}
}
else
{
//parentTreeNode.Text = parentContainer.Name;
}
}
private void AddConnectionToList(ConnectionInfo connectionInfo, TreeNode treeNode)
{
connectionInfo.TreeNode = treeNode;
ConnectionList.Add(connectionInfo);
treeNode.Tag = connectionInfo;
treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed;
treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed;
}
private void AddContainerToList(ContainerInfo containerInfo, TreeNode treeNode)
{
containerInfo.TreeNode = treeNode;
ContainerList.Add(containerInfo);
treeNode.Tag = containerInfo;
treeNode.ImageIndex = (int)TreeImageType.Container;
treeNode.SelectedImageIndex = (int)TreeImageType.Container;
}
}
}

View File

@@ -186,9 +186,11 @@
<Compile Include="Tools\Sorting\TreeNodeSorter.cs" />
<Compile Include="Tools\Sorting\Sortable.cs" />
<Compile Include="Tree\ConnectionTree.cs" />
<Compile Include="Tree\ConnectionTreeModel.cs" />
<Compile Include="Tree\NodeType.cs" />
<Compile Include="Tree\Root\RootNodeTypeEnum.cs" />
<Compile Include="Tree\TreeNodeMover.cs" />
<Compile Include="UI\ConnectionTreeViewBuilder.cs" />
<Compile Include="UI\Controls\FilteredPropertyGrid\FilteredPropertyGrid.cs">
<SubType>Component</SubType>
</Compile>