tools/build_gtk_tree.js
[app.Builder.js] / tools / build_gtk_tree.js
index c925e3b..91c5ddb 100644 (file)
@@ -37,11 +37,18 @@ NameSpace   = imports.Introspect.NameSpace.NameSpace;
 Link        = imports.Introspect.Link.Link; 
 
 
+Array.prototype.pushUnique = function(v) {
+    if (this.indexOf(v) < 0) {
+        this.push(v);
+    }
+}
 
 function BuildLists () {
  
+    
 
-    var ns_list = [ 'Gtk' ] ; //NameSpace.namespaces();
+    var ns_list = [ 'Gtk' , 'Gdk', 'Pango', 'GtkSource', 'WebKit', 'Vte'] ; //NameSpace.namespaces();
      
     ns_list = ns_list.sort();
     // let's try and load them, so we find out early what will fail.
@@ -62,7 +69,12 @@ function BuildLists () {
             classes[odata.alias] = odata;
         });
     });
-
+    //print(JSON.stringify(classes['Gtk.CellRenderer'] , null, 4));
+    //print(JSON.stringify(classes['Gtk.CellRenderer'].titleType, null, 4));
+    //print(JSON.stringify(classes['Gtk.CellRenderer'].childClasses, null, 4));
+    //print(JSON.stringify(classes['Gtk.CellRenderer'].implementedBy, null, 4));
+          
+    
 
     print("Looping throught namespaces");
     var ns_idx = [];
@@ -72,14 +84,19 @@ function BuildLists () {
     var allmethods = [];  
     
     for (cls in classes) {
-        
+        var odata = classes[cls];
+    
         methods[cls] = {
+            //titleType : odata.titleType,
+            extendsClasses : [],
             can_contain : [],
           //  can_be_added_to : [],
-            using_methods : { },
+            //using_methods : { },
             can_be_added_to_as : {}
         };
-        var odata = classes[cls];
+        odata.extendsClasses.forEach(function(child) {
+            methods[cls].extendsClasses.push(child.alias);
+        });
         
         implementations[odata.alias] = odata.titleType == 'Class' ? odata.childClasses :  odata.implementedBy;
         
@@ -87,10 +104,19 @@ function BuildLists () {
     for (cls in classes) {
         var odata = classes[cls];
         
+       
         
+        //print(cls);
         //print(JSON.stringify(odata.methods,null,4));
         odata.methods.forEach(function(m) {
-           
+            
+            
+            
+            
+             if (!m.name.match(/^(add|pack)/)) {
+                return;
+            }
+            //print(JSON.stringify(m,null,4));
             m.params.forEach(function(p) {
                  
                 if (!p.type || typeof(classes[p.type]) == 'undefined') {
@@ -104,31 +130,87 @@ function BuildLists () {
                 }
                 
                 
-                if (!m.name.match(/^(add|pack)/)) {
-                    return;
-                }
-                
+               
+                // in theory you can not add a window to anything.. ???
+                //if ('Gtk.Window' == addable_type || methods[addable_type].extendsClasses.indexOf('Gtk.Window') > -1) {
+                //    return;
+                //}
+        // 
+        
                 //print(full_method_name );
                 
                 //if (allmethods.indexOf(full_method_name) < 0) {
                 //    allmethods.push(full_method_name);
                 //}
-                if (methods[cls].can_contain.indexOf(addable_type) < 0) {
-                    methods[cls].can_contain.push(addable_type);
-                }
-                methods[cls].using_methods[m.name] = m.params;
+                
+                methods[cls].can_contain.pushUnique(addable_type);
+                
+                //methods[cls].using_methods[m.name] = m.params;
                 
                 //if (methods[addable_type].can_be_added_to.indexOf(cls) < 0) { 
                 //    methods[addable_type].can_be_added_to.push(cls);
                 //}
                 
+                
+                var add = m.memberOf +':'+ m.name;
+                
                 if (typeof(methods[addable_type].can_be_added_to_as[cls]) == 'undefined') {
                     methods[addable_type].can_be_added_to_as[cls]=[];
                 }
-                methods[addable_type].can_be_added_to_as[cls].push( {cls : m.name} );
+                methods[addable_type].can_be_added_to_as[cls].pushUnique( add );
                 implementations[cls].forEach(function(imp) {
-                    methods[addable_type].can_be_added_to_as[imp].push({ cls : m.name });
+                    
+                    
+                    if (typeof(methods[addable_type ].can_be_added_to_as[imp]) == 'undefined') {
+                        methods[addable_type].can_be_added_to_as[imp] = [];
+                    }
+                    
+                    methods[addable_type].can_be_added_to_as[imp].pushUnique(add);
+                     
+                    
                 });
+                // also needs to add
+                //print(addable_type);
+                //print(JSON.stringify(implementations[addable_type], null,4));
+                 
+                
+                implementations[addable_type].forEach(function(addable_child) {
+                    
+                    //if (addable_child == 'Gtk.AboutDialog') {
+                    //    print(JSON.stringify(methods[addable_child].extendsClasses,null,4));Seed.exit();
+                        
+                    //}
+                    
+                    if (addable_child == 'Gtk.Window' ||
+                            methods[addable_child].extendsClasses.indexOf('Gtk.Window') > -1) {
+                        return;
+                    }
+                    
+                    if (typeof(methods[addable_child].can_be_added_to_as[cls]) == 'undefined') {
+                        methods[addable_child].can_be_added_to_as[cls]=[];
+                    }
+                    methods[addable_child].can_be_added_to_as[cls].pushUnique( add );
+                    implementations[cls].forEach(function(imp) {
+                        if (typeof(methods[addable_child ].can_be_added_to_as[imp]) == 'undefined') {
+                            methods[addable_child].can_be_added_to_as[imp] = [];
+                        }
+                        
+                        methods[addable_child].can_be_added_to_as[imp].pushUnique(add);
+                         
+                        
+                    });
+                
+                  
+                    
+                });
+                
+                 
+                
+                
+                
+                
+                
+                
                 
                 return;
             /*
@@ -175,7 +257,88 @@ function BuildLists () {
     this.methods = methods;
     this.allmethods = methods;
     this.implementations = implementations;
-    print(JSON.stringify(methods,null,4));
+    //print(JSON.stringify(methods,null,4));
+    // dump out a usage file..
+    
+    // basically anything that is a Gtk.Container, should be available at the top.
+    /*
+left:
+ *top
+right:
+       Gtk.Window 
+       Gtk.Dialog
+       Gtk.MessageDialog
+       Gtk.AboutDialog
+       Gtk.Dialog
+       Gtk.FontSelectionDialog 
+       Gtk.InputDialog 
+       Gtk.ColorSelectionDialog 
+       Gtk.FileChooserDialog
+       Gtk.Menu
+       GtkClutter.Window
+       Gtk.OffScreenWindow
+    */
+// these should really be based on heirachy..
+    usage = {};
+    tops = {}
+    usage['*top'] = implementations['Gtk.Container'];
+    usage['*top'].forEach(function(ch) {
+        tops[ch] = [ '*top' ];
+    });
+    for(var cls in methods) {
+        if (cls =='Gtk.Builder') {
+            continue;
+        }
+        for (var par in methods[cls].can_be_added_to_as) {
+            
+            if (typeof(usage[par]) == 'undefined') {
+                usage[par] = [];
+            }
+            usage[par].pushUnique(cls);
+            if (typeof(tops[cls]) == 'undefined') {
+                tops[cls] = [];
+            }
+            tops[cls].pushUnique(par);
+        }
+    }
+    function canTop(cls, rec) {
+        
+        rec = rec || 0;
+        //print('CANTOP: ' + cls + ' =' + rec);
+        if (rec > 5) {
+       //     print('SKIP : ' + cls);
+        }
+        if (typeof(tops[cls]) == 'undefined') {
+            return false;
+        }
+        for (var i =0; i < tops[cls].length; i++) {
+            if (tops[cls][i] == '*top') {
+                return true;
+            }
+            if (cls == tops[cls][i]) {
+                continue;
+            }
+            if (canTop(tops[cls][i], rec+1)) {
+                return true;
+            }
+        }
+        return false;
+        
+    }
+    var nusage = {};
+    for(var par in usage) {
+        // see if the parent can be added to something.
+        if (!canTop(par)) {
+            continue;
+        }
+        nusage[par] = usage[par];
+        
+    }
+    
+    print(JSON.stringify(nusage,null,4));
+    
+    
+    
     
     //print(JSON.stringify(implementations ,null,4));
     /*