JsRender/Roo.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     // returns the first path
124     public string getName()
125     {
126         var iter = this.paths.map_iterator();
127         while (iter.next()) {
128             return GLib.Path.get_basename(iter.get_key());
129         }
130       
131         return "";
132     }
133     /**
134      *
135      * to tree - > should
136      */
137  
138     public GLib.List<JsRender.JsRender> toTree ()
139     {
140             
141          
142          
143         var files = new Gee.HashMap<string,JsRender.JsRender>();
144
145                 var fiter = files.map_iterator();
146         while(fiter.next()) {
147             var fo = fiter.get_value();
148             
149             fo.hasParent = false;
150             fo.cn = new GLib.List<JsRender.JsRender>();
151             
152             if (fo.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                 var fiter = files.map_iterator();
205         while(fiter.next()) {
206          
207             var f = fiter.get_value();
208             
209             
210             //console.log(f.id + '?=' + id);
211             if (f.id == id) {
212                 return f;
213             }
214         };
215         return null;
216     }
217         
218     public JsRender.JsRender loadFileOnly (string path)
219     {
220         var xt = this.xtype;
221         return JsRender.JsRender.factory(xt, this, path);
222         
223     }
224     
225     public JsRender.JsRender create(string filename)
226     {
227         var ret = this.loadFileOnly(filename);
228         ret.save();
229         this.addFile(ret);
230         return ret;
231         
232     }
233         
234          
235     public void addFile(JsRender.JsRender pfile) { // add a single file, and trigger changed.
236                 
237                 
238         this.files.set(pfile.path, pfile); // duplicate check?
239         this.on_changed();
240     }
241     
242     public void add(string path, string type)
243     {
244         this.paths.set(path,type);
245         //Seed.print(" type is '" + type + "'");
246         if (type == "dir") {
247             this.scanDir(path);
248         //    console.dump(this.files);
249         }
250         if (type == "file" ) {
251                         
252             this.files.set(path,this.loadFileOnly( path ));
253         }
254         this.on_changed();
255         
256     }
257     public void  scanDirs()
258     {
259         var iter = this.paths.map_iterator();
260         while (iter.next()) {
261                         //print("path: " + iter.get_key() + " : " + iter.get_value() +"\n");
262             if (iter.get_value() != "dir") {
263                 continue;
264             }
265             this.scanDir(iter.get_key());
266         }
267         //console.dump(this.files);
268         
269     }
270         // list files.
271     public void scanDir(string dir, int dp =0 ) 
272     {
273         //dp = dp || 0;
274         //print("Project.Base: Running scandir on " + dir +"\n");
275         if (dp > 5) { // no more than 5 deep?
276             return;
277         }
278         // this should be done async -- but since we are getting the proto up ...
279         
280         var subs = new GLib.List<string>();;            
281         var f = File.new_for_path(dir);
282         try {
283             var file_enum = f.enumerate_children(GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null);
284             
285              
286             FileInfo next_file; 
287             while ((next_file = file_enum.next_file(null)) != null) {
288                 var fn = next_file.get_display_name();
289         
290                  
291                 //print("trying"  + dir + "/" + fn +"\n");
292                 
293                 if (fn[0] == '.') { // skip hidden
294                     continue;
295                 }
296                 
297                 if (FileUtils.test(dir  + "/" + fn, GLib.FileTest.IS_DIR)) {
298                     subs.append(dir  + "/" + fn);
299                     continue;
300                 }
301                 
302                 if (!Regex.match_simple("\\.bjs$", fn)) {
303                                         //print("no a bjs\n");
304                     continue;
305                 }
306                 /*
307                 var parent = "";
308                 //if (dp > 0 ) {
309                 
310                 var sp = dir.split("/");
311                 var parent = "";
312                 for (var i = 0; i < sp.length; i++) {
313                     
314                 }
315                 
316                 /*
317                 sp = sp.splice(sp.length - (dp +1), (dp +1));
318                 parent = sp.join('.');
319                 
320                 
321                 if (typeof(_this.files[dir  + '/' + fn]) != 'undefined') {
322                     // we already have it..
323                     _this.files[dir  + '/' + fn].parent = parent;
324                     return;
325                 }
326                 */
327                 var xt = this.xtype;
328                                 var el = JsRender.JsRender.factory(xt,this, dir + "/" + fn);
329                 this.files.set( dir + "/" + fn, el);
330                 // parent ?? 
331                 
332                  
333             }
334         } catch (Error e) {
335             print("Project::scanDirs failed : " + e.message + "\n");
336         }
337         for (var i = 0; i < subs.length(); i++) {
338             
339              this.scanDir(subs.nth_data(i), dp+1);
340         }
341         
342     }
343       
344 }
345
346