From 839414fec12fa2bbfeb27283cc494b55409c744a Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Mon, 21 Sep 2020 13:05:09 -0700 Subject: [PATCH] Added drag & drop support to the file manager. --- FileDeletePromptForm.Designer.cs | 46 ++-- FileDeletePromptForm.cs | 7 +- FileViewer.Designer.cs | 12 + FileViewer.cs | 84 ++++++- FileViewer.resx | 380 ++++++++++++++++--------------- 5 files changed, 310 insertions(+), 219 deletions(-) diff --git a/FileDeletePromptForm.Designer.cs b/FileDeletePromptForm.Designer.cs index 4839f4f..e64964c 100644 --- a/FileDeletePromptForm.Designer.cs +++ b/FileDeletePromptForm.Designer.cs @@ -30,10 +30,10 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FileDeletePromptForm)); this.mainGroupBox = new System.Windows.Forms.GroupBox(); + this.mainLabel = new System.Windows.Forms.Label(); + this.recursiveCheckBox = new System.Windows.Forms.CheckBox(); this.okButton = new System.Windows.Forms.Button(); this.cancelButton = new System.Windows.Forms.Button(); - this.recursiveCheckBox = new System.Windows.Forms.CheckBox(); - this.mainLabel = new System.Windows.Forms.Label(); this.mainGroupBox.SuspendLayout(); this.SuspendLayout(); // @@ -51,6 +51,27 @@ this.mainGroupBox.TabStop = false; this.mainGroupBox.Text = "Confirm Delete"; // + // mainLabel + // + this.mainLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.mainLabel.Location = new System.Drawing.Point(14, 23); + this.mainLabel.Name = "mainLabel"; + this.mainLabel.Size = new System.Drawing.Size(295, 13); + this.mainLabel.TabIndex = 1; + this.mainLabel.Text = "---"; + // + // recursiveCheckBox + // + this.recursiveCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.recursiveCheckBox.AutoSize = true; + this.recursiveCheckBox.Location = new System.Drawing.Point(17, 44); + this.recursiveCheckBox.Name = "recursiveCheckBox"; + this.recursiveCheckBox.Size = new System.Drawing.Size(108, 17); + this.recursiveCheckBox.TabIndex = 0; + this.recursiveCheckBox.Text = "Recursive Delete"; + this.recursiveCheckBox.UseVisualStyleBackColor = true; + // // okButton // this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); @@ -74,27 +95,6 @@ this.cancelButton.UseVisualStyleBackColor = true; this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); // - // recursiveCheckBox - // - this.recursiveCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.recursiveCheckBox.AutoSize = true; - this.recursiveCheckBox.Location = new System.Drawing.Point(17, 45); - this.recursiveCheckBox.Name = "recursiveCheckBox"; - this.recursiveCheckBox.Size = new System.Drawing.Size(108, 17); - this.recursiveCheckBox.TabIndex = 0; - this.recursiveCheckBox.Text = "Recursive Delete"; - this.recursiveCheckBox.UseVisualStyleBackColor = true; - // - // mainLabel - // - this.mainLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.mainLabel.Location = new System.Drawing.Point(14, 23); - this.mainLabel.Name = "mainLabel"; - this.mainLabel.Size = new System.Drawing.Size(295, 13); - this.mainLabel.TabIndex = 1; - this.mainLabel.Text = "---"; - // // FileDeletePromptForm // this.AcceptButton = this.okButton; diff --git a/FileDeletePromptForm.cs b/FileDeletePromptForm.cs index b1b5f24..41633c2 100644 --- a/FileDeletePromptForm.cs +++ b/FileDeletePromptForm.cs @@ -12,10 +12,15 @@ namespace MeshCentralRouter { public partial class FileDeletePromptForm : Form { - public FileDeletePromptForm(string message) + public FileDeletePromptForm(string message, bool rec) { InitializeComponent(); mainLabel.Text = message; + if (rec == false) + { + recursiveCheckBox.Visible = false; + Height = 142; + } } public bool recursive { get { return recursiveCheckBox.Checked; } } diff --git a/FileViewer.Designer.cs b/FileViewer.Designer.cs index 0d85b74..b2840dc 100644 --- a/FileViewer.Designer.cs +++ b/FileViewer.Designer.cs @@ -73,6 +73,7 @@ namespace MeshCentralRouter this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.leftTopPanel = new System.Windows.Forms.Panel(); this.localLabel = new System.Windows.Forms.Label(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.topPanel.SuspendLayout(); this.statusStrip.SuspendLayout(); this.mainTableLayoutPanel.SuspendLayout(); @@ -287,6 +288,7 @@ namespace MeshCentralRouter this.rightListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.rightListView_DragDrop); this.rightListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.rightListView_DragEnter); this.rightListView.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.rightListView_MouseDoubleClick); + this.rightListView.MouseMove += new System.Windows.Forms.MouseEventHandler(this.rightListView_MouseMove); this.rightListView.Resize += new System.EventHandler(this.rightListView_Resize); // // columnHeader3 @@ -301,6 +303,7 @@ namespace MeshCentralRouter // this.remoteContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.renameToolStripMenuItem, + this.deleteToolStripMenuItem, this.toolStripMenuItem1, this.refreshToolStripMenuItem}); this.remoteContextMenuStrip.Name = "remoteContextMenuStrip"; @@ -359,6 +362,7 @@ namespace MeshCentralRouter // // leftListView // + this.leftListView.AllowDrop = true; this.leftListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1, this.columnHeader2}); @@ -371,6 +375,8 @@ namespace MeshCentralRouter this.leftListView.View = System.Windows.Forms.View.Details; this.leftListView.ColumnWidthChanged += new System.Windows.Forms.ColumnWidthChangedEventHandler(this.leftListView_ColumnWidthChanged); this.leftListView.SelectedIndexChanged += new System.EventHandler(this.leftListView_SelectedIndexChanged); + this.leftListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.leftListView_DragDrop); + this.leftListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.leftListView_DragEnter); this.leftListView.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.leftListView_MouseDoubleClick); this.leftListView.MouseMove += new System.Windows.Forms.MouseEventHandler(this.leftListView_MouseMove); this.leftListView.Resize += new System.EventHandler(this.leftListView_Resize); @@ -399,6 +405,11 @@ namespace MeshCentralRouter resources.ApplyResources(this.localLabel, "localLabel"); this.localLabel.Name = "localLabel"; // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + resources.ApplyResources(this.deleteToolStripMenuItem, "deleteToolStripMenuItem"); + // // FileViewer // resources.ApplyResources(this, "$this"); @@ -469,6 +480,7 @@ namespace MeshCentralRouter private Button downloadButton; private Button localDeleteButton; private Button localNewFolderButton; + private ToolStripMenuItem deleteToolStripMenuItem; } } diff --git a/FileViewer.cs b/FileViewer.cs index 8e3de02..12297b9 100644 --- a/FileViewer.cs +++ b/FileViewer.cs @@ -40,6 +40,7 @@ namespace MeshCentralRouter public DirectoryInfo localFolder = null; public string remoteFolder = null; public ArrayList remoteFolderList = null; + private static string rndString = getRandomString(12); // Stats public long bytesIn = 0; @@ -762,12 +763,13 @@ namespace MeshCentralRouter private void remoteDeleteButton_Click(object sender, EventArgs e) { + bool rec = false; ArrayList filesArray = new ArrayList(); - foreach (ListViewItem l in rightListView.SelectedItems) { filesArray.Add(l.Text); } + foreach (ListViewItem l in rightListView.SelectedItems) { filesArray.Add(l.Text); if (l.ImageIndex == 1) { rec = true; } } string[] files = (string[])filesArray.ToArray(typeof(string)); - string msg = string.Format("Confirm removal of {0} items?", files.Length); - if (files.Length == 1) { msg = "Confirm removal of 1 item?"; } - FileDeletePromptForm f = new FileDeletePromptForm(msg); + string msg = string.Format("Remove {0} items?", files.Length); + if (files.Length == 1) { msg = "Remove 1 item?"; } + FileDeletePromptForm f = new FileDeletePromptForm(msg, rec); if (f.ShowDialog(this) == DialogResult.OK) { requestDelete(remoteFolder, files, f.recursive); @@ -779,11 +781,11 @@ namespace MeshCentralRouter { if (node.agentid < 5) { - toolStripMenuItem1.Visible = renameToolStripMenuItem.Visible = (rightListView.SelectedItems.Count == 1) && (remoteFolder != "") && (remoteFolder != null); + deleteToolStripMenuItem.Visible = toolStripMenuItem1.Visible = renameToolStripMenuItem.Visible = (rightListView.SelectedItems.Count == 1) && (remoteFolder != "") && (remoteFolder != null); } else { - toolStripMenuItem1.Visible = renameToolStripMenuItem.Visible = (rightListView.SelectedItems.Count == 1); + deleteToolStripMenuItem.Visible = toolStripMenuItem1.Visible = renameToolStripMenuItem.Visible = (rightListView.SelectedItems.Count == 1); } } @@ -957,7 +959,7 @@ namespace MeshCentralRouter { string localFilePath; localFilePath = Path.Combine(downloadLocalPath.FullName, (string)downloadFileArray[downloadFileArrayPtr]); - downloadFileStream = File.OpenWrite(localFilePath); + try { downloadFileStream = File.OpenWrite(localFilePath); } catch (Exception) { return; } downloadFileSize = (int)downloadFileSizeArray[downloadFileArrayPtr]; downloadFilePtr = 0; @@ -1051,12 +1053,13 @@ namespace MeshCentralRouter private void localDeleteButton_Click(object sender, EventArgs e) { + bool rec = false; ArrayList filesArray = new ArrayList(); - foreach (ListViewItem l in leftListView.SelectedItems) { filesArray.Add(l.Text); } + foreach (ListViewItem l in leftListView.SelectedItems) { filesArray.Add(l.Text); if (l.ImageIndex == 1) { rec = true; } } string[] files = (string[])filesArray.ToArray(typeof(string)); - string msg = string.Format("Confirm removal of {0} items?", files.Length); - if (files.Length == 1) { msg = "Confirm removal of 1 item?"; } - FileDeletePromptForm f = new FileDeletePromptForm(msg); + string msg = string.Format("Remove {0} items?", files.Length); + if (files.Length == 1) { msg = "Remove 1 item?"; } + FileDeletePromptForm f = new FileDeletePromptForm(msg, rec); if (f.ShowDialog(this) == DialogResult.OK) { foreach (string file in filesArray) @@ -1109,5 +1112,64 @@ namespace MeshCentralRouter } } } + + private void rightListView_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + ArrayList XdownloadFileArray = new ArrayList(); + ArrayList XdownloadFileSizeArray = new ArrayList(); + foreach (ListViewItem l in rightListView.SelectedItems) + { + if (l.ImageIndex == 2) + { + XdownloadFileArray.Add(l.Text); + XdownloadFileSizeArray.Add(int.Parse(l.SubItems[1].Text)); + } + } + if (XdownloadFileArray.Count > 0) + { + DataObject dataObj = new DataObject(); + dataObj.SetData("Type", "MeshCentralRouterRemoteFiles-" + rndString); + dataObj.SetData("RemoteFiles", XdownloadFileArray); + dataObj.SetData("RemoteSizes", XdownloadFileSizeArray); + dataObj.SetData("RemoteFolder", remoteFolder); + rightListView.DoDragDrop(dataObj, DragDropEffects.Copy); + } + } + } + + private void leftListView_DragEnter(object sender, DragEventArgs e) + { + if (uploadActive || downloadActive || (localFolder == null)) return; + if ((e.Data.GetDataPresent("Type") == true) && ((string)e.Data.GetData("Type") == ("MeshCentralRouterRemoteFiles-" + rndString))) { e.Effect = DragDropEffects.Copy; } + } + + private void leftListView_DragDrop(object sender, DragEventArgs e) + { + if (uploadActive || downloadActive) return; + if ((e.Data.GetDataPresent("Type") == false) || ((string)e.Data.GetData("Type") != ("MeshCentralRouterRemoteFiles-" + rndString))) return; + downloadFileArrayPtr = 0; + downloadFileArray = (ArrayList)e.Data.GetData("RemoteFiles"); + downloadFileSizeArray = (ArrayList)e.Data.GetData("RemoteSizes"); + downloadLocalPath = localFolder; + downloadRemotePath = (string)e.Data.GetData("RemoteFolder"); + downloadActive = true; + downloadStop = false; + downloadNextFile(); + + // Show transfer status dialog + transferStatusForm = new FileTransferStatusForm(this); + transferStatusForm.Show(this); + } + private static string getRandomString(int length) + { + using (var rng = new RNGCryptoServiceProvider()) + { + var bytes = new byte[(((length * 6) + 7) / 8)]; + rng.GetBytes(bytes); + return Convert.ToBase64String(bytes); + } + } } } diff --git a/FileViewer.resx b/FileViewer.resx index 9e2c186..d8c789a 100644 --- a/FileViewer.resx +++ b/FileViewer.resx @@ -672,76 +672,61 @@ 0 - - rightListView - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - rightPanel - - - 0 - - - rightTopPanel - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - rightPanel - - - 1 - - - Fill - - - 363, 3 - - - 324, 442 - - - 1 - - - rightPanel - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - mainTableLayoutPanel - - - 1 - - + Name - + 220 - + Size - + Right - + 80 - + + 640, 17 + + + 117, 22 + + + &Rename + + + 152, 22 + + + &Delete + + + 114, 6 + + + 117, 22 + + + R&efresh + + + 153, 98 + + + remoteContextMenuStrip + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill - + 0, 50 - + 320, 388 @@ -752,7 +737,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC+ - CQAAAk1TRnQBSQFMAgEBAwEAAXABAAFwAQABEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA + CQAAAk1TRnQBSQFMAgEBAwEAAXgBAAF4AQABEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABEAMAAQEBAAEQBgABCDoAATABcwHKAWYBygFmAbUBexIAARABQgEQAUIBEAFCARABQgEQAUIBEAFC ARABQgEQAUIBEAFCARABQgEQAUIBEAFCARABQkYAAcoBZgHKAWYBygFmAcoBZgHKAWYBygFmAcoBZgHK AWYBygFmAcoBZgHKAWYBygFmATABcwYAARABQgHeAXsB3gF7Ad4BewHeAXsB3gF7Ad4BewHeAXsB3gF7 @@ -796,9 +781,81 @@ AgAC/wGAAQcBgAEHAgAC/wGAAQcBgAEPAgAC/wGAAQcBgAEfAgAL - + + 1 + + + rightListView + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + rightPanel + + 0 + + remoteLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + rightTopPanel + + + 5 + + + Top + + + 0, 0 + + + 320, 50 + + + 2 + + + rightTopPanel + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + rightPanel + + + 1 + + + Fill + + + 363, 3 + + + 324, 442 + + + 1 + + + rightPanel + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainTableLayoutPanel + + + 1 + leftListView @@ -811,30 +868,6 @@ 1 - - localLabel - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - leftTopPanel - - - 5 - - - Top - - - 0, 0 - - - 320, 50 - - - 1 - leftTopPanel @@ -901,108 +934,6 @@ <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="panel1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="rightPanel" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="leftPanel" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,50,Absolute,30,Percent,50" /><Rows Styles="Percent,100" /></TableLayoutSettings> - - Name - - - 220 - - - Size - - - Right - - - 80 - - - 640, 17 - - - 118, 54 - - - remoteContextMenuStrip - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 0, 50 - - - 320, 388 - - - 1 - - - rightListView - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - rightPanel - - - 0 - - - 117, 22 - - - &Rename - - - 114, 6 - - - 117, 22 - - - R&efresh - - - remoteLabel - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - rightTopPanel - - - 5 - - - Top - - - 0, 0 - - - 320, 50 - - - 2 - - - rightTopPanel - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - rightPanel - - - 1 - Top, Left, Right @@ -1036,6 +967,81 @@ 5 + + Name + + + 220 + + + Size + + + Right + + + 80 + + + Fill + + + 0, 50 + + + 320, 388 + + + 0 + + + leftListView + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + leftPanel + + + 1 + + + localLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + leftTopPanel + + + 5 + + + Top + + + 0, 0 + + + 320, 50 + + + 1 + + + leftTopPanel + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + leftPanel + + + 2 + Top, Left, Right @@ -1584,6 +1590,12 @@ System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + deleteToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + FileViewer