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 createChildren, ImageList* 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(false, imageList));
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(driveItem, imageList);
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 }