Files
mRemoteNG/mRemoteV1/Tree/ConnectionTreeNode.cs

283 lines
8.6 KiB
C#

using mRemoteNG.App;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Images;
using System;
using System.Windows.Forms;
using mRemoteNG.Messages;
using mRemoteNG.My;
using mRemoteNG.Root.PuttySessions;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Tree
{
public class ConnectionTreeNode
{
#region Public Methods
public static string GetConstantID(TreeNode node)
{
if (GetNodeType(node) == TreeNodeType.Connection)
return (node.Tag as ConnectionInfo).ConstantID;
else if (GetNodeType(node) == TreeNodeType.Container)
return (node.Tag as ContainerInfo).ConnectionInfo.ConstantID;
return null;
}
public static TreeNode GetNodeFromPositionID(int id)
{
foreach (ConnectionInfo connection in Runtime.ConnectionList)
{
if (connection.PositionID == id)
{
if (connection.IsContainer)
return (connection.Parent as ContainerInfo).TreeNode;
else
return connection.TreeNode;
}
}
return null;
}
public static TreeNode GetNodeFromConstantID(string id)
{
foreach (ConnectionInfo connectionInfo in Runtime.ConnectionList)
{
if (connectionInfo.ConstantID == id)
{
if (connectionInfo.IsContainer)
return (connectionInfo.Parent as ContainerInfo).TreeNode;
else
return connectionInfo.TreeNode;
}
}
return null;
}
public static TreeNodeType GetNodeType(TreeNode treeNode)
{
try
{
if (treeNode == null || treeNode.Tag == null)
return TreeNodeType.None;
if (treeNode.Tag is PuttySessionsNodeInfo)
return TreeNodeType.PuttyRoot;
else if (treeNode.Tag is RootNodeInfo)
return TreeNodeType.Root;
else if (treeNode.Tag is ContainerInfo)
return TreeNodeType.Container;
else if (treeNode.Tag is PuttySessionInfo)
return TreeNodeType.PuttySession;
else if (treeNode.Tag is ConnectionInfo)
return TreeNodeType.Connection;
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Couldn\'t get node type" + Environment.NewLine + ex.Message, true);
}
return TreeNodeType.None;
}
public static TreeNodeType GetNodeTypeFromString(string str)
{
try
{
switch (str.ToLower())
{
case "root":
return TreeNodeType.Root;
case "container":
return TreeNodeType.Container;
case "connection":
return TreeNodeType.Connection;
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Couldn\'t get node type from string" + Environment.NewLine + ex.Message, true);
}
return TreeNodeType.None;
}
public static bool IsEmpty(TreeNode treeNode)
{
try
{
if (treeNode.Nodes.Count > 0)
return false;
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "IsEmpty (Tree.Node) failed" + Environment.NewLine + ex.Message, true);
}
return true;
}
public static TreeNode AddNode(TreeNodeType nodeType, string name = null)
{
try
{
TreeNode treeNode = new TreeNode();
string defaultName = "";
switch (nodeType)
{
case TreeNodeType.Connection:
case TreeNodeType.PuttySession:
defaultName = Language.strNewConnection;
treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed;
treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed;
break;
case TreeNodeType.Container:
defaultName = Language.strNewFolder;
treeNode.ImageIndex = (int)TreeImageType.Container;
treeNode.SelectedImageIndex = (int)TreeImageType.Container;
break;
case TreeNodeType.Root:
defaultName = Language.strNewRoot;
treeNode.ImageIndex = (int)TreeImageType.Root;
treeNode.SelectedImageIndex = (int)TreeImageType.Root;
break;
}
if (!string.IsNullOrEmpty(name))
treeNode.Name = name;
else
treeNode.Name = defaultName;
treeNode.Text = treeNode.Name;
return treeNode;
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "AddNode failed" + Environment.NewLine + ex.Message, true);
}
return null;
}
public static void CloneNode(TreeNode oldTreeNode, TreeNode parentNode = null)
{
try
{
if (GetNodeType(oldTreeNode) == TreeNodeType.Connection)
CloneConnectionNode(oldTreeNode, parentNode);
else if (GetNodeType(oldTreeNode) == TreeNodeType.Container)
CloneContainerNode(oldTreeNode, parentNode);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strErrorCloneNodeFailed, ex.Message));
}
}
private static void CloneContainerNode(TreeNode oldTreeNode, TreeNode parentNode)
{
ContainerInfo oldContainerInfo = (ContainerInfo) oldTreeNode.Tag;
ContainerInfo newContainerInfo = oldContainerInfo.Copy();
ConnectionInfo newConnectionInfo = oldContainerInfo.ConnectionInfo.Copy();
newContainerInfo.ConnectionInfo = newConnectionInfo;
TreeNode newTreeNode = new TreeNode(newContainerInfo.Name);
newTreeNode.Tag = newContainerInfo;
newTreeNode.ImageIndex = (int)TreeImageType.Container;
newTreeNode.SelectedImageIndex = (int)TreeImageType.Container;
newContainerInfo.ConnectionInfo.Parent = newContainerInfo;
Runtime.ContainerList.Add(newContainerInfo);
if (parentNode == null)
{
oldTreeNode.Parent.Nodes.Insert(oldTreeNode.Index + 1, newTreeNode);
ConnectionTree.SelectedNode = newTreeNode;
}
else
{
parentNode.Nodes.Add(newTreeNode);
}
foreach (TreeNode childTreeNode in oldTreeNode.Nodes)
{
CloneNode(childTreeNode, newTreeNode);
}
newTreeNode.Expand();
}
private static void CloneConnectionNode(TreeNode oldTreeNode, TreeNode parentNode)
{
ConnectionInfo oldConnectionInfo = (ConnectionInfo)oldTreeNode.Tag;
ConnectionInfo newConnectionInfo = oldConnectionInfo.Copy();
ConnectionInfoInheritance newInheritance = oldConnectionInfo.Inheritance.Copy();
newInheritance.Parent = newConnectionInfo;
newConnectionInfo.Inheritance = newInheritance;
Runtime.ConnectionList.Add(newConnectionInfo);
TreeNode newTreeNode = new TreeNode(newConnectionInfo.Name);
newTreeNode.Tag = newConnectionInfo;
newTreeNode.ImageIndex = (int)TreeImageType.ConnectionClosed;
newTreeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed;
newConnectionInfo.TreeNode = newTreeNode;
if (parentNode == null)
{
oldTreeNode.Parent.Nodes.Insert(oldTreeNode.Index + 1, newTreeNode);
ConnectionTree.SelectedNode = newTreeNode;
}
else
{
ContainerInfo parentContainerInfo = parentNode.Tag as ContainerInfo;
if (parentContainerInfo != null)
{
newConnectionInfo.Parent = parentContainerInfo;
}
parentNode.Nodes.Add(newTreeNode);
}
}
public static void SetNodeImage(TreeNode treeNode, TreeImageType Img)
{
SetNodeImageIndex(treeNode, (int)Img);
}
public static void RenameNode(ConnectionInfo connectionInfo, string newName)
{
if (newName == null || newName.Length <= 0)
return;
connectionInfo.Name = newName;
if (mRemoteNG.Settings.Default.SetHostnameLikeDisplayName)
connectionInfo.Hostname = newName;
}
#endregion
#region Private Methods
private delegate void SetNodeImageIndexDelegate(TreeNode treeNode, int imageIndex);
private static void SetNodeImageIndex(TreeNode treeNode, int imageIndex)
{
if (treeNode == null || treeNode.TreeView == null)
{
return;
}
if (treeNode.TreeView.InvokeRequired)
{
treeNode.TreeView.Invoke(new SetNodeImageIndexDelegate(SetNodeImageIndex), new object[] { treeNode, imageIndex });
return;
}
treeNode.ImageIndex = imageIndex;
treeNode.SelectedImageIndex = imageIndex;
}
#endregion
}
}