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     // fill in the added to list..
155     for(var p in methods ) {
156         var odata = methods[p];
157         
158         methods[p].can_be_added_to.forEach(function(c) {
159             methods[p].can_be_added_to_as[c]=c;
160             implementations[c].forEach(function(imp) {
161                 methods[p].can_be_added_to_as[imp]=c;
162             });
163         });
164         
165         
166     }
167     
168     // now do the reverese 'can be added to'
169     
170     
171     
172     this.methods = methods;
173     this.allmethods = methods;
174     this.implementations = implementations;
175     print(JSON.stringify(methods,null,4));
176     
177     //print(JSON.stringify(implementations ,null,4));
178     /*
179       methods is
180         [a class]
181             [has methods that use this object]
182                 [list of methods of the top class..]
183      
184      
185       So let's pick one..
186         TOP        ARRAY  2ND
187         Gtk.Button.add(Gtk.Widget) <<
188         
189         
190         What we need:
191         
192         A) what can this dragged element be dropped onto.
193         eg. list of parents.
194         
195         
196         
197         
198         B) what method is available when this object is dropped onto this one.
199         b
200         
201         
202      
203      
204     */
205     
206     
207     //print(JSON.stringify(implementations,null,4));
208     
209 }
210 BuildLists();
211
212 // we now have a list of classes / methods that can be used..
213 // we now need a ui to flag stuff as "don't bother with"
214
215