tools/build_gtk_tree.js
[app.Builder.js] / tools / build_gtk_tree.js
1 //<script type="text/javascript">
2
3
4 /**
5  * usage:
6  * 
7  * this.data = new BuildLists();
8  * 
9  * 
10  * 
11  * 
12  * 
13  */
14 // see if we can build the insertion tree for gtk - using introspection
15
16 // it should build the tree of feasible insertions, then we will have to manually prune it..
17
18 // it needs to know
19 // a) what the inherited types are
20 // b) what methods are available for each type, that include a reference to another type..
21
22 // let's start with types.. 
23 GIRepository = imports.gi.GIRepository;
24 GLib        = imports.gi.GLib;
25
26 // we add this in, as it appears to get lost sometimes if we set it using the ENV. variable in builder.sh
27 //GIRepository.Repository.prepend_search_path(GLib.get_home_dir() + '/.Builder/girepository-1.1');
28
29
30 imports.searchPath.push('../../gnome.introspection-doc-generator');
31
32 XObject     = imports.XObject.XObject;
33 File        = imports.File.File; 
34  
35 // Introspecion specific..
36 NameSpace   = imports.Introspect.NameSpace.NameSpace; 
37 Link        = imports.Introspect.Link.Link; 
38
39
40
41 function BuildLists () {
42  
43
44     var ns_list = [ 'Gtk' ] ; //NameSpace.namespaces();
45      
46     ns_list = ns_list.sort();
47     // let's try and load them, so we find out early what will fail.
48     print("loading library to make sure it works.");
49
50     var classes = {};
51
52     ns_list.forEach(function(ns_name) {   
53         var  core = imports.gi[ns_name];
54         var ns = NameSpace.ns(ns_name); // fetch all the elements in namespace...
55         ns['objects'].forEach( function(n) {
56             var odata = NameSpace.factory('Class', ns_name, n);
57             classes[odata.alias] = odata;
58             
59         });
60         ns['interfaces'].forEach( function(n) {
61              var odata =NameSpace.factory('Interface', ns_name, n);
62             classes[odata.alias] = odata;
63         });
64     });
65
66
67     print("Looping throught namespaces");
68     var ns_idx = [];
69     var implementations = {};
70     
71     var methods = {};
72     var allmethods = [];  
73     
74     for (cls in classes) {
75         
76         methods[cls] = {
77             can_contain : [],
78             can_be_added_to : [],
79             using_methods : { },
80             can_be_added_to_as : {}
81         };
82         var odata = classes[cls];
83         
84         implementations[odata.alias] = odata.titleType == 'Class' ? odata.childClasses :  odata.implementedBy;
85         
86     }
87     for (cls in classes) {
88         var odata = classes[cls];
89         
90         
91         //print(JSON.stringify(odata.methods,null,4));
92         odata.methods.forEach(function(m) {
93            
94             m.params.forEach(function(p) {
95                  
96                 if (!p.type || typeof(classes[p.type]) == 'undefined') {
97                     return;
98                 }
99                 // now add it..
100                 //print(JSON.stringify(p));Seed.exit();
101                 var addable_type = p.type;
102                 if (addable_type.indexOf('.') < 0) {
103                     addable_type = p.memberOf + '.' + p.type;
104                 }
105                 
106                 
107                 if (!m.name.match(/^(add|pack)/)) {
108                     return;
109                 }
110                 
111                 //print(full_method_name );
112                 
113                 //if (allmethods.indexOf(full_method_name) < 0) {
114                 //    allmethods.push(full_method_name);
115                 //}
116                 if (methods[cls].can_contain.indexOf(addable_type) < 0) {
117                     methods[cls].can_contain.push(addable_type);
118                 }
119                 methods[cls].using_methods[m.name] = m.params;
120                 
121                 if (methods[addable_type].can_be_added_to.indexOf(cls) < 0) { 
122                     methods[addable_type].can_be_added_to.push(cls);
123                 }
124                 
125                 
126                 methods[addable_type].can_be_added_to_as[cls]=cls;
127                 implementations[cls].forEach(function(imp) {
128                     methods[addable_type].can_be_added_to_as[imp]=c;
129                 });
130                 
131                 return;
132             /*
133                     methods[cls].using_methods[m.name] = {};
134                 }
135                 
136                 
137                 if (typeof(methods[cls][full_method_name]) == 'undefined') {
138                     methods[cls][full_method_name] = [];
139                 }
140                 if (methods[cls][full_method_name].indexOf(m.name) > -1) {
141                     return;
142                 }
143                 methods[cls][full_method_name].push(m.name);
144             */  
145             });
146             
147         });
148         //for(method in odata.methods) {
149         //    print(method.name);
150         //}
151         
152         
153     }
154     /*
155     // fill in the added to list..
156     for(var p in methods ) {
157         var odata = methods[p];
158         
159         methods[p].can_be_added_to.forEach(function(c) {
160             methods[p].can_be_added_to_as[c]=c;
161             implementations[c].forEach(function(imp) {
162                 methods[p].can_be_added_to_as[imp]=c;
163             });
164         });
165         
166         
167     }
168     */
169     // now do the reverese 'can be added to'
170     
171     
172     
173     this.methods = methods;
174     this.allmethods = methods;
175     this.implementations = implementations;
176     print(JSON.stringify(methods,null,4));
177     
178     //print(JSON.stringify(implementations ,null,4));
179     /*
180       methods is
181         [a class]
182             [has methods that use this object]
183                 [list of methods of the top class..]
184      
185      
186       So let's pick one..
187         TOP        ARRAY  2ND
188         Gtk.Button.add(Gtk.Widget) <<
189         
190         
191         What we need:
192         
193         A) what can this dragged element be dropped onto.
194         eg. list of parents.
195         
196         
197         
198         
199         B) what method is available when this object is dropped onto this one.
200         b
201         
202         
203      
204      
205     */
206     
207     
208     //print(JSON.stringify(implementations,null,4));
209     
210 }
211 BuildLists();
212
213 // we now have a list of classes / methods that can be used..
214 // we now need a ui to flag stuff as "don't bother with"
215
216