Horizon – Blame information for rev 8

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