5 public class JsRender.NodeToGtk : Object {
11 Gee.ArrayList<NodeToGtk> children;
13 Gee.ArrayList<string> els;
14 //Gee.ArrayList<string> skip;
15 Gee.HashMap<string,string> ar_props;
16 public static int vcnt = 0;
18 public NodeToGtk( Node node)
21 this.els = new Gee.ArrayList<string>();
22 this.children = new Gee.ArrayList<NodeToGtk>();
23 //this.skip = new Gee.ArrayList<string>();
24 this.ar_props = new Gee.HashMap<string,string>();
25 this.parentObj = null;
28 public Object? munge ( )
30 var ret = this.mungeNode();
35 return ret.wrapped_object;
38 public NodeToGtk? mungeChild( Node cnode)
40 var x = new NodeToGtk(cnode);
46 public NodeToGtk? mungeNode()
49 var parent = this.parentObj != null ? this.parentObj.wrapped_object : null;
50 var cls = this.node.fqn().replace(".", "");
51 var ns = this.node.fqn().split(".")[0];
52 var gtkbuilder = new global::Gtk.Builder();
54 var cls_gtype = gtkbuilder.get_type_from_name(cls);
55 print("Type: %s ?= %s\n", this.node.fqn(), cls_gtype.name());
57 if (cls_gtype == GLib.Type.INVALID) {
58 print("SKIP - gtype is invalid\n");
61 // if it's a window...
63 if (cls_gtype.is_a(typeof(global::Gtk.Window))) {
64 // what if it has none...
65 if (this.node.items.size < 1) {
68 return this.mungeChild(this.node.items.get(0));
71 var ret = Object.new(cls_gtype);
72 ret.ref(); //??? problematic?
73 this.wrapped_object = ret;
78 //case "GtkTreeStore": // top level.. - named and referenced
79 case "GtkListStore": // top level.. - named and referenced
80 //case "GtkTreeViewColumn": // part of liststore?!?!
81 //case "GtkMenu": // top level..
82 //case "GtkCellRendererText":
83 case "GtkSourceBuffer":
84 case "GtkClutterActor"://fixme..
85 case "GtkClutterEmbed"://fixme.. -- we can not nest embedded.. need to solve..
96 if (parent != null && parent.get_type().is_a(typeof(global::Gtk.Container))) {
97 this.packContainerParams();
100 var cls_gir =Palete.Gir.factoryFqn(this.node.fqn());
101 if (cls_gir == null) {
104 //var id = this.node.uid();
105 //var ret = @"$pad<object class=\"$cls\" id=\"$id\">\n";
107 var props = cls_gir.props;
110 var pviter = props.map_iterator();
111 while (pviter.next()) {
113 // print("Check: " +cls + "::(" + pviter.get_value().propertyof + ")" + pviter.get_key() + " " );
114 var k = pviter.get_key();
115 // skip items we have already handled..
116 if (!this.node.has(k)) {
119 // find out the type of the property...
120 var type = pviter.get_value().type;
121 type = Palete.Gir.fqtypeLookup(type, ns);
123 var val = this.toValue(this.node.get(k).strip(), type);
125 print("skip (failed to transform value %s type = %s from %s\n",
126 cls + "." + k, type, this.node.get(k).strip());
129 print ("set_property ( %s , %s / %s)\n", k, this.node.get(k).strip(), val.strdup_contents());
132 ret.set_property(k, val);
137 // for now... - just try the builder style packing
141 if (this.node.items.size < 1) {
145 for (var i = 0; i < this.node.items.size; i++ ) {
147 var ch = this.mungeChild(this.node.items.get(i));
149 this.children.add(ch);
154 this.afterChildren();
163 public void afterChildren()
165 // things like GtkNotebook - we have to pack children after they have been created..
166 var cls = this.node.fqn().replace(".", "");
168 if (cls == "GtkNotebook") {
169 this.afterChildrenGtkNotebook();
176 public void afterChildrenGtkNotebook()
184 * called after the this.object has been created
185 * and it needs to be packed onto parent.
187 public void packParent()
189 var cls = this.node.fqn().replace(".", "");
191 var gtkbuilder = new global::Gtk.Builder();
192 var cls_gtype = gtkbuilder.get_type_from_name(cls);
194 if (this.parentObj == null) {
199 var parent = this.parentObj.wrapped_object;
203 if (parent == null) { // no parent.. can not pack.
206 // ------------- handle various special parents .. -----------
208 var par_type = this.parentObj.node.fqn().replace(".", "");
210 if (par_type == "GtkNotebook") {
211 // do not pack - it's done afterwards...
215 // ------------- handle various child types.. -----------
217 if (cls == "GtkMenu") {
222 if (cls == "GtkTreeStore") { // other stores?
223 // tree store is buildable??? ---
224 this.packTreeStore();
227 if (cls =="GtkTreeViewColumn") { // other stores?
228 //?? treeview column is actually buildable -- but we do not use the builder???
229 this.packTreeViewColumn();
232 if (cls_gtype.is_a(typeof(global::Gtk.CellRenderer))) { // other stores?
233 this.packCellRenderer();
239 // -- handle buildable add_child..
240 if ( cls_gtype.is_a(typeof(global::Gtk.Buildable))
242 parent.get_type().is_a(typeof(global::Gtk.Buildable))
245 ((global::Gtk.Buildable)parent).add_child(gtkbuilder,
246 this.wrapped_object, null);
255 public void packMenu()
259 var parent = this.parentObj.wrapped_object;
260 if (!parent.get_type().is_a(typeof(global::Gtk.Widget))) {
261 print("skip menu pack - parent is not a widget");
265 var p = (global::Gtk.Menu)this.wrapped_object;
266 ((global::Gtk.Widget)parent).button_press_event.connect((s, ev) => {
267 p.set_screen(Gdk.Screen.get_default());
269 p.popup(null, null, null, ev.button, ev.time);
274 public void packTreeStore()
276 var parent = this.parentObj.wrapped_object;
277 if (!parent.get_type().is_a(typeof(global::Gtk.TreeView))) {
278 print("skip treestore pack - parent is not a treeview");
281 ((global::Gtk.TreeView)parent).set_model((global::Gtk.TreeModel)this.wrapped_object);
284 public void packTreeViewColumn()
286 var parent = this.parentObj.wrapped_object;
287 if (!parent.get_type().is_a(typeof(global::Gtk.TreeView))) {
288 print("skip packGtkViewColumn pack - parent is not a treeview");
291 ((global::Gtk.TreeView)parent).append_column((global::Gtk.TreeViewColumn)this.wrapped_object);
292 // init contains the add_attribute for what to render...
297 public void packCellRenderer()
299 var parent = this.parentObj.wrapped_object;
300 if (!parent.get_type().is_a(typeof(global::Gtk.TreeViewColumn))) {
301 print("skip packGtkViewColumn pack - parent is not a treeview");
304 ((global::Gtk.TreeViewColumn)parent).pack_start((global::Gtk.CellRenderer)this.wrapped_object, false);
305 // init contains the add_attribute for what to render...
310 public void packContainerParams()
313 if (this.parentObj == null) {
316 // child must be a widget..
317 if (!this.wrapped_object.get_type().is_a(typeof(global::Gtk.Widget))) {
321 var parent_gir = Palete.Gir.factoryFqn(this.parentObj.node.fqn());
323 var parent = this.parentObj.wrapped_object;
325 if (parent_gir == null) {
329 // let's test just setting expand to false...
330 var cls_methods = parent_gir.methods;
331 if (cls_methods == null) {
335 if (!this.node.props.has_key("* pack")) {
339 var ns = this.parentObj.node.fqn().split(".")[0];
341 var pack = this.node.props.get("* pack").split(",");
344 if (cls_methods.has_key(pack[0])) {
345 var mparams = cls_methods.get(pack[0]).paramset.params;
346 for (var i = 1; i < mparams.size; i++ ) {
347 if (i > (pack.length -1)) {
351 var k = mparams.get(i).name;
355 var type = mparams.get(i).type;
356 type = Palete.Gir.fqtypeLookup(type, ns);
358 var val = this.toValue(pack[i].strip(), type);
360 print("skip (failed to transform value %s type = %s from %s\n",
361 this.parentObj.node.fqn() + "." + k, type, pack[i].strip());
364 print ("pack:set_property ( %s , %s / %s)\n", k, pack[i].strip(), val.strdup_contents());
366 ((global::Gtk.Container)parent).child_set_property(
367 (global::Gtk.Widget)this.wrapped_object , k, val);
379 public GLib.Value? toValue(string val, string type) {
381 var gtkbuilder = new global::Gtk.Builder();
383 if (type == "utf8") {
384 var qret = GLib.Value(typeof(string));
385 qret.set_string(val);
389 var prop_gtype = gtkbuilder.get_type_from_name(type);
392 if (prop_gtype == GLib.Type.INVALID) {
398 var ret = GLib.Value(prop_gtype);
403 ret.set_boolean(val.down() == "false" ? false : true);
406 ret.set_uint(int.parse(val));
410 ret.set_int(int.parse(val));
414 ret.set_float(long.parse(val));
423 var sval = GLib.Value(typeof(string));
424 sval.set_string(val);
426 if (!sval.transform(ref ret)) {