Horizon – Blame information for rev 7

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Drawing;
5 using System.IO;
6 using System.Linq;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10 using Horizon.Utilities;
11 using Microsoft.WindowsAPICodePack.Dialogs;
12 using TrackedFolders;
13  
14 namespace Horizon
15 {
16 public partial class ManageFoldersForm : Form
17 {
18 #region Private Delegates, Events, Enums, Properties, Indexers and Fields
19  
20 private readonly MainForm _mainForm;
21  
22 private readonly CancellationTokenSource _localCancellationTokenSource;
23  
24 private readonly CancellationToken _localCancellationToken;
25  
26 private readonly CancellationTokenSource _cancellationTokenSource;
27  
28 private readonly CancellationToken _cancellationToken;
29  
30 #endregion
31  
32 #region Constructors, Destructors and Finalizers
33  
34 public ManageFoldersForm()
35 {
36 InitializeComponent();
37 Utilities.WindowState.FormTracker.Track(this);
38  
39 _localCancellationTokenSource = new CancellationTokenSource();
40 _localCancellationToken = _localCancellationTokenSource.Token;
41  
42 dataGridView1.Columns["DelayColumn"].ValueType = typeof(int);
43 }
44  
45 public ManageFoldersForm(MainForm mainForm, CancellationToken cancellationToken) : this()
46 {
47 _mainForm = mainForm;
48  
49 _cancellationTokenSource =
50 CancellationTokenSource.CreateLinkedTokenSource(_localCancellationToken, cancellationToken);
51 _cancellationToken = _cancellationTokenSource.Token;
52 }
53  
54 /// <summary>
55 /// Clean up any resources being used.
56 /// </summary>
57 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
58 protected override void Dispose(bool disposing)
59 {
60 if (disposing && components != null)
61 {
62 components.Dispose();
63 }
64  
65 _localCancellationTokenSource.Cancel();
66  
67 base.Dispose(disposing);
68 }
69  
70 #endregion
71  
72 #region Event Handlers
73  
74 private async void RecursiveToolStripMenuItem_Click(object sender, EventArgs e)
75 {
76 foreach (var row in dataGridView1.SelectedRows.OfType<DataGridViewRow>())
77 {
78 var path = (string)row.Cells["PathColumn"].Value;
79  
80 await _mainForm.TakeSnapshotRecursive(path);
81 }
82 }
83  
84 private async void SelectedDirectoryToolStripMenuItem_Click(object sender, EventArgs e)
85 {
86 foreach (var row in dataGridView1.SelectedRows.OfType<DataGridViewRow>())
87 {
88 var path = (string)row.Cells["PathColumn"].Value;
89  
90 await _mainForm.TakeSnapshot(path);
91 }
92 }
93  
94 private void Button1_Click(object sender, EventArgs e)
95 {
96 var commonOpenFileDialog = new CommonOpenFileDialog
97 {
98 Multiselect = true,
99 IsFolderPicker = true
100 };
101  
102 if (commonOpenFileDialog.ShowDialog() == CommonFileDialogResult.Ok)
103 {
104 _mainForm.Configuration.LastFolder = commonOpenFileDialog.FileNames.FirstOrDefault();
105 _mainForm.ChangedConfigurationContinuation.Schedule(TimeSpan.FromSeconds(1),
106 async () => await _mainForm.SaveConfiguration(), _cancellationToken);
107  
108 foreach (var name in commonOpenFileDialog.FileNames)
109 {
110 if (!Directory.Exists(name))
111 {
112 continue;
113 }
114  
115 var exists = false;
116 foreach (var folder in _mainForm.TrackedFolders.Folder)
117 {
118 if (folder.Path.IsPathEqual(name))
119 {
120 exists = true;
121 }
122  
123 if (folder.Path.IsSubPathOf(name))
124 {
125 if (folder.Recursive)
126 {
127 exists = true;
128 }
129 }
130 }
131  
132 if (!exists)
133 {
134 dataGridView1.InvokeIfRequired(async dataGridView =>
135 {
136 var folder = new Folder(commonOpenFileDialog.FileName, true);
137  
138 var index = dataGridView.Rows.Add();
139  
140 var enableCheckBox =
141 (DataGridViewCheckBoxCell)dataGridView.Rows[index].Cells["EnableColumn"];
142  
143 enableCheckBox.Value = true;
144  
145 dataGridView.Rows[index].Cells["PathColumn"].Value = commonOpenFileDialog.FileName;
146 dataGridView.Rows[index].Cells["DelayColumn"].Value = folder.Delay;
147  
148 _mainForm.TrackedFolders.Folder.Add(folder);
149  
150 await _mainForm.SaveFolders();
151 });
152 }
153 }
154 }
155 }
156  
157 private async void Button2_Click(object sender, EventArgs e)
158 {
159 var removeRows = new List<DataGridViewRow>();
160 foreach (var row in dataGridView1.SelectedRows.OfType<DataGridViewRow>())
161 {
162 var path = (string)row.Cells["PathColumn"].Value;
163 var removeFolders = new List<Folder>();
164 foreach (var folder in _mainForm.TrackedFolders.Folder)
165 {
166 if (path == folder.Path)
167 {
168 removeFolders.Add(folder);
169 }
170 }
171  
172 foreach (var folder in removeFolders)
173 {
174 _mainForm.TrackedFolders.Folder.Remove(folder);
175 }
176  
177 removeRows.Add(row);
178 }
179  
180 await _mainForm.SaveFolders();
181  
182 foreach (var row in removeRows)
183 {
184 dataGridView1.Rows.Remove(row);
185 }
186 }
187  
188 private void ManageFoldersForm_Load(object sender, EventArgs e)
189 {
190 dataGridView1.CellValueChanged -= DataGridView1_CellValueChanged;
191 try
192 {
193 foreach (var folder in _mainForm.TrackedFolders.Folder)
194 {
195 var index = dataGridView1.Rows.Add();
196  
197 var enableCheckBox =
198 (DataGridViewCheckBoxCell)dataGridView1.Rows[index].Cells["EnableColumn"];
199  
200 enableCheckBox.Value = Directory.Exists(folder.Path);
201  
202 dataGridView1.Rows[index].Cells["PathColumn"].Value = folder.Path;
203  
204 var recursiveCheckBox =
205 (DataGridViewCheckBoxCell)dataGridView1.Rows[index].Cells["RecursiveColumn"];
206  
207 recursiveCheckBox.Value = folder.Recursive;
208  
209 dataGridView1.Rows[index].Cells["DelayColumn"].Value = folder.Delay;
210  
211 if (folder.Color.ToArgb() != 0)
212 {
213 dataGridView1.Rows[index].DefaultCellStyle.BackColor = folder.Color;
214 }
215 }
216 }
217 finally
218 {
219 dataGridView1.CellValueChanged += DataGridView1_CellValueChanged;
220 }
221  
222 dataGridView1.Sort(dataGridView1.Columns["PathColumn"], ListSortDirection.Descending);
223 }
224  
225 private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
226 {
227 var dataGridView = (DataGridView)sender;
228  
229 if (dataGridView.CurrentCell is DataGridViewCheckBoxCell)
230 {
231 dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
232 }
233 }
234  
235 private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
236 {
237 var dataGridView = (DataGridView)sender;
238  
239 dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
240 }
241  
242 private async void DataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
243 {
244 var dataGridView = (DataGridView)sender;
245  
246 var row = dataGridView.SelectedRows.OfType<DataGridViewRow>().FirstOrDefault();
247 if (row == null)
248 {
249 return;
250 }
251  
252 var directory = (string)row.Cells["PathColumn"].Value;
253  
254 var commonOpenFileDialog = new CommonOpenFileDialog
255 {
256 Multiselect = true,
257 IsFolderPicker = true,
258 DefaultDirectory = directory
259 };
260  
261 if (commonOpenFileDialog.ShowDialog() == CommonFileDialogResult.Ok)
262 {
263 foreach (var name in commonOpenFileDialog.FileNames)
264 {
265 _mainForm.Configuration.LastFolder = name;
266 _mainForm.ChangedConfigurationContinuation.Schedule(TimeSpan.FromSeconds(1),
267 async () => await _mainForm.SaveConfiguration(), _cancellationToken);
268  
269 if (!Directory.Exists(name))
270 {
271 continue;
272 }
273  
274 var exists = false;
275 Folder processFolder = null;
276 foreach (var folder in _mainForm.TrackedFolders.Folder)
277 {
278 if (folder.Path == directory)
279 {
280 processFolder = folder;
281 }
282  
283 if (folder.Path.IsPathEqual(name))
284 {
285 exists = true;
286 continue;
287 }
288  
289 if (folder.Path.IsSubPathOf(name))
290 {
291 if (folder.Recursive)
292 {
293 exists = true;
294 }
295 }
296 }
297  
298 if (!exists)
299 {
300 if (processFolder != null)
301 {
302 _mainForm.TrackedFolders.Folder.Remove(processFolder);
303 row.Cells["PathColumn"].Value = name;
304 processFolder.Path = name;
305 _mainForm.TrackedFolders.Folder.Add(processFolder);
306  
307 await _mainForm.SaveFolders();
308 }
309 }
310 }
311 }
312 }
313  
314 private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
315 {
316 var dataGridView = (DataGridView)sender;
317  
318 if (dataGridView.CurrentCell is DataGridViewCheckBoxCell)
319 {
320 if (dataGridView.CurrentCell.IsInEditMode)
321 {
322 if (dataGridView.IsCurrentCellDirty)
323 {
324 dataGridView.EndEdit();
325 }
326 }
327 }
328 }
329  
330 private async void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
331 {
332 var dataGridView = (DataGridView)sender;
333  
334 if (e.RowIndex == -1 || e.ColumnIndex == -1)
335 {
336 return;
337 }
338  
339 switch (dataGridView.Columns[e.ColumnIndex].Name)
340 {
341 case "DelayColumn":
342 ProcessDelay(dataGridView.Rows[e.RowIndex]);
343 break;
344 case "RecursiveColumn":
345 await ProcessRecursive(dataGridView.Rows[e.RowIndex]);
346  
347 break;
348 case "EnableColumn":
349 await ProcessEnable(dataGridView.Rows[e.RowIndex]);
350 break;
351 }
352 }
353  
354 private void DataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
355 {
356 var dataGridView = (DataGridView)sender;
357  
358 if (e.RowIndex == -1 || e.ColumnIndex == -1 ||
359 !(dataGridView.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn))
360 {
361 return;
362 }
363  
364 dataGridView.EndEdit();
365 }
366  
367 private void DataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
368 {
369 var dataGridView = (DataGridView)sender;
370  
371 if (e.RowIndex == -1 || e.ColumnIndex == -1 ||
372 !(dataGridView.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn))
373 {
374 return;
375 }
376  
377 dataGridView.EndEdit();
378 }
379  
380 private async void DataGridView1_DragDrop(object sender, DragEventArgs e)
381 {
382 var dataGridView = (DataGridView)sender;
383  
384 if (!e.Data.GetDataPresent(DataFormats.FileDrop))
385 {
386 return;
387 }
388  
389 var files = (string[])e.Data.GetData(DataFormats.FileDrop);
390  
391 foreach (var name in files)
392 {
393 // Only accept directories.
394 if (!Directory.Exists(name))
395 {
396 continue;
397 }
398  
399 var exists = false;
400 foreach (var folder in _mainForm.TrackedFolders.Folder)
401 {
402 if (folder.Path.IsPathEqual(name))
403 {
404 exists = true;
405 }
406  
407 if (folder.Path.IsSubPathOf(name))
408 {
409 if (folder.Recursive)
410 {
411 exists = true;
412 }
413 }
414 }
415  
416 if (!exists)
417 {
418 var folder = new Folder(name, true);
419  
420 var index = dataGridView.Rows.Add();
421  
422 var enableCheckBox =
423 (DataGridViewCheckBoxCell)dataGridView.Rows[index].Cells["EnableColumn"];
424  
425 enableCheckBox.Value = true;
426  
427 dataGridView.Rows[index].Cells["PathColumn"].Value = name;
428 dataGridView.Rows[index].Cells["DelayColumn"].Value = folder.Delay;
429 _mainForm.TrackedFolders.Folder.Add(folder);
430  
431 await _mainForm.SaveFolders();
432 }
433 }
434 }
435  
436 private void DataGridView1_DragEnter(object sender, DragEventArgs e)
437 {
438 if (e.Data.GetDataPresent(DataFormats.FileDrop))
439 {
440 e.Effect = DragDropEffects.Copy;
441 return;
442 }
443  
444 e.Effect = DragDropEffects.None;
445 }
446  
447 private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
448 {
449 // Do not allow errors.
450 }
451  
452 private async void ColorToolStripMenuItem_Click(object sender, EventArgs e)
453 {
454 var toolStripMenuItem = (ToolStripMenuItem)sender;
455 var color = toolStripMenuItem.BackColor;
456  
457 foreach (var row in dataGridView1.SelectedRows.OfType<DataGridViewRow>())
458 {
459 var path = (string)row.Cells["PathColumn"].Value;
460 var processFolders = new List<Folder>();
461 foreach (var folder in _mainForm.TrackedFolders.Folder)
462 {
463 if (path == folder.Path)
464 {
465 processFolders.Add(folder);
466 }
467 }
468  
469 foreach (var folder in processFolders)
470 {
471 _mainForm.TrackedFolders.Folder.Remove(folder);
472 }
473  
474 foreach (var folder in processFolders)
475 {
476 row.DefaultCellStyle.BackColor = color;
477 folder.Color = color;
478  
479 _mainForm.TrackedFolders.Folder.Add(folder);
480  
481 await _mainForm.SaveFolders();
482 }
483 }
484 }
485  
486 private async void NoneToolStripMenuItem_Click(object sender, EventArgs e)
487 {
488 foreach (var row in dataGridView1.SelectedRows.OfType<DataGridViewRow>())
489 {
490 var path = (string)row.Cells["PathColumn"].Value;
491 var processFolders = new List<Folder>();
492 foreach (var folder in _mainForm.TrackedFolders.Folder)
493 {
494 if (path == folder.Path)
495 {
496 processFolders.Add(folder);
497 }
498 }
499  
500 foreach (var folder in processFolders)
501 {
502 _mainForm.TrackedFolders.Folder.Remove(folder);
503 }
504  
505 foreach (var folder in processFolders)
506 {
507 row.DefaultCellStyle.BackColor = Color.Empty;
508 folder.Color = Color.Empty;
509  
510 _mainForm.TrackedFolders.Folder.Add(folder);
511  
512 await _mainForm.SaveFolders();
513 }
514 }
515 }
516  
517 #endregion
518  
519 #region Private Methods
520  
521 private async void ProcessDelay(DataGridViewRow row)
522 {
523 var path = (string)row.Cells["PathColumn"].Value;
524 var delay = (int)row.Cells["DelayColumn"].Value;
525  
526 var modifyFolders = new List<Folder>();
527 foreach (var folder in _mainForm.TrackedFolders.Folder)
528 {
529 if (path == folder.Path)
530 {
531 modifyFolders.Add(folder);
532 }
533 }
534  
535 foreach (var folder in modifyFolders)
536 {
537 _mainForm.TrackedFolders.Folder.Remove(folder);
538 }
539  
540 foreach (var folder in modifyFolders)
541 {
542 folder.Delay = delay;
543  
544 _mainForm.TrackedFolders.Folder.Add(folder);
545  
546 await _mainForm.SaveFolders();
547 }
548 }
549  
550 private async Task ProcessEnable(DataGridViewRow row)
551 {
552 var enableCheckBoxCell =
553 (DataGridViewCheckBoxCell)row.Cells["EnableColumn"];
554  
555 var path = (string)row.Cells["PathColumn"].Value;
556 var processFolders = new List<Folder>();
557 foreach (var folder in _mainForm.TrackedFolders.Folder)
558 {
559 if (path == folder.Path)
560 {
561 processFolders.Add(folder);
562 }
563 }
564  
565 foreach (var folder in processFolders)
566 {
567 _mainForm.TrackedFolders.Folder.Remove(folder);
568 }
569  
570 foreach (var folder in processFolders)
571 {
572 folder.Enable = (bool)enableCheckBoxCell.Value;
573  
574 _mainForm.TrackedFolders.Folder.Add(folder);
575  
576 await _mainForm.SaveFolders();
577 }
578 }
579  
580 private async Task ProcessRecursive(DataGridViewRow row)
581 {
582 var recursiveCheckBoxCell =
583 (DataGridViewCheckBoxCell)row.Cells["RecursiveColumn"];
584  
585 var path = (string)row.Cells["PathColumn"].Value;
586 var processFolders = new List<Folder>();
587 foreach (var folder in _mainForm.TrackedFolders.Folder)
588 {
589 if (path == folder.Path)
590 {
591 processFolders.Add(folder);
592 }
593 }
594  
595 // Check that any folder is not included in the already existing list of folders.
596 var removeProcess = new List<Folder>();
597 foreach (var processFolder in processFolders)
598 {
599 foreach (var folder in _mainForm.TrackedFolders.Folder)
600 {
601 if (!folder.Path.IsPathEqual(processFolder.Path) &&
602 folder.Path.IsSubPathOf(processFolder.Path))
603 {
604 removeProcess.Add(processFolder);
605 }
606 }
607 }
608  
609 foreach (var folder in removeProcess)
610 {
611 processFolders.Remove(folder);
612 }
613  
614 // In case all folders are contained within other folder paths revert the checkmark.
615 if (processFolders.Count == 0)
616 {
617 dataGridView1.CellValueChanged -= DataGridView1_CellValueChanged;
618 try
619 {
620 recursiveCheckBoxCell.Value = !(bool)recursiveCheckBoxCell.Value;
621 }
622 finally
623 {
624 dataGridView1.CellValueChanged += DataGridView1_CellValueChanged;
625 }
626  
627 return;
628 }
629  
630 foreach (var folder in processFolders)
631 {
632 _mainForm.TrackedFolders.Folder.Remove(folder);
633 }
634  
635 foreach (var folder in processFolders)
636 {
637 folder.Recursive = (bool)recursiveCheckBoxCell.Value;
638 _mainForm.TrackedFolders.Folder.Add(folder);
639  
640 await _mainForm.SaveFolders();
641 }
642 }
643  
644 #endregion
645 }
646 }