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