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(204u206u219u);
 10     }
 11 
 12     public Padding DefaultDirectoryTreeViewNodeImagePadding()
 13     {
 14         return Padding(2222);
 15     }
 16 
 17     public float DefaultDirectoryTreeViewNodeIndentPercent()
 18     {
 19         return 100.000000f;
 20     }
 21 
 22     public class DirectoryTreeView : ContainerControl
 23     {
 24         public DirectoryTreeView(ImageList* imageListComputerNode* 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(00));
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(trueimageList));
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 }