mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
Began building logic to build a TreeView from a connection tree model
This commit is contained in:
195
mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs
Normal file
195
mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
16
mRemoteV1/Tree/ConnectionTreeModel.cs
Normal file
16
mRemoteV1/Tree/ConnectionTreeModel.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
85
mRemoteV1/UI/ConnectionTreeViewBuilder.cs
Normal file
85
mRemoteV1/UI/ConnectionTreeViewBuilder.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user