X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=src%2FJsRender%2FNodeToVala.vala;h=1350c0dc62488d255f644f711f0900df62e6a7c1;hb=HEAD;hp=81e871df6dc216161161d2b649dacb6cd694e716;hpb=454ecbfc88fbd738774bad9a932ef9bbf70685f4;p=app.Builder.js diff --git a/src/JsRender/NodeToVala.vala b/src/JsRender/NodeToVala.vala index 81e871df6..1350c0dc6 100644 --- a/src/JsRender/NodeToVala.vala +++ b/src/JsRender/NodeToVala.vala @@ -1,8 +1,8 @@ /** * - * Code to convert node tree to Javascript... + * Code to convert node tree to Vala... * - * usage : x = (new JsRender.NodeToJs(node)).munge(); + * usage : x = (new JsRender.NodeToVala(node)).munge(); * * * @@ -62,11 +62,14 @@ public class JsRender.NodeToVala : Object { this.file = null; // initialize line data.. - node.line = this.cur_line; - node.proplines = new Gee.HashMap(); - node.listenlines = Gee.HashMap(); - - + node.line_start = this.cur_line; + node.line_end = this.cur_line; + node.lines = new Gee.ArrayList(); + node.line_map = new Gee.HashMap(); + if (parent == null) { + node.node_lines = new Gee.ArrayList(); + node.node_lines_map = new Gee.HashMap(); + } } @@ -188,23 +191,29 @@ public class JsRender.NodeToVala : Object { public void addLine(string str= "") { this.cur_line++; + //this.ret += "/*%d*/ ".printf(this.cur_line-1) + str + "\n"; this.ret += str + "\n"; } - + public void addMultiLine(string str= "") + { + + this.cur_line += str.split("\n").length; + //this.ret += "/*%d*/ ".printf(l) + str + "\n"; + this.ret += str + "\n"; + } + public void globalVars() { if (this.depth > 0) { return; } - // Global Vars.. + // Global Vars..??? when did this get removed..? //this.ret += this.inpad + "public static " + this.xcls + " " + this.node.xvala_id+ ";\n\n"; - this.addLine("%sstatic %s _%s;".printf(this.inpad, this.xcls, this.node.xvala_id)); + this.addLine(this.inpad + "static " + this.xcls + " _" + this.node.xvala_id+ ";"); this.addLine(); - //this.ret += this.inpad + "static " + this.xcls + " _" + this.node.xvala_id+ ";\n\n"; - - + } void classHeader() @@ -212,13 +221,17 @@ public class JsRender.NodeToVala : Object { // class header.. // class xxx { WrappedGtk el; } - this.node.line = this.cur_line; - this.addLine(inpad + "public class " + this.xcls + " : Object \n" + this.inpad + "{"); + this.node.line_start = this.cur_line; + + this.top.node.setNodeLine(this.cur_line, this.node); + + this.addLine(inpad + "public class " + this.xcls + " : Object"); + this.addLine(this.inpad + "{"); this.addLine(this.pad + "public " + this.cls + " el;"); - this.addLine(this.pad + "private " + this.top.xcls + " _this;)"; + this.addLine(this.pad + "private " + this.top.xcls + " _this;"); this.addLine(); @@ -231,7 +244,7 @@ public class JsRender.NodeToVala : Object { return; } this.addLine(pad + "public static " + xcls + " singleton()"); - this.addLine(this.pad + "{") + this.addLine(this.pad + "{"); this.addLine(this.ipad + "if (_" + this.node.xvala_id + " == null) {"); this.addLine(this.ipad + " _" + this.node.xvala_id + "= new "+ this.xcls + "();"); // what about args? this.addLine(this.ipad + "}"); @@ -308,7 +321,7 @@ public class JsRender.NodeToVala : Object { } if (vv[0] == "@") { - this.node.proplines.set(k, this.cur_line); + this.node.setLine(this.cur_line, "p", k); this.addLine(this.pad + "public signal" + k.substring(1) + " " + iter.get_value() + ";"); this.ignore(k); @@ -332,8 +345,8 @@ public class JsRender.NodeToVala : Object { } this.myvars.add(k); - - this.node.proplines.set(k, this.cur_line); + this.node.setLine(this.cur_line, "p", k); + this.addLine(this.pad + "public " + (k[0] == '$' || k[0] == '#' ? k.substring(2) : k ) + ";"); @@ -343,7 +356,7 @@ public class JsRender.NodeToVala : Object { } } - // if id of child is '+' then it's a property of this.. + // if id of child is '+' then it's a property of this.. void addPlusProperties() { if (this.node.items.size < 1) { @@ -351,13 +364,13 @@ public class JsRender.NodeToVala : Object { } var iter = this.node.items.list_iterator(); while (iter.next()) { - var ci = iter.get(); + var ci = iter.get(); if (ci.xvala_id[0] != '+') { continue; // skip generation of children? } - this.node.proplines.set(k, this.cur_line); + this.addLine(this.pad + "public " + ci.xvala_xcls + " " + ci.xvala_id.substring(1) + ";"); @@ -391,7 +404,7 @@ public class JsRender.NodeToVala : Object { if (this.depth < 1) { // top level - does not pass the top level element.. - this.addLine(this.pad + "public " + this.xcls + "(" + cargs_str +")") + this.addLine(this.pad + "public " + this.xcls + "(" + cargs_str +")"); this.addLine(this.pad + "{"); } else { @@ -407,12 +420,14 @@ public class JsRender.NodeToVala : Object { */ void addUnderThis() { - // public static? + // public static? if (depth < 1) { this.addLine( this.ipad + "_this = this;"); return; } - this.ret+= this.ipad + "_this = _owner;\n"; + // for non top level = _this point to owner, and _this.ID is set + + this.addLine( this.ipad + "_this = _owner;"); if (this.node.props.has_key("id") && @@ -422,13 +437,16 @@ public class JsRender.NodeToVala : Object { && this.node.xvala_id[0] != '+' ) { - this.ret+= this.ipad + "_this." + node.xvala_id + " = this;\n"; + this.addLine( this.ipad + "_this." + node.xvala_id + " = this;"); } - - - + } + /** + * Initialize this.el to point to the wrapped element. + * + * + */ void addWrappedCtor() { @@ -445,19 +463,14 @@ public class JsRender.NodeToVala : Object { } */ if (this.node.has("* ctor")) { - - - this.ret += this.ipad + "this.el = " + this.node.get("* ctor")+ ";\n"; + this.node.setLine(this.cur_line, "p", "* ctor"); + this.addLine(this.ipad + "this.el = " + this.node.get("* ctor")+ ";"); return; } - // the ctor arguments... - - // see what the - //var default_ctor = Palete.Gir.factoryFqn(this.node.fqn() + ".newv"); - //if (default_ctor == null) { - var default_ctor = Palete.Gir.factoryFqn(this.node.fqn() + ".new"); + + var default_ctor = Palete.Gir.factoryFqn(this.node.fqn() + ".new"); - //} + if (default_ctor != null && default_ctor.paramset != null && default_ctor.paramset.params.size > 0) { string[] args = {}; var iter =default_ctor.paramset.params.list_iterator(); @@ -498,13 +511,15 @@ public class JsRender.NodeToVala : Object { args += v; } - this.ret += this.ipad + "this.el = new " + cls + "( "+ string.joinv(", ",args) + " );\n" ; + this.node.setLine(this.cur_line, "p", "* xtype"); + + this.addLine(this.ipad + "this.el = new " + cls + "( "+ string.joinv(", ",args) + " );") ; return; } + this.node.setLine(this.cur_line, "p", "* xtype");; - - this.ret += this.ipad + "this.el = new " + this.cls + "();\n"; + this.addLine(this.ipad + "this.el = new " + this.cls + "();"); } @@ -517,30 +532,32 @@ public class JsRender.NodeToVala : Object { // initialize.. my vars.. - this.ret += "\n" + this.ipad + "// my vars (dec)\n"; + this.addLine(); + this.addLine( this.ipad + "// my vars (dec)"); var iter = this.myvars.list_iterator(); while(iter.next()) { - var k = iter.get(); + var k = iter.get(); - var ar = k.strip().split(" "); + var ar = k.strip().split(" "); var kname = ar[ar.length-1]; - var v = this.node.props.get(k); + var v = this.node.props.get(k); // ignore signals.. - if (v.length < 1) { - continue; - } + if (v.length < 1) { + continue; + } if (v == "FALSE" || v == "TRUE") { v = v.down(); } -//FIXME -- check for raw string.. "string XXXX" + //FIXME -- check for raw string.. "string XXXX" // if it's a string... - this.ret += this.ipad + "this." + kname + " = " + v +";\n"; - } + + this.addLine(this.ipad + "this." + kname + " = " + v +";"); + } } @@ -554,12 +571,14 @@ public class JsRender.NodeToVala : Object { return; } // what are the properties of this class??? - this.ret += "\n" + this.ipad + "// set gobject values\n"; + this.addLine(); + this.addLine(this.ipad + "// set gobject values"); + var iter = cls.props.map_iterator(); while (iter.next()) { var p = iter.get_key(); - print("Check Write %s\n", p); + //print("Check Write %s\n", p); if (!this.node.has(p)) { continue; } @@ -593,7 +612,7 @@ public class JsRender.NodeToVala : Object { } - this.ret += "%sthis.el.%s = %s;\n".printf(ipad,p,v); // // %s, iter.get_value().type); + this.addLine("%sthis.el.%s = %s;".printf(ipad,p,v)); // // %s, iter.get_value().type); // got a property.. @@ -601,6 +620,12 @@ public class JsRender.NodeToVala : Object { } } + /** + * pack the children into the parent. + * + * if the child's id starts with '*' then it is not packed... + * - this allows you to define children and add them manually.. + */ void addChildren() { @@ -609,62 +634,65 @@ public class JsRender.NodeToVala : Object { return; } - var iter = this.node.items.list_iterator(); + var iter = this.node.items.list_iterator(); var i = -1; while (iter.next()) { i++; - var ci = iter.get(); + var ci = iter.get(); if (ci.xvala_id[0] == '*') { - continue; // skip generation of children? - } + continue; // skip generation of children? + } - var xargs = ""; - if (ci.has("* args")) { - - var ar = ci.get("* args").split(","); - for (var ari = 0 ; ari < ar.length; ari++ ) { + var xargs = ""; + if (ci.has("* args")) { + + var ar = ci.get("* args").split(","); + for (var ari = 0 ; ari < ar.length; ari++ ) { var arg = ar[ari].split(" "); - xargs += "," + arg[arg.length -1]; - } - } - - this.ret += this.ipad + "var child_" + "%d".printf(i) + " = new " + ci.xvala_xcls + - "( _this " + xargs + ");\n" ; - - this.ret+= this.ipad + "child_" + "%d".printf(i) +".ref();\n"; // we need to reference increase unnamed children... - - if (ci.has("* prop")) { - this.ret+= ipad + "this.el." + ci.get("* prop") + " = child_" + "%d".printf(i) + ".el;\n"; - continue; - } + xargs += "," + arg[arg.length -1]; + } + } + // create the element.. + this.addLine(this.ipad + "var child_" + "%d".printf(i) + " = new " + ci.xvala_xcls + + "( _this " + xargs + ");" ); + + // this is only needed if it does not have an ID??? + this.addLine(this.ipad + "child_" + "%d".printf(i) +".ref();"); // we need to reference increase unnamed children... + + if (ci.has("* prop")) { + this.addLine(ipad + "this.el." + ci.get("* prop") + " = child_" + "%d".printf(i) + ".el;"); + continue; + } + - // not sure why we have 'true' in pack?!? - if (!ci.has("pack") || ci.get("pack").down() == "false" || ci.get("pack").down() == "true") { - continue; - } - - string[] packing = { "add" }; + // not sure why we have 'true' in pack?!? + if (!ci.has("pack") || ci.get("pack").down() == "false" || ci.get("pack").down() == "true") { + continue; + } + + string[] packing = { "add" }; if (ci.has("pack")) { packing = ci.get("pack").split(","); } - - var pack = packing[0]; - this.ret += this.ipad + "this.el." + pack.strip() + " ( child_" + "%d".printf(i) + ".el " + - (packing.length > 1 ? - (", " + string.joinv(",", packing).substring(pack.length+1)) - : - "" - ) + " );\n"; - - - if (ci.xvala_id[0] != '+') { - continue; // skip generation of children? - - } - this.ret+= this.ipad + "this." + ci.xvala_id.substring(1) + " = child_" + "%d".printf(i) + ";\n"; - + + var pack = packing[0]; + this.addLine(this.ipad + "this.el." + pack.strip() + " ( child_" + "%d".printf(i) + ".el " + + (packing.length > 1 ? + (", " + string.joinv(",", packing).substring(pack.length+1)) + : + "" + ) + " );"); + + + if (ci.xvala_id[0] != '+') { + continue; // skip generation of children? + + } + // this.{id - without the '+'} = the element... + this.addLine(this.ipad + "this." + ci.xvala_id.substring(1) + " = child_" + "%d".printf(i) + ";"); + } } @@ -675,9 +703,12 @@ public class JsRender.NodeToVala : Object { if (!this.node.has("init")) { return; } - this.ret+= "\n" + ipad + "// init method \n"; - - this.ret+= "\n" + ipad + this.padMultiline(ipad, this.node.get("init")) + "\n"; + this.addLine(); + this.addLine(ipad + "// init method"); + this.addLine(); + this.node.setLine(this.cur_line, "p", "init"); + + this.addMultiLine(ipad + this.padMultiline(ipad, this.node.get("init")) ); } void addListeners() @@ -686,26 +717,27 @@ public class JsRender.NodeToVala : Object { return; } + this.addLine(); + this.addLine(ipad + "//listeners"); - - this.ret+= "\n" + ipad + "// listeners \n"; + var iter = this.node.listeners.map_iterator(); while (iter.next()) { var k = iter.get_key(); var v = iter.get_value(); - this.ret+= this.ipad + "this.el." + k + ".connect( " + - this.padMultiline(this.ipad,v) +");\n"; - - } + + this.node.setLine(this.cur_line, "l", k); + this.addMultiLine(this.ipad + "this.el." + k + ".connect( " + + this.padMultiline(this.ipad,v) +");"); + + } } - void addEndCtor() + void addEndCtor() { - - - + // end ctor.. - this.ret+= this.pad + "}\n"; + this.addLine(this.pad + "}"); } @@ -753,48 +785,53 @@ public class JsRender.NodeToVala : Object { void addUserMethods() { - - this.ret+= "\n" + pad + "// user defined functions \n"; + this.addLine(); + this.addLine(this.pad + "// user defined functions"); // user defined functions... var iter = this.node.props.map_iterator(); while(iter.next()) { - var k = iter.get_key(); + var k = iter.get_key(); if (this.shouldIgnore(k)) { continue; } // HOW TO DETERIME if its a method? - if (k[0] != '|') { - //strbuilder("\n" + pad + "// skip " + k + " - not pipe \n"); - continue; - } - // function in the format of {type} (args) { .... } - var kk = k.substring(2); - var vv = iter.get_value(); - this.ret += this.pad + "public " + kk + " " + this.padMultiline(this.pad, vv) + "\n"; + if (k[0] != '|') { + //strbuilder("\n" + pad + "// skip " + k + " - not pipe \n"); + continue; + } + + // function in the format of {type} (args) { .... } + var kk = k.substring(2); + var vv = iter.get_value(); + this.node.setLine(this.cur_line, "p", k); + this.addMultiLine(this.pad + "public " + kk + " " + this.padMultiline(this.pad, vv));; - } + } } void iterChildren() { + this.node.line_end = this.cur_line; + this.node.sortLines(); + - if (this.depth > 0) { - this.ret+= this.inpad + "}\n"; - } + if (this.depth > 0) { + this.addLine(this.inpad + "}"); + } var iter = this.node.items.list_iterator(); - var i = -1; + while (iter.next()) { - this.ret += this.mungeChild(iter.get()); + this.addMultiLine(this.mungeChild(iter.get())); } - if (this.depth < 1) { - this.ret+= this.inpad + "}\n"; - } - + if (this.depth < 1) { + this.addLine(this.inpad + "}"); } + + } string padMultiline(string pad, string str) {