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