Builder/Provider/File/Base.js
[app.Builder.js] / Builder / Provider / File / Base.js
1 //<Script type="text/javascript">
2
3 console = imports.console;
4 XObject = imports.XObject.XObject;
5
6 Lang = imports.Builder.Provider.File.Lang.Lang;
7
8 File = imports.File.File;
9 // File Provider..
10
11 Base = XObject.define(
12     
13     function(cfg) {
14     
15         XObject.extend(this, cfg);
16     },
17     Object,
18     {
19         
20         id : false,
21         name : false,   // is the JS name of the file.
22         path : '',      // is the full path to the file.
23         parent : false, // JS parent.
24         
25         title : false,  // a title.. ?? nickname.. ??? - 
26         project: false, // name...
27         Project : false, // link to container project!
28         
29         items : false, // the tree of nodes.
30         
31         cn : false, // array used by project tree.
32         
33         
34         save : function()
35         {
36             var write = { }; 
37             var _this = this;
38             var write = this.toJsonArray()
39             print("WRITE: " + this.path);// + "\n" + JSON.stringify(write));
40             File.write(this.path, JSON.stringify(write));
41         },
42         
43         /**
44          * accepts:
45          * { success : , failure : , scope : }
46          * 
47          * 
48          * 
49          */
50          
51         getTree : function( o ) {
52             console.log("File.getTree tree called on base object?!?!");
53         },
54         toJsonArray : function()
55         {
56             var ret = { }; 
57             var _this = this;
58             ['id', 'name', 'parent', 'title', 'path', 'items'].forEach( function(k) {
59                 ret[k] = _this[k];
60             });
61             return ret;
62         },
63         getTitle : function()
64         {
65             if (this.title) {
66                 return this.title;
67             }
68             return this.path.split('/').pop();
69             
70         },
71         getTitleTip: function()
72         {
73             if (this.title) {
74                 return '<b>' + this.title + '</b> ' + this.path;
75             }
76             return this.path;
77         },
78         sortCn: function()
79         {
80             this.cn.sort(function(a,b) {
81                 return a.path > b.path;// ? 1 : -1;
82             });
83         },
84         // should be in palete provider really..
85         
86         guessName : function(ar) // turns the object into full name.
87         {
88              // eg. xns: Roo, xtype: XXX -> Roo.xxx
89             if (typeof( ar['|xns'] ) == 'undefined' || typeof( ar['xtype'] ) == 'undefined') {
90                 return '';
91                }
92              
93             return ar['|xns'] +'.' + ar['xtype'];
94                             
95                                  
96         },
97         
98         /*
99         Roo specific?
100         toSourceStdClass: function()
101         {
102             var cfg = this.items[0]
103             var fcfg = XObject.extend({ },  this.items[0]);
104             delete fcfg['*class'];
105             delete fcfg['*extends'];
106             delete fcfg['*static'];
107             delete fcfg['|constructor'];
108             
109             var hasExtends = (typeof(cfg['*extends']) != 'undefined') && cfg['*extends'].length;
110             var hasConstructor = (typeof(cfg['|constructor']) != 'undefined');
111             var isStatic = (typeof(cfg['*static']) == '*static');
112             
113             var newline = '';
114             var endline = '';
115             if (hasExtends) {
116                 newline =  hasConstructor ? 
117                 
118                  
119                     cfg['//constructor'] + "\n" + 
120                     cfg['*class'] + " = " + cfg['|constructor'] + "\n\n"+ 
121                     "Roo.extend(" + cfg['*class'] + ":, " + cfg['*extends'] + ", " :
122                     
123                     cfg['//*class'] + "\n" + 
124                     cfg['*class'] + " = new " + cfg['*extends'] + "(" ;
125                 
126                 endline = ');';
127             } else {
128                 
129                 
130                 
131                 newline  = hasConstructor ? 
132                 
133                     cfg['//constructor'] + "\n" + 
134                     cfg['*class'] + " = " + cfg['|constructor'] + "\n\n"+ 
135                     'Roo.apply( ' +  cfg['*class'] + ".prototype , " :
136                     
137                     cfg['//*class'] + "\n" + 
138                     cfg['*class'] + " = ";
139                 
140                     
141                 endline = hasConstructor ? ');' : ';';
142             }
143                   
144             return this.outputHeader() + 
145                     newline + 
146                     this.objectToJsString(fcfg,1) +
147                     endline;
148             
149             
150             
151          
152         },
153         */
154         
155         copyTo: function(path, cb)
156         {
157             var _this = this;
158             this.loadItems(function() {
159                 
160                 _this.path = path;
161                 cb();
162             });
163             
164         },
165         
166         
167         
168         
169         mungeToString:  function(obj, isListener, pad)
170         {
171             pad = pad || '';
172             var keys = [];
173             var isArray = false;
174             isListener = isListener || false;
175              
176             // am I munging a object or array...
177             if (obj.constructor.toString() === Array.toString()) {
178                 for (var i= 0; i < obj.length; i++) {
179                     keys.push(i);
180                 }
181                 isArray = true;
182             } else {
183                 for (var i in obj) {
184                     keys.push(i);
185                 }
186             }
187             
188             
189             var els = []; 
190             var skip = [];
191             if (!isArray && 
192                     typeof(obj['|xns']) != 'undefined' &&
193                     typeof(obj['xtype']) != 'undefined'
194                 ) {
195                     els.push('xtype: '+ obj['|xns'] + '.' + obj['xtype']);
196                     skip.push('|xns','xtype');
197                 }
198             
199             var _this = this;
200             
201             
202             
203             keys.forEach(function(i) {
204                 var el = obj[i];
205                 if (!isArray && skip.indexOf(i) > -1) { // things we do not write..
206                     return;
207                 }
208                 
209                 if (isListener) {
210                     if (!_this.withDebug) {
211                         // do not write listeners unless we are debug mode.
212                         return;
213                     }
214                     //if (obj[i].match(new RegExp("Gtk.main" + "_quit"))) { // we can not handle this very well..
215                     //    return;
216                    // }
217                     var str= ('' + obj[i]).replace(/^\s+|\s+$/g,"");
218                     var lines = str.split("\n");
219                     if (lines.length > 1) {
220                         str = lines.join("\n" + pad);
221                     }
222                     els.push(JSON.stringify(i) + ":" + str);
223                     return;
224                 }
225                 
226                 
227                 
228                 var left = isArray ? '' : (JSON.stringify(i) + " : " )
229                 
230                 if (i[0] == '|') {
231                     // does not hapepnd with arrays..
232                     if (typeof(el) == 'string' && !obj[i].length) { //skip empty.
233                         return;
234                     }
235                     // this needs to go...
236                     //if (typeof(el) == 'string'  && obj[i].match(new RegExp("Gtk.main" + "_quit"))) { // we can not handle this very well..
237                     //    return;
238                     //}
239                     
240                     var str= ('' + obj[i]).replace(/^\s+|\s+$/g,"");;
241                     var lines = str.split("\n");
242                     if (lines.length > 1) {
243                         str = lines.join("\n" + pad);
244                     }
245                     
246                     els.push(left + str);
247                     return;
248                 }
249                 
250                 
251                 
252                 
253                 if (typeof(el) == 'object') {
254                     els.push(left + _this.mungeToString(el, i == 'listeners', pad + '    '));
255                     return;
256                 }
257                 // standard. .
258                 
259                 els.push(left + JSON.stringify(obj[i]));
260             });
261             var spad = pad.substring(0, pad.length-4);
262             return (isArray ? '[' : '{') + "\n" +
263                 pad  + els.join(",\n" + pad ) + 
264                 "\n" + spad + (isArray ? ']' : '}');
265                
266             
267             
268         },
269         
270         
271           
272         
273         objectToJsString : function (o, ind) 
274         {
275             ind = ind || 0;
276             
277             
278             var ret = '';
279             var ix = new Array(ind+1).join("    ");
280             var ix1 = new Array(ind).join("    ");
281             for (var k in o) {
282                 var v = o[k];
283                 if (k[0] == '+') { // + means  hide from renderer.. we do not save this.
284                     continue;
285                 }
286                 if (k[0] == '/') { //  means  hide from renderer.. we prefix the col with it..
287                     continue;
288                 }
289             
290                 
291                 if (typeof(v) == 'object') {
292                     
293                     if ((v.constructor != Array) && !this.objectKeys(v).length) {
294                         continue;
295                     }
296                     if ((v.constructor == Array) && !v.length && k == 'items') {
297                         continue;
298                     }   
299                 }
300                 ret += ret.length ? ",\n" : '';
301                 
302                 var kk = k[0] == '|' ? k.substring(1) : k;
303                 if (typeof(o['//' + kk]) != 'undefined') {
304                     ret += ix + o['//' + kk].split("\n").join( "\n" + ix) + "\n";
305                 }
306                 
307                 switch(typeof(v)) {
308                     case 'object': 
309                         if (v.constructor == Array) {
310                             ret += ix + this.toJsProp(k) +  ' : ' + this.arrayToJsString(v, ind+1);
311                             continue;
312                         }
313                     
314                     
315                         ret += ix + this.toJsProp(k) +  ' : ' + this.objectToJsString(v, ind+1);
316                         continue;
317                     
318                     case 'boolean' : 
319                         ret += ix + this.toJsProp(k) +  ' : ' +  (v ? 'true' : 'false');
320                         continue;
321                     
322                     case 'number' : 
323                         ret += ix + this.toJsProp(k) +  ' : ' +  v;
324                         continue;
325                         
326                     
327                     case 'string': 
328                         if (k[0] == '|') {
329                             ret += ix + this.toJsProp(k) +  ' : ' +  v.split("\n").join( "\n" + ix);
330                             continue;
331                         }
332                         // fallthru
333                     
334                     default:
335                         // we should use special stuff here to determine if it's a singly or dobuley 
336                         // quoted string..
337                         ret += ix + this.toJsProp(k) +  ' : ' +  this.stringToJsString(v, k, o);
338                         continue;
339                         
340                      
341                     }
342             }
343             return "{\n" + ret + "\n" + ix1 + '}'; 
344             
345         },
346         arrayToJsString : function (ar, ind)
347         {
348             var isobjar = false;
349             ar.forEach( function(o) {
350                 if (typeof(o) == 'object' && (o.constructor != Array)) {
351                     isobjar = true;
352                 }
353             });
354             var ix = '';
355             var ix1 = '';
356             var cr = ', ';
357             var lb = ' ';
358             if (isobjar) {
359                 ix = new Array(ind+1).join("    ");
360                 ix1 = new Array(ind).join("    ");
361                 cr = ",\n";
362                 lb = "\n";
363                  
364             }
365             // array of parts...
366             var ret =  '';
367             var _this = this;
368             ar.forEach( function(v, n) {
369                 // skip blank last element in an array
370                 if ((n == (ar.length -1))  && typeof(v) == 'undefined') {
371                     return;
372                 }
373                 
374                 // empty objects in array?
375                 if (typeof(v) == 'object' && v.constructor != Array) {
376                     if (!_this.objectKeys(v).length) {
377                         return;
378                     }
379                 }
380                     
381                 
382                 ret += ret.length ? cr : '';
383                 
384                 switch(typeof(v)) {
385                 
386                     case 'object': 
387                         if (v.constructor == Array) {
388                             
389                             ret += ix + _this.arrayToJsString(v, ind+1);
390                             return;
391                         }
392                     
393                         ret += ix + _this.objectToJsString(v, ind+1);
394                         return;
395                     
396                     case 'boolean' : 
397                         ret += ix +  (v ? 'true' : 'false');
398                         return;
399                     
400                     case 'number' : 
401                         ret += ix +  v;
402                         return;
403                         
404                     
405                     case 'string': 
406                         if (k[0] == '|') {
407                             ret += ix + v.split("\n").join( "\n" + ix);
408                             return;
409                         }
410                         // fallthru
411                     
412                     default:
413                         // we should use special stuff here to determine if it's a singly or dobuley 
414                         // quoted string..
415                         ret += ix + JSON.stringify(v);
416                         return;
417                         
418                  
419                 }
420                  
421             });
422             return "[" + lb  + ret + lb + ix1 + "]";
423             
424         },
425         stringToJsString :  function(v, k , o) {
426             // since most properties can use single quotes (non-translatable)
427             // we try to fix this here..
428             var val = JSON.stringify(v);
429             if (['xns', 'xtype'   ].indexOf(k) > -1) {
430                 return "'" + val.substring(1, val.length-1).replace(/'/, "\\'") + "'";
431             }
432             return val;
433             
434             
435         },
436         
437         
438         toJsProp:  function(v) {
439             var vv = v[0] == '|' ? v.substring(1) : v;
440             if (Lang.isKeyword(vv) || Lang.isBuiltin(vv)) {
441                 return "'" + vv + "'";
442             }
443             if (vv.match(/[^A-Z_]+/i)) {
444                 var val = JSON.stringify(vv);
445                 return "'" + val.substring(1, val.length-1).replace(/'/, "\\'") + "'";
446             }
447             return vv;
448         }
449         
450         
451     }
452 );
453
454
455
456
457
458