Test.GtkWriter.vala.c
[app.Builder.js] / JsRender / Node.vala
index 23483c1..5b8daae 100644 (file)
@@ -4,20 +4,23 @@
 
 public class JsRender.Node  {
     
-    GLib.List<Node> items; // child items..
-    
-    Gee.HashMap<string,string> props; // the properties..
-    
-  
+    public GLib.List<Node> items; // child items..
     
+    public Gee.HashMap<string,string> props; // the properties..
+    public Gee.HashMap<string,string> listeners; // the listeners..
+    public string  xvala_cls;
+       public string xvala_xcls; // 'Xcls_' + id;
+    public string xvala_id; // item id or ""
+            
     public bool is_array;
     
-    Node()
+    public Node()
     {
         this.items = new GLib.List<Node>();
         this.props = new Gee.HashMap<string,string>();
+               this.listeners = new Gee.HashMap<string,string>();
         this.is_array = false;
-        
+        this.xvala_xcls = "";
     }
     
     
@@ -39,20 +42,58 @@ public class JsRender.Node  {
         }
         return false;
     }
+       public string fqn()
+       {
+               if (!this.hasXnsType ()) {
+                       return "";
+               }
+               return this.props.get("|xns") + "." + this.props.get("xtype"); 
+
+       }
+       
     // wrapper around get props that returns empty string if not found.
     public string get(string key)
     {
         var k = this.props.get(key);
-        if (k == null) {
-            return "";
-        }
-        return k;
+        if (k != null) {
+                       return k;
+               }
+               
+               k = this.props.get("|" + key);
+               if (k != null) {
+                       
+               return k;
+               }
+        
+        return "";
         
     }
      
     /* creates javascript based on the rules */
-    
-  
+    public Node? findProp(string n) {
+               for(var i=0;i< this.items.length();i++) {
+                       var p = this.items.nth_data(i).get("*prop");
+                       if (this.items.nth_data(i).get("*prop").length < 1) {
+                               continue;
+                       }
+                       if (p == n) {
+                               return this.items.nth_data(i);
+                       }
+               }
+               return null;
+
+       }
+
+       string gLibStringListJoin( string sep, GLib.List<string> ar) 
+       {
+               var ret = "";
+               for (var i = 0; i < ar.length(); i++) {
+                       ret += i>0 ? sep : "";
+                       ret += ar.nth_data(i);
+               }
+               return ret;
+
+       }
     
     public string mungeToString (bool isListener, string pad,  GLib.List<string> doubleStringProps)
     {
@@ -142,7 +183,7 @@ public class JsRender.Node  {
             }
             var spad = pad.substring(0, pad.length-4);
             return   "{\n" +
-                pad  + string.join(",\n" + pad , els) + 
+                pad  + this.gLibStringListJoin(",\n" + pad , els) + 
                 "\n" + spad +  "}";
                
             
@@ -192,18 +233,19 @@ public class JsRender.Node  {
             
             if (isListener) {
             // change the lines...
-                            
-                string str;
+                /*           
+                string str = "";
                 try {
                     str = func_regex.replace(v,v.length, 0, "");
                 } catch(Error e) {
                     print("regex failed");
                     return "";
                 }
-                
+                */
+                               var str = v.strip();
                 var lines = str.split("\n");
-                if (lines.length > 1) {
-                    str = string.join("\n" + pad, lines);
+                if (lines.length > 0) {
+                    str = string.joinv("\n" + pad, lines);
                 }
                 
                 els.append(left  + str);
@@ -216,20 +258,24 @@ public class JsRender.Node  {
                 if (v.length < 1) {  //if (typeof(el) == 'string' && !obj[i].length) { //skip empty.
                     continue;
                 }
-                
-                string str;
+                               /*
+                       print(v);
+                string str = "";
                 try {
                     str = func_regex.replace(v,v.length, 0, "");
                 } catch(Error e) {
                     print("regex failed");
                     return "";
                 }
-                
+                */
+                var str = v.strip();
+                                 
                 var lines = str.split("\n");
-                if (lines.length > 1) {
-                    str =  string.join("\n" + pad, lines);
+                                 
+                if (lines.length > 0) {
+                    str =  string.joinv("\n" + pad, lines);
                 }
-                
+                //print("==> " +  str + "\n");
                 els.append(left + str);
                 continue;
             }
@@ -286,6 +332,64 @@ public class JsRender.Node  {
         
             
         }
+
+
+               if (this.listeners.size > 0) {
+                       // munge the listeners.
+                       //print("ADDING listeners?");
+                       
+                       var liter = this.listeners.map_iterator();
+               
+                   var itms = "listeners : {\n";
+                       var i =0;
+                   while (liter.next()) {
+                               
+                               itms += i >0 ? ",\n" : "";    
+                               // 
+                               var str = liter.get_value().strip();
+                var lines = str.split("\n");
+                if (lines.length > 0) {
+                    str = string.joinv("\n" + pad + "       ", lines);
+                }
+                
+
+                               
+                               itms +=  pad + "    "  + liter.get_key()  + " : " + str;
+
+                               i++;
+                       
+                               
+                       }
+                       itms += "\n" + pad + "}";
+                       //print ( "ADD " + itms); 
+                       els.append(itms);
+
+               }
+
+
+               
+               // finally munge the children...
+               if (this.items.length()> 0) {
+                       var itms = "items : [\n";
+                       for(var i = 0; i < this.items.length();i++) {
+                               // 
+                               itms +=    pad + "    "  +
+                                       this.items.nth_data(i).mungeToString(false, pad + "        ",  doubleStringProps) + "\n";
+
+
+                       }
+                       
+                       els.append(itms);
+               }
+
+               // finally output listeners...
+               
+
+               
+
+
+
+                       
         if (els.length() < 1) {
             return "";
         }
@@ -293,7 +397,7 @@ public class JsRender.Node  {
             
         var spad = pad.substring(0, pad.length-4);
         return   "{\n" +
-            pad  + string.join(",\n" + pad , els) + 
+            pad  + gLibStringListJoin(",\n" + pad , els) + 
             "\n" + spad +  "}";
            
            
@@ -308,29 +412,106 @@ public class JsRender.Node  {
         if (Node.gen == null) {
             Node.gen = new Json.Generator();
         }
-        var builder = new Json.Builder();
-        builder.add_string_value(str);
-        Node.gen.set_root (builder.get_root ());
+       var n = new Json.Node(Json.NodeType.VALUE);
+               n.set_string(str);
+        Node.gen.set_root (n);
         return  Node.gen.to_data (null);   
     }
 
-    void loadFromJson(Json.Object obj) {
-        obj.foreach_member(o , key, value) {
+    public void loadFromJson(Json.Object obj) {
+        obj.foreach_member((o , key, value) => {
+                       //print(key+"\n");
             if (key == "items") {
-
+                var ar = value.get_array();
+                ar.foreach_element( (are, ix, el) => {
+                    var node = new Node();
+                    node.loadFromJson(el.get_object());
+                    this.items.append(node);
+                });
                 return;
             }
             if (key == "listeners") {
+                var li = value.get_object();
+                li.foreach_member((lio , li_key, li_value) => {
+                    this.listeners.set(li_key, li_value.get_string());
 
+                });
                 return;
             }
-            this.props.set(key, value.get_string());
-        }
+                       var v = value.get_value();
+                       var sv =  Value (typeof (string));
+                       v.transform(ref sv);
+                        
+            this.props.set(key,  (string)sv);
+        });
         
 
 
 
     }
-    
+       public string toJsonString()
+    {
+        if (Node.gen == null) {
+            Node.gen = new Json.Generator();
+        }
+        var n = new Json.Node(Json.NodeType.OBJECT);
+               n.set_object(this.toJsonObject () );
+        Node.gen.set_root (n);
+        return  Node.gen.to_data (null);   
+    }
+       
+    public Json.Object toJsonObject()
+       {
+               var ret = new Json.Object();
+
+               // listeners...
+               var li = new Json.Object();
+               ret.set_object_member("listeners", li);
+               var liter = this.listeners.map_iterator();
+        while (liter.next()) {
+                       li.set_string_member(liter.get_key(), liter.get_value());
+               }
+
+               //props
+           var iter = this.props.map_iterator();
+        while (iter.next()) {
+                       this.jsonObjectsetMember(ret, iter.get_key(), iter.get_value());
+               }
+               
+               var ar = new Json.Array();
+               ret.set_array_member("items", ar);
+               
+               // children..
+               for(var i =0;i < this.items.length();i++) {
+                       ar.add_object_element(this.items.nth_data(i).toJsonObject());
+        }
+               return ret;
+               
+       }
+        
+       public void jsonObjectsetMember(Json.Object o, string key, string val) {
+               if (Lang.isBoolean(val)) {
+                       o.set_boolean_member(key, val == "false" ? false : true);
+                       return;
+               }
+               
+               
+               if (Lang.isNumber(val)) {
+                       if (val.contains(".")) {
+                               //print( "ADD " + key + "=" + val + " as a double?\n");
+                               o.set_double_member(key, double.parse (val));
+                               return;
+
+                       }
+                       //print( "ADD " + key + "=" + val + " as a int?\n")  ;
+                       o.set_int_member(key,long.parse(val));
+                       return;
+               }
+               ///print( "ADD " + key + "=" + val + " as a string?\n");
+               o.set_string_member(key,val);
+               
+       }
     
 }