FileDialogTreeBuilder.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.IO.Abstractions;
  5. using System.Linq;
  6. namespace Terminal.Gui {
  7. class FileDialogTreeBuilder : ITreeBuilder<object> {
  8. readonly FileDialog _dlg;
  9. public FileDialogTreeBuilder(FileDialog dlg)
  10. {
  11. _dlg = dlg;
  12. }
  13. public bool SupportsCanExpand => true;
  14. public bool CanExpand (object toExpand)
  15. {
  16. return this.TryGetDirectories (NodeToDirectory (toExpand)).Any ();
  17. }
  18. public IEnumerable<object> GetChildren (object forObject)
  19. {
  20. return this.TryGetDirectories (NodeToDirectory (forObject));
  21. }
  22. internal static IDirectoryInfo NodeToDirectory (object toExpand)
  23. {
  24. return toExpand is FileDialogRootTreeNode f ? f.Path : (IDirectoryInfo)toExpand;
  25. }
  26. internal string AspectGetter(object o)
  27. {
  28. string icon;
  29. string name;
  30. if(o is FileDialogRootTreeNode r)
  31. {
  32. icon = _dlg.Style.IconGetter.Invoke(
  33. new FileDialogIconGetterArgs(_dlg, r.Path, FileDialogIconGetterContext.Tree));
  34. name = r.DisplayName;
  35. }
  36. else
  37. {
  38. var dir = (IDirectoryInfo)o;
  39. icon = _dlg.Style.IconGetter.Invoke(
  40. new FileDialogIconGetterArgs(_dlg, dir, FileDialogIconGetterContext.Tree));
  41. name = dir.Name;
  42. }
  43. return icon + name;
  44. }
  45. private IEnumerable<IDirectoryInfo> TryGetDirectories (IDirectoryInfo directoryInfo)
  46. {
  47. try {
  48. return directoryInfo.EnumerateDirectories ();
  49. } catch (Exception) {
  50. return Enumerable.Empty<IDirectoryInfo> ();
  51. }
  52. }
  53. }
  54. }