diff --git a/mRemoteV1/Tree/ExpandNodeClickHandler.cs b/mRemoteV1/Tree/ExpandNodeClickHandler.cs new file mode 100644 index 00000000..5376d731 --- /dev/null +++ b/mRemoteV1/Tree/ExpandNodeClickHandler.cs @@ -0,0 +1,28 @@ +using System; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.UI.Controls; + + +namespace mRemoteNG.Tree +{ + public class ExpandNodeClickHandler : ITreeNodeClickHandler + { + private readonly ConnectionTree _connectionTree; + + public ExpandNodeClickHandler(ConnectionTree connectionTree) + { + if (connectionTree == null) + throw new ArgumentNullException(nameof(connectionTree)); + + _connectionTree = connectionTree; + } + + public void Execute(ConnectionInfo clickedNode) + { + var clickedNodeAsContainer = clickedNode as ContainerInfo; + if (clickedNodeAsContainer == null) return; + _connectionTree.ToggleExpansion(clickedNodeAsContainer); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Tree/ITreeNodeClickHandler.cs b/mRemoteV1/Tree/ITreeNodeClickHandler.cs new file mode 100644 index 00000000..40b2852a --- /dev/null +++ b/mRemoteV1/Tree/ITreeNodeClickHandler.cs @@ -0,0 +1,10 @@ +using mRemoteNG.Connection; + + +namespace mRemoteNG.Tree +{ + public interface ITreeNodeClickHandler + { + void Execute(ConnectionInfo clickedNode); + } +} \ No newline at end of file diff --git a/mRemoteV1/Tree/OpenConnectionClickHandler.cs b/mRemoteV1/Tree/OpenConnectionClickHandler.cs new file mode 100644 index 00000000..22c1794e --- /dev/null +++ b/mRemoteV1/Tree/OpenConnectionClickHandler.cs @@ -0,0 +1,15 @@ +using mRemoteNG.Connection; + + +namespace mRemoteNG.Tree +{ + public class OpenConnectionClickHandler : ITreeNodeClickHandler + { + public void Execute(ConnectionInfo clickedNode) + { + if (clickedNode == null) return; + if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; + ConnectionInitiator.OpenConnection(clickedNode); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Tree/SwitchToConnectionClickHandler.cs b/mRemoteV1/Tree/SwitchToConnectionClickHandler.cs new file mode 100644 index 00000000..fbb24eb3 --- /dev/null +++ b/mRemoteV1/Tree/SwitchToConnectionClickHandler.cs @@ -0,0 +1,15 @@ +using mRemoteNG.Connection; + + +namespace mRemoteNG.Tree +{ + public class SwitchToConnectionClickHandler : ITreeNodeClickHandler + { + public void Execute(ConnectionInfo clickedNode) + { + if (clickedNode == null) return; + if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; + ConnectionInitiator.SwitchToOpenConnection(clickedNode); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Tree/TreeNodeDoubleClickHandler.cs b/mRemoteV1/Tree/TreeNodeDoubleClickHandler.cs new file mode 100644 index 00000000..333ae08a --- /dev/null +++ b/mRemoteV1/Tree/TreeNodeDoubleClickHandler.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using mRemoteNG.Connection; + + +namespace mRemoteNG.Tree +{ + public class TreeNodeDoubleClickHandler : ITreeNodeClickHandler + { + public IEnumerable ClickHandlers { get; set; } = new ITreeNodeClickHandler[0]; + + public void Execute(ConnectionInfo clickedNode) + { + if (clickedNode == null) return; + foreach (var handler in ClickHandlers) + { + handler.Execute(clickedNode); + } + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Tree/TreeNodeSingleClickHandler.cs b/mRemoteV1/Tree/TreeNodeSingleClickHandler.cs new file mode 100644 index 00000000..5ce6f847 --- /dev/null +++ b/mRemoteV1/Tree/TreeNodeSingleClickHandler.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using mRemoteNG.Connection; + + +namespace mRemoteNG.Tree +{ + public class TreeNodeSingleClickHandler : ITreeNodeClickHandler + { + public IEnumerable ClickHandlers { get; set; } = new ITreeNodeClickHandler[0]; + + public void Execute(ConnectionInfo clickedNode) + { + if (clickedNode == null) return; + foreach (var handler in ClickHandlers) + { + handler.Execute(clickedNode); + } + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/Controls/ConnectionTree.cs b/mRemoteV1/UI/Controls/ConnectionTree.cs index fb65257e..01ca2a5f 100644 --- a/mRemoteV1/UI/Controls/ConnectionTree.cs +++ b/mRemoteV1/UI/Controls/ConnectionTree.cs @@ -28,6 +28,11 @@ namespace mRemoteNG.UI.Controls public IEnumerable PostSetupActions { get; set; } = new IConnectionTreeDelegate[0]; + public TreeNodeDoubleClickHandler DoubleClickHandler { get; set; } = new TreeNodeDoubleClickHandler(); + + public TreeNodeSingleClickHandler SingleClickHandler { get; set; } = new TreeNodeSingleClickHandler(); + + public ConnectionTreeModel ConnectionTreeModel { get { return _connectionTreeModel; } @@ -149,6 +154,66 @@ namespace mRemoteNG.UI.Controls #endregion #region ConnectionTree Behavior + public RootNodeInfo GetRootConnectionNode() + { + return (RootNodeInfo)Roots.Cast().First(item => item is RootNodeInfo); + } + + public IEnumerable GetRootPuttyNodes() + { + return Objects.OfType(); + } + + public void AddConnection() + { + try + { + AddNode(new ConnectionInfo()); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace("UI.Window.Tree.AddConnection() failed.", ex); + } + } + + public void AddFolder() + { + try + { + AddNode(new ContainerInfo()); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace(Language.strErrorAddFolderFailed, ex); + } + } + + private void AddNode(ConnectionInfo newNode) + { + if (SelectedNode == null) return; + DefaultConnectionInfo.Instance.SaveTo(newNode); + DefaultConnectionInheritance.Instance.SaveTo(newNode.Inheritance); + var selectedContainer = SelectedNode as ContainerInfo; + var parent = selectedContainer ?? SelectedNode?.Parent; + newNode.SetParent(parent); + Expand(parent); + SelectObject(newNode); + EnsureModelVisible(newNode); + } + + public void DuplicateSelectedNode() + { + var newNode = SelectedNode.Clone(); + newNode.Parent.SetChildBelow(newNode, SelectedNode); + Runtime.SaveConnectionsAsync(); + } + + public void RenameSelectedNode() + { + SelectedItem.BeginEdit(); + Runtime.SaveConnectionsAsync(); + } + public void DeleteSelectedNode() { if (SelectedNode is RootNodeInfo || SelectedNode is PuttySessionInfo) return; @@ -189,43 +254,6 @@ namespace mRemoteNG.UI.Controls } } - public void AddConnection() - { - try - { - AddNode(new ConnectionInfo()); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("UI.Window.Tree.AddConnection() failed.", ex); - } - } - - public void AddFolder() - { - try - { - AddNode(new ContainerInfo()); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace(Language.strErrorAddFolderFailed, ex); - } - } - - private void AddNode(ConnectionInfo newNode) - { - if (SelectedNode == null) return; - DefaultConnectionInfo.Instance.SaveTo(newNode); - DefaultConnectionInheritance.Instance.SaveTo(newNode.Inheritance); - var selectedContainer = SelectedNode as ContainerInfo; - var parent = selectedContainer ?? SelectedNode?.Parent; - newNode.SetParent(parent); - Expand(parent); - SelectObject(newNode); - EnsureModelVisible(newNode); - } - private void tvConnections_AfterSelect(object sender, EventArgs e) { try @@ -240,40 +268,16 @@ namespace mRemoteNG.UI.Controls private void tvConnections_NodeMouseSingleClick(object sender, CellClickEventArgs e) { - try - { - if (e.ClickCount > 1) return; - var clickedNode = e.Model as ConnectionInfo; - - if (clickedNode == null) return; - if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; - if (Settings.Default.SingleClickOnConnectionOpensIt) - ConnectionInitiator.OpenConnection(SelectedNode); - - if (Settings.Default.SingleClickSwitchesToOpenConnection) - ConnectionInitiator.SwitchToOpenConnection(SelectedNode); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_NodeMouseClick (UI.Window.ConnectionTreeWindow) failed", ex); - } + if (e.ClickCount > 1) return; + var clickedNode = e.Model as ConnectionInfo; + SingleClickHandler.Execute(clickedNode); } private void tvConnections_NodeMouseDoubleClick(object sender, CellClickEventArgs e) { if (e.ClickCount < 2) return; - var clickedNodeAsContainer = e.Model as ContainerInfo; - if (clickedNodeAsContainer != null) - { - ToggleExpansion(clickedNodeAsContainer); - } - var clickedNode = e.Model as ConnectionInfo; - if (clickedNode?.GetTreeNodeType() == TreeNodeType.Connection | - clickedNode?.GetTreeNodeType() == TreeNodeType.PuttySession) - { - ConnectionInitiator.OpenConnection(SelectedNode); - } + DoubleClickHandler.Execute(clickedNode); } private void tvConnections_CellToolTipShowing(object sender, ToolTipShowingEventArgs e) @@ -288,29 +292,6 @@ namespace mRemoteNG.UI.Controls Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_MouseMove (UI.Window.ConnectionTreeWindow) failed", ex); } } - - public RootNodeInfo GetRootConnectionNode() - { - return (RootNodeInfo)Roots.Cast().First(item => item is RootNodeInfo); - } - - public IEnumerable GetRootPuttyNodes() - { - return Objects.OfType(); - } - - public void DuplicateSelectedNode() - { - var newNode = SelectedNode.Clone(); - newNode.Parent.SetChildBelow(newNode, SelectedNode); - Runtime.SaveConnectionsAsync(); - } - - public void RenameSelectedNode() - { - SelectedItem.BeginEdit(); - Runtime.SaveConnectionsAsync(); - } #endregion } } \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 6714379b..1a2ae6e4 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -3,6 +3,7 @@ using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Tree; using System; +using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; @@ -33,6 +34,7 @@ namespace mRemoteNG.UI.Window olvConnections.ContextMenuStrip = _contextMenu; SetMenuEventHandlers(); SetConnectionTreeEventHandlers(); + Settings.Default.PropertyChanged += (sender, args) => SetConnectionTreeEventHandlers(); } #region Form Stuff @@ -90,6 +92,28 @@ namespace mRemoteNG.UI.Window new RootNodeExpander(), new PreviousSessionOpener() }; + SetConnectionTreeDoubleClickHandlers(); + SetConnectionTreeSingleClickHandlers(); + } + + private void SetConnectionTreeDoubleClickHandlers() + { + olvConnections.DoubleClickHandler.ClickHandlers = new ITreeNodeClickHandler[] + { + new ExpandNodeClickHandler(olvConnections), + new OpenConnectionClickHandler() + }; + } + + private void SetConnectionTreeSingleClickHandlers() + { + + var singleClickHandlers = new List(); + if (Settings.Default.SingleClickOnConnectionOpensIt) + singleClickHandlers.Add(new OpenConnectionClickHandler()); + if (Settings.Default.SingleClickSwitchesToOpenConnection) + singleClickHandlers.Add(new SwitchToConnectionClickHandler()); + olvConnections.SingleClickHandler.ClickHandlers = singleClickHandlers; } #endregion diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index c8e26f1f..5c1f3aed 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -214,13 +214,19 @@ + + + + + + Component