Files
mRemoteNG/mRemoteV1/UI/Window/ConnectionTreeWindow.cs
2016-04-29 11:47:35 -04:00

1030 lines
33 KiB
C#

using mRemoteNG.App;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Messages;
using mRemoteNG.My;
using mRemoteNG.Tree;
using System;
using System.Drawing;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace mRemoteNG.UI.Window
{
public partial class ConnectionTreeWindow : BaseWindow
{
#region Form Stuff
public void Tree_Load(object sender, EventArgs e)
{
ApplyLanguage();
Themes.ThemeManager.ThemeChanged += ApplyTheme;
ApplyTheme();
txtSearch.Multiline = true;
txtSearch.MinimumSize = new Size(0, 14);
txtSearch.Size = new Size(txtSearch.Size.Width, 14);
txtSearch.Multiline = false;
}
private void ApplyLanguage()
{
Text = Language.strConnections;
TabText = Language.strConnections;
mMenAddConnection.ToolTipText = Language.strAddConnection;
mMenAddFolder.ToolTipText = Language.strAddFolder;
mMenView.ToolTipText = Language.strMenuView.Replace("&", "");
mMenViewExpandAllFolders.Text = Language.strExpandAllFolders;
mMenViewCollapseAllFolders.Text = Language.strCollapseAllFolders;
mMenSortAscending.ToolTipText = Language.strSortAsc;
cMenTreeConnect.Text = Language.strConnect;
cMenTreeConnectWithOptions.Text = Language.strConnectWithOptions;
cMenTreeConnectWithOptionsConnectToConsoleSession.Text = Language.strConnectToConsoleSession;
cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = Language.strDontConnectToConsoleSessionMenuItem;
cMenTreeConnectWithOptionsConnectInFullscreen.Text = Language.strConnectInFullscreen;
cMenTreeConnectWithOptionsNoCredentials.Text = Language.strConnectNoCredentials;
cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = Language.strChoosePanelBeforeConnecting;
cMenTreeDisconnect.Text = Language.strMenuDisconnect;
cMenTreeToolsExternalApps.Text = Language.strMenuExternalTools;
cMenTreeToolsTransferFile.Text = Language.strMenuTransferFile;
cMenTreeDuplicate.Text = Language.strDuplicate;
cMenTreeRename.Text = Language.strRename;
cMenTreeDelete.Text = Language.strMenuDelete;
cMenTreeImport.Text = Language.strImportMenuItem;
cMenTreeImportFile.Text = Language.strImportFromFileMenuItem;
cMenTreeImportActiveDirectory.Text = Language.strImportAD;
cMenTreeImportPortScan.Text = Language.strImportPortScan;
cMenTreeExportFile.Text = Language.strExportToFileMenuItem;
cMenTreeAddConnection.Text = Language.strAddConnection;
cMenTreeAddFolder.Text = Language.strAddFolder;
cMenTreeToolsSort.Text = Language.strSort;
cMenTreeToolsSortAscending.Text = Language.strSortAsc;
cMenTreeToolsSortDescending.Text = Language.strSortDesc;
cMenTreeMoveUp.Text = Language.strMoveUp;
cMenTreeMoveDown.Text = Language.strMoveDown;
txtSearch.Text = Language.strSearchPrompt;
}
public void ApplyTheme()
{
msMain.BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor;
msMain.ForeColor = Themes.ThemeManager.ActiveTheme.ToolbarTextColor;
tvConnections.BackColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelBackgroundColor;
tvConnections.ForeColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTextColor;
tvConnections.LineColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTreeLineColor;
BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor;
txtSearch.BackColor = Themes.ThemeManager.ActiveTheme.SearchBoxBackgroundColor;
txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor;
}
#endregion
#region Public Methods
public ConnectionTreeWindow(DockContent panel)
{
WindowType = WindowType.Tree;
DockPnl = panel;
InitializeComponent();
FillImageList();
DescriptionTooltip = new ToolTip();
DescriptionTooltip.InitialDelay = 300;
DescriptionTooltip.ReshowDelay = 0;
}
public void InitialRefresh()
{
tvConnections_AfterSelect(tvConnections, new TreeViewEventArgs(tvConnections.SelectedNode, TreeViewAction.ByMouse));
}
#endregion
#region Public Properties
public ToolTip DescriptionTooltip {get; set;}
#endregion
#region Private Methods
private void FillImageList()
{
try
{
imgListTree.Images.Add(Resources.Root);
imgListTree.Images.Add(Resources.Folder);
imgListTree.Images.Add(Resources.Play);
imgListTree.Images.Add(Resources.Pause);
imgListTree.Images.Add(Resources.PuttySessions);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "FillImageList (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
public void tvConnections_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e)
{
cMenTreeDelete.ShortcutKeys = Keys.None;
}
public void tvConnections_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
try
{
cMenTreeDelete.ShortcutKeys = Keys.Delete;
ConnectionTree.FinishRenameSelectedNode(e.Label);
Windows.configForm.pGrid_SelectedObjectChanged();
ShowHideTreeContextMenuItems(e.Node);
Runtime.SaveConnectionsBG();
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_AfterLabelEdit (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
public void tvConnections_AfterSelect(object sender, TreeViewEventArgs e)
{
try
{
if ((mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.TreeNodeType.Connection) || (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.TreeNodeType.PuttySession))
{
Windows.configForm.SetPropertyGridObject(e.Node.Tag);
}
else if (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.TreeNodeType.Container)
{
Windows.configForm.SetPropertyGridObject((e.Node.Tag as Container.ContainerInfo).ConnectionInfo);
}
else if ((mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.TreeNodeType.Root) || (mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.TreeNodeType.PuttyRoot))
{
Windows.configForm.SetPropertyGridObject(e.Node.Tag);
}
else
{
return;
}
Windows.configForm.pGrid_SelectedObjectChanged();
ShowHideTreeContextMenuItems(e.Node);
Runtime.LastSelected = mRemoteNG.Tree.Node.GetConstantID(e.Node);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_AfterSelect (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
public void tvConnections_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
try
{
ShowHideTreeContextMenuItems(tvConnections.SelectedNode);
tvConnections.SelectedNode = e.Node;
if (e.Button == MouseButtons.Left)
{
if (My.Settings.Default.SingleClickOnConnectionOpensIt &&
(mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.TreeNodeType.Connection |
mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.TreeNodeType.PuttySession))
{
Runtime.OpenConnection();
}
if (My.Settings.Default.SingleClickSwitchesToOpenConnection && mRemoteNG.Tree.Node.GetNodeType(e.Node) == mRemoteNG.Tree.TreeNodeType.Connection)
{
Runtime.SwitchToOpenConnection((mRemoteNG.Connection.ConnectionInfo)e.Node.Tag);
}
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_NodeMouseClick (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
static public void tvConnections_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (mRemoteNG.Tree.Node.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection |
mRemoteNG.Tree.Node.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession)
{
Runtime.OpenConnection();
}
}
public void tvConnections_MouseMove(object sender, MouseEventArgs e)
{
try
{
ConnectionTree.SetNodeToolTip(e, DescriptionTooltip);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_MouseMove (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
private static void EnableMenuItemsRecursive(ToolStripItemCollection items, bool enable = true)
{
ToolStripMenuItem menuItem = default(ToolStripMenuItem);
foreach (ToolStripItem item in items)
{
menuItem = item as ToolStripMenuItem;
if (menuItem == null)
{
continue;
}
menuItem.Enabled = enable;
if (menuItem.HasDropDownItems)
{
EnableMenuItemsRecursive(menuItem.DropDownItems, enable);
}
}
}
private void ShowHideTreeContextMenuItems(TreeNode selectedNode)
{
if (selectedNode == null)
{
return ;
}
try
{
cMenTree.Enabled = true;
EnableMenuItemsRecursive(cMenTree.Items);
if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == TreeNodeType.Connection)
{
ConnectionInfo connectionInfo = (ConnectionInfo)selectedNode.Tag;
if (connectionInfo.OpenConnections.Count == 0)
{
cMenTreeDisconnect.Enabled = false;
}
if (!(connectionInfo.Protocol == ProtocolType.SSH1 |
connectionInfo.Protocol == ProtocolType.SSH2))
{
cMenTreeToolsTransferFile.Enabled = false;
}
if (!(connectionInfo.Protocol == ProtocolType.RDP | connectionInfo.Protocol == ProtocolType.ICA))
{
cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false;
cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false;
}
if (connectionInfo.Protocol == ProtocolType.IntApp)
{
cMenTreeConnectWithOptionsNoCredentials.Enabled = false;
}
}
else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == TreeNodeType.PuttySession)
{
PuttySessionInfo puttySessionInfo = (PuttySessionInfo)selectedNode.Tag;
cMenTreeAddConnection.Enabled = false;
cMenTreeAddFolder.Enabled = false;
if (puttySessionInfo.OpenConnections.Count == 0)
{
cMenTreeDisconnect.Enabled = false;
}
if (!(puttySessionInfo.Protocol == ProtocolType.SSH1 | puttySessionInfo.Protocol == ProtocolType.SSH2))
{
cMenTreeToolsTransferFile.Enabled = false;
}
cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false;
cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false;
cMenTreeToolsSort.Enabled = false;
cMenTreeDuplicate.Enabled = false;
cMenTreeRename.Enabled = false;
cMenTreeDelete.Enabled = false;
cMenTreeMoveUp.Enabled = false;
cMenTreeMoveDown.Enabled = false;
}
else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == TreeNodeType.Container)
{
cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false;
cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false;
cMenTreeDisconnect.Enabled = false;
int openConnections = 0;
ConnectionInfo connectionInfo = default(ConnectionInfo);
foreach (TreeNode node in selectedNode.Nodes)
{
if (node.Tag is ConnectionInfo)
{
connectionInfo = (ConnectionInfo)node.Tag;
openConnections = openConnections + connectionInfo.OpenConnections.Count;
}
}
if (openConnections == 0)
{
cMenTreeDisconnect.Enabled = false;
}
cMenTreeToolsTransferFile.Enabled = false;
cMenTreeToolsExternalApps.Enabled = false;
}
else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == TreeNodeType.Root)
{
cMenTreeConnect.Enabled = false;
cMenTreeConnectWithOptions.Enabled = false;
cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false;
cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false;
cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = false;
cMenTreeDisconnect.Enabled = false;
cMenTreeToolsTransferFile.Enabled = false;
cMenTreeToolsExternalApps.Enabled = false;
cMenTreeDuplicate.Enabled = false;
cMenTreeDelete.Enabled = false;
cMenTreeMoveUp.Enabled = false;
cMenTreeMoveDown.Enabled = false;
}
else if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == TreeNodeType.PuttyRoot)
{
cMenTreeAddConnection.Enabled = false;
cMenTreeAddFolder.Enabled = false;
cMenTreeConnect.Enabled = false;
cMenTreeConnectWithOptions.Enabled = false;
cMenTreeDisconnect.Enabled = false;
cMenTreeToolsTransferFile.Enabled = false;
cMenTreeConnectWithOptions.Enabled = false;
cMenTreeToolsSort.Enabled = false;
cMenTreeToolsExternalApps.Enabled = false;
cMenTreeDuplicate.Enabled = false;
cMenTreeRename.Enabled = true;
cMenTreeDelete.Enabled = false;
cMenTreeMoveUp.Enabled = false;
cMenTreeMoveDown.Enabled = false;
}
else
{
cMenTree.Enabled = false;
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowHideTreeContextMenuItems (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
#endregion
#region Drag and Drop
static public void tvConnections_DragDrop(object sender, DragEventArgs e)
{
try
{
//Check that there is a TreeNode being dragged
if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true) == false)
{
return;
}
//Get the TreeView raising the event (in case multiple on form)
TreeView selectedTreeview = (TreeView) sender;
//Get the TreeNode being dragged
System.Windows.Forms.TreeNode dropNode = (System.Windows.Forms.TreeNode) (e.Data.GetData("System.Windows.Forms.TreeNode"));
//The target node should be selected from the DragOver event
TreeNode targetNode = selectedTreeview.SelectedNode;
if (dropNode == targetNode)
{
return;
}
if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.TreeNodeType.Root)
{
return;
}
if (dropNode == targetNode.Parent)
{
return;
}
//Remove the drop node from its current location
dropNode.Remove();
//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 (mRemoteNG.Tree.Node.GetNodeType(targetNode) == mRemoteNG.Tree.TreeNodeType.Root | mRemoteNG.Tree.Node.GetNodeType(targetNode) == mRemoteNG.Tree.TreeNodeType.Container)
{
targetNode.Nodes.Insert(0, dropNode);
}
else
{
targetNode.Parent.Nodes.Insert(targetNode.Index + 1, dropNode);
}
if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.TreeNodeType.Connection | mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.TreeNodeType.Container)
{
if (mRemoteNG.Tree.Node.GetNodeType(dropNode.Parent) == mRemoteNG.Tree.TreeNodeType.Container)
{
((mRemoteNG.Container.ContainerInfo)dropNode.Tag).Parent = (mRemoteNG.Container.ContainerInfo)dropNode.Parent.Tag;
}
else if (mRemoteNG.Tree.Node.GetNodeType(dropNode.Parent) == mRemoteNG.Tree.TreeNodeType.Root)
{
if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.TreeNodeType.Connection)
{
((mRemoteNG.Connection.ConnectionInfo)dropNode.Tag).Parent = null;
((mRemoteNG.Connection.ConnectionInfo)dropNode.Tag).Inherit.TurnOffInheritanceCompletely();
}
else if (mRemoteNG.Tree.Node.GetNodeType(dropNode) == mRemoteNG.Tree.TreeNodeType.Container)
{
((mRemoteNG.Container.ContainerInfo)dropNode.Tag).Parent = null;
((mRemoteNG.Container.ContainerInfo)dropNode.Tag).ConnectionInfo.Inherit.TurnOffInheritanceCompletely();
}
}
}
//Ensure the newly created node is visible to
//the user and select it
dropNode.EnsureVisible();
selectedTreeview.SelectedNode = dropNode;
Runtime.SaveConnectionsBG();
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_DragDrop (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
static public void tvConnections_DragEnter(object sender, DragEventArgs e)
{
try
{
//See if there is a TreeNode being dragged
if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true))
{
//TreeNode found allow move effect
e.Effect = DragDropEffects.Move;
}
else
{
//No TreeNode found, prevent move
e.Effect = DragDropEffects.None;
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_DragEnter (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
static public void tvConnections_DragOver(object sender, DragEventArgs e)
{
try
{
//Check that there is a TreeNode being dragged
if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true) == false)
{
return;
}
//Get the TreeView raising the event (in case multiple on form)
TreeView selectedTreeview = (TreeView) sender;
//As the mouse moves over nodes, provide feedback to
//the user by highlighting the node that is the
//current drop target
Point pt = ((TreeView) sender).PointToClient(new Point(e.X, e.Y));
TreeNode targetNode = selectedTreeview.GetNodeAt(pt);
//Select the node currently under the cursor
selectedTreeview.SelectedNode = targetNode;
//Check that the selected node is not the dropNode and
//also that it is not a child of the dropNode and
//therefore an invalid target
TreeNode dropNode = (TreeNode) (e.Data.GetData("System.Windows.Forms.TreeNode"));
Root.PuttySessions.Info puttyRootInfo = default(Root.PuttySessions.Info);
while (!(targetNode == null))
{
puttyRootInfo = targetNode.Tag as Root.PuttySessions.Info;
if (puttyRootInfo != null || targetNode == dropNode)
{
e.Effect = DragDropEffects.None;
return ;
}
targetNode = targetNode.Parent;
}
//Currently selected node is a suitable target
e.Effect = DragDropEffects.Move;
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_DragOver (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
public void tvConnections_ItemDrag(object sender, ItemDragEventArgs e)
{
try
{
TreeNode dragTreeNode = e.Item as TreeNode;
if (dragTreeNode == null)
{
return ;
}
if (dragTreeNode.Tag == null)
{
return ;
}
if (dragTreeNode.Tag is PuttySessionInfo|| !(dragTreeNode.Tag is ConnectionInfo|| dragTreeNode.Tag is ContainerInfo))
{
tvConnections.SelectedNode = dragTreeNode;
return ;
}
//Set the drag node and initiate the DragDrop
DoDragDrop(e.Item, DragDropEffects.Move);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "tvConnections_ItemDrag (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
#endregion
#region Tree Context Menu
public void cMenTreeAddConnection_Click(System.Object sender, EventArgs e)
{
AddConnection();
Runtime.SaveConnectionsBG();
}
public void cMenTreeAddFolder_Click(System.Object sender, EventArgs e)
{
AddFolder();
Runtime.SaveConnectionsBG();
}
static public void cMenTreeConnect_Click(System.Object sender, EventArgs e)
{
Runtime.OpenConnection(mRemoteNG.Connection.ConnectionInfo.Force.DoNotJump);
}
static public void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(System.Object sender, EventArgs e)
{
Runtime.OpenConnection(mRemoteNG.Connection.ConnectionInfo.Force.UseConsoleSession | mRemoteNG.Connection.ConnectionInfo.Force.DoNotJump);
}
static public void cMenTreeConnectWithOptionsNoCredentials_Click(System.Object sender, EventArgs e)
{
Runtime.OpenConnection(mRemoteNG.Connection.ConnectionInfo.Force.NoCredentials);
}
static public void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(System.Object sender, EventArgs e)
{
Runtime.OpenConnection(mRemoteNG.Connection.ConnectionInfo.Force.DontUseConsoleSession | mRemoteNG.Connection.ConnectionInfo.Force.DoNotJump);
}
static public void cMenTreeConnectWithOptionsConnectInFullscreen_Click(System.Object sender, EventArgs e)
{
Runtime.OpenConnection(mRemoteNG.Connection.ConnectionInfo.Force.Fullscreen | mRemoteNG.Connection.ConnectionInfo.Force.DoNotJump);
}
static public void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(System.Object sender, EventArgs e)
{
Runtime.OpenConnection(mRemoteNG.Connection.ConnectionInfo.Force.OverridePanel | mRemoteNG.Connection.ConnectionInfo.Force.DoNotJump);
}
public void cMenTreeDisconnect_Click(System.Object sender, EventArgs e)
{
DisconnectConnection();
}
static public void cMenTreeToolsTransferFile_Click(System.Object sender, EventArgs e)
{
SshTransferFile();
}
public void mMenSortAscending_Click(System.Object sender, EventArgs e)
{
tvConnections.BeginUpdate();
ConnectionTree.Sort(tvConnections.Nodes[0], SortOrder.Ascending);
tvConnections.EndUpdate();
Runtime.SaveConnectionsBG();
}
public void cMenTreeToolsSortAscending_Click(System.Object sender, EventArgs e)
{
tvConnections.BeginUpdate();
ConnectionTree.Sort(tvConnections.SelectedNode, SortOrder.Ascending);
tvConnections.EndUpdate();
Runtime.SaveConnectionsBG();
}
public void cMenTreeToolsSortDescending_Click(System.Object sender, EventArgs e)
{
tvConnections.BeginUpdate();
ConnectionTree.Sort(tvConnections.SelectedNode, SortOrder.Descending);
tvConnections.EndUpdate();
Runtime.SaveConnectionsBG();
}
public void cMenTree_DropDownOpening(object sender, EventArgs e)
{
AddExternalApps();
}
private static void cMenTreeToolsExternalAppsEntry_Click(object sender, EventArgs e)
{
StartExternalApp((mRemoteNG.Tools.ExternalTool)((System.Windows.Forms.Control)sender).Tag);
}
public void cMenTreeDuplicate_Click(System.Object sender, EventArgs e)
{
mRemoteNG.Tree.Node.CloneNode(tvConnections.SelectedNode);
Runtime.SaveConnectionsBG();
}
static public void cMenTreeRename_Click(System.Object sender, EventArgs e)
{
ConnectionTree.StartRenameSelectedNode();
Runtime.SaveConnectionsBG();
}
static public void cMenTreeDelete_Click(System.Object sender, EventArgs e)
{
ConnectionTree.DeleteSelectedNode();
Runtime.SaveConnectionsBG();
}
static public void cMenTreeImportFile_Click(System.Object sender, EventArgs e)
{
Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, true);
}
static public void cMenTreeImportActiveDirectory_Click(System.Object sender, EventArgs e)
{
Windows.Show(WindowType.ActiveDirectoryImport);
}
static public void cMenTreeImportPortScan_Click(System.Object sender, EventArgs e)
{
Windows.Show(UI.Window.WindowType.PortScan, true);
}
static public void cMenTreeExportFile_Click(System.Object sender, EventArgs e)
{
Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode);
}
static public void cMenTreeMoveUp_Click(System.Object sender, EventArgs e)
{
ConnectionTree.MoveNodeUp();
Runtime.SaveConnectionsBG();
}
static public void cMenTreeMoveDown_Click(System.Object sender, EventArgs e)
{
ConnectionTree.MoveNodeDown();
Runtime.SaveConnectionsBG();
}
#endregion
#region Context Menu Actions
public void AddConnection()
{
try
{
if (tvConnections.SelectedNode == null)
{
tvConnections.SelectedNode = tvConnections.Nodes[0];
}
TreeNode newTreeNode = mRemoteNG.Tree.Node.AddNode(mRemoteNG.Tree.TreeNodeType.Connection);
if (newTreeNode == null)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Tree.AddConnection() failed." + Environment.NewLine + "mRemoteNG.Tree.Node.AddNode() returned Nothing.", true);
return ;
}
TreeNode containerNode = tvConnections.SelectedNode;
if (mRemoteNG.Tree.Node.GetNodeType(containerNode) == mRemoteNG.Tree.TreeNodeType.Connection)
{
containerNode = containerNode.Parent;
}
mRemoteNG.Connection.ConnectionInfo newConnectionInfo = new mRemoteNG.Connection.ConnectionInfo();
if (mRemoteNG.Tree.Node.GetNodeType(containerNode) == mRemoteNG.Tree.TreeNodeType.Root)
{
newConnectionInfo.Inherit.TurnOffInheritanceCompletely();
}
else
{
newConnectionInfo.Parent = (mRemoteNG.Container.ContainerInfo)containerNode.Tag;
}
newConnectionInfo.TreeNode = newTreeNode;
newTreeNode.Tag = newConnectionInfo;
Runtime.ConnectionList.Add(newConnectionInfo);
containerNode.Nodes.Add(newTreeNode);
tvConnections.SelectedNode = newTreeNode;
tvConnections.SelectedNode.BeginEdit();
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Tree.AddConnection() failed." + Environment.NewLine + ex.Message, true);
}
}
public void AddFolder()
{
try
{
TreeNode newNode = mRemoteNG.Tree.Node.AddNode(TreeNodeType.Container);
ContainerInfo newContainerInfo = new ContainerInfo();
newNode.Tag = newContainerInfo;
newContainerInfo.TreeNode = newNode;
TreeNode selectedNode = ConnectionTree.SelectedNode;
TreeNode parentNode = default(TreeNode);
if (selectedNode == null)
{
parentNode = tvConnections.Nodes[0];
}
else
{
if (mRemoteNG.Tree.Node.GetNodeType(selectedNode) == TreeNodeType.Connection)
{
parentNode = selectedNode.Parent;
}
else
{
parentNode = selectedNode;
}
}
newContainerInfo.ConnectionInfo = new mRemoteNG.Connection.ConnectionInfo(newContainerInfo);
newContainerInfo.ConnectionInfo.Name = newNode.Text;
// We can only inherit from a container node, not the root node or connection nodes
if (mRemoteNG.Tree.Node.GetNodeType(parentNode) == mRemoteNG.Tree.TreeNodeType.Container)
{
newContainerInfo.Parent = parentNode.Tag;
}
else
{
newContainerInfo.ConnectionInfo.Inherit.TurnOffInheritanceCompletely();
}
Runtime.ContainerList.Add(newContainerInfo);
parentNode.Nodes.Add(newNode);
tvConnections.SelectedNode = newNode;
tvConnections.SelectedNode.BeginEdit();
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, string.Format(Language.strErrorAddFolderFailed, ex.Message), true);
}
}
private void DisconnectConnection()
{
try
{
if (tvConnections.SelectedNode != null)
{
if (tvConnections.SelectedNode.Tag is ConnectionInfo)
{
ConnectionInfo conI = (ConnectionInfo)tvConnections.SelectedNode.Tag;
for (int i = 0; i <= conI.OpenConnections.Count - 1; i++)
{
conI.OpenConnections[i].Disconnect();
}
}
if (tvConnections.SelectedNode.Tag is ContainerInfo)
{
foreach (TreeNode n in tvConnections.SelectedNode.Nodes)
{
if (n.Tag is ConnectionInfo)
{
ConnectionInfo conI = (ConnectionInfo)n.Tag;
for (int i = 0; i <= conI.OpenConnections.Count - 1; i++)
{
conI.OpenConnections[i].Disconnect();
}
}
}
}
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "DisconnectConnection (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
private static void SshTransferFile()
{
try
{
Windows.Show(WindowType.SSHTransfer);
ConnectionInfo conI = (ConnectionInfo)ConnectionTree.SelectedNode.Tag;
Windows.sshtransferForm.Hostname = conI.Hostname;
Windows.sshtransferForm.Username = conI.Username;
Windows.sshtransferForm.Password = conI.Password;
Windows.sshtransferForm.Port = System.Convert.ToString(conI.Port);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SSHTransferFile (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
private void AddExternalApps()
{
try
{
//clean up
cMenTreeToolsExternalApps.DropDownItems.Clear();
//add ext apps
foreach (Tools.ExternalTool extA in Runtime.ExternalTools)
{
ToolStripMenuItem nItem = new ToolStripMenuItem();
nItem.Text = extA.DisplayName;
nItem.Tag = extA;
nItem.Image = extA.Image;
nItem.Click += cMenTreeToolsExternalAppsEntry_Click;
cMenTreeToolsExternalApps.DropDownItems.Add(nItem);
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cMenTreeTools_DropDownOpening failed (UI.Window.Tree)" + Environment.NewLine + ex.Message, true);
}
}
private static void StartExternalApp(Tools.ExternalTool externalTool)
{
try
{
if (mRemoteNG.Tree.Node.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | mRemoteNG.Tree.Node.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession)
{
externalTool.Start((ConnectionInfo)ConnectionTree.SelectedNode.Tag);
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cMenTreeToolsExternalAppsEntry_Click failed (UI.Window.Tree)" + Environment.NewLine + ex.Message, true);
}
}
#endregion
#region Menu
static public void mMenViewExpandAllFolders_Click(System.Object sender, EventArgs e)
{
ConnectionTree.ExpandAllNodes();
}
public void mMenViewCollapseAllFolders_Click(System.Object sender, EventArgs e)
{
if (tvConnections.SelectedNode != null)
{
if (tvConnections.SelectedNode.IsEditing)
{
tvConnections.SelectedNode.EndEdit(false);
}
}
ConnectionTree.CollapseAllNodes();
}
#endregion
#region Search
public void txtSearch_GotFocus(object sender, EventArgs e)
{
txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextColor;
if (txtSearch.Text == Language.strSearchPrompt)
{
txtSearch.Text = "";
}
}
public void txtSearch_LostFocus(object sender, EventArgs e)
{
if (txtSearch.Text == "")
{
txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor;
txtSearch.Text = Language.strSearchPrompt;
}
}
public void txtSearch_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Escape)
{
e.Handled = true;
tvConnections.Focus();
}
else if (e.KeyCode == Keys.Up)
{
tvConnections.SelectedNode = tvConnections.SelectedNode.PrevVisibleNode;
}
else if (e.KeyCode == Keys.Down)
{
tvConnections.SelectedNode = tvConnections.SelectedNode.NextVisibleNode;
}
else
{
tvConnections_KeyDown(sender, e);
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "txtSearch_KeyDown (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
public void txtSearch_TextChanged(System.Object sender, EventArgs e)
{
tvConnections.SelectedNode = ConnectionTree.Find(tvConnections.Nodes[0], txtSearch.Text);
}
public void tvConnections_KeyPress(object sender, KeyPressEventArgs e)
{
try
{
if (char.IsLetterOrDigit(e.KeyChar))
{
txtSearch.Text = e.KeyChar.ToString();
txtSearch.Focus();
txtSearch.SelectionStart = txtSearch.TextLength;
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_KeyPress (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
public void tvConnections_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
if (tvConnections.SelectedNode.Tag is mRemoteNG.Connection.ConnectionInfo)
{
e.Handled = true;
Runtime.OpenConnection();
}
else
{
if (tvConnections.SelectedNode.IsExpanded)
{
tvConnections.SelectedNode.Collapse(true);
}
else
{
tvConnections.SelectedNode.Expand();
}
}
}
else if (e.KeyCode == Keys.Escape ^ e.KeyCode == Keys.Control | e.KeyCode == Keys.F)
{
txtSearch.Focus();
txtSearch.SelectionStart = txtSearch.TextLength;
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_KeyDown (UI.Window.Tree) failed" + Environment.NewLine + ex.Message, true);
}
}
#endregion
}
}