1 module dlangide.ui.wspanel;
2 
3 import dlangui.all;
4 import dlangide.workspace.workspace;
5 import dlangide.workspace.project;
6 
7 enum ProjectItemType : int {
8     None,
9     SourceFile,
10     SourceFolder,
11     Project,
12     Workspace
13 }
14 
15 interface SourceFileSelectionHandler {
16     bool onSourceFileSelected(ProjectSourceFile file, bool activate);
17 }
18 
19 class WorkspacePanel : DockWindow {
20     protected Workspace _workspace;
21     protected TreeWidget _tree;
22 
23     /// handle source file selection change
24     Signal!SourceFileSelectionHandler sourceFileSelectionListener;
25 
26     this(string id) {
27         super(id);
28         workspace = null;
29         //layoutWidth = 200;
30         _caption.text = "Workspace Explorer"d;
31     }
32 
33     bool selectItem(ProjectItem projectItem) {
34         if (projectItem) {
35             TreeItem item = _tree.findItemById(projectItem.filename);
36             if (item) {
37                 _tree.selectItem(item);
38                 return true;
39             }
40         } else {
41             _tree.clearSelection();
42             return true;
43         }
44         return false;
45     }
46 
47     void onTreeItemSelected(TreeItems source, TreeItem selectedItem, bool activated) {
48         if (!selectedItem)
49             return;
50         if (selectedItem.intParam == ProjectItemType.SourceFile) {
51             // file selected
52             if (sourceFileSelectionListener.assigned) {
53                 ProjectSourceFile sourceFile = cast(ProjectSourceFile)selectedItem.objectParam;
54                 if (sourceFile) {
55                     sourceFileSelectionListener(sourceFile, activated);
56                 }
57             }
58         } else if (selectedItem.intParam == ProjectItemType.SourceFolder) {
59             // folder selected
60         }
61     }
62 
63     override protected Widget createBodyWidget() {
64         _tree = new TreeWidget("wstree");
65         _tree.layoutHeight(FILL_PARENT).layoutHeight(FILL_PARENT);
66         _tree.selectionListener = &onTreeItemSelected;
67 		_tree.fontSize = 16;
68         return _tree;
69     }
70 
71     @property Workspace workspace() {
72         return _workspace;
73     }
74 
75     ProjectSourceFile findSourceFileItem(string filename) {
76         if (_workspace)
77             return _workspace.findSourceFileItem(filename);
78         return null;
79     }
80 
81     void addProjectItems(TreeItem root, ProjectItem items) {
82         for (int i = 0; i < items.childCount; i++) {
83             ProjectItem child = items.child(i);
84             if (child.isFolder) {
85                 TreeItem p = root.newChild(child.filename, child.name, "folder");
86                 p.intParam = ProjectItemType.SourceFolder;
87                 p.objectParam = child;
88                 addProjectItems(p, child);
89             } else {
90                 TreeItem p = root.newChild(child.filename, child.name, "text-plain");
91                 p.intParam = ProjectItemType.SourceFile;
92                 p.objectParam = child;
93             }
94         }
95     }
96 
97     @property void workspace(Workspace w) {
98         _workspace = w;
99         _tree.requestLayout();
100         _tree.items.clear();
101         if (w) {
102             TreeItem root = _tree.items.newChild(w.filename, w.name, "project-development");
103             root.intParam = ProjectItemType.Workspace;
104             foreach(project; w.projects) {
105                 TreeItem p = root.newChild(project.filename, project.name, "project-open");
106                 p.intParam = ProjectItemType.Project;
107                 addProjectItems(p, project.items);
108             }
109         } else {
110             _tree.items.newChild("none", "New workspace"d, "project-development");
111         }
112         _tree.onTreeContentChange(null);
113     }
114 }