Files
mRemoteNG/mRemoteV1/Tree/TreeNodeMover.cs
David Sparer 45b3f3d56f fixed issue described in MR-385
also made some refactoring changes in a quest to make the code more readable
2016-05-07 17:59:23 -06:00

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;
((Inheritance)_nodeBeingMoved.Tag).Inheritance.EnableInheritance();
}
}
private void UpdateParentReferenceWhenParentIsRoot()
{
if (ConnectionTreeNode.GetNodeType(_nodeBeingMoved.Parent) == TreeNodeType.Root)
{
((Parent)_nodeBeingMoved.Tag).Parent = null;
((Inheritance)_nodeBeingMoved.Tag).Inheritance.DisableInheritance();
}
}
private void SelectTheNewNode()
{
_nodeBeingMoved.EnsureVisible();
_nodeBeingMoved.TreeView.SelectedNode = _nodeBeingMoved;
}
}
}