5 public class JsRender.NodeToGtk : Object {
11 Gee.ArrayList<string> els;
12 //Gee.ArrayList<string> skip;
13 Gee.HashMap<string,string> ar_props;
14 public static int vcnt = 0;
16 public NodeToGtk( Node node)
19 this.els = new Gee.ArrayList<string>();
20 //this.skip = new Gee.ArrayList<string>();
21 this.ar_props = new Gee.HashMap<string,string>();
22 this.parentObj = null;
25 public Object? munge ( )
28 return this.mungeNode ();
32 public Object? mungeChild( Node cnode)
34 var x = new NodeToGtk(cnode);
39 public Object? mungeNode()
42 var parent = this.parentObj != null ? this.parentObj.wrapped_object : null;
43 var cls = this.node.fqn().replace(".", "");
44 var ns = this.node.fqn().split(".")[0];
45 var gtkbuilder = new global::Gtk.Builder();
47 var cls_gtype = gtkbuilder.get_type_from_name(cls);
48 print("Type: %s ?= %s\n", this.node.fqn(), cls_gtype.name());
50 if (cls_gtype == GLib.Type.INVALID) {
51 print("SKIP - gtype is invalid\n");
54 // if it's a window...
56 if (cls_gtype.is_a(typeof(global::Gtk.Window))) {
57 // what if it has none...
58 if (this.node.items.size < 1) {
61 return this.mungeChild(this.node.items.get(0));
64 var ret = Object.new(cls_gtype);
65 ret.ref(); //??? problematic?
66 this.wrapped_object = ret;
71 //case "GtkTreeStore": // top level.. - named and referenced
72 case "GtkListStore": // top level.. - named and referenced
73 //case "GtkTreeViewColumn": // part of liststore?!?!
74 //case "GtkMenu": // top level..
75 //case "GtkCellRendererText":
76 case "GtkSourceBuffer":
77 case "GtkClutterActor"://fixme..
78 case "GtkClutterEmbed"://fixme.. -- we can not nest embedded.. need to solve..
89 if (parent != null && parent.get_type().is_a(typeof(global::Gtk.Container))) {
90 this.packContainerParams();
93 var cls_gir =Palete.Gir.factoryFqn(this.node.fqn());
94 if (cls_gir == null) {
97 //var id = this.node.uid();
98 //var ret = @"$pad<object class=\"$cls\" id=\"$id\">\n";
100 var props = cls_gir.props;
103 var pviter = props.map_iterator();
104 while (pviter.next()) {
106 // print("Check: " +cls + "::(" + pviter.get_value().propertyof + ")" + pviter.get_key() + " " );
107 var k = pviter.get_key();
108 // skip items we have already handled..
109 if (!this.node.has(k)) {
112 // find out the type of the property...
113 var type = pviter.get_value().type;
114 type = Palete.Gir.fqtypeLookup(type, ns);
116 var val = this.toValue(this.node.get(k).strip(), type);
118 print("skip (failed to transform value %s type = %s from %s\n",
119 cls + "." + k, type, this.node.get(k).strip());
122 print ("set_property ( %s , %s / %s)\n", k, this.node.get(k).strip(), val.strdup_contents());
125 ret.set_property(k, val);
130 // for now... - just try the builder style packing
134 if (this.node.items.size < 1) {
138 for (var i = 0; i < this.node.items.size; i++ ) {
140 this.mungeChild(this.node.items.get(i));
150 public void packParent()
152 var cls = this.node.fqn().replace(".", "");
154 var gtkbuilder = new global::Gtk.Builder();
155 var cls_gtype = gtkbuilder.get_type_from_name(cls);
157 if (this.parentObj == null) {
162 var parent = this.parentObj.wrapped_object;
166 if (parent == null) { // no parent.. can not pack.
170 if (cls == "GtkMenu") {
175 if (cls == "GtkTreeStore") { // other stores?
176 // tree store is buildable??? ---
177 this.packTreeStore();
180 if (cls =="GtkTreeViewColumn") { // other stores?
181 //?? treeview column is actually buildable -- but we do not use the builder???
182 this.packTreeViewColumn();
185 if (cls_gtype.is_a(typeof(global::Gtk.CellRenderer))) { // other stores?
186 this.packCellRenderer();
192 // -- handle buildable add_child..
193 if ( cls_gtype.is_a(typeof(global::Gtk.Buildable))
195 parent.get_type().is_a(typeof(global::Gtk.Buildable))
198 ((global::Gtk.Buildable)parent).add_child(gtkbuilder,
199 this.wrapped_object, null);
208 public void packMenu()
212 var parent = this.parentObj.wrapped_object;
213 if (!parent.get_type().is_a(typeof(global::Gtk.Widget))) {
214 print("skip menu pack - parent is not a widget");
218 var p = (global::Gtk.Menu)this.wrapped_object;
219 ((global::Gtk.Widget)parent).button_press_event.connect((s, ev) => {
220 p.set_screen(Gdk.Screen.get_default());
222 p.popup(null, null, null, ev.button, ev.time);
227 public void packTreeStore()
229 var parent = this.parentObj.wrapped_object;
230 if (!parent.get_type().is_a(typeof(global::Gtk.TreeView))) {
231 print("skip treestore pack - parent is not a treeview");
234 ((global::Gtk.TreeView)parent).set_model((global::Gtk.TreeModel)this.wrapped_object);
237 public void packTreeViewColumn()
239 var parent = this.parentObj.wrapped_object;
240 if (!parent.get_type().is_a(typeof(global::Gtk.TreeView))) {
241 print("skip packGtkViewColumn pack - parent is not a treeview");
244 ((global::Gtk.TreeView)parent).append_column((global::Gtk.TreeViewColumn)this.wrapped_object);
245 // init contains the add_attribute for what to render...
250 public void packCellRenderer()
252 var parent = this.parentObj.wrapped_object;
253 if (!parent.get_type().is_a(typeof(global::Gtk.TreeViewColumn))) {
254 print("skip packGtkViewColumn pack - parent is not a treeview");
257 ((global::Gtk.TreeViewColumn)parent).pack_start((global::Gtk.CellRenderer)this.wrapped_object, false);
258 // init contains the add_attribute for what to render...
263 public void packContainerParams()
266 if (this.parentObj == null) {
269 // child must be a widget..
270 if (!this.wrapped_object.get_type().is_a(typeof(global::Gtk.Widget))) {
274 var parent_gir = Palete.Gir.factoryFqn(this.parentObj.node.fqn());
276 var parent = this.parentObj.wrapped_object;
278 if (parent_gir == null) {
282 // let's test just setting expand to false...
283 var cls_methods = parent_gir.methods;
284 if (cls_methods == null) {
288 if (!this.node.props.has_key("* pack")) {
292 var ns = this.parentObj.node.fqn().split(".")[0];
294 var pack = this.node.props.get("* pack").split(",");
297 if (cls_methods.has_key(pack[0])) {
298 var mparams = cls_methods.get(pack[0]).paramset.params;
299 for (var i = 1; i < mparams.size; i++ ) {
300 if (i > (pack.length -1)) {
304 var k = mparams.get(i).name;
308 var type = mparams.get(i).type;
309 type = Palete.Gir.fqtypeLookup(type, ns);
311 var val = this.toValue(pack[i].strip(), type);
313 print("skip (failed to transform value %s type = %s from %s\n",
314 this.parentObj.node.fqn() + "." + k, type, pack[i].strip());
317 print ("pack:set_property ( %s , %s / %s)\n", k, pack[i].strip(), val.strdup_contents());
319 ((global::Gtk.Container)parent).child_set_property(
320 (global::Gtk.Widget)this.wrapped_object , k, val);
332 public GLib.Value? toValue(string val, string type) {
334 var gtkbuilder = new global::Gtk.Builder();
336 if (type == "utf8") {
337 var qret = new GLib.Value(typeof(string));
338 qret.set_string(val);
342 var prop_gtype = gtkbuilder.get_type_from_name(type);
345 if (prop_gtype == GLib.Type.INVALID) {
351 var ret = new GLib.Value(prop_gtype);
356 ret.set_boolean(val.down() == "false" ? false : true);
359 ret.set_uint(int.parse(val));
363 ret.set_int(int.parse(val));
367 ret.set_float(long.parse(val));
376 var sval =new GLib.Value(typeof(string));
377 sval.set_string(val);
379 if (!sval.transform(ref ret)) {