mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
@@ -10,7 +10,7 @@ using mRemoteNG.Tools;
|
||||
|
||||
namespace mRemoteNG.App
|
||||
{
|
||||
public class Import
|
||||
public static class Import
|
||||
{
|
||||
private enum FileType
|
||||
{
|
||||
@@ -23,7 +23,7 @@ namespace mRemoteNG.App
|
||||
}
|
||||
|
||||
#region Public Methods
|
||||
public static void ImportFromFile(ContainerInfo importDestinationContainer, bool alwaysUseSelectedTreeNode = false)
|
||||
public static void ImportFromFile(ContainerInfo importDestinationContainer)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -51,6 +51,7 @@ namespace mRemoteNG.App
|
||||
try
|
||||
{
|
||||
IConnectionImporter importer;
|
||||
// ReSharper disable once SwitchStatementMissingSomeCases
|
||||
switch (DetermineFileType(fileName))
|
||||
{
|
||||
case FileType.mRemoteXml:
|
||||
@@ -91,8 +92,7 @@ namespace mRemoteNG.App
|
||||
{
|
||||
try
|
||||
{
|
||||
var importer = new ActiveDirectoryImporter();
|
||||
importer.Import(ldapPath, importDestinationContainer);
|
||||
ActiveDirectoryImporter.Import(ldapPath, importDestinationContainer);
|
||||
Runtime.SaveConnectionsAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -120,8 +120,9 @@ namespace mRemoteNG.App
|
||||
private static FileType DetermineFileType(string fileName)
|
||||
{
|
||||
// TODO: Use the file contents to determine the file type instead of trusting the extension
|
||||
var fileExtension = Convert.ToString(Path.GetExtension(fileName).ToLowerInvariant());
|
||||
switch (fileExtension)
|
||||
var extension = Path.GetExtension(fileName);
|
||||
if (extension == null) return FileType.Unknown;
|
||||
switch (extension.ToLowerInvariant())
|
||||
{
|
||||
case ".xml":
|
||||
return FileType.mRemoteXml;
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace mRemoteNG.Config.Import
|
||||
Import(ldapPathAsString, destinationContainer);
|
||||
}
|
||||
|
||||
public void Import(string ldapPath, ContainerInfo destinationContainer)
|
||||
public static void Import(string ldapPath, ContainerInfo destinationContainer)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.DirectoryServices;
|
||||
using System.Text.RegularExpressions;
|
||||
using mRemoteNG.App;
|
||||
using mRemoteNG.Config.Import;
|
||||
using mRemoteNG.Connection;
|
||||
using mRemoteNG.Container;
|
||||
using mRemoteNG.Tree;
|
||||
@@ -45,19 +46,27 @@ namespace mRemoteNG.Config.Serializers
|
||||
{
|
||||
try
|
||||
{
|
||||
const string ldapFilter = "(objectClass=computer)";
|
||||
const string ldapFilter = "(|(objectClass=computer)(objectClass=organizationalUnit))";
|
||||
using (var ldapSearcher = new DirectorySearcher())
|
||||
{
|
||||
ldapSearcher.SearchRoot = new DirectoryEntry(ldapPath);
|
||||
ldapSearcher.Filter = ldapFilter;
|
||||
ldapSearcher.SearchScope = SearchScope.OneLevel;
|
||||
ldapSearcher.PropertiesToLoad.AddRange(new[] { "securityEquals", "cn" });
|
||||
ldapSearcher.PropertiesToLoad.AddRange(new[] { "securityEquals", "cn", "objectClass" });
|
||||
|
||||
var ldapResults = ldapSearcher.FindAll();
|
||||
foreach (SearchResult ldapResult in ldapResults)
|
||||
{
|
||||
using (var directoryEntry = ldapResult.GetDirectoryEntry())
|
||||
{
|
||||
if (directoryEntry.Properties["objectClass"].Contains("organizationalUnit"))
|
||||
{
|
||||
ActiveDirectoryImporter.Import(ldapResult.Path, parentContainer);
|
||||
continue;
|
||||
}
|
||||
|
||||
DeserializeConnection(directoryEntry, parentContainer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,87 +7,100 @@ namespace mRemoteNG.UI.Window
|
||||
#region Windows Form Designer generated code
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.btnImport = new System.Windows.Forms.Button();
|
||||
this.Load += new System.EventHandler(ADImport_Load);
|
||||
this.btnImport.Click += new System.EventHandler(this.btnImport_Click);
|
||||
this.txtDomain = new System.Windows.Forms.TextBox();
|
||||
this.txtDomain.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(mRemoteNG.UI.Window.ActiveDirectoryImportWindow.txtDomain_PreviewKeyDown);
|
||||
this.txtDomain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtDomain_KeyDown);
|
||||
this.lblDomain = new System.Windows.Forms.Label();
|
||||
this.btnChangeDomain = new System.Windows.Forms.Button();
|
||||
this.btnChangeDomain.Click += new System.EventHandler(this.btnChangeDomain_Click);
|
||||
this.ActiveDirectoryTree = new ADTree.ADtree();
|
||||
this.ActiveDirectoryTree.ADPathChanged += new ADTree.ADtree.ADPathChangedEventHandler(this.ActiveDirectoryTree_ADPathChanged);
|
||||
this.SuspendLayout();
|
||||
//
|
||||
//btnImport
|
||||
//
|
||||
this.btnImport.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);
|
||||
this.btnImport.Location = new System.Drawing.Point(443, 338);
|
||||
this.btnImport.Name = "btnImport";
|
||||
this.btnImport.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnImport.TabIndex = 4;
|
||||
this.btnImport.Text = "&Import";
|
||||
this.btnImport.UseVisualStyleBackColor = true;
|
||||
//
|
||||
//txtDomain
|
||||
//
|
||||
this.txtDomain.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right);
|
||||
this.txtDomain.Location = new System.Drawing.Point(12, 25);
|
||||
this.txtDomain.Name = "txtDomain";
|
||||
this.txtDomain.Size = new System.Drawing.Size(425, 20);
|
||||
this.txtDomain.TabIndex = 1;
|
||||
//
|
||||
//lblDomain
|
||||
//
|
||||
this.lblDomain.AutoSize = true;
|
||||
this.lblDomain.Location = new System.Drawing.Point(9, 9);
|
||||
this.lblDomain.Name = "lblDomain";
|
||||
this.lblDomain.Size = new System.Drawing.Size(46, 13);
|
||||
this.lblDomain.TabIndex = 0;
|
||||
this.lblDomain.Text = "Domain:";
|
||||
//
|
||||
//btnChangeDomain
|
||||
//
|
||||
this.btnChangeDomain.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right);
|
||||
this.btnChangeDomain.Location = new System.Drawing.Point(443, 23);
|
||||
this.btnChangeDomain.Name = "btnChangeDomain";
|
||||
this.btnChangeDomain.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnChangeDomain.TabIndex = 2;
|
||||
this.btnChangeDomain.Text = "Change";
|
||||
this.btnChangeDomain.UseVisualStyleBackColor = true;
|
||||
//
|
||||
//ActiveDirectoryTree
|
||||
//
|
||||
this.ActiveDirectoryTree.ADPath = null;
|
||||
this.ActiveDirectoryTree.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right);
|
||||
this.ActiveDirectoryTree.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.ActiveDirectoryTree.Location = new System.Drawing.Point(12, 52);
|
||||
this.ActiveDirectoryTree.Name = "ActiveDirectoryTree";
|
||||
this.ActiveDirectoryTree.SelectedNode = null;
|
||||
this.ActiveDirectoryTree.Size = new System.Drawing.Size(506, 280);
|
||||
this.ActiveDirectoryTree.TabIndex = 3;
|
||||
//
|
||||
//ADImport
|
||||
//
|
||||
this.AcceptButton = this.btnImport;
|
||||
this.ClientSize = new System.Drawing.Size(530, 373);
|
||||
this.Controls.Add(this.ActiveDirectoryTree);
|
||||
this.Controls.Add(this.lblDomain);
|
||||
this.Controls.Add(this.txtDomain);
|
||||
this.Controls.Add(this.btnChangeDomain);
|
||||
this.Controls.Add(this.btnImport);
|
||||
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0));
|
||||
this.Icon = Resources.ActiveDirectory_Icon;
|
||||
this.Name = "ActiveDirectoryImport";
|
||||
this.TabText = "Active Directory Import";
|
||||
this.Text = "Active Directory Import";
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
this.btnImport = new System.Windows.Forms.Button();
|
||||
this.txtDomain = new System.Windows.Forms.TextBox();
|
||||
this.lblDomain = new System.Windows.Forms.Label();
|
||||
this.btnChangeDomain = new System.Windows.Forms.Button();
|
||||
this.ActiveDirectoryTree = new ADTree.ADtree();
|
||||
this.btnClose = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// btnImport
|
||||
//
|
||||
this.btnImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnImport.Location = new System.Drawing.Point(362, 338);
|
||||
this.btnImport.Name = "btnImport";
|
||||
this.btnImport.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnImport.TabIndex = 4;
|
||||
this.btnImport.Text = "&Import";
|
||||
this.btnImport.UseVisualStyleBackColor = true;
|
||||
this.btnImport.Click += new System.EventHandler(this.btnImport_Click);
|
||||
//
|
||||
// txtDomain
|
||||
//
|
||||
this.txtDomain.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.txtDomain.Location = new System.Drawing.Point(12, 25);
|
||||
this.txtDomain.Name = "txtDomain";
|
||||
this.txtDomain.Size = new System.Drawing.Size(425, 22);
|
||||
this.txtDomain.TabIndex = 1;
|
||||
this.txtDomain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtDomain_KeyDown);
|
||||
//
|
||||
// lblDomain
|
||||
//
|
||||
this.lblDomain.AutoSize = true;
|
||||
this.lblDomain.Location = new System.Drawing.Point(9, 9);
|
||||
this.lblDomain.Name = "lblDomain";
|
||||
this.lblDomain.Size = new System.Drawing.Size(50, 13);
|
||||
this.lblDomain.TabIndex = 0;
|
||||
this.lblDomain.Text = "Domain:";
|
||||
//
|
||||
// btnChangeDomain
|
||||
//
|
||||
this.btnChangeDomain.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnChangeDomain.Location = new System.Drawing.Point(443, 23);
|
||||
this.btnChangeDomain.Name = "btnChangeDomain";
|
||||
this.btnChangeDomain.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnChangeDomain.TabIndex = 2;
|
||||
this.btnChangeDomain.Text = "Change";
|
||||
this.btnChangeDomain.UseVisualStyleBackColor = true;
|
||||
this.btnChangeDomain.Click += new System.EventHandler(this.btnChangeDomain_Click);
|
||||
//
|
||||
// ActiveDirectoryTree
|
||||
//
|
||||
this.ActiveDirectoryTree.ADPath = null;
|
||||
this.ActiveDirectoryTree.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.ActiveDirectoryTree.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.ActiveDirectoryTree.Domain = "tant-a01";
|
||||
this.ActiveDirectoryTree.Location = new System.Drawing.Point(12, 52);
|
||||
this.ActiveDirectoryTree.Name = "ActiveDirectoryTree";
|
||||
this.ActiveDirectoryTree.SelectedNode = null;
|
||||
this.ActiveDirectoryTree.Size = new System.Drawing.Size(506, 280);
|
||||
this.ActiveDirectoryTree.TabIndex = 3;
|
||||
this.ActiveDirectoryTree.ADPathChanged += new ADTree.ADtree.ADPathChangedEventHandler(this.ActiveDirectoryTree_ADPathChanged);
|
||||
//
|
||||
// btnClose
|
||||
//
|
||||
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnClose.Location = new System.Drawing.Point(444, 337);
|
||||
this.btnClose.Name = "btnClose";
|
||||
this.btnClose.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnClose.TabIndex = 5;
|
||||
this.btnClose.Text = "Close";
|
||||
this.btnClose.UseVisualStyleBackColor = true;
|
||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
||||
//
|
||||
// ActiveDirectoryImportWindow
|
||||
//
|
||||
this.AcceptButton = this.btnImport;
|
||||
this.ClientSize = new System.Drawing.Size(530, 373);
|
||||
this.Controls.Add(this.btnClose);
|
||||
this.Controls.Add(this.ActiveDirectoryTree);
|
||||
this.Controls.Add(this.lblDomain);
|
||||
this.Controls.Add(this.txtDomain);
|
||||
this.Controls.Add(this.btnChangeDomain);
|
||||
this.Controls.Add(this.btnImport);
|
||||
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.Icon = global::mRemoteNG.Resources.ActiveDirectory_Icon;
|
||||
this.Name = "ActiveDirectoryImportWindow";
|
||||
this.TabText = "Active Directory Import";
|
||||
this.Text = "Active Directory Import";
|
||||
this.Load += new System.EventHandler(this.ADImport_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
private System.Windows.Forms.Button btnImport;
|
||||
private System.Windows.Forms.TextBox txtDomain;
|
||||
@@ -95,5 +108,7 @@ namespace mRemoteNG.UI.Window
|
||||
private System.Windows.Forms.Button btnChangeDomain;
|
||||
private ADTree.ADtree ActiveDirectoryTree;
|
||||
#endregion
|
||||
}
|
||||
|
||||
private System.Windows.Forms.Button btnClose;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,14 +22,15 @@ namespace mRemoteNG.UI.Window
|
||||
|
||||
#region Private Methods
|
||||
#region Event Handlers
|
||||
public void ADImport_Load(object sender, EventArgs e)
|
||||
|
||||
private void ADImport_Load(object sender, EventArgs e)
|
||||
{
|
||||
ApplyLanguage();
|
||||
txtDomain.Text = ActiveDirectoryTree.Domain;
|
||||
EnableDisableImportButton();
|
||||
}
|
||||
|
||||
public void btnImport_Click(object sender, EventArgs e)
|
||||
|
||||
private void btnImport_Click(object sender, EventArgs e)
|
||||
{
|
||||
var selectedNode = Windows.TreeForm.SelectedNode;
|
||||
ContainerInfo importDestination;
|
||||
@@ -38,31 +39,27 @@ namespace mRemoteNG.UI.Window
|
||||
else
|
||||
importDestination = Runtime.ConnectionTreeModel.RootNodes.First();
|
||||
Import.ImportFromActiveDirectory(ActiveDirectoryTree.ADPath, importDestination);
|
||||
DialogResult = DialogResult.OK;
|
||||
Close();
|
||||
}
|
||||
|
||||
public static void txtDomain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
|
||||
|
||||
private static void txtDomain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Enter)
|
||||
e.IsInputKey = true;
|
||||
}
|
||||
|
||||
public void txtDomain_KeyDown(object sender, KeyEventArgs e)
|
||||
|
||||
private void txtDomain_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Enter)
|
||||
{
|
||||
ChangeDomain();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
if (e.KeyCode != Keys.Enter) return;
|
||||
ChangeDomain();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
|
||||
public void btnChangeDomain_Click(object sender, EventArgs e)
|
||||
|
||||
private void btnChangeDomain_Click(object sender, EventArgs e)
|
||||
{
|
||||
ChangeDomain();
|
||||
}
|
||||
|
||||
public void ActiveDirectoryTree_ADPathChanged(object sender)
|
||||
|
||||
private void ActiveDirectoryTree_ADPathChanged(object sender)
|
||||
{
|
||||
EnableDisableImportButton();
|
||||
}
|
||||
@@ -86,5 +83,10 @@ namespace mRemoteNG.UI.Window
|
||||
btnImport.Enabled = !string.IsNullOrEmpty(ActiveDirectoryTree.ADPath);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
private void btnClose_Click(object sender, EventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -112,9 +112,9 @@
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -92,7 +92,7 @@ namespace mRemoteNG.UI.Window
|
||||
dropSink.CanDropBetween = true;
|
||||
}
|
||||
|
||||
private object ConnectionImageGetter(object rowObject)
|
||||
private static object ConnectionImageGetter(object rowObject)
|
||||
{
|
||||
if (rowObject is RootPuttySessionsNodeInfo) return "PuttySessions";
|
||||
if (rowObject is RootNodeInfo) return "Root";
|
||||
@@ -194,7 +194,7 @@ namespace mRemoteNG.UI.Window
|
||||
_contextMenu.ImportFileClicked += (sender, args) =>
|
||||
{
|
||||
var selectedNodeAsContainer = SelectedNode as ContainerInfo ?? SelectedNode.Parent;
|
||||
Import.ImportFromFile(selectedNodeAsContainer, true);
|
||||
Import.ImportFromFile(selectedNodeAsContainer);
|
||||
};
|
||||
_contextMenu.ImportActiveDirectoryClicked += (sender, args) => Windows.Show(WindowType.ActiveDirectoryImport);
|
||||
_contextMenu.ImportPortScanClicked += (sender, args) => Windows.Show(WindowType.PortScan);
|
||||
@@ -316,7 +316,7 @@ namespace mRemoteNG.UI.Window
|
||||
}
|
||||
#endregion
|
||||
|
||||
public void ExpandPreviouslyOpenedFolders()
|
||||
private void ExpandPreviouslyOpenedFolders()
|
||||
{
|
||||
var containerList = ConnectionTreeModel.GetRecursiveChildList(GetRootConnectionNode()).OfType<ContainerInfo>();
|
||||
var previouslyExpandedNodes = containerList.Where(container => container.IsExpanded);
|
||||
@@ -324,7 +324,7 @@ namespace mRemoteNG.UI.Window
|
||||
olvConnections.InvokeRebuildAll(true);
|
||||
}
|
||||
|
||||
public void OpenConnectionsFromLastSession()
|
||||
private void OpenConnectionsFromLastSession()
|
||||
{
|
||||
if (!Settings.Default.OpenConsFromLastSession || Settings.Default.NoReconnect) return;
|
||||
var connectionInfoList = GetRootConnectionNode().GetRecursiveChildList().Where(node => !(node is ContainerInfo));
|
||||
@@ -389,7 +389,7 @@ namespace mRemoteNG.UI.Window
|
||||
return PromptUser(messagePrompt);
|
||||
}
|
||||
|
||||
private bool PromptUser(string promptMessage)
|
||||
private static bool PromptUser(string promptMessage)
|
||||
{
|
||||
var msgBoxResponse = MessageBox.Show(promptMessage, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
||||
return (msgBoxResponse == DialogResult.Yes);
|
||||
@@ -477,13 +477,14 @@ namespace mRemoteNG.UI.Window
|
||||
private void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs args)
|
||||
{
|
||||
var senderAsContainerInfo = sender as ContainerInfo;
|
||||
// ReSharper disable once SwitchStatementMissingSomeCases
|
||||
switch (args?.Action)
|
||||
{
|
||||
case NotifyCollectionChangedAction.Add:
|
||||
var childList = senderAsContainerInfo?.Children;
|
||||
ConnectionInfo otherChild = null;
|
||||
if (childList?.Count > 1)
|
||||
try { otherChild = childList.First(child => !args.NewItems.Contains(child)); } catch { }
|
||||
otherChild = childList.First(child => !args.NewItems.Contains(child));
|
||||
RefreshTreeObject(otherChild ?? senderAsContainerInfo);
|
||||
break;
|
||||
case NotifyCollectionChangedAction.Remove:
|
||||
@@ -509,13 +510,7 @@ namespace mRemoteNG.UI.Window
|
||||
|
||||
private void RefreshTreeObjects(IList modelObjects)
|
||||
{
|
||||
try
|
||||
{
|
||||
olvConnections.RefreshObjects(modelObjects);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
olvConnections.RefreshObjects(modelObjects);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -725,12 +720,15 @@ namespace mRemoteNG.UI.Window
|
||||
|
||||
private void ExpandParentsRecursive(ConnectionInfo connectionInfo)
|
||||
{
|
||||
if (connectionInfo?.Parent == null) return;
|
||||
olvConnections.Expand(connectionInfo.Parent);
|
||||
ExpandParentsRecursive(connectionInfo.Parent);
|
||||
}
|
||||
while (true)
|
||||
{
|
||||
if (connectionInfo?.Parent == null) return;
|
||||
olvConnections.Expand(connectionInfo.Parent);
|
||||
connectionInfo = connectionInfo.Parent;
|
||||
}
|
||||
}
|
||||
|
||||
private void tvConnections_KeyPress(object sender, KeyPressEventArgs e)
|
||||
private void tvConnections_KeyPress(object sender, KeyPressEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user