1 //<Script type="text/javascript">
4 GIRepository = imports.gi.GIRepository;
6 console = imports.console;
7 XObject = imports.XObject.XObject;
9 Base = imports.Builder.Provider.Palete.Base.Base;
10 File = imports.File.File;
11 //----------------------- our roo verison
20 // various loader methods..
35 var data = File.read(__script_path__ +'/../GtkUsage.txt');
37 data = data.split(/\n/g);
43 data.forEach( function(d) {
44 if (!d.length || d.match(/^\s+$/) || d.match(/^\s*\//)) { //empty
47 if (d.match(/^left:/)) {
60 if (d.match(/^right:/)) {
65 left.push(d.replace(/\s+/g, ''));
68 right.push(d.replace(/\s+/g, ''));
84 commentLoad : function(ns)
87 if (typeof(this.comments[ns]) != 'undefined') {
91 console.log("LOAD DOCS: " + ns);
92 var gi = GIRepository.IRepository.get_default();
93 var ver = gi.get_version(ns);
95 this.comments[ns] = {};
100 // no idea why this is broken on my build system.
101 function getAttribute(n, name){
102 var properties = n.properties;
104 if (properties.name == name)
105 return properties.children.content;
106 properties = properties.next
112 function walk(element, path) {
119 var n = getAttribute(element, 'name') ;
120 //console.log("WALK" + n);
121 if (element.name == 'signal') {
125 path += path.length ? '.' : '';
128 if (element.name == 'return-value') {
129 path += '.return-value';
134 var d = getAttribute(element,'doc');
136 // Seed.print(path + ':' + d);
140 var child = element.children;
143 //console.log(child.tag);
144 if (child.type == "element"){
151 var pth = GIRepository.IRepository.get_search_path ();
154 var gir_path = pth[0].replace(/lib\/girepository-1.0/, 'share\/gir-1.0');
158 var fn = gir_path + '/'+ ns + '-' + ver + '.gir';
161 if (!File.exists(fn)) {
162 console.log('missing docc file ' + fn);
163 this.comments[ns] = {};
167 var doc = xml.parseFile(fn);
168 //console.log("xmldoc?" + doc);
171 this.comments[ns] = ret;
177 doc : function(what) {
178 var ns = what.split('.').shift();
179 this.commentLoad(ns);
180 return typeof(this.comments[ns][what]) == 'undefined' ? '' : this.comments[ns][what];
183 getPropertiesFor: function(ename, type)
185 print("Loading for " + ename);
187 if (typeof(this.proplist[ename]) != 'undefined') {
188 return this.proplist[ename][type];
190 // use introspection to get lists..
191 var gi = GIRepository.IRepository.get_default();
192 var es = ename.split('.');
193 var bi = gi.find_by_name(es[0], es[1]);
196 print("COULND NOT FIND BY NAME");
199 var etype = GIRepository.base_info_get_type(bi);
200 var meth = etype == GIRepository.IInfoType.INTERFACE ?
202 'interface_info_get_n_properties',
203 'interface_info_get_property',
204 'interface_info_get_n_signals',
205 'interface_info_get_signal',
206 'interface_info_get_n_methods',
207 'interface_info_get_method'
209 'object_info_get_n_properties',
210 'object_info_get_property',
211 'object_info_get_n_signals',
212 'object_info_get_signal',
213 'object_info_get_n_methods',
214 'object_info_get_method'
218 this.proplist[ename] = {}
219 this.proplist[ename]['props'] = [];
220 this.proplist[ename]['events'] = [];
221 this.proplist[ename]['methods'] = [];
222 this.proplist[ename]['inherits']= [];
224 var plist = this.proplist[ename]['props'] ;
225 var elist = this.proplist[ename]['events'];
226 var mlist = this.proplist[ename]['methods'];
227 var ilist = this.proplist[ename]['inherits'];
235 // properties.. -- and parent ones...!!!
236 for (var i =0;i < GIRepository[meth[0]](bi); i++) {
237 var prop = GIRepository[meth[1]](bi, i);
238 var n_original = GIRepository.base_info_get_name(prop);
240 var flags = GIRepository.property_info_get_flags(prop); // check for readonly..
243 var ty = this.typeToName(GIRepository.property_info_get_type(prop));
244 print (n_original +":"+ ty);
249 name : n_original.replace(/\-/g, '_'),
251 desc : this.doc(ename + '.' + n_original),
263 for (var i =0;i < GIRepository[meth[2]](bi); i++) {
264 var prop = GIRepository[meth[3]](bi, i);
265 var n_original = GIRepository.base_info_get_name(prop);
266 // print ('signal: ' + n_original);
268 name : n_original.replace(/\-/g, '_'),
269 type : 'function', //???
270 desc : this.doc(ename + '.signal.' + n_original),
271 sig : this.genSkel(prop) // fixme..
277 for (var i =0;i < GIRepository[meth[4]](bi); i++) {
278 var prop = GIRepository[meth[5]](bi, i);
279 var n_original = GIRepository.base_info_get_name(prop);
280 var flags = GIRepository.function_info_get_flags (prop);
281 if (flags & GIRepository.IFunctionInfoFlags.IS_CONSTRUCTOR) {
284 if (!(flags & GIRepository.IFunctionInfoFlags.IS_METHOD)) {
287 // print ('signal: ' + n_original);
289 name : n_original.replace(/\-/g, '_'),
290 type : 'function', //???
291 desc : this.doc(ename + '.signal.' + n_original),
293 this.genParams(prop,add);
302 if (etype == GIRepository.IInfoType.INTERFACE ) {
307 var pi = GIRepository.object_info_get_parent(bi);
312 var pname = GIRepository.base_info_get_namespace(pi) + '.' +
313 GIRepository.base_info_get_name(pi);
314 this.getPropertiesFor(pname, 'props');
317 elist.push.apply(elist,this.proplist[pname]['events']);
318 plist.push.apply(plist,this.proplist[pname]['props']);
320 ilist.push.apply(ilist,this.proplist[pname]['inherits']);
321 this.overrides(this.proplist[pname]['methods'], mlist);
326 // implements needs to be more carefull as it could add dupes..
327 // use the parent implements list to ensure no dupes..
328 for(var i =0; i < GIRepository.object_info_get_n_interfaces(bi); i++) {
330 var prop = GIRepository.object_info_get_interface(bi,i);
331 var iface = GIRepository.base_info_get_namespace(prop) +'.'+
332 GIRepository.base_info_get_name(prop);
333 if ( ilist.indexOf(iface) > -1) {
336 this.getPropertiesFor(iface, 'props'); // just load one of them..
339 elist.push.apply(elist,this.proplist[iface]['events']);
340 plist.push.apply(plist,this.proplist[iface]['props']);
341 this.overrides(this.proplist[pname]['methods'], mlist);
343 function sfunc(a,b) {
344 if (a.name == b.name) return 0;
345 return a.name > b.name ? 1 : -1
351 return this.proplist[ename][type];
354 genParams: function(sig, meth)
358 meth.ret_type = this.typeToName(GIRepository.callable_info_get_return_type(sig));
359 // might be a numbeR??
361 for(var a_i =0; a_i < GIRepository.callable_info_get_n_args(sig); a_i++) {
362 var arg = GIRepository.callable_info_get_arg(sig, a_i);
365 name : GIRepository.base_info_get_name(arg),
366 type : this.typeToName(GIRepository.property_info_get_type(arg), true)
374 genSkel: function(sig) // should really use genParams...
378 var ret_type = this.typeToName(GIRepository.callable_info_get_return_type(sig));
379 // might be a numbeR??
380 if (ret_type == 'boolean') {
381 ret = " return false;\n";
383 for(var a_i =0; a_i < GIRepository.callable_info_get_n_args(sig); a_i++) {
384 var arg = GIRepository.callable_info_get_arg(sig, a_i);
386 args.push(GIRepository.base_info_get_name(arg));
388 return 'function (' + args.join(', ') + ") {\n" + ret + "}";
393 typeToName : function (type_info, allow_iface) // find type for properties or arguments.
395 var ty = GIRepository.type_tag_to_string( GIRepository.type_info_get_tag(type_info));
397 if ((ty == 'void') && GIRepository.type_info_is_pointer(type_info)) {
401 return false; // unspported
403 if (ty != 'interface') {
406 // we can accept enum types here..
407 var interface_info = GIRepository.type_info_get_interface (type_info);
408 var interface_type = GIRepository.base_info_get_type (interface_info);
410 if (!allow_iface && interface_type != GIRepository.IInfoType.ENUM) {
413 return GIRepository.base_info_get_namespace(interface_info) + '.' +
414 GIRepository.base_info_get_name(interface_info);
418 * merge two proprety arrays' ignoring what's overrriden.
423 overrides : function (top, bottom)
427 return top.every(function(t) {
428 if (t.name == b.name) {
433 bottom.forEach(function(e) {
445 findType : function (data, prop, value)
448 if ((prop == '|xns') || (prop == 'xtype')) {
452 var qname = this.guessName(data);
453 if (prop[0] == '|') {
454 prop= prop.substring(1);
457 var prs = this.getPropertiesFor(qname, 'props');
459 prs.forEach(function(e) {
463 if (e.name == prop) {
469 return Base.prototype.findType(data, prop,value);
476 findOptions : function(ename)
479 var es = ename.split('.');
481 return Base.prototype.findOptions(ename);
483 var gi = GIRepository.IRepository.get_default();
484 var bi = gi.find_by_name(es[0], es[1]);
485 var etype = GIRepository.base_info_get_type(bi);
486 if (etype != GIRepository.IInfoType.ENUM) {
487 console.log("Options not handled yet!!!");
491 // got an enum.. let's return the values..
492 for(var i =0; i < GIRepository.enum_info_get_n_values(bi); i++) {
494 var prop = GIRepository.enum_info_get_value(bi,i);
497 ret.push( ename + '.' + GIRepository.base_info_get_name(prop).toUpperCase() )
502 * determine the packing types..
504 getDefaultPack: function(pname, cname) {
505 var list = this.getPackingList(pname,cname);
507 if (!list.every(function(e) { return e.name =='add'; })) {
508 return 'add'; // add is in our list..?? what about args..?!?
512 e.params.forEach(function(p,i) {
513 if (ret === false) { return; } // skip broken..
514 if (i==0) { return; } // skip first..
515 if (p.type == 'boolean') {
519 if (p.type == 'number') {
523 ret = false; // invalid!
525 return ret === false ? false : ret.join(',');
528 list.every(function(e) {
530 if (packret !== false) {
535 // should we do best match..?
541 getPackingList :function (pname, cname)
543 var funcs = this.getPropertiesFor(pname,'methods');
546 // let's assume top down...
547 var inherits = [ cname ];
548 inherits.push.apply(inherits, this.getPropertiesFor(cname,'inherits'));
549 funcs.forEach(function(m) {
550 if (m.params.length && (typeof(m.params[0].type) == 'string') &&
551 inherits.indexOf(m.params[0].type) > -1) {