1 using System;
2 using System.Collections;
3 using System.Windows;
4
5 namespace FileExplorer
6 {
7 public System.Windows.Color DefaultDirectoryTreeViewFrameColor()
8 {
9 return System.Windows.Color(204u, 206u, 219u);
10 }
11
12 public Padding DefaultDirectoryTreeViewNodeImagePadding()
13 {
14 return Padding(2, 2, 2, 2);
15 }
16
17 public float DefaultDirectoryTreeViewNodeIndentPercent()
18 {
19 return 100.000000f;
20 }
21
22 public class DirectoryTreeView : ContainerControl
23 {
24 public DirectoryTreeView(ImageList* imageList, ComputerNode* computer_) :
25 base(ControlCreateParams().SetWindowClassName("FileExplorer.DirectoryTreeView").
26 SetWindowClassBackgroundColor(SystemColor.COLOR_WINDOW).SetBackgroundColor(Color.White()).SetDock(Dock.fill)),
27 computer(computer_)
28 {
29 UniquePtr<TreeView> treeViewPtr(new TreeView(TreeViewCreateParams(TreeViewControlCreateParams(ControlCreateParams().Defaults())).
30 SetNodeImagePadding(DefaultDirectoryTreeViewNodeImagePadding()).SetNodeIndentPercent(DefaultDirectoryTreeViewNodeIndentPercent())));
31 if (treeViewPtr->Error())
32 {
33 SetErrorId(treeViewPtr->GetErrorId());
34 return;
35 }
36 treeView = treeViewPtr.Get();
37 treeView->SetDoubleBuffered();
38 treeView->SetScrollSubject();
39 treeView->SetImageList(imageList);
40 treeView->NodeClickEvent().AddHandler(TreeViewNodeClick);
41 treeView->NodeDoubleClickEvent().AddHandler(TreeViewNodeDoubleClick);
42 UniquePtr<PaddedControl> paddedTreeViewPtr(new PaddedControl(
43 PaddedControlCreateParams(
44 PaddedControlControlCreateParams(
45 ControlCreateParams().Defaults(), treeView),
46 treeViewPtr.Release()).Defaults()));
47 if (paddedTreeViewPtr->Error())
48 {
49 SetErrorId(paddedTreeViewPtr->GetErrorId());
50 return;
51 }
52 PaddedControl* paddedTreeView = paddedTreeViewPtr.Get();
53 UniquePtr<BorderedControl> borderedTreeViewPtr(new BorderedControl(
54 BorderedControlCreateParams(
55 BorderedControlControlCreateParams(
56 ControlCreateParams().Defaults(), paddedTreeView),
57 paddedTreeViewPtr.Release()).SetNormalBorderColor(DefaultDirectoryTreeViewFrameColor())));
58 if (borderedTreeViewPtr->Error())
59 {
60 SetErrorId(borderedTreeViewPtr->GetErrorId());
61 return;
62 }
63 BorderedControl* borderedTreeView = borderedTreeViewPtr.Get();
64 UniquePtr<ScrollableControl> scrollableTreeViewPtr(new ScrollableControl(
65 ScrollableControlCreateParams(
66 ScrollableControlControlCreateParams(
67 ControlCreateParams().SetDock(Dock.fill), borderedTreeView),
68 borderedTreeViewPtr.Release()).Defaults()));
69 if (scrollableTreeViewPtr->Error())
70 {
71 SetErrorId(scrollableTreeViewPtr->GetErrorId());
72 return;
73 }
74 child = scrollableTreeViewPtr.Get();
75 auto result = AddChild(scrollableTreeViewPtr.Release());
76 if (result.Error())
77 {
78 SetErrorId(result.GetErrorId());
79 return;
80 }
81 result = PopulateTreeView(imageList);
82 if (result.Error())
83 {
84 SetErrorId(result.GetErrorId());
85 return;
86 }
87 }
88 public void SetMainWindow(MainWindow* mainWindow_)
89 {
90 mainWindow = mainWindow_;
91 }
92 [nodiscard]
93 public Result<bool> Open(Node* node)
94 {
95 TreeViewNode* treeViewNode = node->GetTreeViewNode();
96 if (treeViewNode != null)
97 {
98 TreeView* treeView = treeViewNode->GetTreeView();
99 treeView->SetContentLocation(Point(0, 0));
100 TreeViewNode* parentNode = treeViewNode->Parent();
101 while (parentNode != null)
102 {
103 auto result = parentNode->Expand();
104 if (result.Error()) return result;
105 parentNode = parentNode->Parent();
106 }
107 treeViewNode->Select();
108 }
109 return Result<bool>(true);
110 }
111 public Node* SelectedNode() const
112 {
113 if (treeView != null)
114 {
115 TreeViewNode* selectedNode = treeView->SelectedNode();
116 if (selectedNode != null)
117 {
118 void* data = selectedNode->Data();
119 if (data != null)
120 {
121 Node* node = cast<Node*>(data);
122 return node;
123 }
124 }
125 }
126 return null;
127 }
128 protected override Result<bool> OnPaint(PaintEventArgs& args)
129 {
130 auto result = treeView->Invalidate();
131 if (result.Error()) return result;
132 result = child->Invalidate();
133 if (result.Error()) return result;
134 return base->OnPaint(args);
135 }
136 [nodiscard]
137 private Result<bool> PopulateTreeView(ImageList* imageList)
138 {
139 Result<UniquePtr<TreeViewNode>> rootPtrResult(computer->ToTreeViewNode(true, imageList));
140 if (rootPtrResult.Error())
141 {
142 return Result<bool>(ErrorId(rootPtrResult.GetErrorId()));
143 }
144 TreeViewNode* root = rootPtrResult.Value().Get();
145 auto result = treeView->SetRoot(rootPtrResult.Value().Release());
146 if (result.Error()) return result;
147 result = root->Expand();
148 if (result.Error()) return result;
149 return Result<bool>(true);
150 }
151 private void TreeViewNodeClick(TreeViewNodeMouseClickEventArgs& args)
152 {
153 if (mainWindow != null)
154 {
155 TreeViewNode* treeViewNode = args.node;
156 if (treeViewNode != null)
157 {
158 void* data = treeViewNode->Data();
159 if (data != null)
160 {
161 Node* node = cast<Node*>(data);
162 ContentView* contentView = mainWindow->GetContentView();
163 if (contentView != null)
164 {
165 auto result = contentView->ViewContent(node);
166 if (result.Error())
167 {
168 args.errorId = result.GetErrorId();
169 return;
170 }
171 result = node->SetCurrentPathNode();
172 if (result.Error())
173 {
174 args.errorId = result.GetErrorId();
175 return;
176 }
177 }
178 }
179 }
180 }
181 }
182 private void TreeViewNodeDoubleClick(TreeViewNodeMouseClickEventArgs& args)
183 {
184 TreeViewNode* treeViewNode = args.node;
185 if (treeViewNode != null)
186 {
187 Node* node = null;
188 if (treeViewNode->Data() != null)
189 {
190 node = cast<Node*>(treeViewNode->Data());
191 }
192 if (treeViewNode->GetState() == TreeViewNode.State.collapsed)
193 {
194 auto result = treeViewNode->ExpandAll();
195 if (result.Error())
196 {
197 args.errorId = result.GetErrorId();
198 return;
199 }
200 }
201 else if (treeViewNode->GetState() == TreeViewNode.State.expanded)
202 {
203 auto result = treeViewNode->CollapseAll();
204 if (result.Error())
205 {
206 args.errorId = result.GetErrorId();
207 return;
208 }
209 }
210 }
211 }
212 private MainWindow* mainWindow;
213 private TreeView* treeView;
214 private Control* child;
215 private ComputerNode* computer;
216 }
217 }