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