From fb01ceac2a8d5828c262200cdb428e0cf33e8b6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Tue, 2 Oct 2018 01:52:25 +0300 Subject: [PATCH] =?UTF-8?q?handleSearchBtn=5FClick,=20fillChildNode,=20bui?= =?UTF-8?q?ldResultTree=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20async.=20?= =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=20TaskController=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=82=D0=B5=D0=BA=D1=83=D1=89=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B5=D0=B9.=20=D0=A0=D0=B5?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=20ProgressRepo?= =?UTF-8?q?rtModel=20=D0=B4=D0=BB=D1=8F=20IProgress=20=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D1=83=D1=8E=D1=89=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8=D0=B7?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B0=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D1=83.=20fillChildNode=20=D0=BE=D0=B1=D0=BB?= =?UTF-8?q?=D0=B0=D0=B3=D0=BE=D1=80=D0=BE=D0=B6=D0=B5=D0=BD,=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B6?= =?UTF-8?q?=D0=B8=D0=B2=D1=88=D0=B0=D1=8F=20=D0=B2=20=D0=BD=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fileFinder/MainForm.cs | 88 +++++++++++++++++++++---------- fileFinder/ProgressReportModel.cs | 14 +++++ fileFinder/TaskController.cs | 51 ++++++++++++++++++ fileFinder/fileFinder.csproj | 2 + 4 files changed, 127 insertions(+), 28 deletions(-) create mode 100644 fileFinder/ProgressReportModel.cs create mode 100644 fileFinder/TaskController.cs diff --git a/fileFinder/MainForm.cs b/fileFinder/MainForm.cs index 99153b2..2059a63 100644 --- a/fileFinder/MainForm.cs +++ b/fileFinder/MainForm.cs @@ -8,11 +8,15 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; +using System.Threading; namespace fileFinder { public partial class MainForm : Form { + bool hintHided = false; + TaskController mainController = new TaskController(); + public MainForm() { InitializeComponent(); @@ -43,7 +47,6 @@ namespace fileFinder } } - bool hintHided = false; private void curDirTextBox_Enter(object sender, EventArgs e) { if (!hintHided) @@ -52,48 +55,77 @@ namespace fileFinder curDirTextBox.Text = ""; } } - - private void handleSearchBtn_Click(object sender, EventArgs e) + + private async Task buildResultTree(TaskController controller, IProgress report) { - resultViewer.Nodes.Clear(); - List foundFiles = new List(); TreeNode itemsNode = new TreeNode(); + List foundFiles = new List(); + ProgressReportModel _report = new ProgressReportModel(); try { foundFiles = Directory.GetFiles(curDirTextBox.Text, queryTextBox.Text, SearchOption.AllDirectories).ToList(); - } catch { } + } + catch (Exception ex) + { + var dialog = new ThreadExceptionDialog(ex); + dialog.ShowDialog(); + } + int counter = 0; foreach (String item in foundFiles) - fillChildNode(itemsNode, item.Replace(curDirTextBox.Text, "")); + { + while (controller.isPaused) + Thread.Sleep(100); + await fillChildNode(itemsNode, item.Replace(curDirTextBox.Text, "")); + _report.progress = counter; + _report.currentFileUrl = item; + report.Report(_report); + } + controller.stopTask(); + return itemsNode; + } - resultViewer.Nodes.Add(itemsNode); + private void reportProgress(object sender, ProgressReportModel report) + { + infoLabel.Text = report.currentFileUrl; } - public void fillChildNode (TreeNode node, String item) + private async void handleSearchBtn_Click(object sender, EventArgs e) + { + Progress progress = new Progress(); + progress.ProgressChanged += reportProgress; + TreeNode tN = await Task.Run(() => buildResultTree(mainController, progress)); + resultViewer.Nodes.Clear(); + resultViewer.Nodes.Add(tN); + } + + public async Task fillChildNode (TreeNode node, String item) { int backSlashIndex = item.IndexOf("\\"); - if (backSlashIndex > -1) + switch (backSlashIndex) { - if (backSlashIndex == 0) - { + case -1: + node.Nodes.Add(item, item, 2, 2); + break; + case 0: item = item.Remove(0, 1); - backSlashIndex = item.IndexOf("\\"); - } - String currentNodeName = item.Substring(0, backSlashIndex); - int nodeIndex = node.Nodes.IndexOfKey(currentNodeName); - if (nodeIndex != -1) - fillChildNode(node.Nodes[nodeIndex], item.Remove(0, backSlashIndex + 1)); - else - { - node.Nodes.Add(currentNodeName, currentNodeName, 0, 0); - nodeIndex = node.Nodes.IndexOfKey(currentNodeName); - fillChildNode(node.Nodes[nodeIndex], item.Remove(0, backSlashIndex + 1)); - } - } else - node.Nodes.Add(item, item, 2, 2); - } - + await fillChildNode(node, item); + break; + default: + String currentNodeName = item.Substring(0, backSlashIndex); + int nodeIndex = node.Nodes.IndexOfKey(currentNodeName); + if (nodeIndex != -1) + await fillChildNode(node.Nodes[nodeIndex], item.Remove(0, backSlashIndex + 1)); + else + { + node.Nodes.Add(currentNodeName, currentNodeName, 0, 0); + nodeIndex = node.Nodes.IndexOfKey(currentNodeName); + await fillChildNode(node.Nodes[nodeIndex], item.Remove(0, backSlashIndex + 1)); + } + break; + } + } } } diff --git a/fileFinder/ProgressReportModel.cs b/fileFinder/ProgressReportModel.cs new file mode 100644 index 0000000..9ec8b16 --- /dev/null +++ b/fileFinder/ProgressReportModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace fileFinder +{ + class ProgressReportModel + { + public int progress { get; set; } + public string currentFileUrl { get; set; } + } +} diff --git a/fileFinder/TaskController.cs b/fileFinder/TaskController.cs new file mode 100644 index 0000000..09588c6 --- /dev/null +++ b/fileFinder/TaskController.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace fileFinder +{ + class TaskController + { + public bool isPaused { get; private set; } + public bool isFinished { get; private set; } + + public TaskController () + { + isPaused = false; + isFinished = false; + } + + public bool pauseTask() + { + if (!isPaused && !isFinished) + { + isPaused = true; + return true; + } else + return false; + } + + public bool resumeTask () + { + if (isPaused && !isFinished) + { + isPaused = false; + return true; + } else + return false; + } + + public bool stopTask () + { + if (!isFinished) + { + isFinished = true; + return true; + } else + return false; + } + + } +} diff --git a/fileFinder/fileFinder.csproj b/fileFinder/fileFinder.csproj index 91c32c1..5919035 100644 --- a/fileFinder/fileFinder.csproj +++ b/fileFinder/fileFinder.csproj @@ -52,7 +52,9 @@ MainForm.cs + + MainForm.cs