1 using System;
  2 using System.Collections;
  3 using System.Windows;
  4 
  5 namespace FileExplorer
  6 {
  7     public class ComputerNode : Node
  8     {
  9         public ComputerNode() : base("Computer")
 10         {
 11         }
 12         public void AddDrive(DriveNode* drive)
 13         {
 14             drive->SetParent(this);
 15             drives.Add(UniquePtr<DriveNode>(drive));
 16         }
 17         public inline const List<UniquePtr<DriveNode>>& Drives() const
 18         {
 19             return drives;
 20         }
 21         public override MainWindow* GetMainWindow() const
 22         {
 23             return mainWindow;
 24         }
 25         public void SetMainWindow(MainWindow* mainWindow_)
 26         {
 27             mainWindow = mainWindow_;
 28         }
 29         public override string ImageName() const
 30         {
 31             return "computer.bitmap";
 32         }
 33         [nodiscard]
 34         public override Result<UniquePtr<TreeViewNode>> ToTreeViewNode(bool createChildrenImageList* imageList)
 35         {
 36             UniquePtr<TreeViewNode> rootPtr(new TreeViewNode(Name()));
 37             if (rootPtr->Error())
 38             {
 39                 return Result<UniquePtr<TreeViewNode>>(ErrorId(rootPtr->GetErrorId()));
 40             }
 41             TreeViewNode* root = rootPtr.Get();
 42             auto result = root->SetImageIndex(imageList->GetImageIndex(ImageName()));
 43             if (result.Error())
 44             {
 45                 return Result<UniquePtr<TreeViewNode>>(ErrorId(result.GetErrorId()));
 46             }
 47             result = SetTreeViewNode(root);
 48             if (result.Error())
 49             {
 50                 return Result<UniquePtr<TreeViewNode>>(ErrorId(result.GetErrorId()));
 51             }
 52             if (createChildren)
 53             {
 54                 for (const UniquePtr<DriveNode>& drive : drives)
 55                 {
 56                     Result<UniquePtr<TreeViewNode>> childPtrResult(drive->ToTreeViewNode(falseimageList));
 57                     if (childPtrResult.Error()) return childPtrResult;
 58                     TreeViewNode* child = childPtrResult.Value().Get();
 59                     if (imageList != null)
 60                     {
 61                         int imageIndex = imageList->GetImageIndex(drive->ImageName());
 62                         if (imageIndex != -1)
 63                         {
 64                             auto imageIndexResult = child->SetImageIndex(imageIndex);
 65                             if (imageIndexResult.Error())
 66                             {
 67                                 return Result<UniquePtr<TreeViewNode>>(ErrorId(imageIndexResult.GetErrorId()));
 68                             }
 69                         }
 70                     }
 71                     auto addResult = root->AddChild(childPtrResult.Value().Release());
 72                     if (addResult.Error())
 73                     {
 74                         return Result<UniquePtr<TreeViewNode>>(ErrorId(addResult.GetErrorId()));
 75                     }
 76                 }
 77             }
 78             return Result<UniquePtr<TreeViewNode>>(Rvalue(rootPtr));
 79         }
 80         public override Result<Control*> CreateView(ImageList* imageList)
 81         {
 82             ListView* listView = new ListView(ListViewCreateParams(ListViewControlCreateParams(ControlCreateParams().Defaults())).Defaults());
 83             if (listView->Error())
 84             {
 85                 return Result<Control*>(ErrorId(listView->GetErrorId()));
 86             }
 87             listView->SetData(this);
 88             MainWindow* mainWindow = GetMainWindow();
 89             if (mainWindow != null)
 90             {
 91                 mainWindow->AddListViewEventHandlers(listView);
 92             }
 93             listView->SetDoubleBuffered();
 94             listView->SetImageList(imageList);
 95             listView->AddColumn("Drive"200u);
 96             for (const UniquePtr<DriveNode>& drive : drives)
 97             {
 98                 ListViewItem* driveItem = listView->AddItem();
 99                 auto result = drive->SetData(driveItemimageList);
100                 if (result.Error())
101                 {
102                     return Result<Control*>(ErrorId(result.GetErrorId()));
103                 }
104             }
105             return Result<Control*>(listView);
106         }
107         private List<UniquePtr<DriveNode>> drives;
108         private MainWindow* mainWindow;
109     }
110 }