resources/RooUsage.txt
[app.Builder.js] / src / JsRender / Node.vala
index 61a7157..cd10119 100644 (file)
@@ -102,10 +102,15 @@ public class JsRender.Node : Object {
        public string  xvala_cls;
        public string xvala_xcls; // 'Xcls_' + id;
        public string xvala_id; // item id or ""
-       public int line;
-       public Gee.HashMap<string,int> proplines;
-       public Gee.HashMap<string,int> listenlines;
-
+       
+       // line markers..
+       public int line_start;
+       public int line_end;
+       public Gee.ArrayList<int> lines;
+       public Gee.HashMap<int,string> line_map; // store of l:xxx or p:....
+       public Gee.ArrayList<int> node_lines;
+       public Gee.HashMap<int,Node> node_lines_map; // store of l:xxx or p:....
+       
 
        public Node()
        {
@@ -116,12 +121,158 @@ public class JsRender.Node : Object {
                this.xvala_xcls = "";
                this.xvala_id = "";
                this.parent = null;
-               this.line = -1;
-               this.proplines = new Gee.HashMap<string,int>();
-               this.listenlines = Gee.HashMap<string,int>();
+               this.line_start = -1;
+               this.line_end = -1;             
+               this.lines = new Gee.ArrayList<int>();
+               this.line_map = new Gee.HashMap<int,string>();
+               this.node_lines = new Gee.ArrayList<int>();
+               this.node_lines_map = new Gee.HashMap<int,Node>();
                
        }
+       
+       public void setNodeLine(int line, Node node) {
+               //print("Add node @ %d\n", line);
+               if (this.node_lines_map.has_key(line)) {
+                       return;
+               }
+               this.node_lines.add(line);
+               this.node_lines_map.set(line, node);
+               
+       }
+       
+       public void setLine(int line, string type, string prop) {
+               if (this.line_map.has_key(line)) {
+                       if  (this.line_map.get(line) != "e:"  ) {
+                               return;
+                       }
+               } else {
+                       this.lines.add(line);
+               }
+               this.line_map.set(line, type + ":" + prop);
+               GLib.debug("setLine %d, %s", line, type + ":" + prop);
+       }
+       public void sortLines() {
+               //print("sortLines\n");
+               this.lines.sort((a,b) => {   
+                       return (int)a-(int)b;
+               });
+               this.node_lines.sort((a,b) => {   
+                       return (int)a-(int)b;
+               });
+       }
+       public Node? lineToNode(int line)
+       {
+               //print("Searching for line %d\n",line);
+               var l = -1;
+               //foreach(int el in this.node_lines) {
+                       //print("all lines %d\n", el);
+               //}
+               
+               
+               foreach(int el in this.node_lines) {
+                       //print("?match %d\n", el);
+                       if (el < line) {
+                               
+                               l = el;
+                               //print("LESS\n");
+                               continue;
+                       }
+                       if (el == line) {
+                               //print("SAME\n");
+                               l = el;
+                               break;
+                       }
+                       if (l > -1) {
+                               var ret = this.node_lines_map.get(l);
+                               if (line > ret.line_end) {
+                                       return null;
+                               }
+                               //print("RETURNING NODE ON LINE %d", l);
+                               return ret;
+                       }
+                       return null;
+                       
+               }
+               if (l > -1) {
+                       var ret = this.node_lines_map.get(l);
+                       if (line > ret.line_end) {
+                               return null;
+                       }
+                       //print("RETURNING NODE ON LINE %d", l);
+                       return ret;
 
+               }
+               return null;
+               
+       }
+       public string lineToProp(int line)
+       {
+               // assume lineToNode called first...
+               var l = -1;
+               //foreach(int el in this.lines) {
+               //      //print("all lines %d\n", el);
+               //
+               
+               
+               foreach(int el in this.lines) {
+                       //print("?match %d\n", el);
+                       if (el < line) {
+                               
+                               l = el;
+                               //print("LESS\n");
+                               continue;
+                       }
+                       if (el == line) {
+                               //print("SAME\n");
+                               l = el;
+                               break;
+                       }
+                       if (l > -1) {
+                               //print("RETURNING NODE ON LINE %d", l);
+                               return this.line_map.get(l);
+                       }
+                       return null;
+                       
+               }
+               if (l > -1) {
+                       //print("RETURNING NODE ON LINE %d", l);
+                       return this.line_map.get(l);
+               }
+               return null;
+       
+       }
+       
+       public bool getPropertyRange(string prop, out int start, out int end)
+       {
+               start = -1;
+               foreach(int el in this.lines) {
+                       if (start < 0) {
+                               if (this.line_map.get(el) == prop) {
+                                       start = el;
+                                       end = el;
+                               }
+                               continue;
+                       }
+                       end = el -1;
+                       break;
+               }
+               return start > -1;
+       
+       
+       }
+       
+       public void dumpProps(string indent = "")
+       {
+               print("%s:\n" , this.fqn());
+               foreach(int el in this.lines) {
+                       print("%d: %s%s\n", el, indent, this.line_map.get(el));
+               }
+               foreach(Node n in this.items) {
+                       n.dumpProps(indent + "  ");
+               }
+       }
+       
+       
        
        public string uid()
        {
@@ -159,7 +310,7 @@ public class JsRender.Node : Object {
                this.props.set("xtype", ar[ar.length-1]);
                var l = name.length - (ar[ar.length-1].length +1);
                this.props.set("$ xns", name.substring(0, l));
-               print("setFQN %s to %s\n", name , this.fqn());
+               //print("setFQN %s to %s\n", name , this.fqn());
                               
 
        }
@@ -221,9 +372,17 @@ public class JsRender.Node : Object {
                // $ XXX - with flag (no type)
                // $ string XXX - with flag
                kname = "";
-               ktype = "-";
-               kflag = "-";
-               var kk = key.strip().split(" ");
+               ktype = ""; // these used to contain '-' ???
+               kflag = ""; // these used to contain '-' ???
+               var kkv = key.strip().split(" ");
+               string[] kk = {};
+               for (var i = 0; i < kkv.length; i++) {
+                       if (kkv[i].length > 0 ) {
+                               kk+= kkv[i];
+                       }
+               }
+               //print("normalize %s => %s\n", key,string.joinv("=:=",kk));
+               
                switch(kk.length) {
                        case 1: 
                                kname = kk[0];