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