resources/RooUsage.txt
[app.Builder.js] / src / JsRender / NodeToGlade.vala
1 /*
2
3 <?xml version="1.0" encoding="UTF-8"?>
4 <!-- Generated with glade 3.18.3 -->
5 <interface>
6   <requires lib="gtk+" version="3.12"/>
7   <object class="GtkBox" id="box1">
8     <property name="visible">True</property>
9     <property name="can_focus">False</property>
10     <property name="orientation">vertical</property>
11     <child>
12       <object class="GtkButton" id="button1">
13         <property name="label" translatable="yes">button</property>
14         <property name="visible">True</property>
15         <property name="can_focus">True</property>
16         <property name="receives_default">True</property>
17       </object>
18       <packing>
19         <property name="expand">False</property>
20         <property name="fill">True</property>
21         <property name="position">0</property>
22       </packing>
23     </child>
24     <child>
25       <placeholder/>
26     </child>
27     <child>
28       <object class="GtkToggleButton" id="togglebutton1">
29         <property name="label" translatable="yes">togglebutton</property>
30         <property name="visible">True</property>
31         <property name="can_focus">True</property>
32         <property name="receives_default">True</property>
33       </object>
34       <packing>
35         <property name="expand">False</property>
36         <property name="fill">True</property>
37         <property name="position">2</property>
38       </packing>
39     </child>
40   </object>
41 </interface>
42 */
43 public class JsRender.NodeToGlade : Object {
44
45         Node node;
46         string pad;
47         Gee.ArrayList<string> els;
48         //Gee.ArrayList<string> skip;
49         Gee.HashMap<string,string> ar_props;
50         public static int vcnt = 0; 
51
52         public NodeToGlade( Node node,   string pad) 
53         {
54                 this.node = node;
55                 this.pad = pad;
56                 this.els = new Gee.ArrayList<string>(); 
57                 //this.skip = new Gee.ArrayList<string>();
58                 this.ar_props = new Gee.HashMap<string,string>();
59
60         }
61         
62         public string munge ( )
63         {
64
65                  
66                 this.pad += "    ";
67
68                 var cls = this.node.fqn().replace(".", "");
69                 string res = "";
70                 switch(cls) {
71                         // things we can not do yet...
72                         case "GtkDialog": // top level.. - named and referenced
73                         case "GtkAboutDialog":
74                         case "GtkMessageDialog":
75                         case "GtkWindow": // top level.. - named and referenced
76                                 res =  this.mungeOuter(true);
77                                 break;
78                         default:
79                                 res = this.mungeOuter(false);
80                                 break;
81                 }
82                                 
83                 
84                 if (res.length < 1) {
85                         return "";
86                 }
87                 return  "<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
88                         <!-- Generated with appBuilder 4.1 -->
89                         <interface> 
90                                 <requires lib=\"gtk+\" version=\"3.12\"/>
91                                 <!-- <requires lib=\"gtksourceview\" version=\"3.0\"/> -->
92                         " +
93                         res +
94                         "</interface>\n";
95           
96                      
97         }
98         public string mungeChild(string pad ,  Node cnode, bool with_packing = false)
99         {
100                 var x = new  NodeToGlade(cnode,  pad);
101                 return x.mungeNode(with_packing);
102         }
103         
104         public string mungeNode(bool with_packing)
105         {
106                 var pad = this.pad;
107                 var cls = this.node.fqn().replace(".", "");
108                 
109                 var b = new global::Gtk.Builder();
110
111                 var gtype = b.get_type_from_name(cls);
112                 print("Type: %s ?= %s\n", this.node.fqn(), gtype.name());
113
114                 
115                 
116                 var ns = this.node.fqn().split(".")[0];
117                 if (ns == "Clutter") {
118                         return "";
119                 }
120                 //if (ns == "GtkClutter") {
121                 //      return "";
122                 //}
123                 if (ns == "WebKit") {
124                         return "";
125                 }
126                 switch(cls) {
127                         // things we can not do yet...
128                         /*case "GtkDialog": // top level.. - named and referenced
129                         case "GtkAboutDialog":
130                         case "GtkWindow": // top level.. - named and referenced
131                                 return this.mungeWindow();
132                                 
133                                         
134                                 if (this.node.items.size > 0) {
135                                         return this.mungeChild(pad + "        " , this.node.items.get(0), false );
136                                 }
137                                 return "";
138                         */
139                         //case "GtkView": // SourceView?
140                         case "GtkTreeStore": // top level.. - named and referenced
141                         case "GtkListStore": // top level.. - named and referenced
142                         case "GtkTreeViewColumn": // part of liststore?!?!
143                         case "GtkMenu": // top level..
144                         case "GtkCellRendererText":
145                         case "GtkSourceBuffer":                         
146                         case "GtkClutterActor"://fixme..
147                         ///case "GtkClutterEmbed"://fixme..
148                                 return "";
149                 }
150
151                 
152                 var id = this.node.uid();
153                 var ret = @"$pad<object class=\"$cls\" id=\"$id\">\n";
154                 // properties..
155                 var props = Palete.Gir.factoryFqn(this.node.fqn()).props;
156                 //var props =  Palete.factory("Gtk").getPropertiesFor(this.node.fqn(), "props");
157               
158                 var pviter = props.map_iterator();
159                 while (pviter.next()) {
160                         
161                                 // print("Check: " +cls + "::(" + pviter.get_value().propertyof + ")" + pviter.get_key() + " " );
162                                 
163                         // skip items we have already handled..
164                         if  (!this.node.has(pviter.get_key())) {
165                                 continue;
166                         }
167                         var k = pviter.get_key();
168                         var val = GLib.Markup.escape_text(this.node.get(pviter.get_key()).strip());
169                         ret += @"$pad    <property name=\"$k\">$val</property>\n"; // es
170
171                 }
172                 // packing???
173
174                 var pack = "";
175                 
176                 if (with_packing   ) {
177  
178                         pack = this.packString();
179                         
180
181                 }       
182                 // children..
183
184                 if (this.node.items.size < 1) {
185                         return ret + @"$pad</object>\n" + pack;
186                 }
187                 
188                 for (var i = 0; i < this.node.items.size; i++ ) {
189
190                         var add = this.mungeChild(pad + "        " , this.node.items.get(i) , true);
191                         if (add.length < 1) {
192                                 continue;
193                         }
194                         
195                         ret += @"$pad    <child>\n";
196                         ret += add;
197                         ret += @"$pad    </child>\n";
198                 }
199                 
200                 return ret + @"$pad</object>\n" + pack;
201                 
202
203                  
204
205         }
206          
207          
208         public string packString()
209         {
210                 
211                 
212                 
213                 
214                 // pack is part of the parent element..
215                 var p = node.parent;
216                 string[]  pk= { "add" };
217                 var pfqn = "Gtk.Box";
218                 if (p != null) {
219                         pfqn  = p.fqn();
220                         if (this.node.props.get("* pack") == null) {
221                                 return "";
222                         }
223                         pk = this.node.get("* pack").split(",");
224                 } else {
225                         if (this.node.props.get("* pack") != null) {
226                                 pk = this.node.get("* pack").split(",");
227                         }
228                         
229                 }
230                 
231                 if (pfqn == null) {
232                         return "";
233                 }
234                 if (pfqn == "Gtk.ScrolledWindow") {
235                         return "";
236                 }
237                 var p_parts =pfqn.split(".");
238
239  
240                 var ns = p_parts[0];
241                 var gir =  Palete.Gir.factory(ns);
242                 var cls = gir.classes.get(p_parts[1]);
243                 var mdef = cls.methods.get(pk[0]);
244                 if (mdef == null) {
245                         print("could not find method : %s\n", pk[0]);
246                         return "";
247                 }
248                 /*
249                 var generator = new Json.Generator ();
250                 var n = new Json.Node(Json.NodeType.OBJECT);
251                 n.set_object(mdef.toJSON());
252                 generator.set_root(n);
253                 generator.indent = 4;
254                 generator.pretty = true;
255                     
256                 print(generator.to_data(null));
257                 */
258                 string[]  pbody  = {};
259                 switch(pk[0]) {
260
261                         case "pack_start":
262                                 pbody += @"$pad    <property name=\"pack_type\">start</property>\n";
263                                 break;
264                         
265                         case "pack_end":
266                                 pbody += @"$pad    <property name=\"pack_type\">start</property>\n";
267                                 break;
268                                 
269                         case "add":
270                                 //pbody += @"$pad    <property name=\"pack_type\">start</property>\n";
271                                  pbody += @"$pad    <property name=\"expand\">True</property>\n";
272                                 pbody += @"$pad    <property name=\"fill\">True</property>\n";
273                                 //pbody += @"$pad    <property name=\"position\">1</property>\n";
274                                 var pack = @"$pad<packing>\n" +
275                                         string.joinv("", pbody) + 
276                                                 @"$pad</packing>\n";
277                                 return pack;
278                 
279                         case "set_model":
280                                 print ("set_model not handled yet..");
281                                 return "";
282                         
283                         default:
284                                 print ("unknown pack type: %s", pk[0]);
285                                 return "";
286                                 
287                 }
288                         
289                 var pad = this.pad;
290                  
291                 for (var i = 2; i < mdef.paramset.params.size; i++) {
292                         var poff = i - 1;
293                         if (poff > (pk.length-1)) {
294                                 break;
295                         }
296                         
297                         var key = mdef.paramset.params.get(i).name;
298                         var val = pk[poff];
299                         pbody += @"$pad    <property name=\"$key\">$val</property>\n";
300                 
301                 }
302              
303                 if (pbody.length < 1) {
304                         /*var generator = new Json.Generator ();
305                         var n = new Json.Node(Json.NodeType.OBJECT);
306                         n.set_object(mdef.toJSON());
307                         generator.set_root(n);
308                         generator.indent = 4;
309                         generator.pretty = true;
310                             
311                         print(generator.to_data(null));
312                         */
313                         print("skip - packing - no arguments (" + pk[0] + ")\n");
314                         return "";
315                 }
316                 
317                 var pack = @"$pad<packing>\n" +
318                                 string.joinv("", pbody) + 
319                                 @"$pad</packing>\n";
320                 return pack;
321
322         }
323         public string  mungeOuter(bool with_window)
324         {
325                 var label = this.node.fqn() + ": " + 
326                         (this.node.has("title") ? this.node.get("title") : "No-title");
327                 
328                 var ret = "";
329                 ret+= "
330 <object class=\"GtkBox\" id=\"fake-window1\">
331         <property name=\"visible\">True</property>
332         <property name=\"can_focus\">False</property>
333         <property name=\"orientation\">vertical</property>
334 ";
335                 if (with_window) {              
336                         ret+="
337         <child>
338                 <object class=\"GtkLabel\" id=\"fake-window-label-1\">
339                         <property name=\"visible\">True</property>
340                         <property name=\"can_focus\">False</property>
341                         <property name=\"label\" translatable=\"yes\">" + label + "</property>
342                 </object>
343                 <packing>
344                         <property name=\"expand\">False</property>
345                         <property name=\"fill\">True</property>
346                         <property name=\"position\">0</property>
347                 </packing>
348         </child>
349         ";
350                 }
351                 
352                 ret+=" 
353                 <child>
354                 ";
355                 if (with_window) {
356                         var children = "";
357                         if (this.node.items.size > 0) {
358                         
359                                 children =  this.mungeChild(pad + "        " , this.node.items.get(0), false);
360                           
361
362                         } 
363                         children += (children.length > 0) ? "<packing>
364                                 <property name=\"expand\">True</property>
365                                 <property name=\"fill\">True</property>
366                                 <property name=\"position\">1</property>
367                       </packing>" : "";
368                         
369                         ret+= (children.length < 1 ) ? "<placeholder/>" : children;
370                         
371                         
372                         
373
374                 } else {
375                         ret+= this.mungeNode (true);
376                 }
377
378                 ret+="
379                     </child>
380             ";
381         if (with_window) {
382                 ret+="
383                     <child>
384                       <object class=\"GtkBox\" id=\"fake-footer\">
385                         <property name=\"visible\">True</property>
386                         <property name=\"can_focus\">False</property>
387                         <child>
388                           <placeholder/>
389                         </child>
390                         <child>
391                           <placeholder/>
392                         </child>
393                       </object>
394                       <packing>
395                         <property name=\"expand\">False</property>
396                         <property name=\"fill\">True</property>
397                         <property name=\"position\">2</property>
398                       </packing>
399                     </child>
400             ";
401         }
402                 ret +="
403         </object>"; 
404
405         return ret;
406         }
407
408                 
409 }