mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-26 03:58:45 +08:00
89 lines
2.9 KiB
C#
89 lines
2.9 KiB
C#
using mRemoteNG.App;
|
|
using mRemoteNG.Connection;
|
|
using mRemoteNG.Container;
|
|
using System.Windows.Forms;
|
|
|
|
namespace mRemoteNG.Tree
|
|
{
|
|
public class TreeNodeMover
|
|
{
|
|
TreeNode _nodeBeingMoved;
|
|
|
|
public TreeNodeMover (TreeNode NodeBeingMoved)
|
|
{
|
|
_nodeBeingMoved = NodeBeingMoved;
|
|
}
|
|
|
|
public void MoveNode(TreeNode TargetNode)
|
|
{
|
|
if (WeAreAllowedToMoveThisNode(TargetNode))
|
|
{
|
|
RemoveNodeFromCurrentLocation();
|
|
AddNodeToNewLocation(TargetNode);
|
|
UpdateParentReferences();
|
|
SelectTheNewNode();
|
|
Runtime.SaveConnectionsBG();
|
|
}
|
|
}
|
|
|
|
private bool WeAreAllowedToMoveThisNode(TreeNode targetNode)
|
|
{
|
|
bool weShouldMoveThisNode = true;
|
|
|
|
if (_nodeBeingMoved == targetNode)
|
|
weShouldMoveThisNode = false;
|
|
if (ConnectionTreeNode.GetNodeType(_nodeBeingMoved) == TreeNodeType.Root)
|
|
weShouldMoveThisNode = false;
|
|
if (_nodeBeingMoved == targetNode.Parent)
|
|
weShouldMoveThisNode = false;
|
|
|
|
return weShouldMoveThisNode;
|
|
}
|
|
|
|
private void RemoveNodeFromCurrentLocation()
|
|
{
|
|
_nodeBeingMoved.Remove();
|
|
}
|
|
|
|
private void AddNodeToNewLocation(TreeNode targetNode)
|
|
{
|
|
//If there is no targetNode add dropNode to the bottom of
|
|
//the TreeView root nodes, otherwise add it to the end of
|
|
//the dropNode child nodes
|
|
if (ConnectionTreeNode.GetNodeType(targetNode) == TreeNodeType.Root | ConnectionTreeNode.GetNodeType(targetNode) == TreeNodeType.Container)
|
|
targetNode.Nodes.Insert(0, _nodeBeingMoved);
|
|
else
|
|
targetNode.Parent.Nodes.Insert(targetNode.Index + 1, _nodeBeingMoved);
|
|
}
|
|
|
|
private void UpdateParentReferences()
|
|
{
|
|
UpdateParentReferenceWhenParentIsAContainer();
|
|
UpdateParentReferenceWhenParentIsRoot();
|
|
}
|
|
|
|
private void UpdateParentReferenceWhenParentIsAContainer()
|
|
{
|
|
if (ConnectionTreeNode.GetNodeType(_nodeBeingMoved.Parent) == TreeNodeType.Container)
|
|
{
|
|
((Parent)_nodeBeingMoved.Tag).Parent = (ContainerInfo)_nodeBeingMoved.Parent.Tag;
|
|
((IInheritable)_nodeBeingMoved.Tag).Inheritance.EnableInheritance();
|
|
}
|
|
}
|
|
|
|
private void UpdateParentReferenceWhenParentIsRoot()
|
|
{
|
|
if (ConnectionTreeNode.GetNodeType(_nodeBeingMoved.Parent) == TreeNodeType.Root)
|
|
{
|
|
((Parent)_nodeBeingMoved.Tag).Parent = null;
|
|
((IInheritable)_nodeBeingMoved.Tag).Inheritance.DisableInheritance();
|
|
}
|
|
}
|
|
|
|
private void SelectTheNewNode()
|
|
{
|
|
_nodeBeingMoved.EnsureVisible();
|
|
_nodeBeingMoved.TreeView.SelectedNode = _nodeBeingMoved;
|
|
}
|
|
}
|
|
} |