PageRenderTime 37ms CodeModel.GetById 8ms RepoModel.GetById 1ms app.codeStats 0ms

/src/MarkPad/DocumentSources/FileSystem/JekyllSiteContext.cs

https://github.com/bcott/DownmarkerWPF
C# | 141 lines | 123 code | 18 blank | 0 comment | 6 complexity | 18db4535d224446a31f28f65efe40c6f MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using Caliburn.Micro;
  7. using MarkPad.Events;
  8. using MarkPad.Infrastructure;
  9. using MarkPad.Infrastructure.Abstractions;
  10. using MarkPad.Infrastructure.DialogService;
  11. using MarkPad.Plugins;
  12. namespace MarkPad.DocumentSources.FileSystem
  13. {
  14. public class JekyllSiteContext : PropertyChangedBase, ISiteContext, IHandle<FileDeletedEvent>, IDisposable
  15. {
  16. readonly string siteBasePath;
  17. readonly IEventAggregator eventAggregator;
  18. readonly IDialogService dialogService;
  19. readonly IFileSystemWatcher fileSystemWatcher;
  20. readonly IFileSystem fileSystem;
  21. ObservableCollection<ISiteItem> items;
  22. public JekyllSiteContext(
  23. IEventAggregator eventAggregator,
  24. IDialogService dialogService,
  25. IFileSystem fileSystem,
  26. IFileSystemWatcherFactory fileSystemWatcherFactory,
  27. string siteBasePath)
  28. {
  29. this.siteBasePath = siteBasePath;
  30. this.fileSystem = fileSystem;
  31. this.dialogService = dialogService;
  32. this.eventAggregator = eventAggregator;
  33. fileSystemWatcher = fileSystemWatcherFactory.Create(siteBasePath);
  34. fileSystemWatcher.IncludeSubdirectories = true;
  35. fileSystemWatcher.Created += FileSystemWatcherOnCreated;
  36. fileSystemWatcher.Changed += FileSystemWatcherOnChanged;
  37. fileSystemWatcher.Renamed += FileSystemWatcherOnRenamed;
  38. fileSystemWatcher.Deleted += FileSystemWatcherOnDeleted;
  39. fileSystemWatcher.EnableRaisingEvents = true;
  40. }
  41. void FileSystemWatcherOnDeleted(object sender, FileSystemEventArgs fileSystemEventArgs)
  42. {
  43. Debug.Write(string.Format("Deleted: {0} [{1}] (CT={2})",
  44. fileSystemEventArgs.Name,
  45. fileSystemEventArgs.FullPath,
  46. fileSystemEventArgs.ChangeType));
  47. eventAggregator.Publish(new FileDeletedEvent(fileSystemEventArgs.FullPath));
  48. }
  49. void FileSystemWatcherOnRenamed(object sender, RenamedEventArgs renamedEventArgs)
  50. {
  51. Debug.Write(string.Format("Renamed: {0} [{1}] from {2} [{3}]",
  52. renamedEventArgs.Name,
  53. renamedEventArgs.FullPath,
  54. renamedEventArgs.OldName,
  55. renamedEventArgs.OldFullPath));
  56. eventAggregator.Publish(new FileRenamedEvent(renamedEventArgs.OldFullPath, renamedEventArgs.FullPath));
  57. }
  58. void FileSystemWatcherOnChanged(object sender, FileSystemEventArgs fileSystemEventArgs)
  59. {
  60. Debug.Write(string.Format("Changed: {0} [{1}] (CT={2})",
  61. fileSystemEventArgs.Name,
  62. fileSystemEventArgs.FullPath,
  63. fileSystemEventArgs.ChangeType));
  64. }
  65. void FileSystemWatcherOnCreated(object sender, FileSystemEventArgs fileSystemEventArgs)
  66. {
  67. Debug.Write(string.Format("Created: {0} [{1}] (CT={2})",
  68. fileSystemEventArgs.Name,
  69. fileSystemEventArgs.FullPath,
  70. fileSystemEventArgs.ChangeType));
  71. eventAggregator.Publish(new FileCreatedEvent(fileSystemEventArgs.FullPath));
  72. }
  73. public ObservableCollection<ISiteItem> Items
  74. {
  75. get { return items ?? (items = new FileSystemSiteItem(eventAggregator, fileSystem, SiteBasePath).Children); }
  76. }
  77. public bool IsLoading { get { return false; } }
  78. public string SiteBasePath
  79. {
  80. get { return siteBasePath; }
  81. }
  82. public void OpenItem(ISiteItem selectedItem)
  83. {
  84. var fileItem = selectedItem as FileSystemSiteItem;
  85. if (fileItem == null || !File.Exists(fileItem.Path)) return;
  86. if (Constants.DefaultExtensions.Contains(Path.GetExtension(fileItem.Path).ToLower()))
  87. {
  88. eventAggregator.Publish(new FileOpenEvent(fileItem.Path));
  89. }
  90. else
  91. {
  92. try
  93. {
  94. Process.Start(fileItem.Path);
  95. }
  96. catch (Exception ex)
  97. {
  98. dialogService.ShowError("Failed to open file", "Cannot open {0}", ex.Message);
  99. }
  100. }
  101. }
  102. public string WorkingDirectory { get { return siteBasePath; } }
  103. public void Dispose()
  104. {
  105. fileSystemWatcher.Dispose();
  106. foreach (var item in Items)
  107. {
  108. item.Dispose();
  109. }
  110. }
  111. public void Handle(FileDeletedEvent message)
  112. {
  113. foreach (var siteItemBase in Items.OfType<FileSystemSiteItem>())
  114. {
  115. if (siteItemBase.Path == message.FileName)
  116. {
  117. Items.Remove(siteItemBase);
  118. break;
  119. }
  120. }
  121. }
  122. }
  123. }