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         TreeItem item = _tree.findItemById(projectItem.filename);
35         if (item) {
36             _tree.selectItem(item);
37             return true;
38         }
39         return false;
40     }
41 
42     void onTreeItemSelected(TreeItems source, TreeItem selectedItem, bool activated) {
43         if (selectedItem.intParam == ProjectItemType.SourceFile) {
44             // file selected
45             if (sourceFileSelectionListener.assigned) {
46                 ProjectSourceFile sourceFile = cast(ProjectSourceFile)selectedItem.objectParam;
47                 if (sourceFile) {
48                     sourceFileSelectionListener(sourceFile, activated);
49                 }
50             }
51         } else if (selectedItem.intParam == ProjectItemType.SourceFolder) {
52             // folder selected
53         }
54     }
55 
56     override protected Widget createBodyWidget() {
57         _tree = new TreeWidget("wstree");
58         _tree.layoutHeight(FILL_PARENT).layoutHeight(FILL_PARENT);
59         _tree.selectionListener = &onTreeItemSelected;
60 		_tree.fontSize = 12;
61         return _tree;
62     }
63 
64     @property Workspace workspace() {
65         return _workspace;
66     }
67 
68     void addProjectItems(TreeItem root, ProjectItem items) {
69         for (int i = 0; i < items.childCount; i++) {
70             ProjectItem child = items.child(i);
71             if (child.isFolder) {
72                 TreeItem p = root.newChild(child.filename, child.name, "folder");
73                 p.intParam = ProjectItemType.SourceFolder;
74                 p.objectParam = child;
75                 addProjectItems(p, child);
76             } else {
77                 TreeItem p = root.newChild(child.filename, child.name, "text-plain");
78                 p.intParam = ProjectItemType.SourceFile;
79                 p.objectParam = child;
80             }
81         }
82     }
83 
84     @property void workspace(Workspace w) {
85         _workspace = w;
86         _tree.requestLayout();
87         _tree.items.clear();
88         if (w) {
89             TreeItem root = _tree.items.newChild(w.filename, w.name, "project-development");
90             root.intParam = ProjectItemType.Workspace;
91             foreach(project; w.projects) {
92                 TreeItem p = root.newChild(project.filename, project.name, "project-open");
93                 p.intParam = ProjectItemType.Project;
94                 addProjectItems(p, project.items);
95             }
96         } else {
97             _tree.items.newChild("none", "New workspace"d, "project-development");
98         }
99         _tree.onTreeContentChange(null);
100     }
101 }