PageRenderTime 41ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/src/MarkPad/DocumentSources/FileSystem/FileSystemSiteItem.cs

https://github.com/bcott/DownmarkerWPF
C# | 127 lines | 110 code | 11 blank | 6 comment | 4 complexity | fed0754e283772a8639597538c671c96 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.IO;
  4. using System.Linq;
  5. using Caliburn.Micro;
  6. using MarkPad.Events;
  7. using MarkPad.Infrastructure;
  8. using MarkPad.Plugins;
  9. namespace MarkPad.DocumentSources.FileSystem
  10. {
  11. public class FileSystemSiteItem : SiteItemBase, IHandle<FileRenamedEvent>, IHandle<FileCreatedEvent>, IHandle<FileDeletedEvent>
  12. {
  13. readonly IFileSystem fileSystem;
  14. string originalFileName;
  15. public FileSystemSiteItem(IEventAggregator eventAggregator, IFileSystem fileSystem, string filePath) :
  16. base(eventAggregator)
  17. {
  18. this.fileSystem = fileSystem;
  19. Path = filePath;
  20. originalFileName = System.IO.Path.GetFileName(filePath);
  21. Name = originalFileName;
  22. if (fileSystem.File.Exists(filePath))
  23. Children = new ObservableCollection<ISiteItem>();
  24. else
  25. {
  26. try
  27. {
  28. var siteItems = fileSystem.Directory.GetDirectories(filePath)
  29. .Select(d => new FileSystemSiteItem(eventAggregator, fileSystem, d))
  30. .OrderBy(i => i.Name)
  31. .Concat(fileSystem.Directory.GetFiles(filePath)
  32. //TODO Restrict to markdown files only?
  33. .Select(
  34. d =>
  35. new FileSystemSiteItem(eventAggregator, fileSystem,
  36. d))
  37. .OrderBy(i => i.Name));
  38. Children = new ObservableCollection<ISiteItem>(siteItems);
  39. }
  40. catch (IOException)
  41. {
  42. Children = new ObservableCollection<ISiteItem>();
  43. }
  44. }
  45. }
  46. public string Path { get; private set; }
  47. public override void CommitRename()
  48. {
  49. var fileDir = System.IO.Path.GetDirectoryName(Path);
  50. var newFileName = System.IO.Path.Combine(fileDir, Name);
  51. try
  52. {
  53. fileSystem.File.Move(Path, newFileName);
  54. }
  55. catch (IOException)
  56. {
  57. Name = originalFileName;
  58. //TODO show error
  59. }
  60. IsRenaming = false;
  61. }
  62. public override void UndoRename()
  63. {
  64. Name = originalFileName;
  65. IsRenaming = false;
  66. }
  67. public override void Delete()
  68. {
  69. fileSystem.File.Delete(Path);
  70. }
  71. public void Handle(FileRenamedEvent message)
  72. {
  73. if (Path == message.OriginalFileName)
  74. {
  75. Path = message.NewFileName;
  76. Name = System.IO.Path.GetFileName(Path);
  77. originalFileName = Name;
  78. }
  79. }
  80. public void Handle(FileCreatedEvent message)
  81. {
  82. //ignore changes to files in .git repository
  83. //seems to happen if you are running github 4 windows and
  84. //looking at a repository while you edit a file from
  85. //that repository in markpad
  86. if(message.FullPath.Contains(".git\\") ||
  87. message.FullPath.Contains(".git/"))
  88. {
  89. return;
  90. }
  91. if (Path == System.IO.Path.GetDirectoryName(message.FullPath))
  92. {
  93. var newItem = new FileSystemSiteItem(EventAggregator, fileSystem, message.FullPath);
  94. for (int i = 0; i < Children.Count; i++)
  95. {
  96. if (String.Compare(Children[i].Name, newItem.Name, StringComparison.Ordinal) < 0) continue;
  97. Children.Insert(i, newItem);
  98. break;
  99. }
  100. }
  101. }
  102. public void Handle(FileDeletedEvent message)
  103. {
  104. foreach (var siteItemBase in Children.OfType<FileSystemSiteItem>())
  105. {
  106. if (siteItemBase.Path == message.FileName)
  107. {
  108. Children.Remove(siteItemBase);
  109. break;
  110. }
  111. }
  112. }
  113. }
  114. }