Project/Project.vala
[app.Builder.js] / Project / Project.vala
1 //<Script type="text/javascript">
2
3 /**
4  * Project Object
5  * 
6  * Projects can only contain one directory... - it can import other projects..(later)
7  * 
8  * we need to sort out that - paths is currently a key/value array..
9  * 
10  * 
11  * 
12  */
13
14
15 public class Project.Project {
16     
17     public signal void on_changed (); 
18         
19     public string id = "";
20     public string fn = "";
21     public string name = "";
22     public Gee.HashMap<string,string> paths;
23     public GLib.List<JsRender.JsRender> files ;
24     //tree : false,
25     public string xtype = "";
26     
27     
28     public Project (string path) {
29         
30         //this.name = name;
31         
32         
33         this.paths = new Gee.HashMap<string,string>();
34         this.files = new GLib.List<JsRender.JsRender>();
35         //XObject.extend(this, cfg);
36         //this.files = { }; 
37         this.paths.set(path, "dir");
38         
39         this.scanDirs();
40         
41     }
42     
43     
44     /*
45     public load
46      
47         
48         load : function (o)  // is this used??
49         {
50             if (!this.fetchTree) {
51                 console.log("Project.getTree tree called on base object?!?!");
52                 return false;
53             }
54             
55             if (this.files) {
56                 return o.success.apply(o.scope || this, [this]);
57             }
58             return this.fetchTree(o);
59             
60         },
61     */
62    // public Palete  getPalete ()
63     //{
64             //print("Project.Base: GET PROVIDER FOR " + this.xtype);
65    //         return  ProjectManager.getPalete(this.xtype);
66    // }
67     
68     public string toJSON(bool show_all)
69     {
70         
71         var builder = new Json.Builder ();
72         
73         builder.begin_object ();
74         
75         builder.set_member_name ("name");
76         builder.add_string_value (this.name);
77
78         
79         builder.set_member_name ("fn");
80         builder.add_string_value (this.fn);
81
82         builder.set_member_name ("xtype");
83         builder.add_string_value (this.xtype);
84         
85         // file ??? try/false?
86         builder.set_member_name ("paths");
87         
88         
89         builder.begin_array ();
90         
91         
92         var iter = this.paths.map_iterator();
93         while (iter.next()) {
94             builder.add_string_value (iter.get_key());
95         }
96         builder.end_array ();
97                 if (show_all) {
98                         builder.set_member_name ("files");
99                         builder.begin_array ();
100                     
101                     
102                     
103                     for(var i=0;i<this.files.length();i++) {
104                                 builder.add_string_value (this.files.nth_data(i).path);
105                     }
106                     builder.end_array ();
107                 }
108
109                 
110         builder.end_object ();
111                 
112         var  generator = new Json.Generator ();
113         var  root = builder.get_root ();
114         generator.set_root (root);
115                 if (show_all) {
116                         generator.pretty = true;
117                         generator.indent = 4;
118                 }
119
120         return  generator.to_data (null);
121               
122           
123     }
124     // returns the first path
125     public string getName()
126     {
127         var iter = this.paths.map_iterator();
128         while (iter.next()) {
129             return GLib.Path.get_basename(iter.get_key());
130         }
131       
132         return "";
133     }
134     /**
135      *
136      * to tree - > should
137      */
138  
139     public GLib.List<JsRender.JsRender> toTree ()
140     {
141             
142          
143          
144         var files = new Gee.HashMap<string,JsRender.JsRender>();
145          
146         for(var i = 0; i < this.files.length(); i++) {
147             var fo = this.files.nth_data(i);
148             
149             fo.hasParent = false;
150             fo.cn = new GLib.List<JsRender.JsRender>();
151             
152             if (this.files.nth_data(i).fullname.length > 0) {
153                 files.set(fo.fullname, fo);
154             }
155         }
156         
157         var iter = files.map_iterator();
158         while (iter.next()) {
159             var f = iter.get_value();
160             
161             var par = f.parent;
162             if (par.length < 1) {
163                 continue;
164             }
165             if (!files.has_key(par)) {
166                 continue;
167             }
168             files.get(par).cn.append(f);
169             f.hasParent = true;
170              
171         };
172             
173         var ret = new GLib.List<JsRender.JsRender>();
174         iter = files.map_iterator();
175         while (iter.next()) {
176             var f = iter.get_value();
177                 
178             //   f.sortCn();
179             if (f.hasParent) {
180                 continue;
181             }
182             if (files.has_key(f.fullname)) {
183             
184                 ret.append(f);
185             }
186         }
187         ret.sort( (a,b) => {
188             return a.path > b.path ? 1 : -1;
189         });
190         
191         
192         //print(JSON.stringify(ret,null,4));
193             
194         return ret;  
195              
196             
197     }
198     
199     
200     
201     public JsRender.JsRender? getById(string id)
202     {
203         
204        for(var i = 0; i < this.files.length(); i++) {
205             var f = this.files.nth_data(i);
206             
207             
208             //console.log(f.id + '?=' + id);
209             if (f.id == id) {
210                 return f;
211             }
212         };
213         return null;
214     }
215         
216     public JsRender.JsRender loadFileOnly (string path)
217     {
218         var xt = this.xtype;
219         return JsRender.JsRender.factory(xt, this, path);
220         
221     }
222     
223     public JsRender.JsRender create(string filename)
224     {
225         var ret = this.loadFileOnly(filename);
226         ret.save();
227         this.addFile(ret);
228         return ret;
229         
230     }
231         
232          
233     public void addFile(JsRender.JsRender pfile) { // add a single file, and trigger changed.
234         this.files.append(pfile); // duplicate check?
235         this.on_changed();
236     }
237     
238     public void add(string path, string type)
239     {
240         this.paths.set(path,type);
241         //Seed.print(" type is '" + type + "'");
242         if (type == "dir") {
243             this.scanDir(path);
244         //    console.dump(this.files);
245         }
246         if (type == "file" ) {
247             this.files.append(this.loadFileOnly( path ));
248         }
249         this.on_changed();
250         
251     }
252     public void  scanDirs()
253     {
254         var iter = this.paths.map_iterator();
255         while (iter.next()) {
256                         print("path: " + iter.get_key() + " : " + iter_get_value());
257             if (iter.get_value() != "dir") {
258                 continue;
259             }
260             this.scanDir(iter.get_key());
261         }
262         //console.dump(this.files);
263         
264     }
265         // list files.
266     public void scanDir(string dir, int dp =0 ) 
267     {
268         //dp = dp || 0;
269         print("Project.Base: Running scandir on " + dir);
270         if (dp > 5) { // no more than 5 deep?
271             return;
272         }
273         // this should be done async -- but since we are getting the proto up ...
274         
275         var subs = new GLib.List<string>();;            
276         var f = File.new_for_path(dir);
277         try {
278             var file_enum = f.enumerate_children(GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null);
279             
280              
281             FileInfo next_file; 
282             while ((next_file = file_enum.next_file(null)) != null) {
283                 var fn = next_file.get_display_name();
284         
285                  
286                 //console.log('trying ' + dir + '/' + fn);
287                 
288                 if (fn[0] == '.') { // skip hidden
289                     continue;
290                 }
291                 
292                 if (FileUtils.test(dir  + "/" + fn, GLib.FileTest.IS_DIR)) {
293                     subs.append(dir  + "/" + fn);
294                     continue;
295                 }
296                 
297                 if (!Regex.match_simple("\\.bjs$", fn)) {
298                     continue;
299                 }
300                 /*
301                 var parent = "";
302                 //if (dp > 0 ) {
303                 
304                 var sp = dir.split("/");
305                 var parent = "";
306                 for (var i = 0; i < sp.length; i++) {
307                     
308                 }
309                 
310                 /*
311                 sp = sp.splice(sp.length - (dp +1), (dp +1));
312                 parent = sp.join('.');
313                 
314                 
315                 if (typeof(_this.files[dir  + '/' + fn]) != 'undefined') {
316                     // we already have it..
317                     _this.files[dir  + '/' + fn].parent = parent;
318                     return;
319                 }
320                 */
321                 var xt = this.xtype;
322                 JsRender.JsRender.factory(xt,this, dir + "/" + fn);
323                 // parent ?? 
324                 
325                  
326             }
327         } catch (Error e) {
328             print("Project::scanDirs failed");
329         }
330         for (var i = 0; i < subs.length(); i++) {
331             
332              this.scanDir(subs.nth_data(i), dp+1);
333         }
334         
335     }
336       
337 }
338
339