Horizon – Blame information for rev 15
?pathlinks?
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 | } |