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     void reloadItems() {
98         _tree.clearAllItems();
99         if (_workspace) {
100             TreeItem root = _tree.items.newChild(_workspace.filename, _workspace.name, "project-development");
101             root.intParam = ProjectItemType.Workspace;
102             foreach(project; _workspace.projects) {
103                 TreeItem p = root.newChild(project.filename, project.name, "project-open");
104                 p.intParam = ProjectItemType.Project;
105                 addProjectItems(p, project.items);
106             }
107         } else {
108             _tree.items.newChild("none", "No workspace"d, "project-development");
109         }
110         _tree.onTreeContentChange(null);
111     }
112 
113     @property void workspace(Workspace w) {
114         _workspace = w;
115         reloadItems();
116     }
117 }