JsRender/Gtk.vala.c
[app.Builder.js] / Palete / Palete.vala
index 70b1db3..983fb17 100644 (file)
@@ -1,15 +1,51 @@
 
 namespace Palete 
 {
-    public errordomain Error {
-        INVALID_TYPE,
-        NEED_IMPLEMENTING
-    }
-    
+
+
+       public errordomain Error {
+               INVALID_TYPE,
+               NEED_IMPLEMENTING,
+               MISSING_FILE,
+               INVALID_VALUE
+       }
+
+       public class Usage : Object 
+       {
+               public Gee.ArrayList<string> left;
+               public Gee.ArrayList<string> right;
+               public Usage(Gee.ArrayList<string> ileft, Gee.ArrayList<string> iright)
+               {
+                       this.left = ileft;
+                       this.right=  iright;
+               }
+               public bool leftHas(string s)
+               {
+                       for(var i = 0 ; i < this.left.size; i++) {
+                               var m = this.left.get(i);
+                               if (s == m) {
+                                       return true;
+                               }
+                               if (!m.contains(":")) {
+                                       continue;
+                               }
+                               var ar = m.split(":");
+                               if (ar[0] == s) {
+                                       return true;
+                               }
+                       }
+                       return false;
+                               
+               }
+
+               
+       }
+
+       
 
     static Gee.HashMap<string,Palete>? cache = null;
     
-    public static   Palete factory(string xtype)
+    public static Palete factory(string xtype)
     {
         if (cache == null) {
             cache = new Gee.HashMap<string,Palete>();
@@ -21,25 +57,28 @@ namespace Palete
             case "Gtk":
                 cache.set(xtype, new Gtk());
                 break;
-            //case "Roo":
-            //    cache.set(xtype, new Roo());
+            case "Roo":
+                cache.set(xtype, new Roo());
                 break;
             default:
-                throw Error.INVALID_TYPE("invalid argument to Palete factory");
+                throw new Error.INVALID_TYPE("invalid argument to Palete factory");
         }
         return cache.get(xtype);
     }
        
 
-    public class Palete : Object 
+    public abstract class Palete : Object 
     {
         
        
         public string name;
-        
+
+       public Gee.ArrayList<Usage> map;
+               
         public Palete()
         {
             // nothing?
+               this.map = null;
         }
         
         
@@ -62,7 +101,7 @@ namespace Palete
          * 
          */
         /*
-        gatherList: function (existing) {
+        listChildren: function (existing) {
             existing = existing || [];
            // existing.push('*top'); // always have top
             var ret  = []; 
@@ -101,27 +140,92 @@ namespace Palete
             
             
         },
-        
-        getDropList : function(rval)
+        */
+       
+
+           
+       public string[] getChildList(string in_rval)
         {
+
+               if (this.map == null) {
+                       this.load();
+               }
+               // empty == *top
+               
+               var rval = in_rval == "" ? "*top" : in_rval; 
+                               
+                               // should be a bit more than this..
+                       // -> it should look for all elements that inherit 
+               string[] ret = {};
+               var rt = new Gee.ArrayList<string>();
+               for (var i = 0; i < this.map.size; i++) {
+                       var m = this.map.get(i);
+                               
+                       if (!m.leftHas(rval)) {
+                               continue;
+                       }
+                       print("found LEFT, adding right\n");
+               
+                       for(var ii =0; ii < m.right.size; ii++) {
+                               var l = m.right.get(ii);
+                                       
+                               if (rt.index_of(l) > -1) {
+                                   continue;
+                               }
+                               //print("ADD " + string.joinv(", ", ret) + "\n");
+                               ret += l;
+                               rt.add(l);
+                       }
+                               
+                
+               }
+               print ("drop list for %s is:\n%s\n", rval, string.joinv("\n", ret));
+               //console.log("DROP LIST:");
+               //console.dump(ret);
+               return ret;
             
-            var ret = [];
-            this.map.forEach( function(m) {
-                if (m.right.indexOf(rval) > -1) {
-                    m.left.forEach(function(l) {
-                        if (ret.indexOf(l) > -1) {
-                            return;
-                        }
-                        ret.push(l)
-                    });
-                }
+        }
+
+           
+        public string[] getDropList(string rval)
+        {
+
+               if (this.map == null) {
+                       this.load();
+               }
+
+                               
+                               // should be a bit more than this..
+                       // -> it should look for all elements that inherit 
+               string[] ret = {};
+               var rt = new Gee.ArrayList<string>();
+               for (var i = 0; i < this.map.size; i++) {
+                       var m = this.map.get(i);
+                               
+                       if (m.right.index_of(rval) < 0) {
+                               continue;
+                       }
+                       //print("found RIGHT, adding left\n");
+               
+                       for(var ii =0; ii < m.left.size; ii++) {
+                               var l = m.left.get(ii);
+                                       
+                               if (rt.index_of(l) > -1) {
+                                   continue;
+                               }
+                               //print("ADD " + string.joinv(", ", ret) + "\n");
+                               ret += l;
+                               rt.add(l);
+                       }
+                               
                 
-            });
-            console.log("DROP LIST:");
-            console.dump(ret);
-            return ret;
+               }
+                print ("drop list for %s is:\n%s\n", rval, string.joinv("\n", ret));
+               //console.log("DROP LIST:");
+               //console.dump(ret);
+               return ret;
             
-        },
+        }
         /**
          * basic guess type.. 
          * 
@@ -161,58 +265,170 @@ namespace Palete
         getDefaultPack: function(pname, cname) {
             return 'add';
         },
-        saveTemplate: function(name, data)
+       */
+        public void saveTemplate (string name, JsRender.Node data)
         {
-            var gn = this.guessName(JSON.parse(data));
+
+                       var gn = data.fqn();
             // store it in user's directory..
-            var appdir = GLib.get_home_dir() + '/.Builder'; 
-            
-            if (!File.isDirectory(appdir+ '/' + gn)) {
-                File.mkdir(appdir+ '/' + gn);
+            var appdir =  GLib.Environment.get_home_dir() + "/.Builder"; 
+
+                       
+            if (!GLib.FileUtils.test(appdir+ "/" + gn, GLib.FileTest.IS_DIR)) {
+                               GLib.File.new_for_path (appdir+ "/" + gn).make_directory ();
+                               
             }
-            File.write(appdir+ '/' + gn + '/' +  name + '.json', data);
+            GLib.FileUtils.set_contents(appdir+ "/" + gn + "/" +  name + ".json", data.toJsonString());
             
-        },
+        }
+       
         /**
          * list templates - in home directory (and app dir in future...)
          * @param {String} name  - eg. Gtk.Window..
          * @return {Array} list of templates available..
-         * /
-        listTemplates : function(name)
+         */
+         
+        public  GLib.List<string> listTemplates (JsRender.Node node)
         {
             
-            var gn = name;
-            if (typeof(gn) != 'string') {
-                gn = this.guessName(gn);
-            }
-            
+               var gn = node.fqn();
             
-            var dir= GLib.get_home_dir() + '/.Builder/' + gn; 
-            if (!File.isDirectory(dir)) {
-                return [];
+               var ret = new GLib.List<string>();
+               var dir= GLib.Environment.get_home_dir() + "/.Builder/" + gn;
+               if (!GLib.FileUtils.test(dir, GLib.FileTest.IS_DIR)) {
+                       return ret;
+               }
+                       
+
+
+                                   
+               var f = File.new_for_path(dir);
+        
+            var file_enum = f.enumerate_children(GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null);
+             
+            FileInfo next_file; 
+            while ((next_file = file_enum.next_file(null)) != null) {
+                var n = next_file.get_display_name();
+                       if (!Regex.match_simple ("\\.json$", n)) {
+                                       continue;
+                               }
+                               ret.append( dir + "/" + n);
             }
-            var ret =  [];
-            File.list(dir).forEach(function(n) {
-                if (!n.match(/\.json$/)) {
-                    return;
-                }
-                
-                ret.push({
-                    path : dir + '/' + n,
-                    name:  n.replace(/\.json$/,'')
-                });
-            });
             return ret;
             
-        },
-        loadTemplate : function(path)
+        }
+        public JsRender.Node? loadTemplate(string path)
         {
-            return JSON.parse(File.read(path));
+
+               var pa = new Json.Parser();
+               pa.load_from_file(path);
+               var node = pa.get_root();
+
+               if (node.get_node_type () != Json.NodeType.OBJECT) {
+                       return null;
+               }
+               var obj = node.get_object ();
+
+               var ret = new JsRender.Node();
+
+
+               ret.loadFromJson(obj, 1);
+               ret.ref(); // not sure if needed -- but we had a case where ret became uninitialized?
+               
+               return ret;
+        }
+          public   void  loadUsageFile (string fname) {
+
+
+
+                       
+               print("Palete Load called\n");
+               string raw;
+               if (!FileUtils.test (fname, FileTest.EXISTS)) {
+                       throw new Error.MISSING_FILE(fname + " not found");
+               }
+       
+               FileUtils.get_contents(fname, out raw);
+             // print(data);
+               var data  = raw.split("\n");
+               var state = 0;
+               var cfg = new Gee.ArrayList<Usage>();
+               var left = new Gee.ArrayList<string>();
+               var right = new Gee.ArrayList<string>();
+       
+               for (var i = 0; i < data.length; i++) {
+                       var d = data[i].strip();
+                       //print("READ " + d + "\n");
+                       if (
+                               d.length < 1
+                           ||
+                            Regex.match_simple ("^\\s+$", d)
+                           ||
+                               Regex.match_simple ("^\\s*/", d)
+                    ){
+                           continue;
+                       }
+                               
+                       if (Regex.match_simple ("^left:", d)) { 
+                           state = 1;
+                           if (left.size > 0 ){
+                               cfg.add(new Usage( left, right));
+                                               }
+                           left = new Gee.ArrayList<string>();
+                                       right = new Gee.ArrayList<string>();
+                           continue;
+                       }
+                        if (Regex.match_simple ("^right:", d)) { 
+                           state = 2;
+                           continue;
+                       }
+                       if (state == 1) {
+                                               //print("add left: " + d + "\n");
+                           left.add(d);
+                           continue;
+                       }
+                                       //print("add Right: " + d + "\n");
+                       right.add(d);
+                       //Seed.quit();
+                      
+               }
+               if (left.size > 0 ){
+                       cfg.add(new Usage( left, right));
+               }
+               this.map = cfg;
+
         }
-    */        
-        
+
+       
+           
+       public string validateCode(string code, string language) 
+       {   
+
+               print("validate code (%s) %s\n", language, code);
+               if (language == "javascript") {
+                       //var cd = new JSCore.ClassDefinitionEmpty();
+                       string res;
+//                     var ret = Javascript.singleton().validate(code, out res);
+//                     print ("ret = %s\n%s" , ret ? "OK" : "BAD", res);
+                       
+                       return "";
+               }
+
+               print ("not javascript\n");
+               return "";
+
+       }
+
+           
+          
+        public abstract void fillPack(JsRender.Node node,JsRender.Node parent);
+       public abstract void load();
+       public abstract Gee.HashMap<string,GirObject> getPropertiesFor(string ename, string type);
+       public abstract GirObject? getClass(string ename);
     }
 
+
 }