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 {
21 Gee.HashMap<string,string> paths;
22 Glib.List<JsRender.Base> files ;
27 Project (string path) {
32 this.paths = new Gee.HashMap<string,string>();
33 this.files = new GLib.List<JsRender.Base>();
34 //XObject.extend(this, cfg);
42 public void onChanged() {
43 // ProjectManager.fireEvent('changed');
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()
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();
95 while (null != iter.next()) {
96 builder.add_string_value (iter.get_key());
101 var generator = new Json.Generator ();
102 var root = builder.get_root ();
103 generator.set_root (root);
105 return generator.to_data (null);
109 // returns the first path
110 public string getName()
112 var iter = this.paths.map_iterator();
113 while (null != iter.next()) {
114 return GLib.basename(iter.get_key());
124 public Array<JsRender.Base> toTree ()
129 var files = new Gee.Map<string,Json.Object>();
132 for(var i = 0; i < this.files.length; i++) {
133 var fo = this.files.index(i);
135 fo.hasParent = false;
136 fo.cn = new Array<JsRender.Base>();
138 if (this.files.index(i).fullname.length > 0) {
139 files.set(fo.fullname, f);
143 var iter = files.map_iterator();
144 while (null != iter.next()) {
145 var f = iter.get_value();
148 if (par.length < 1) {
151 if (!files.has_key(par)) {
154 files.get(par).cn.add(f);
159 var ret = new Array<JsRender.Base>();
160 iter = files.map_iterator();
161 while (null != iter.next()) {
162 var f = iter.get_value();
168 if (files.has_key(f.fullname)) {
174 return a.path > b.path ? 1 : -1;
178 //print(JSON.stringify(ret,null,4));
187 public JsRender.Base? getById(string id)
190 for(var i = 0; i < this.files.length; i++) {
191 var fo = this.files.index(i);
194 //console.log(f.id + '?=' + id);
202 public JsRender.Base loadFileOnly (string path)
205 return JsRender.Base.factory(xt, this, path);
209 public JsRender.Base create(string filename)
211 var ret = this.loadFileOnly(filename);
219 public void addFile(JsRender.Base pfile) { // add a single file, and trigger changed.
220 this.files.append_val(pfile); // duplicate check?
224 public void add(string path, string type)
226 this.paths.set(path,type);
227 //Seed.print(" type is '" + type + "'");
230 // console.dump(this.files);
232 if (type == "file" ) {
233 this.files.append_val(this.loadFileOnly( path ));
238 public void scanDirs()
240 var iter = files.map_iterator();
241 while (null != iter.next()) {
242 if (iter.get_value() != "dir") {
245 this.scanDir(iter.get_key());
247 //console.dump(this.files);
251 public void scanDir(string dir, int dp =0 )
254 //Seed.print("Project.Base: Running scandir on " + dir);
255 if (dp > 5) { // no more than 5 deep?
258 // this should be done async -- but since we are getting the proto up ...
261 var f = File.new_for_path(dir);
262 var file_enum = f.enumerate_children(Gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, Gio.FileQueryInfoFlags.NONE, null);
266 while ((next_file = file_enum.next_file(null)) != null) {
267 var fn = next_file.get_display_name();
270 //console.log('trying ' + dir + '/' + fn);
272 if (fn[0] == '.') { // skip hidden
276 if (FileUtils.test(dir + '/' + fn, GLib.FileTest.IS_DIR)) {
277 subs += (dir + '/' + fn);
281 if (!Regex.match_simple("\\.bjs$", fn)) {
288 var sp = dir.split("/");
290 for (var i = 0; i < sp.length; i++) {
295 sp = sp.splice(sp.length - (dp +1), (dp +1));
296 parent = sp.join('.');
299 if (typeof(_this.files[dir + '/' + fn]) != 'undefined') {
300 // we already have it..
301 _this.files[dir + '/' + fn].parent = parent;
306 JsRender.Base.factory(xt,this, dir + "/" + fn);
311 for (var i = 0; i < subs.length; i++) {
312 this.scanDir(subs[i], dp+1);