/*
*/
public class JsRender.NodeToGlade : Object {
Node node;
string pad;
Gee.ArrayList els;
//Gee.ArrayList skip;
Gee.HashMap ar_props;
public static int vcnt = 0;
public NodeToGlade( Node node, string pad)
{
this.node = node;
this.pad = pad;
this.els = new Gee.ArrayList();
//this.skip = new Gee.ArrayList();
this.ar_props = new Gee.HashMap();
}
public string munge ( )
{
this.pad += " ";
var cls = this.node.fqn().replace(".", "");
string res = "";
switch(cls) {
// things we can not do yet...
case "GtkDialog": // top level.. - named and referenced
case "GtkAboutDialog":
case "GtkMessageDialog":
case "GtkWindow": // top level.. - named and referenced
res = this.mungeOuter(true);
break;
default:
res = this.mungeOuter(false);
break;
}
if (res.length < 1) {
return "";
}
return "
" +
res +
"\n";
}
public string mungeChild(string pad , Node cnode, bool with_packing = false)
{
var x = new NodeToGlade(cnode, pad);
return x.mungeNode(with_packing);
}
public string mungeNode(bool with_packing)
{
var pad = this.pad;
var cls = this.node.fqn().replace(".", "");
var b = new global::Gtk.Builder();
var gtype = b.get_type_from_name(cls);
print("Type: %s ?= %s\n", this.node.fqn(), gtype.name());
var ns = this.node.fqn().split(".")[0];
if (ns == "Clutter") {
return "";
}
//if (ns == "GtkClutter") {
// return "";
//}
if (ns == "WebKit") {
return "";
}
switch(cls) {
// things we can not do yet...
/*case "GtkDialog": // top level.. - named and referenced
case "GtkAboutDialog":
case "GtkWindow": // top level.. - named and referenced
return this.mungeWindow();
if (this.node.items.size > 0) {
return this.mungeChild(pad + " " , this.node.items.get(0), false );
}
return "";
*/
//case "GtkView": // SourceView?
case "GtkTreeStore": // top level.. - named and referenced
case "GtkListStore": // top level.. - named and referenced
case "GtkTreeViewColumn": // part of liststore?!?!
case "GtkMenu": // top level..
case "GtkCellRendererText":
case "GtkSourceBuffer":
case "GtkClutterActor"://fixme..
///case "GtkClutterEmbed"://fixme..
return "";
}
var id = this.node.uid();
var ret = @"$pad\n";
// properties..
var props = Palete.Gir.factoryFqn(this.node.fqn()).props;
//var props = Palete.factory("Gtk").getPropertiesFor(this.node.fqn(), "props");
var pviter = props.map_iterator();
while (pviter.next()) {
// print("Check: " +cls + "::(" + pviter.get_value().propertyof + ")" + pviter.get_key() + " " );
// skip items we have already handled..
if (!this.node.has(pviter.get_key())) {
continue;
}
var k = pviter.get_key();
var val = GLib.Markup.escape_text(this.node.get(pviter.get_key()).strip());
ret += @"$pad $val\n"; // es
}
// packing???
var pack = "";
if (with_packing ) {
pack = this.packString();
}
// children..
if (this.node.items.size < 1) {
return ret + @"$pad\n" + pack;
}
for (var i = 0; i < this.node.items.size; i++ ) {
var add = this.mungeChild(pad + " " , this.node.items.get(i) , true);
if (add.length < 1) {
continue;
}
ret += @"$pad \n";
ret += add;
ret += @"$pad \n";
}
return ret + @"$pad\n" + pack;
}
public string packString()
{
// pack is part of the parent element..
var p = node.parent;
string[] pk= { "add" };
var pfqn = "Gtk.Box";
if (p != null) {
pfqn = p.fqn();
if (this.node.props.get("* pack") == null) {
return "";
}
pk = this.node.get("* pack").split(",");
} else {
if (this.node.props.get("* pack") != null) {
pk = this.node.get("* pack").split(",");
}
}
if (pfqn == null) {
return "";
}
if (pfqn == "Gtk.ScrolledWindow") {
return "";
}
var p_parts =pfqn.split(".");
var ns = p_parts[0];
var gir = Palete.Gir.factory(ns);
var cls = gir.classes.get(p_parts[1]);
var mdef = cls.methods.get(pk[0]);
if (mdef == null) {
print("could not find method : %s\n", pk[0]);
return "";
}
/*
var generator = new Json.Generator ();
var n = new Json.Node(Json.NodeType.OBJECT);
n.set_object(mdef.toJSON());
generator.set_root(n);
generator.indent = 4;
generator.pretty = true;
print(generator.to_data(null));
*/
string[] pbody = {};
switch(pk[0]) {
case "pack_start":
pbody += @"$pad start\n";
break;
case "pack_end":
pbody += @"$pad start\n";
break;
case "add":
//pbody += @"$pad start\n";
pbody += @"$pad True\n";
pbody += @"$pad True\n";
//pbody += @"$pad 1\n";
var pack = @"$pad\n" +
string.joinv("", pbody) +
@"$pad\n";
return pack;
case "set_model":
print ("set_model not handled yet..");
return "";
default:
print ("unknown pack type: %s", pk[0]);
return "";
}
var pad = this.pad;
for (var i = 2; i < mdef.paramset.params.size; i++) {
var poff = i - 1;
if (poff > (pk.length-1)) {
break;
}
var key = mdef.paramset.params.get(i).name;
var val = pk[poff];
pbody += @"$pad $val\n";
}
if (pbody.length < 1) {
/*var generator = new Json.Generator ();
var n = new Json.Node(Json.NodeType.OBJECT);
n.set_object(mdef.toJSON());
generator.set_root(n);
generator.indent = 4;
generator.pretty = true;
print(generator.to_data(null));
*/
print("skip - packing - no arguments (" + pk[0] + ")\n");
return "";
}
var pack = @"$pad\n" +
string.joinv("", pbody) +
@"$pad\n";
return pack;
}
public string mungeOuter(bool with_window)
{
var label = this.node.fqn() + ": " +
(this.node.has("title") ? this.node.get("title") : "No-title");
var ret = "";
ret+= "
TrueFalsevertical
";
if (with_window) {
ret+="
TrueFalse" + label + "FalseTrue0
";
}
ret+="
";
if (with_window) {
var children = "";
if (this.node.items.size > 0) {
children = this.mungeChild(pad + " " , this.node.items.get(0), false);
}
children += (children.length > 0) ? "TrueTrue1" : "";
ret+= (children.length < 1 ) ? "" : children;
} else {
ret+= this.mungeNode (true);
}
ret+="
";
if (with_window) {
ret+="
TrueFalseFalseTrue2
";
}
ret +="
";
return ret;
}
}