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..
15 public class Project.Project {
17 public signal void on_changed ();
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 ;
25 public string xtype = "";
28 public Project (string path) {
33 this.paths = new Gee.HashMap<string,string>();
34 this.files = new GLib.List<JsRender.JsRender>();
35 //XObject.extend(this, cfg);
37 this.paths.set(path, "dir");
48 load : function (o) // is this used??
50 if (!this.fetchTree) {
51 console.log("Project.getTree tree called on base object?!?!");
56 return o.success.apply(o.scope || this, [this]);
58 return this.fetchTree(o);
62 // public Palete getPalete ()
64 //print("Project.Base: GET PROVIDER FOR " + this.xtype);
65 // return ProjectManager.getPalete(this.xtype);
68 public string toJSON(bool show_all)
71 var builder = new Json.Builder ();
73 builder.begin_object ();
75 builder.set_member_name ("name");
76 builder.add_string_value (this.name);
79 builder.set_member_name ("fn");
80 builder.add_string_value (this.fn);
82 builder.set_member_name ("xtype");
83 builder.add_string_value (this.xtype);
85 // file ??? try/false?
86 builder.set_member_name ("paths");
89 builder.begin_array ();
92 var iter = this.paths.map_iterator();
94 builder.add_string_value (iter.get_key());
98 builder.end_object ();
100 var generator = new Json.Generator ();
101 var root = builder.get_root ();
102 generator.set_root (root);
104 return generator.to_data (null);
108 // returns the first path
109 public string getName()
111 var iter = this.paths.map_iterator();
112 while (iter.next()) {
113 return GLib.Path.get_basename(iter.get_key());
123 public GLib.List<JsRender.JsRender> toTree ()
128 var files = new Gee.HashMap<string,JsRender.JsRender>();
130 for(var i = 0; i < this.files.length(); i++) {
131 var fo = this.files.nth_data(i);
133 fo.hasParent = false;
134 fo.cn = new GLib.List<JsRender.JsRender>();
136 if (this.files.nth_data(i).fullname.length > 0) {
137 files.set(fo.fullname, fo);
141 var iter = files.map_iterator();
142 while (iter.next()) {
143 var f = iter.get_value();
146 if (par.length < 1) {
149 if (!files.has_key(par)) {
152 files.get(par).cn.append(f);
157 var ret = new GLib.List<JsRender.JsRender>();
158 iter = files.map_iterator();
159 while (iter.next()) {
160 var f = iter.get_value();
166 if (files.has_key(f.fullname)) {
172 return a.path > b.path ? 1 : -1;
176 //print(JSON.stringify(ret,null,4));
185 public JsRender.JsRender? getById(string id)
188 for(var i = 0; i < this.files.length(); i++) {
189 var f = this.files.nth_data(i);
192 //console.log(f.id + '?=' + id);
200 public JsRender.JsRender loadFileOnly (string path)
203 return JsRender.JsRender.factory(xt, this, path);
207 public JsRender.JsRender create(string filename)
209 var ret = this.loadFileOnly(filename);
217 public void addFile(JsRender.JsRender pfile) { // add a single file, and trigger changed.
218 this.files.append(pfile); // duplicate check?
222 public void add(string path, string type)
224 this.paths.set(path,type);
225 //Seed.print(" type is '" + type + "'");
228 // console.dump(this.files);
230 if (type == "file" ) {
231 this.files.append(this.loadFileOnly( path ));
236 public void scanDirs()
238 var iter = this.paths.map_iterator();
239 while (iter.next()) {
240 if (iter.get_value() != "dir") {
243 this.scanDir(iter.get_key());
245 //console.dump(this.files);
249 public void scanDir(string dir, int dp =0 )
252 //Seed.print("Project.Base: Running scandir on " + dir);
253 if (dp > 5) { // no more than 5 deep?
256 // this should be done async -- but since we are getting the proto up ...
258 var subs = new GLib.List<string>();;
259 var f = File.new_for_path(dir);
261 var file_enum = f.enumerate_children(GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null);
265 while ((next_file = file_enum.next_file(null)) != null) {
266 var fn = next_file.get_display_name();
269 //console.log('trying ' + dir + '/' + fn);
271 if (fn[0] == '.') { // skip hidden
275 if (FileUtils.test(dir + "/" + fn, GLib.FileTest.IS_DIR)) {
276 subs.append(dir + "/" + fn);
280 if (!Regex.match_simple("\\.bjs$", fn)) {
287 var sp = dir.split("/");
289 for (var i = 0; i < sp.length; i++) {
294 sp = sp.splice(sp.length - (dp +1), (dp +1));
295 parent = sp.join('.');
298 if (typeof(_this.files[dir + '/' + fn]) != 'undefined') {
299 // we already have it..
300 _this.files[dir + '/' + fn].parent = parent;
305 JsRender.JsRender.factory(xt,this, dir + "/" + fn);
311 print("Project::scanDirs failed");
313 for (var i = 0; i < subs.length(); i++) {
315 this.scanDir(subs.nth_data(i), dp+1);