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                 
127                 
128                 return;
129             /*
130                     methods[cls].using_methods[m.name] = {};
131                 }
132                 
133                 
134                 if (typeof(methods[cls][full_method_name]) == 'undefined') {
135                     methods[cls][full_method_name] = [];
136                 }
137                 if (methods[cls][full_method_name].indexOf(m.name) > -1) {
138                     return;
139                 }
140                 methods[cls][full_method_name].push(m.name);
141             */  
142             });
143             
144         });
145         //for(method in odata.methods) {
146         //    print(method.name);
147         //}
148         
149         
150     }
151     // fill in the added to list..
152     for(var p in methods ) {
153         var odata = methods[p];
154         
155         methods[p].can_be_added_to.forEach(function(c) {
156             methods[p].can_be_added_to_as[c]=c;
157             implementations[c].forEach(function(imp) {
158                 methods[p].can_be_added_to_as[c]=imp;
159             });
160         });
161         
162         
163     }
164     
165     // now do the reverese 'can be added to'
166     
167     
168     
169     this.methods = methods;
170     this.allmethods = methods;
171     this.implementations = implementations;
172     print(JSON.stringify(methods,null,4));
173     
174     //print(JSON.stringify(implementations ,null,4));
175     /*
176       methods is
177         [a class]
178             [has methods that use this object]
179                 [list of methods of the top class..]
180      
181      
182       So let's pick one..
183         TOP        ARRAY  2ND
184         Gtk.Button.add(Gtk.Widget) <<
185         
186         
187         What we need:
188         
189         A) what can this dragged element be dropped onto.
190         eg. list of parents.
191         
192         
193         
194         
195         B) what method is available when this object is dropped onto this one.
196         b
197         
198         
199      
200      
201     */
202     
203     
204     //print(JSON.stringify(implementations,null,4));
205     
206 }
207 BuildLists();
208
209 // we now have a list of classes / methods that can be used..
210 // we now need a ui to flag stuff as "don't bother with"
211
212