Horizon – Blame information for rev 15

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