1 //<Script type="text/javascript">
6 * Projects can only contain one directory... - it can import other projects..(later)
8 * we need to sort out that - paths is currently a key/value array..
14 public errordomain Error {
21 public class Project : Object {
23 public signal void on_changed ();
26 public string fn = "";
27 public string name = "";
28 public string runhtml = "";
29 public Gee.HashMap<string,string> paths;
30 public Gee.HashMap<string,JsRender.JsRender> files ;
37 public Project (string path) {
42 this.paths = new Gee.HashMap<string,string>();
43 this.files = new Gee.HashMap<string,JsRender.JsRender>();
44 //XObject.extend(this, cfg);
46 this.paths.set(path, "dir");
51 public static Project factory(string xtype, string path)
59 throw new Error.INVALID_TYPE("invalid project type");
67 load : function (o) // is this used??
69 if (!this.fetchTree) {
70 console.log("Project.getTree tree called on base object?!?!");
75 return o.success.apply(o.scope || this, [this]);
77 return this.fetchTree(o);
81 // public Palete getPalete ()
83 //print("Project.Base: GET PROVIDER FOR " + this.xtype);
84 // return ProjectManager.getPalete(this.xtype);
93 public string toJSON(bool show_all)
96 var builder = new Json.Builder ();
98 builder.begin_object ();
100 builder.set_member_name ("name");
101 builder.add_string_value (this.name);
104 builder.set_member_name ("fn");
105 builder.add_string_value (this.fn);
107 builder.set_member_name ("xtype");
108 builder.add_string_value (this.xtype);
110 // file ??? try/false?
111 builder.set_member_name ("paths");
114 builder.begin_array ();
117 var iter = this.paths.map_iterator();
118 while (iter.next()) {
119 builder.add_string_value (iter.get_key());
121 builder.end_array ();
123 builder.set_member_name ("files");
124 builder.begin_array ();
125 var fiter = this.files.map_iterator();
126 while (fiter.next()) {
127 builder.add_string_value (fiter.get_key());
131 builder.end_array ();
135 builder.end_object ();
137 var generator = new Json.Generator ();
138 var root = builder.get_root ();
139 generator.set_root (root);
141 generator.pretty = true;
142 generator.indent = 4;
145 return generator.to_data (null);
149 public string firstPath()
151 var iter = this.paths.map_iterator();
152 while (iter.next()) {
153 return iter.get_key();
159 // returns the first path
160 public string getName()
162 var iter = this.paths.map_iterator();
163 while (iter.next()) {
164 return GLib.Path.get_basename(iter.get_key());
174 public GLib.List<JsRender.JsRender> toTree ()
179 var files = new Gee.HashMap<string,JsRender.JsRender>();
181 var fiter = this.files.map_iterator();
182 while(fiter.next()) {
183 var fo = fiter.get_value();
185 fo.hasParent = false;
186 fo.cn = new GLib.List<JsRender.JsRender>();
188 if (fo.fullname.length > 0) {
189 files.set(fo.fullname, fo);
193 var iter = files.map_iterator();
194 while (iter.next()) {
195 var f = iter.get_value();
198 if (par.length < 1) {
201 if (!files.has_key(par)) {
204 files.get(par).cn.append(f);
209 var ret = new GLib.List<JsRender.JsRender>();
210 iter = files.map_iterator();
211 while (iter.next()) {
212 var f = iter.get_value();
218 if (files.has_key(f.fullname)) {
224 return a.path > b.path ? 1 : -1;
228 //print(JSON.stringify(ret,null,4));
237 public JsRender.JsRender? getById(string id)
240 var fiter = files.map_iterator();
241 while(fiter.next()) {
243 var f = fiter.get_value();
246 //console.log(f.id + '?=' + id);
254 public JsRender.JsRender loadFileOnly (string path)
257 return JsRender.JsRender.factory(xt, this, path);
261 public JsRender.JsRender create(string filename)
263 var ret = this.loadFileOnly(filename);
271 public void addFile(JsRender.JsRender pfile) { // add a single file, and trigger changed.
274 this.files.set(pfile.path, pfile); // duplicate check?
278 public void add(string path, string type)
280 this.paths.set(path,type);
281 //Seed.print(" type is '" + type + "'");
284 // console.dump(this.files);
286 if (type == "file" ) {
288 this.files.set(path,this.loadFileOnly( path ));
293 public void scanDirs()
295 var iter = this.paths.map_iterator();
296 while (iter.next()) {
297 //print("path: " + iter.get_key() + " : " + iter.get_value() +"\n");
298 if (iter.get_value() != "dir") {
301 this.scanDir(iter.get_key());
303 //console.dump(this.files);
307 public void scanDir(string dir, int dp =0 )
310 //print("Project.Base: Running scandir on " + dir +"\n");
311 if (dp > 5) { // no more than 5 deep?
314 // this should be done async -- but since we are getting the proto up ...
316 var subs = new GLib.List<string>();;
317 var f = File.new_for_path(dir);
319 var file_enum = f.enumerate_children(GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null);
323 while ((next_file = file_enum.next_file(null)) != null) {
324 var fn = next_file.get_display_name();
327 //print("trying" + dir + "/" + fn +"\n");
329 if (fn[0] == '.') { // skip hidden
333 if (FileUtils.test(dir + "/" + fn, GLib.FileTest.IS_DIR)) {
334 subs.append(dir + "/" + fn);
338 if (!Regex.match_simple("\\.bjs$", fn)) {
339 //print("no a bjs\n");
346 var sp = dir.split("/");
348 for (var i = 0; i < sp.length; i++) {
353 sp = sp.splice(sp.length - (dp +1), (dp +1));
354 parent = sp.join('.');
357 if (typeof(_this.files[dir + '/' + fn]) != 'undefined') {
358 // we already have it..
359 _this.files[dir + '/' + fn].parent = parent;
364 var el = JsRender.JsRender.factory(xt,this, dir + "/" + fn);
365 this.files.set( dir + "/" + fn, el);
371 print("Project::scanDirs failed : " + e.message + "\n");
373 for (var i = 0; i < subs.length(); i++) {
375 this.scanDir(subs.nth_data(i), dp+1);