1 using System;
  2 using System.Collections;
  3 using System.IO;
  4 using System.Windows;
  5 
  6 namespace FileExplorer
  7 {
  8     public class DirectoryNode : Node
  9     {
 10         public DirectoryNode(const string& name_) : base(name_)isRootDirectory(false)
 11         {
 12         }
 13         public override bool IsRootDirectory() const
 14         {
 15             return isRootDirectory;
 16         }
 17         public void SetRootDirectory()
 18         {
 19             isRootDirectory = true;
 20         }
 21         public void AddDirectory(DirectoryNode* directory)
 22         {
 23             directory->SetParent(this);
 24             directories.Add(UniquePtr<DirectoryNode>(directory));
 25         }
 26         public void AddFile(FileNode* file)
 27         {
 28             file->SetParent(this);
 29             files.Add(UniquePtr<FileNode>(file));
 30         }
 31         public override string ImageName() const
 32         {
 33             return "folder_closed.bitmap";
 34         }
 35         public override string ExpandedImageName() const
 36         {
 37             return "folder_opened.bitmap";
 38         }
 39         [nodiscard]
 40         public override Result<UniquePtr<TreeViewNode>> ToTreeViewNode(bool createChilrenImageList* imageList)
 41         {
 42             UniquePtr<TreeViewNode> treeViewNodePtr(new TreeViewNode(Name()));
 43             if (treeViewNodePtr->Error())
 44             {
 45                 return Result<UniquePtr<TreeViewNode>>(ErrorId(treeViewNodePtr->GetErrorId()));
 46             }
 47             TreeViewNode* node = treeViewNodePtr.Get();
 48             auto result = SetTreeViewNode(node);
 49             if (result.Error())
 50             {
 51                 return Result<UniquePtr<TreeViewNode>>(ErrorId(result.GetErrorId()));
 52             }
 53             if (imageList != null)
 54             {
 55                 int imageIndex = imageList->GetImageIndex(ImageName());
 56                 if (imageIndex != -1)
 57                 {
 58                     auto imageIndexResult = node->SetImageIndex(imageIndex);
 59                     if (imageIndexResult.Error())
 60                     {
 61                         return Result<UniquePtr<TreeViewNode>>(ErrorId(imageIndexResult.GetErrorId()));
 62                     }
 63                 }
 64                 int expandedImageIndex = imageList->GetImageIndex(ExpandedImageName());
 65                 if (expandedImageIndex != -1)
 66                 {
 67                     auto expandedImageIndexResult = node->SetExpandedImageIndex(expandedImageIndex);
 68                     if (expandedImageIndexResult.Error())
 69                     {
 70                         return Result<UniquePtr<TreeViewNode>>(ErrorId(expandedImageIndexResult.GetErrorId()));
 71                     }
 72                 }
 73             }
 74             return Result<UniquePtr<TreeViewNode>>(Rvalue(treeViewNodePtr));
 75         }
 76         public override Result<Control*> CreateView(ImageList* imageList)
 77         {
 78             Clear();
 79             string directoryPath = DirectoryPath();
 80             List<string> directoryNames = Directory.GetDirectories(directoryPath);
 81             Sort(directoryNames.Begin()directoryNames.End());
 82             for (const string& directoryName : directoryNames)
 83             {
 84                 AddDirectory(new DirectoryNode(Path.GetFileName(directoryName)));
 85             }
 86             List<string> fileNames = Directory.GetFiles(directoryPath);
 87             Sort(fileNames.Begin()fileNames.End());
 88             for (const string& fileName : fileNames)
 89             {
 90                 AddFile(new FileNode(Path.GetFileName(fileName)));
 91             }
 92             ListView* listView = new ListView(ListViewCreateParams(ListViewControlCreateParams(ControlCreateParams().Defaults())).Defaults());
 93             if (listView->Error())
 94             {
 95                 return Result<Control*>(ErrorId(listView->GetErrorId()));
 96             }
 97             MainWindow* mainWindow = GetMainWindow();
 98             if (mainWindow != null)
 99             {
100                 mainWindow->AddListViewEventHandlers(listView);
101             }
102             listView->SetData(this);
103             listView->SetDoubleBuffered();
104             listView->SetImageList(imageList);
105             listView->AddColumn("Name"400);
106             TreeViewNode* treeViewNode = GetTreeViewNode();
107             if (treeViewNode == null)
108             {
109                 Node* parent = Parent();
110                 if (parent != null)
111                 {
112                     treeViewNode = parent->GetTreeViewNode();
113                 }
114             }
115             if (treeViewNode != null)
116             {
117                 treeViewNode->RemoveChildren();
118             }
119             for (const UniquePtr<DirectoryNode>& directory : directories)
120             {
121                 ListViewItem* directoryItem = listView->AddItem();
122                 auto result = directory->SetData(directoryItemimageList);
123                 if (result.Error()) return Result<Control*>(ErrorId(result.GetErrorId()));
124                 if (treeViewNode != null)
125                 {
126                     auto treeViewNodeResult = directory->ToTreeViewNode(falseimageList);
127                     auto result = treeViewNode->AddChild(treeViewNodeResult.Value().Release());
128                     if (result.Error())
129                     {
130                         return Result<Control*>(ErrorId(result.GetErrorId()));
131                     }
132                 }
133             }
134             for (const UniquePtr<FileNode>& file : files)
135             {
136                 ListViewItem* fileItem = listView->AddItem();
137                 auto result = file->SetData(fileItemimageList);
138                 if (result.Error()) return Result<Control*>(ErrorId(result.GetErrorId()));
139             }
140             if (treeViewNode != null)
141             {
142                 treeViewNode->Select();
143                 TreeView* treeView = treeViewNode->GetTreeView();
144                 if (treeView != null)
145                 {
146                     auto result = treeView->Invalidate();
147                     if (result.Error()) return Result<Control*>(ErrorId(result.GetErrorId()));
148                 }
149             }
150             return Result<Control*>(listView);
151         }
152         protected override string DirectoryPath()
153         {
154             string parentDirectoryPath;
155             Node* p = Parent();
156             if (p != null)
157             {
158                 parentDirectoryPath = p->DirectoryPath();
159             }
160             if (!parentDirectoryPath.IsEmpty())
161             {
162                 return Path.Combine(parentDirectoryPathName());
163             }
164             else
165             {
166                 return Name();
167             }
168         }
169         private void Clear()
170         {
171             directories.Clear();
172             files.Clear();
173         }
174         private bool isRootDirectory;
175         private List<UniquePtr<DirectoryNode>> directories;
176         private List<UniquePtr<FileNode>> files;
177     }