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 ();
20 public string fn = "";
21 public string name = "";
22 public Gee.HashMap<string,string> paths;
23 public GLib.List<JsRender.JsRender> files ;
30 public Project (string path) {
35 this.paths = new Gee.HashMap<string,string>();
36 this.files = new GLib.List<JsRender.JsRender>();
37 //XObject.extend(this, cfg);
39 this.paths.set(path, "dir");
50 load : function (o) // is this used??
52 if (!this.fetchTree) {
53 console.log("Project.getTree tree called on base object?!?!");
58 return o.success.apply(o.scope || this, [this]);
60 return this.fetchTree(o);
64 // public Palete getPalete ()
66 //print("Project.Base: GET PROVIDER FOR " + this.xtype);
67 // return ProjectManager.getPalete(this.xtype);
70 public string toJSON(bool show_all)
73 var builder = new Json.Builder ();
75 builder.begin_object ();
77 builder.set_member_name ("name");
78 builder.add_string_value (this.name);
81 builder.set_member_name ("fn");
82 builder.add_string_value (this.fn);
84 builder.set_member_name ("xtype");
85 builder.add_string_value (this.xtype);
87 // file ??? try/false?
88 builder.set_member_name ("paths");
91 builder.begin_array ();
94 var iter = this.paths.map_iterator();
96 builder.add_string_value (iter.get_key());
100 builder.set_member_name ("files");
101 builder.begin_array ();
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);
109 builder.end_array ();
113 builder.end_object ();
115 var generator = new Json.Generator ();
116 var root = builder.get_root ();
117 generator.set_root (root);
119 generator.pretty = true;
120 generator.indent = 4;
123 return generator.to_data (null);
127 // returns the first path
128 public string getName()
130 var iter = this.paths.map_iterator();
131 while (iter.next()) {
132 return GLib.Path.get_basename(iter.get_key());
142 public GLib.List<JsRender.JsRender> toTree ()
147 var files = new Gee.HashMap<string,JsRender.JsRender>();
149 for(var i = 0; i < this.files.length(); i++) {
150 var fo = this.files.nth_data(i);
152 fo.hasParent = false;
153 fo.cn = new GLib.List<JsRender.JsRender>();
155 if (this.files.nth_data(i).fullname.length > 0) {
156 files.set(fo.fullname, fo);
160 var iter = files.map_iterator();
161 while (iter.next()) {
162 var f = iter.get_value();
165 if (par.length < 1) {
168 if (!files.has_key(par)) {
171 files.get(par).cn.append(f);
176 var ret = new GLib.List<JsRender.JsRender>();
177 iter = files.map_iterator();
178 while (iter.next()) {
179 var f = iter.get_value();
185 if (files.has_key(f.fullname)) {
191 return a.path > b.path ? 1 : -1;
195 //print(JSON.stringify(ret,null,4));
204 public JsRender.JsRender? getById(string id)
207 for(var i = 0; i < this.files.length(); i++) {
208 var f = this.files.nth_data(i);
211 //console.log(f.id + '?=' + id);
219 public JsRender.JsRender loadFileOnly (string path)
222 return JsRender.JsRender.factory(xt, this, path);
226 public JsRender.JsRender create(string filename)
228 var ret = this.loadFileOnly(filename);
236 public void addFile(JsRender.JsRender pfile) { // add a single file, and trigger changed.
237 this.files.append(pfile); // duplicate check?
241 public void add(string path, string type)
243 this.paths.set(path,type);
244 //Seed.print(" type is '" + type + "'");
247 // console.dump(this.files);
249 if (type == "file" ) {
250 this.files.append(this.loadFileOnly( path ));
255 public void scanDirs()
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") {
263 this.scanDir(iter.get_key());
265 //console.dump(this.files);
269 public void scanDir(string dir, int dp =0 )
272 print("Project.Base: Running scandir on " + dir +"\n");
273 if (dp > 5) { // no more than 5 deep?
276 // this should be done async -- but since we are getting the proto up ...
278 var subs = new GLib.List<string>();;
279 var f = File.new_for_path(dir);
281 var file_enum = f.enumerate_children(GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null);
285 while ((next_file = file_enum.next_file(null)) != null) {
286 var fn = next_file.get_display_name();
289 print("trying" + dir + "/" + fn +"\n");
291 if (fn[0] == '.') { // skip hidden
295 if (FileUtils.test(dir + "/" + fn, GLib.FileTest.IS_DIR)) {
296 subs.append(dir + "/" + fn);
300 if (!Regex.match_simple("\\.bjs$", fn)) {
308 var sp = dir.split("/");
310 for (var i = 0; i < sp.length; i++) {
315 sp = sp.splice(sp.length - (dp +1), (dp +1));
316 parent = sp.join('.');
319 if (typeof(_this.files[dir + '/' + fn]) != 'undefined') {
320 // we already have it..
321 _this.files[dir + '/' + fn].parent = parent;
326 var el = JsRender.JsRender.factory(xt,this, dir + "/" + fn);
327 this.files.append(el);
333 print("Project::scanDirs failed : " + e.message + "\n");
335 for (var i = 0; i < subs.length(); i++) {
337 this.scanDir(subs.nth_data(i), dp+1);