From 7b831c6ab848f06e98c9f854ae8d20f74be1e079 Mon Sep 17 00:00:00 2001 From: Riley McArdle Date: Sat, 16 Mar 2013 22:37:34 -0500 Subject: [PATCH] Add feature MR-351 - Import connections from PuTTY --- CHANGELOG.TXT | 1 + mRemoteV1/App/App.Runtime.vb | 10 +- mRemoteV1/Config/PuttySessions.vb | 142 ++++++++++ mRemoteV1/Connection/Connection.Info.vb | 30 +- .../Connection.Protocol.PuttyBase.vb | 23 -- .../Connection/Connection.PuttySession.vb | 21 -- mRemoteV1/Connection/PuttySession.Info.vb | 77 ++++++ mRemoteV1/Forms/frmMain.vb | 29 +- mRemoteV1/Icons/PuTTY.ico | Bin 0 -> 318 bytes mRemoteV1/Images/Images.Enums.vb | 1 + mRemoteV1/Language/Language.Designer.vb | 9 + mRemoteV1/Language/Language.resx | 3 + mRemoteV1/My Project/Resources.Designer.vb | 9 +- mRemoteV1/My Project/Resources.resx | 6 +- mRemoteV1/My Project/Settings.Designer.vb | 26 ++ mRemoteV1/My Project/Settings.settings | 6 + mRemoteV1/Resources/Images/PuttySessions.png | Bin 0 -> 322 bytes mRemoteV1/Root/PuttySessions.Info.vb | 29 ++ mRemoteV1/Root/Root.Info.vb | 3 +- mRemoteV1/Tree/Tree.Node.vb | 18 +- mRemoteV1/UI/UI.Window.Config.vb | 61 +++-- mRemoteV1/UI/UI.Window.Tree.vb | 259 ++++++++++-------- mRemoteV1/app.config | 6 + mRemoteV1/mRemoteV1.vbproj | 8 +- 24 files changed, 561 insertions(+), 216 deletions(-) create mode 100644 mRemoteV1/Config/PuttySessions.vb delete mode 100644 mRemoteV1/Connection/Connection.PuttySession.vb create mode 100644 mRemoteV1/Connection/PuttySession.Info.vb create mode 100644 mRemoteV1/Icons/PuTTY.ico create mode 100644 mRemoteV1/Resources/Images/PuttySessions.png create mode 100644 mRemoteV1/Root/PuttySessions.Info.vb diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index be4fa3f9..68161c83 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -1,5 +1,6 @@ Added feature MR-345 - Two separate options for confirming closure of Tabs and Connection Panels Added feature MR-346 - Option to show/hide the description box at the bottom of the Config panel + Added feature MR-351 - Import connections from PuTTY Fixed issue MR-354 - Re-ordering tabs doesn't give good, reliable visual feedback Fixed issue MR-375 - Changing a connection's icon using the picture button should immediately update Icon field Fixed issue MR-377 - Several redundant panels can be opened diff --git a/mRemoteV1/App/App.Runtime.vb b/mRemoteV1/App/App.Runtime.vb index 5f4015e8..62418e01 100644 --- a/mRemoteV1/App/App.Runtime.vb +++ b/mRemoteV1/App/App.Runtime.vb @@ -464,10 +464,6 @@ Namespace App Next End Sub - Public Shared Sub GetPuttySessions() - Connection.PuttySession.PuttySessions = Connection.Protocol.PuttyBase.GetSessions() - End Sub - Public Shared Sub CreateLogger() log4net.Config.XmlConfigurator.Configure() @@ -1568,11 +1564,13 @@ Namespace App Exit Sub End If - If Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.Connection Then + If Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.Connection Or _ + Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.PuttySession Then OpenConnection(Windows.treeForm.tvConnections.SelectedNode.Tag, Force) ElseIf Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.Container Then For Each tNode As TreeNode In Tree.Node.SelectedNode.Nodes - If Tree.Node.GetNodeType(tNode) = Tree.Node.Type.Connection Then + If Tree.Node.GetNodeType(tNode) = Tree.Node.Type.Connection Or _ + Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.PuttySession Then If tNode.Tag IsNot Nothing Then OpenConnection(tNode.Tag, Force) End If diff --git a/mRemoteV1/Config/PuttySessions.vb b/mRemoteV1/Config/PuttySessions.vb new file mode 100644 index 00000000..4ba82d18 --- /dev/null +++ b/mRemoteV1/Config/PuttySessions.vb @@ -0,0 +1,142 @@ +Imports System.ComponentModel +Imports Microsoft.Win32 +Imports mRemoteNG.Connection.Protocol +Imports mRemoteNG.Tree +Imports mRemoteNG.My + +Namespace Config + Public Class PuttySessions + Private Const PuttySessionsKey As String = "Software\SimonTatham\PuTTY\Sessions" + + Public Shared Sub AddSessionsToTree(ByVal treeView As TreeView) + Dim savedSessions() As Connection.Info = LoadSessions() + If savedSessions Is Nothing OrElse savedSessions.Length = 0 Then Return + + Dim puttyRootInfo As New Root.PuttySessions.Info() + If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsName) Then + puttyRootInfo.Name = Language.strPuttySavedSessionsRootName + Else + puttyRootInfo.Name = My.Settings.PuttySavedSessionsName + End If + If String.IsNullOrEmpty(My.Settings.PuttySavedSessionsPanel) Then + puttyRootInfo.Panel = Language.strGeneral + Else + puttyRootInfo.Panel = My.Settings.PuttySavedSessionsPanel + End If + + Dim puttyRootNode As TreeNode = New TreeNode + puttyRootNode.Text = puttyRootInfo.Name + puttyRootNode.Tag = puttyRootInfo + puttyRootNode.ImageIndex = Images.Enums.TreeImage.PuttySessions + puttyRootNode.SelectedImageIndex = Images.Enums.TreeImage.PuttySessions + + puttyRootInfo.TreeNode = puttyRootNode + + treeView.BeginUpdate() + treeView.Nodes.Add(puttyRootNode) + + Dim newTreeNode As TreeNode + For Each sessionInfo As Connection.PuttySession.Info In savedSessions + newTreeNode = Node.AddNode(Node.Type.PuttySession, sessionInfo.Name) + If newTreeNode Is Nothing Then Continue For + + sessionInfo.RootPuttySessionsInfo = puttyRootInfo + sessionInfo.TreeNode = newTreeNode + sessionInfo.Inherit.TurnOffInheritanceCompletely() + + newTreeNode.Tag = sessionInfo + newTreeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed + newTreeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed + + puttyRootNode.Nodes.Add(newTreeNode) + Next + + puttyRootNode.Expand() + treeView.EndUpdate() + End Sub + + Protected Shared Function GetSessionNames(Optional ByVal addDefaultSettings As Boolean = False) As String() + Dim sessionsKey As RegistryKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey) + If sessionsKey Is Nothing Then Return Nothing + + Dim sessionNames As New List(Of String) + If addDefaultSettings Then sessionNames.Add("Default Settings") + For Each sessionName As String In sessionsKey.GetSubKeyNames() + sessionNames.Add(Web.HttpUtility.UrlDecode(sessionName)) + Next + Return sessionNames.ToArray() + End Function + + Protected Shared Function LoadSessions() As Connection.PuttySession.Info() + Dim sessionList As New List(Of Connection.PuttySession.Info) + Dim sessionInfo As Connection.Info + For Each sessionName As String In GetSessionNames() + sessionInfo = SessionToConnectionInfo(sessionName) + If sessionInfo Is Nothing Then Continue For + sessionList.Add(sessionInfo) + Next + Return sessionList.ToArray() + End Function + + Protected Shared Function SessionToConnectionInfo(ByVal sessionName As String) As Connection.PuttySession.Info + Dim sessionsKey As RegistryKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey) + If sessionsKey Is Nothing Then Return Nothing + + Dim sessionKey As RegistryKey = sessionsKey.OpenSubKey(sessionName) + If sessionKey Is Nothing Then Return Nothing + + Dim sessionInfo As New Connection.PuttySession.Info + With sessionInfo + .PuttySession = sessionName + .Name = sessionName + .Hostname = sessionKey.GetValue("HostName") + .Username = sessionKey.GetValue("UserName") + Dim protocol As String = sessionKey.GetValue("Protocol") + Select Case protocol.ToLowerInvariant() + Case "raw" + .Protocol = Protocols.RAW + Case "rlogin" + .Protocol = Protocols.Rlogin + Case "serial" + Return Nothing + Case "ssh" + Dim sshVersion As Integer = sessionKey.GetValue("SshProt") + If sshVersion >= 2 Then + .Protocol = Protocols.SSH2 + Else + .Protocol = Protocols.SSH1 + End If + Case "telnet" + .Protocol = Protocols.Telnet + Case Else + Return Nothing + End Select + .Port = sessionKey.GetValue("PortNumber") + End With + + Return sessionInfo + End Function + + Public Class SessionList + Inherits StringConverter + + Public Shared ReadOnly Property Names() As String() + Get + Return GetSessionNames(True) + End Get + End Property + + Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection + Return New StandardValuesCollection(Names) + End Function + + Public Overloads Overrides Function GetStandardValuesExclusive(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean + Return True + End Function + + Public Overloads Overrides Function GetStandardValuesSupported(ByVal context As ITypeDescriptorContext) As Boolean + Return True + End Function + End Class + End Class +End Namespace diff --git a/mRemoteV1/Connection/Connection.Info.vb b/mRemoteV1/Connection/Connection.Info.vb index c7b2f798..6a35ffee 100644 --- a/mRemoteV1/Connection/Connection.Info.vb +++ b/mRemoteV1/Connection/Connection.Info.vb @@ -13,7 +13,7 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNameName"), _ LocalizedDescription("strPropertyDescriptionName")> _ - Public Property Name() As String + Public Overridable Property Name() As String Get Return Me._Name End Get @@ -27,7 +27,7 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNameDescription"), _ LocalizedDescription("strPropertyDescriptionDescription")> _ - Public Property Description() As String + Public Overridable Property Description() As String Get If Me._Inherit.Description And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -54,7 +54,7 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNameIcon"), _ LocalizedDescription("strPropertyDescriptionIcon")> _ - Public Property Icon() As String + Public Overridable Property Icon() As String Get If Me._Inherit.Icon And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -80,7 +80,7 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNamePanel"), _ LocalizedDescription("strPropertyDescriptionPanel")> _ - Public Property Panel() As String + Public Overridable Property Panel() As String Get If Me._Inherit.Panel And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -107,7 +107,7 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNameAddress"), _ LocalizedDescription("strPropertyDescriptionAddress")> _ - Public Property Hostname() As String + Public Overridable Property Hostname() As String Get Return Me._Hostname.Trim() End Get @@ -121,7 +121,7 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNameUsername"), _ LocalizedDescription("strPropertyDescriptionUsername")> _ - Public Property Username() As String + Public Overridable Property Username() As String Get If Me._Inherit.Username And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -148,7 +148,7 @@ Namespace Connection LocalizedDisplayName("strPropertyNamePassword"), _ LocalizedDescription("strPropertyDescriptionPassword"), _ PasswordPropertyText(True)> _ - Public Property Password() As String + Public Overridable Property Password() As String Get If Me._Inherit.Password And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -202,7 +202,7 @@ Namespace Connection LocalizedDisplayName("strPropertyNameProtocol"), _ LocalizedDescription("strPropertyDescriptionProtocol"), _ TypeConverter(GetType(Tools.Misc.EnumTypeConverter))> _ - Public Property Protocol() As Connection.Protocol.Protocols + Public Overridable Property Protocol() As Connection.Protocol.Protocols Get If Me._Inherit.Protocol And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -255,7 +255,7 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNamePort"), _ LocalizedDescription("strPropertyDescriptionPort")> _ - Public Property Port() As Integer + Public Overridable Property Port() As Integer Get If Me._Inherit.Port And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -281,8 +281,8 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNamePuttySession"), _ LocalizedDescription("strPropertyDescriptionPuttySession"), _ - TypeConverter(GetType(mRemoteNG.Connection.PuttySession))> _ - Public Property PuttySession() As String + TypeConverter(GetType(Config.PuttySessions.SessionList))> _ + Public Overridable Property PuttySession() As String Get If Me._Inherit.PuttySession And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -958,7 +958,7 @@ Namespace Connection LocalizedDisplayName("strPropertyNameExternalToolBefore"), _ LocalizedDescription("strPropertyDescriptionExternalToolBefore"), _ TypeConverter(GetType(Tools.ExternalAppsTypeConverter))> _ - Public Property PreExtApp() As String + Public Overridable Property PreExtApp() As String Get If Me._Inherit.PreExtApp And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -985,7 +985,7 @@ Namespace Connection LocalizedDisplayName("strPropertyNameExternalToolAfter"), _ LocalizedDescription("strPropertyDescriptionExternalToolAfter"), _ TypeConverter(GetType(Tools.ExternalAppsTypeConverter))> _ - Public Property PostExtApp() As String + Public Overridable Property PostExtApp() As String Get If Me._Inherit.PostExtApp And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -1011,7 +1011,7 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNameMACAddress"), _ LocalizedDescription("strPropertyDescriptionMACAddress")> _ - Public Property MacAddress() As String + Public Overridable Property MacAddress() As String Get If Me._Inherit.MacAddress And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo @@ -1037,7 +1037,7 @@ Namespace Connection Browsable(True), _ LocalizedDisplayName("strPropertyNameUser1"), _ LocalizedDescription("strPropertyDescriptionUser1")> _ - Public Property UserField() As String + Public Overridable Property UserField() As String Get If Me._Inherit.UserField And Me._Parent IsNot Nothing Then Dim parCon As Connection.Info = TryCast(Me._Parent, Container.Info).ConnectionInfo diff --git a/mRemoteV1/Connection/Connection.Protocol.PuttyBase.vb b/mRemoteV1/Connection/Connection.Protocol.PuttyBase.vb index 3ec93c91..b40dbf45 100644 --- a/mRemoteV1/Connection/Connection.Protocol.PuttyBase.vb +++ b/mRemoteV1/Connection/Connection.Protocol.PuttyBase.vb @@ -243,27 +243,6 @@ Namespace Connection #End Region #Region "Public Shared Methods" - Public Shared Function GetSessions() As Array - Try - Dim regKey As RegistryKey - regKey = Registry.CurrentUser.OpenSubKey("Software\SimonTatham\PuTTY\Sessions") - - Dim arrKeys() As String - arrKeys = regKey.GetSubKeyNames() - Array.Resize(arrKeys, arrKeys.Length + 1) - arrKeys(arrKeys.Length - 1) = "Default Settings" - - For i As Integer = 0 To arrKeys.Length - 1 - arrKeys(i) = System.Web.HttpUtility.UrlDecode(arrKeys(i)) - Next - - Return arrKeys - Catch ex As Exception - App.Runtime.MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strPuttyGetSessionsFailed & vbNewLine & ex.Message, True) - Return Nothing - End Try - End Function - Public Shared Function IsFilePuttyNg(file As String) As Boolean Dim isPuttyNg As Boolean Try @@ -282,8 +261,6 @@ Namespace Connection p = Process.Start(pSI) p.WaitForExit() - - mRemoteNG.Connection.PuttySession.PuttySessions = GetSessions() Catch ex As Exception MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strPuttyStartFailed & vbNewLine & ex.Message, True) End Try diff --git a/mRemoteV1/Connection/Connection.PuttySession.vb b/mRemoteV1/Connection/Connection.PuttySession.vb deleted file mode 100644 index 63b650f0..00000000 --- a/mRemoteV1/Connection/Connection.PuttySession.vb +++ /dev/null @@ -1,21 +0,0 @@ -Imports System.ComponentModel - -Namespace Connection - Public Class PuttySession - Inherits StringConverter - - Public Shared PuttySessions As String() = New String() {} - - Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection - Return New StandardValuesCollection(PuttySessions) - End Function - - Public Overloads Overrides Function GetStandardValuesExclusive(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean - Return True - End Function - - Public Overloads Overrides Function GetStandardValuesSupported(ByVal context As ITypeDescriptorContext) As Boolean - Return True - End Function - End Class -End Namespace \ No newline at end of file diff --git a/mRemoteV1/Connection/PuttySession.Info.vb b/mRemoteV1/Connection/PuttySession.Info.vb new file mode 100644 index 00000000..f6425098 --- /dev/null +++ b/mRemoteV1/Connection/PuttySession.Info.vb @@ -0,0 +1,77 @@ +Imports System.ComponentModel + +Namespace Connection + Namespace PuttySession + Public Class Info + Inherits Connection.Info + + _ + Public Property RootPuttySessionsInfo() As Root.PuttySessions.Info + + <[ReadOnly](True)> _ + Public Overrides Property PuttySession() As String + + <[ReadOnly](True)> _ + Public Overrides Property Name() As String + + <[ReadOnly](True), _ + Browsable(False)> _ + Public Overrides Property Description() As String + + <[ReadOnly](True), _ + Browsable(False)> _ + Public Overrides Property Icon() As String + Get + Return "PuTTY" + End Get + Set(value As String) + + End Set + End Property + + <[ReadOnly](True), _ + Browsable(False)> _ + Public Overrides Property Panel() As String + Get + Return RootPuttySessionsInfo.Panel + End Get + Set(value As String) + + End Set + End Property + + <[ReadOnly](True)> _ + Public Overrides Property Hostname() As String + + <[ReadOnly](True)> _ + Public Overrides Property Username() As String + + <[ReadOnly](True), _ + Browsable(False)> _ + Public Overrides Property Password() As String + + <[ReadOnly](True)> _ + Public Overrides Property Protocol() As Protocol.Protocols + + <[ReadOnly](True)> _ + Public Overrides Property Port() As Integer + + <[ReadOnly](True), _ + Browsable(False)> _ + Public Overrides Property PreExtApp() As String + + <[ReadOnly](True), _ + Browsable(False)> _ + Public Overrides Property PostExtApp() As String + + <[ReadOnly](True), _ + Browsable(False)> _ + Public Overrides Property MacAddress() As String + + <[ReadOnly](True), _ + Browsable(False)> _ + Public Overrides Property UserField() As String + End Class + End Namespace +End Namespace + diff --git a/mRemoteV1/Forms/frmMain.vb b/mRemoteV1/Forms/frmMain.vb index 22b7bb43..53caa1e6 100644 --- a/mRemoteV1/Forms/frmMain.vb +++ b/mRemoteV1/Forms/frmMain.vb @@ -62,7 +62,6 @@ Public Class frmMain WindowList = New UI.Window.List Startup.GetConnectionIcons() - Startup.GetPuttySessions() App.Runtime.GetExtApps() Windows.treePanel.Focus() @@ -75,6 +74,8 @@ Public Class frmMain Return End If + PuttySessions.AddSessionsToTree(Tree.Node.TreeView) + If My.Settings.StartupComponentsCheck Then Windows.Show(UI.Window.Type.ComponentsCheck) End If @@ -314,7 +315,8 @@ Public Class frmMain Private Sub tsExtAppEntry_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim extA As Tools.ExternalTool = sender.Tag - If Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.Connection Then + If Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.Connection Or _ + Tree.Node.GetNodeType(Tree.Node.SelectedNode) = Tree.Node.Type.PuttySession Then extA.Start(Tree.Node.SelectedNode.Tag) Else extA.Start() @@ -341,8 +343,10 @@ Public Class frmMain #Region "Menu" #Region "File" Private Sub mMenFile_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mMenFile.DropDownOpening - Select Case Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) + Select Case Tree.Node.GetNodeType(Tree.Node.SelectedNode) Case Tree.Node.Type.Root + mMenFileNewConnection.Enabled = True + mMenFileNewFolder.Enabled = True mMenFileImportExport.Enabled = True mMenFileDelete.Enabled = False mMenFileRename.Enabled = True @@ -351,6 +355,8 @@ Public Class frmMain mMenFileRename.Text = My.Language.strMenuRenameFolder mMenFileDuplicate.Text = My.Language.strMenuDuplicate Case Tree.Node.Type.Container + mMenFileNewConnection.Enabled = True + mMenFileNewFolder.Enabled = True mMenFileImportExport.Enabled = True mMenFileDelete.Enabled = True mMenFileRename.Enabled = True @@ -359,6 +365,8 @@ Public Class frmMain mMenFileRename.Text = My.Language.strMenuRenameFolder mMenFileDuplicate.Text = My.Language.strMenuDuplicateFolder Case Tree.Node.Type.Connection + mMenFileNewConnection.Enabled = True + mMenFileNewFolder.Enabled = True mMenFileImportExport.Enabled = False mMenFileDelete.Enabled = True mMenFileRename.Enabled = True @@ -366,7 +374,19 @@ Public Class frmMain mMenFileDelete.Text = My.Language.strMenuDeleteConnection mMenFileRename.Text = My.Language.strMenuRenameConnection mMenFileDuplicate.Text = My.Language.strMenuDuplicateConnection + Case Tree.Node.Type.PuttyRoot, Tree.Node.Type.PuttySession + mMenFileNewConnection.Enabled = False + mMenFileNewFolder.Enabled = False + mMenFileImportExport.Enabled = False + mMenFileDelete.Enabled = False + mMenFileRename.Enabled = False + mMenFileDuplicate.Enabled = False + mMenFileDelete.Text = My.Language.strMenuDelete + mMenFileRename.Text = My.Language.strMenuRename + mMenFileDuplicate.Text = My.Language.strMenuDuplicate Case Else + mMenFileNewConnection.Enabled = True + mMenFileNewFolder.Enabled = True mMenFileImportExport.Enabled = False mMenFileDelete.Enabled = False mMenFileRename.Enabled = False @@ -735,7 +755,8 @@ Public Class frmMain menToolStrip.DropDownItems.Add(tMenItem) AddNodeToMenu(tNode.Nodes, tMenItem) - ElseIf Tree.Node.GetNodeType(tNode) = Tree.Node.Type.Connection Then + ElseIf Tree.Node.GetNodeType(tNode) = Tree.Node.Type.Connection Or _ + Tree.Node.GetNodeType(tNode) = Tree.Node.Type.PuttySession Then tMenItem.Image = Windows.treeForm.imgListTree.Images(tNode.ImageIndex) tMenItem.Tag = tNode.Tag diff --git a/mRemoteV1/Icons/PuTTY.ico b/mRemoteV1/Icons/PuTTY.ico new file mode 100644 index 0000000000000000000000000000000000000000..f7a1840a858eb8c8a41a343b8510c28a80510d7a GIT binary patch literal 318 zcmZ9Ip$@`85Jcw!2_%SCVL|pUFcl=_f2d + ''' Looks up a localized string similar to PuTTY Saved Sessions. + ''' + Friend Shared ReadOnly Property strPuttySavedSessionsRootName() As String + Get + Return ResourceManager.GetString("strPuttySavedSessionsRootName", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to PuTTY Settings. ''' diff --git a/mRemoteV1/Language/Language.resx b/mRemoteV1/Language/Language.resx index 8f0d451d..b0ecd888 100644 --- a/mRemoteV1/Language/Language.resx +++ b/mRemoteV1/Language/Language.resx @@ -2214,4 +2214,7 @@ mRemoteNG will now quit and begin with the installation. &Show Help Text + + PuTTY Saved Sessions + \ No newline at end of file diff --git a/mRemoteV1/My Project/Resources.Designer.vb b/mRemoteV1/My Project/Resources.Designer.vb index 6cec63b9..fc109e9d 100644 --- a/mRemoteV1/My Project/Resources.Designer.vb +++ b/mRemoteV1/My Project/Resources.Designer.vb @@ -1,7 +1,7 @@ '------------------------------------------------------------------------------ ' ' This code was generated by a tool. -' Runtime Version:4.0.30319.239 +' Runtime Version:4.0.30319.296 ' ' Changes to this file may cause incorrect behavior and will be lost if ' the code is regenerated. @@ -585,6 +585,13 @@ Namespace My.Resources End Get End Property + Friend ReadOnly Property PuttySessions() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("PuttySessions", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + Friend ReadOnly Property Quit() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Quit", resourceCulture) diff --git a/mRemoteV1/My Project/Resources.resx b/mRemoteV1/My Project/Resources.resx index 03b7d41e..0908c939 100644 --- a/mRemoteV1/My Project/Resources.resx +++ b/mRemoteV1/My Project/Resources.resx @@ -445,4 +445,8 @@ ..\Resources\Images_FamFamFam\News.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - + + + ..\Resources\Images\PuttySessions.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/mRemoteV1/My Project/Settings.Designer.vb b/mRemoteV1/My Project/Settings.Designer.vb index aee21108..05c79135 100644 --- a/mRemoteV1/My Project/Settings.Designer.vb +++ b/mRemoteV1/My Project/Settings.Designer.vb @@ -2358,6 +2358,32 @@ Namespace My Me("ShowConfigHelpText") = value End Set End Property + + _ + Public Property PuttySavedSessionsName() As String + Get + Return CType(Me("PuttySavedSessionsName"),String) + End Get + Set + Me("PuttySavedSessionsName") = value + End Set + End Property + + _ + Public Property PuttySavedSessionsPanel() As String + Get + Return CType(Me("PuttySavedSessionsPanel"),String) + End Get + Set + Me("PuttySavedSessionsPanel") = value + End Set + End Property End Class End Namespace diff --git a/mRemoteV1/My Project/Settings.settings b/mRemoteV1/My Project/Settings.settings index f6f98864..58faf135 100644 --- a/mRemoteV1/My Project/Settings.settings +++ b/mRemoteV1/My Project/Settings.settings @@ -536,5 +536,11 @@ True + + + + + + \ No newline at end of file diff --git a/mRemoteV1/Resources/Images/PuttySessions.png b/mRemoteV1/Resources/Images/PuttySessions.png new file mode 100644 index 0000000000000000000000000000000000000000..d3407e276a3f3312ec9383a463338072d5c8173d GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP*5S+ zBgmJ5p~{7Up`n$5kzoY`L$w0~Ls1z6!v_Nf2D1|k461(~7o9K#sy*T9;uunKYs%z6 zzGed+=lSY<$Id>xx5hT|TVU#eTTN*z;|~_TVPQSU<#akpfa%7&6N1Y7x4NwrjTCH& zvvD{TKH*eAea?lzjt^Tl-M!=$-eWMS(fqFBI%z@Tz>aXspJ2|BhGE<_=J(d$s@o literal 0 HcmV?d00001 diff --git a/mRemoteV1/Root/PuttySessions.Info.vb b/mRemoteV1/Root/PuttySessions.Info.vb new file mode 100644 index 00000000..bfd0b6fe --- /dev/null +++ b/mRemoteV1/Root/PuttySessions.Info.vb @@ -0,0 +1,29 @@ +Imports mRemoteNG.Tools.LocalizedAttributes + +Namespace Root + Namespace PuttySessions + Public Class Info + Inherits Root.Info + + Public Sub New() + MyBase.New(RootType.PuttySessions) + End Sub + + Public Overrides Property Name() As String + + Private _panel As String = My.Language.strGeneral + _ + Public Property Panel() As String + Get + Return _panel + End Get + Set(ByVal value As String) + _panel = value + End Set + End Property + End Class + End Namespace +End Namespace + diff --git a/mRemoteV1/Root/Root.Info.vb b/mRemoteV1/Root/Root.Info.vb index 5afa7fb9..223a70f8 100644 --- a/mRemoteV1/Root/Root.Info.vb +++ b/mRemoteV1/Root/Root.Info.vb @@ -20,7 +20,7 @@ Namespace Root LocalizedDisplayName("strPropertyNameName"), _ LocalizedDescription("strPropertyDescriptionName"), _ Attributes.Root()> _ - Public Property Name() As String + Public Overridable Property Name() As String Get Return Me._Name End Get @@ -104,6 +104,7 @@ Namespace Root Public Enum RootType Connection Credential + PuttySessions End Enum Public Class Attributes diff --git a/mRemoteV1/Tree/Tree.Node.vb b/mRemoteV1/Tree/Tree.Node.vb index 1c4bf445..254fbfbb 100644 --- a/mRemoteV1/Tree/Tree.Node.vb +++ b/mRemoteV1/Tree/Tree.Node.vb @@ -5,10 +5,12 @@ Imports System.DirectoryServices Namespace Tree Public Class Node Public Enum Type - Root = 0 - Container = 1 - Connection = 2 - NONE = 66 + None = 0 + Root = 1 + Container = 2 + Connection = 3 + PuttyRoot = 4 + PuttySession = 5 End Enum Private Shared _TreeView As TreeView @@ -92,10 +94,14 @@ Namespace Tree Return Type.NONE End If - If TypeOf treeNode.Tag Is Root.Info Then + If TypeOf treeNode.Tag Is Root.PuttySessions.Info Then + Return Type.PuttyRoot + ElseIf TypeOf treeNode.Tag Is Root.Info Then Return Type.Root ElseIf TypeOf treeNode.Tag Is Container.Info Then Return Type.Container + ElseIf TypeOf treeNode.Tag Is Connection.PuttySession.Info Then + Return Type.PuttySession ElseIf TypeOf treeNode.Tag Is Connection.Info Then Return Type.Connection End If @@ -184,7 +190,7 @@ Namespace Tree Dim nNode As New TreeNode Select Case NodeType - Case Type.Connection + Case Type.Connection Or Type.PuttySession nNode.Text = My.Language.strNewConnection nNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed nNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed diff --git a/mRemoteV1/UI/UI.Window.Config.vb b/mRemoteV1/UI/UI.Window.Config.vb index f2a3e050..77e80bc5 100644 --- a/mRemoteV1/UI/UI.Window.Config.vb +++ b/mRemoteV1/UI/UI.Window.Config.vb @@ -377,7 +377,7 @@ Namespace UI End If Me.btnShowDefaultProperties.Enabled = False Me.btnShowDefaultInheritance.Enabled = False - Me.btnIcon.Enabled = True + btnIcon.Enabled = True Me.btnHostStatus.Enabled = True ElseIf Me.DefaultPropertiesVisible Then 'Defaults selected Me.pGrid.SelectedObject = Obj @@ -441,17 +441,31 @@ Namespace UI If conIcon IsNot Nothing Then Me.btnIcon.Image = conIcon.ToBitmap End If - ElseIf TypeOf Obj Is mRemoteNG.Root.Info Then 'ROOT - Me.PropertiesVisible = True - Me.DefaultPropertiesVisible = False - Me.btnShowProperties.Enabled = True - Me.btnShowInheritance.Enabled = False - Me.btnShowDefaultProperties.Enabled = True - Me.btnShowDefaultInheritance.Enabled = True - Me.btnIcon.Enabled = False - Me.btnHostStatus.Enabled = False - - Me.pGrid.SelectedObject = Obj + ElseIf TypeOf Obj Is Root.Info Then 'ROOT + Dim rootInfo As Root.Info = CType(Obj, Root.Info) + Select Case rootInfo.Type + Case Root.Info.RootType.Connection + PropertiesVisible = True + DefaultPropertiesVisible = False + btnShowProperties.Enabled = True + btnShowInheritance.Enabled = False + btnShowDefaultProperties.Enabled = True + btnShowDefaultInheritance.Enabled = True + btnIcon.Enabled = False + btnHostStatus.Enabled = False + Case Root.Info.RootType.Credential + Throw New NotImplementedException + Case Root.Info.RootType.PuttySessions + PropertiesVisible = True + DefaultPropertiesVisible = False + btnShowProperties.Enabled = True + btnShowInheritance.Enabled = False + btnShowDefaultProperties.Enabled = False + btnShowDefaultInheritance.Enabled = False + btnIcon.Enabled = False + btnHostStatus.Enabled = False + End Select + pGrid.SelectedObject = Obj ElseIf TypeOf Obj Is mRemoteNG.Connection.Info.Inheritance Then 'INHERITANCE Me.pGrid.SelectedObject = Obj @@ -605,8 +619,6 @@ Namespace UI If conIcon IsNot Nothing Then Me.btnIcon.Image = conIcon.ToBitmap End If - Case My.Language.strPropertyNamePuttySession - mRemoteNG.Connection.PuttySession.PuttySessions = mRemoteNG.Connection.Protocol.PuttyBase.GetSessions() Case My.Language.strPropertyNameAddress Me.SetHostStatus(Me.pGrid.SelectedObject) End Select @@ -616,7 +628,16 @@ Namespace UI End If End If - If TypeOf Me.pGrid.SelectedObject Is mRemoteNG.Root.Info Then + If TypeOf pGrid.SelectedObject Is Root.PuttySessions.Info Then + Dim puttyRootInfo As Root.PuttySessions.Info = pGrid.SelectedObject + Select Case e.ChangedItem.PropertyDescriptor.Name + Case "Name" + puttyRootInfo.TreeNode.Text = puttyRootInfo.Name + Settings.PuttySavedSessionsName = puttyRootInfo.Name + Case "Panel" + Settings.PuttySavedSessionsPanel = puttyRootInfo.Panel + End Select + ElseIf TypeOf Me.pGrid.SelectedObject Is mRemoteNG.Root.Info Then Dim rInfo As mRemoteNG.Root.Info = Me.pGrid.SelectedObject Select Case e.ChangedItem.Label @@ -1282,8 +1303,11 @@ Namespace UI strHide.Add("Hostname") strHide.Add("Name") End If - ElseIf TypeOf Me.pGrid.SelectedObject Is mRemoteNG.Root.Info Then - strHide.Add("TreeNode") + ElseIf TypeOf pGrid.SelectedObject Is Root.Info Then + Dim rootInfo As Root.Info = CType(pGrid.SelectedObject, Root.Info) + If rootInfo.Type = Root.Info.RootType.PuttySessions Then + strHide.Add("Password") + End If End If Me.pGrid.HiddenProperties = strHide.ToArray @@ -1356,7 +1380,8 @@ Namespace UI Private Sub btnIcon_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnIcon.MouseUp Try - If TypeOf Me.pGrid.SelectedObject Is mRemoteNG.Connection.Info Then + If TypeOf pGrid.SelectedObject Is mRemoteNG.Connection.Info And _ + Not TypeOf pGrid.SelectedObject Is mRemoteNG.Connection.PuttySession.Info Then Me.cMenIcons.Items.Clear() For Each iStr As String In mRemoteNG.Connection.Icon.Icons diff --git a/mRemoteV1/UI/UI.Window.Tree.vb b/mRemoteV1/UI/UI.Window.Tree.vb index 3a93668a..f6bdc544 100644 --- a/mRemoteV1/UI/UI.Window.Tree.vb +++ b/mRemoteV1/UI/UI.Window.Tree.vb @@ -1,4 +1,4 @@ -Imports mRemoteNG.Connection +Imports mRemoteNG Imports mRemoteNG.My Imports WeifenLuo.WinFormsUI.Docking Imports mRemoteNG.App.Runtime @@ -557,10 +557,11 @@ Namespace UI #Region "Private Methods" Private Sub FillImageList() Try - Me.imgListTree.Images.Add(My.Resources.Root) - Me.imgListTree.Images.Add(My.Resources.Folder) - Me.imgListTree.Images.Add(My.Resources.Play) - Me.imgListTree.Images.Add(My.Resources.Pause) + 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 ex As Exception MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "FillImageList (UI.Window.Tree) failed" & vbNewLine & ex.Message, True) End Try @@ -586,22 +587,22 @@ Namespace UI Private Sub tvConnections_AfterSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvConnections.AfterSelect Try Select Case mRemoteNG.Tree.Node.GetNodeType(e.Node) - Case mRemoteNG.Tree.Node.Type.Connection + Case mRemoteNG.Tree.Node.Type.Connection, mRemoteNG.Tree.Node.Type.PuttySession Windows.configForm.SetPropertyGridObject(e.Node.Tag) Windows.sessionsForm.CurrentHost = TryCast(e.Node.Tag, mRemoteNG.Connection.Info).Hostname Case mRemoteNG.Tree.Node.Type.Container - Windows.configForm.SetPropertyGridObject(TryCast(e.Node.Tag, mRemoteNG.Container.Info).ConnectionInfo) - Case mRemoteNG.Tree.Node.Type.Root + Windows.configForm.SetPropertyGridObject(TryCast(e.Node.Tag, Container.Info).ConnectionInfo) + Case mRemoteNG.Tree.Node.Type.Root, mRemoteNG.Tree.Node.Type.PuttyRoot Windows.configForm.SetPropertyGridObject(e.Node.Tag) Case Else Exit Sub End Select Windows.configForm.pGrid_SelectedObjectChanged() - Me.ShowHideTreeContextMenuItems(e.Node) + ShowHideTreeContextMenuItems(e.Node) Windows.sessionsForm.GetSessionsAuto() - App.Runtime.LastSelected = mRemoteNG.Tree.Node.GetConstantID(e.Node) + LastSelected = mRemoteNG.Tree.Node.GetConstantID(e.Node) Catch ex As Exception MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "tvConnections_AfterSelect (UI.Window.Tree) failed" & vbNewLine & ex.Message, True) End Try @@ -613,8 +614,10 @@ Namespace UI Me.tvConnections.SelectedNode = e.Node If e.Button = System.Windows.Forms.MouseButtons.Left Then - If My.Settings.SingleClickOnConnectionOpensIt And mRemoteNG.Tree.Node.GetNodeType(e.Node) = mRemoteNG.Tree.Node.Type.Connection Then - App.Runtime.OpenConnection() + If Settings.SingleClickOnConnectionOpensIt And _ + (mRemoteNG.Tree.Node.GetNodeType(e.Node) = mRemoteNG.Tree.Node.Type.Connection Or _ + mRemoteNG.Tree.Node.GetNodeType(e.Node) = mRemoteNG.Tree.Node.Type.PuttySession) Then + OpenConnection() End If If My.Settings.SingleClickSwitchesToOpenConnection And mRemoteNG.Tree.Node.GetNodeType(e.Node) = mRemoteNG.Tree.Node.Type.Connection Then @@ -627,8 +630,9 @@ Namespace UI End Sub Private Sub tvConnections_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles tvConnections.NodeMouseDoubleClick - If mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) = mRemoteNG.Tree.Node.Type.Connection Then - App.Runtime.OpenConnection() + If mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) = mRemoteNG.Tree.Node.Type.Connection Or _ + mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) = mRemoteNG.Tree.Node.Type.PuttySession Then + OpenConnection() End If End Sub @@ -656,111 +660,119 @@ Namespace UI Return False End Function - Private Sub ShowHideTreeContextMenuItems(ByVal tNode As TreeNode) - Try - Me.cMenTree.Enabled = True - - If tNode Is Nothing Then - Exit Sub + Private Sub EnableMenuItemsRecursive(ByVal items As ToolStripItemCollection, Optional ByVal enable As Boolean = True) + Dim menuItem As ToolStripMenuItem + For Each item As ToolStripItem In items + menuItem = TryCast(item, ToolStripMenuItem) + If menuItem Is Nothing Then Continue For + menuItem.Enabled = enable + If menuItem.HasDropDownItems Then + EnableMenuItemsRecursive(menuItem.DropDownItems, enable) End If + Next + End Sub - Select Case mRemoteNG.Tree.Node.GetNodeType(tNode) + Private Sub ShowHideTreeContextMenuItems(ByVal selectedNode As TreeNode) + If selectedNode Is Nothing Then Return + + Try + cMenTree.Enabled = True + EnableMenuItemsRecursive(cMenTree.Items) + + Select Case mRemoteNG.Tree.Node.GetNodeType(selectedNode) Case mRemoteNG.Tree.Node.Type.Connection - Dim conI As mRemoteNG.Connection.Info = tNode.Tag + Dim connectionInfo As mRemoteNG.Connection.Info = selectedNode.Tag - Me.cMenTreeConnect.Enabled = True - Me.cMenTreeConnectWithOptions.Enabled = True - - If TryCast(tNode.Tag, mRemoteNG.Connection.Info).OpenConnections.Count > 0 Then - Me.cMenTreeDisconnect.Enabled = True - Else - Me.cMenTreeDisconnect.Enabled = False + If connectionInfo.OpenConnections.Count = 0 Then + cMenTreeDisconnect.Enabled = False End If - If conI.Protocol = mRemoteNG.Connection.Protocol.Protocols.SSH1 Or conI.Protocol = mRemoteNG.Connection.Protocol.Protocols.SSH2 Then - Me.cMenTreeToolsTransferFile.Enabled = True - Else - Me.cMenTreeToolsTransferFile.Enabled = False + If Not (connectionInfo.Protocol = mRemoteNG.Connection.Protocol.Protocols.SSH1 Or _ + connectionInfo.Protocol = mRemoteNG.Connection.Protocol.Protocols.SSH2) Then + cMenTreeToolsTransferFile.Enabled = False End If - If conI.Protocol = mRemoteNG.Connection.Protocol.Protocols.RDP Then - Me.cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = True - Me.cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = True - ElseIf conI.Protocol = mRemoteNG.Connection.Protocol.Protocols.ICA Then - Me.cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = True - Me.cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = False - Else - Me.cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = False - Me.cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = False + If Not (connectionInfo.Protocol = mRemoteNG.Connection.Protocol.Protocols.RDP Or _ + connectionInfo.Protocol = mRemoteNG.Connection.Protocol.Protocols.ICA) Then + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = False + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = False End If - Me.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = True + cMenTreeToolsImportExport.Enabled = False + Case mRemoteNG.Tree.Node.Type.PuttySession + Dim puttySessionInfo As mRemoteNG.Connection.PuttySession.Info = selectedNode.Tag - Me.cMenTreeToolsImportExport.Enabled = False + cMenTreeAddConnection.Enabled = False + cMenTreeAddFolder.Enabled = False - Me.cMenTreeToolsExternalApps.Enabled = True + If puttySessionInfo.OpenConnections.Count = 0 Then + cMenTreeDisconnect.Enabled = False + End If - Me.cMenTreeDuplicate.Enabled = True - Me.cMenTreeDelete.Enabled = True + If Not (puttySessionInfo.Protocol = mRemoteNG.Connection.Protocol.Protocols.SSH1 Or _ + puttySessionInfo.Protocol = mRemoteNG.Connection.Protocol.Protocols.SSH2) Then + cMenTreeToolsTransferFile.Enabled = False + End If - Me.cMenTreeMoveUp.Enabled = True - Me.cMenTreeMoveDown.Enabled = True + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = False + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = False + cMenTreeToolsImportExport.Enabled = False + cMenTreeToolsSort.Enabled = False + cMenTreeDuplicate.Enabled = False + cMenTreeRename.Enabled = False + cMenTreeDelete.Enabled = False + cMenTreeMoveUp.Enabled = False + cMenTreeMoveDown.Enabled = False Case mRemoteNG.Tree.Node.Type.Container - Me.cMenTreeConnect.Enabled = True - Me.cMenTreeConnectWithOptions.Enabled = True - Me.cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = False - Me.cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = False - Me.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = True - Me.cMenTreeDisconnect.Enabled = False + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = False + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = False + cMenTreeDisconnect.Enabled = False - For Each n As TreeNode In tNode.Nodes - If TypeOf n.Tag Is mRemoteNG.Connection.Info Then - Dim cI As mRemoteNG.Connection.Info = n.Tag - If cI.OpenConnections.Count > 0 Then - Me.cMenTreeDisconnect.Enabled = True - Exit For - End If + Dim openConnections As Integer = 0 + Dim connectionInfo As mRemoteNG.Connection.Info + For Each node As TreeNode In selectedNode.Nodes + If TypeOf node.Tag Is mRemoteNG.Connection.Info Then + connectionInfo = node.Tag + openConnections = openConnections + connectionInfo.OpenConnections.Count End If Next + If openConnections = 0 Then + cMenTreeDisconnect.Enabled = False + End If - Me.cMenTreeToolsTransferFile.Enabled = False - - Me.cMenTreeToolsImportExport.Enabled = True - Me.cMenTreeToolsImportExportExportmRemoteXML.Enabled = True - Me.cMenTreeToolsImportExportImportFromAD.Enabled = True - Me.cMenTreeToolsImportExportImportmRemoteXML.Enabled = True - - Me.cMenTreeToolsExternalApps.Enabled = False - - Me.cMenTreeDuplicate.Enabled = True - Me.cMenTreeDelete.Enabled = True - - Me.cMenTreeMoveUp.Enabled = True - Me.cMenTreeMoveDown.Enabled = True + cMenTreeToolsTransferFile.Enabled = False + cMenTreeToolsExternalApps.Enabled = False Case mRemoteNG.Tree.Node.Type.Root - Me.cMenTreeConnect.Enabled = False - Me.cMenTreeConnectWithOptions.Enabled = False - Me.cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = False - Me.cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = False - Me.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = False - Me.cMenTreeDisconnect.Enabled = False - - Me.cMenTreeToolsTransferFile.Enabled = False - - Me.cMenTreeToolsImportExport.Enabled = True - Me.cMenTreeToolsImportExportExportmRemoteXML.Enabled = True - Me.cMenTreeToolsImportExportImportFromAD.Enabled = True - Me.cMenTreeToolsImportExportImportmRemoteXML.Enabled = True - - Me.cMenTreeToolsExternalApps.Enabled = False - - Me.cMenTreeDuplicate.Enabled = False - Me.cMenTreeDelete.Enabled = False - - Me.cMenTreeMoveUp.Enabled = False - Me.cMenTreeMoveDown.Enabled = False + 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 + Case mRemoteNG.Tree.Node.Type.PuttyRoot + cMenTreeAddConnection.Enabled = False + cMenTreeAddFolder.Enabled = False + cMenTreeConnect.Enabled = False + cMenTreeConnectWithOptions.Enabled = False + cMenTreeDisconnect.Enabled = False + cMenTreeToolsTransferFile.Enabled = False + cMenTreeConnectWithOptions.Enabled = False + cMenTreeToolsImportExport.Enabled = False + cMenTreeToolsSort.Enabled = False + cMenTreeToolsExternalApps.Enabled = False + cMenTreeDuplicate.Enabled = False + cMenTreeRename.Enabled = False + cMenTreeDelete.Enabled = False + cMenTreeMoveUp.Enabled = False + cMenTreeMoveDown.Enabled = False Case Else - Me.cMenTree.Enabled = False + cMenTree.Enabled = False End Select Catch ex As Exception MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowHideTreeContextMenuItems (UI.Window.Tree) failed" & vbNewLine & ex.Message, True) @@ -861,26 +873,23 @@ Namespace UI Dim pt As Point = CType(sender, TreeView).PointToClient(New Point(e.X, e.Y)) Dim targetNode As TreeNode = selectedTreeview.GetNodeAt(pt) - 'See if the targetNode is currently selected, - 'if so no need to validate again - If Not (selectedTreeview.SelectedNode Is targetNode) Then - 'Select the node currently under the cursor - selectedTreeview.SelectedNode = targetNode + '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 - Dim dropNode As TreeNode = CType(e.Data.GetData("System.Windows.Forms.TreeNode"), TreeNode) + '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 + Dim dropNode As TreeNode = CType(e.Data.GetData("System.Windows.Forms.TreeNode"), TreeNode) - Do Until targetNode Is Nothing - If targetNode Is dropNode Then - e.Effect = DragDropEffects.None - Exit Sub - End If - - targetNode = targetNode.Parent - Loop - End If + Dim puttyRootInfo As Root.PuttySessions.Info + Do Until targetNode Is Nothing + puttyRootInfo = TryCast(targetNode.Tag, Root.PuttySessions.Info) + If puttyRootInfo IsNot Nothing Or targetNode Is dropNode Then + e.Effect = DragDropEffects.None + Return + End If + targetNode = targetNode.Parent + Loop 'Currently selected node is a suitable target e.Effect = DragDropEffects.Move @@ -891,6 +900,17 @@ Namespace UI Private Sub tvConnections_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles tvConnections.ItemDrag Try + Dim dragTreeNode As TreeNode = TryCast(e.Item, TreeNode) + If dragTreeNode Is Nothing Then Return + + If dragTreeNode.Tag Is Nothing Then Return + If TypeOf dragTreeNode.Tag Is mRemoteNG.Connection.PuttySession.Info Or _ + Not (TypeOf dragTreeNode.Tag Is mRemoteNG.Connection.Info Or _ + TypeOf dragTreeNode.Tag Is Container.Info) Then + tvConnections.SelectedNode = dragTreeNode + Return + End If + 'Set the drag node and initiate the DragDrop DoDragDrop(e.Item, DragDropEffects.Move) Catch ex As Exception @@ -1029,7 +1049,7 @@ Namespace UI containerNode = containerNode.Parent End If - Dim newConnectionInfo As New Info() + Dim newConnectionInfo As New mRemoteNG.Connection.Info() If mRemoteNG.Tree.Node.GetNodeType(containerNode) = mRemoteNG.Tree.Node.Type.Root Then newConnectionInfo.Inherit.TurnOffInheritanceCompletely() Else @@ -1068,7 +1088,7 @@ Namespace UI End If End If - newContainerInfo.ConnectionInfo = New Info(newContainerInfo) + newContainerInfo.ConnectionInfo = New mRemoteNG.Connection.Info(newContainerInfo) ' We can only inherit from a container node, not the root node or connection nodes If mRemoteNG.Tree.Node.GetNodeType(parentNode) = mRemoteNG.Tree.Node.Type.Container Then @@ -1203,7 +1223,8 @@ Namespace UI Private Sub StartExternalApp(ByVal ExtA As Tools.ExternalTool) Try - If mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) = mRemoteNG.Tree.Node.Type.Connection Then + If mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) = mRemoteNG.Tree.Node.Type.Connection Or _ + mRemoteNG.Tree.Node.GetNodeType(mRemoteNG.Tree.Node.SelectedNode) = mRemoteNG.Tree.Node.Type.PuttySession Then ExtA.Start(mRemoteNG.Tree.Node.SelectedNode.Tag) End If Catch ex As Exception diff --git a/mRemoteV1/app.config b/mRemoteV1/app.config index e8cc43f7..5dd93684 100644 --- a/mRemoteV1/app.config +++ b/mRemoteV1/app.config @@ -571,6 +571,12 @@ True + + + + + + diff --git a/mRemoteV1/mRemoteV1.vbproj b/mRemoteV1/mRemoteV1.vbproj index b68c4f63..87456409 100644 --- a/mRemoteV1/mRemoteV1.vbproj +++ b/mRemoteV1/mRemoteV1.vbproj @@ -187,6 +187,9 @@ + + + @@ -215,7 +218,6 @@ - @@ -652,6 +654,7 @@ PreserveNewest + @@ -810,6 +813,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest