using NLog;\r
\r
namespace Maestro.Sources {\r
+ public delegate void ClearAndInitialize();\r
+\r
class FileSystemSource : BindingList<FileSourceItem>, ISource {\r
private readonly Logger logger = LogManager.GetCurrentClassLogger();\r
private IMessageBus messageBus;\r
private List<FileSourceItem> cache = new List<FileSourceItem>();\r
private BackgroundWorker pathWatcherWorker = new BackgroundWorker();\r
private string path;\r
+ private bool initialized;\r
+ private ClearAndInitialize clearAndInitialize;\r
+ private Action<DateTime, string, Color> errorReporter;\r
\r
public DataGridViewColumn[] Columns {\r
get {\r
\r
public bool SupportsFiltering => true;\r
\r
- public FileSystemSource(Control parent, IMessageBus messageBus, String fileExtensionFilter) {\r
+ public FileSystemSource(Control parent, IMessageBus messageBus, String fileExtensionFilter, Action<DateTime, string, Color> errorReporter) {\r
this.parent = parent;\r
this.messageBus = messageBus;\r
this.fileExtensionFilter = fileExtensionFilter;\r
SetAcceptableExtensions();\r
pathWatcherWorker.DoWork += pathWatcherWorker_watchPath;\r
- pathWatcherWorker.ProgressChanged += pathWatcherWorker_progressChanged;\r
pathWatcherWorker.WorkerReportsProgress = true;\r
- }\r
-\r
- private void pathWatcherWorker_progressChanged(object sender, ProgressChangedEventArgs e) {\r
- InnerStartUp();\r
+ this.errorReporter = errorReporter;\r
}\r
\r
private void pathWatcherWorker_watchPath(object sender, DoWorkEventArgs e) {\r
- while (!(Directory.Exists(path))) {\r
- \r
+ while (true) {\r
+ if (!(Directory.Exists(path))) {\r
+ if (initialized) {\r
+ WatchedDirDeleted();\r
+ }\r
+ } else {\r
+ if (!initialized)\r
+ InnerStartUp();\r
+ }\r
}\r
- pathWatcherWorker.ReportProgress(0);\r
\r
}\r
\r
+ private void WatchedDirDeleted() {\r
+ //errorReporter?.Invoke(DateTime.Now, String.Format("[FileSystemSource] {0} path can't be found.", path), Color.Red);\r
+ clearAndInitialize = new ClearAndInitialize(ClearDataGridView);\r
+ clearAndInitialize?.Invoke();\r
+ }\r
+\r
+ private void ClearDataGridView() {\r
+ this.parent.SafeCall(() => {\r
+ Clear();\r
+ }\r
+ );\r
+ cache.Clear();\r
+ initialized = false;\r
+ //todo errorreport küldése\r
+ }\r
+\r
private void SetAcceptableExtensions() {\r
if (fileExtensionFilter != null)\r
acceptableExtensions = fileExtensionFilter.Split(',')?.ToList();\r
public void Startup(Uri address) {\r
string path = address.LocalPath;\r
this.path = path;\r
- if (Directory.Exists(path)) {\r
- InnerStartUp();\r
- } else pathWatcherWorker.RunWorkerAsync();\r
+ clearAndInitialize = ClearDataGridView;\r
+ //if (Directory.Exists(path))\r
+ // InnerStartUp();\r
+ pathWatcherWorker.RunWorkerAsync();\r
}\r
\r
private void InnerStartUp() {\r
createWatch(path);\r
Task.Run(() => initializeList(path));\r
+ initialized = true;\r
}\r
\r
\r
watcher.Created += new FileSystemEventHandler(OnCreated);\r
watcher.Deleted += new FileSystemEventHandler(OnDeleted);\r
watcher.Renamed += new RenamedEventHandler(OnRenamed);\r
- //watcher.Disposed += new EventHandler(OnDispose);\r
+ watcher.Error += new ErrorEventHandler(OnError);\r
watcher.EnableRaisingEvents = true;\r
}\r
\r
- public void OnDispose(object sender, RenamedEventArgs e) {\r
-\r
+ public void OnError(object sender, ErrorEventArgs e) {\r
+ logger.Debug(e.GetException().Message);\r
}\r
\r
- public void OnRenamed(object sender, RenamedEventArgs e) {\r
+ public void OnRenamed(object sender, RenamedEventArgs e) {\r
logger.Debug("{0} {1} {2}", e.ChangeType, e.OldName, e.Name);\r
var item = this.Where(x => x.Name == e.OldName).SingleOrDefault();\r
if (item == null)\r