diff --git a/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs b/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs new file mode 100644 index 000000000..16755a75c --- /dev/null +++ b/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs @@ -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 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; + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index cfc74e278..8da618eb3 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -117,6 +117,7 @@ + Form diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs new file mode 100644 index 000000000..aa669b4a8 --- /dev/null +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using mRemoteNG.Container; + + +namespace mRemoteNG.Tree +{ + public class ConnectionTreeModel + { + public List RootNodes { get; } = new List(); + + public void AddRootNode(ContainerInfo rootNode) + { + RootNodes.Add(rootNode); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs new file mode 100644 index 000000000..d59f7b38c --- /dev/null +++ b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs @@ -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; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index ae78029f9..7722da455 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -186,9 +186,11 @@ + + Component