f15223b8891ef035c9887e79e96045400147c15e
[app.Builder.js] / 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                 this.fillValaName(this.node);
66                 this.pad += "    ";
67                 return  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
68                         "<!-- Generated with glade 3.18.3 -->\n" +
69                         "<interface>\n" + 
70                         "    <requires lib=\"gtk+\" version=\"3.12\"/>\n" +
71                         this.mungeNode() +
72                         "</interface>\n";
73           
74                      
75         }
76         public string mungeChild(string pad ,  Node cnode)
77         {
78                 var x = new  NodeToGlade(cnode,  pad);
79                 return x.mungeNode();
80         }
81         
82         public string mungeNode()
83         {
84                 var pad = this.pad;
85                 var cls = this.node.xvala_cls.replace(".", "");
86
87                 switch(cls) {
88                         // things we can not do yet...
89                         case "GtkTreeStore": // top level.. - named and referenced
90                         case "GtkListStore": // top level.. - named and referenced
91                         case "GtkTreeViewColumn": // part of liststore?!?!
92                         case "GtkMenu": // top level..
93                                 return "";
94                 }
95
96                 
97                 var id = this.node.uid();
98                 var ret = @"$pad<object class=\"$cls\" id=\"$id\">\n";
99                 // properties..
100                 var props =  Palete.factory("Gtk").getPropertiesFor(this.node.xvala_cls, "props");
101             
102                 var pviter = props.map_iterator();
103                 while (pviter.next()) {
104                         
105                                 // print("Check: " +cls + "::(" + pviter.get_value().propertyof + ")" + pviter.get_key() + " " );
106                                 
107                         // skip items we have already handled..
108                         if  (this.node.props.get(pviter.get_key()) == null) {
109                                 continue;
110                         }
111                         var k = pviter.get_key();
112                         var val = GLib.Markup.escape_text(this.node.props.get(pviter.get_key()));
113                         ret += @"$pad    <property name=\"$k\">$val</property>\n"; // es
114
115                 }
116                 // packing???
117
118                 var pack = "";
119                 if (this.node.props.get("* pack") != null) {
120
121                 
122                         pack = this.packString();
123                         
124
125                 }       
126                 // children..
127
128                 if (this.node.items.size < 1) {
129                         return ret + @"$pad</object>\n" + pack;
130                 }
131                 
132                 for (var i = 0; i < this.node.items.size; i++ ) {
133
134                         var add = this.mungeChild(pad + "        " , this.node.items.get(i) );
135                         if (add.length < 1) {
136                                 continue;
137                         }
138                         
139                         ret += @"$pad    <child>\n";
140                         ret += this.mungeChild(pad + "        " , this.node.items.get(i) );
141                         ret += @"$pad    </child>\n";
142                 }
143                 
144                 return ret + @"$pad</object>\n" + pack;
145                 
146
147                  
148
149         }
150         string toValaNS(Node node)
151         {
152             var ns = this.node.get("$ xns") ;
153             if (ns == "Glade") {
154                 return "Gladeui.";
155             }
156             return ns + ".";
157         }
158         public void  fillValaName(Node node) 
159         {
160             if (node.xvala_cls.length < 1) {
161                     vcnt++;
162
163                     var cls = this.toValaNS(node) + node.get("xtype");
164
165                     string id = node.get("id").length > 0 ? 
166                                 node.get("id") :  "%s%d".printf(node.get("xtype"), vcnt);
167
168                     var props = Palete.factory("Gtk").getPropertiesFor(cls,  "props");
169                      
170                     node.xvala_cls = cls;
171                     node.xvala_xcls = "Xcls_" + id;
172                     node.xvala_id = node.get("id").length > 0  ? node.get("id") : "";
173             }                                                     
174             //this.vitems.append(item);  
175             // loop children..
176                                                                                
177             if (node.items.size < 1) {
178                 return;
179             }
180             for(var i =0;i<node.items.size;i++) {
181                 this.fillValaName(node.items.get(i));
182             }
183                                   
184         }
185         public string packString()
186         {
187                  
188                 var pk = this.node.get("* pack").split(",");
189                 // pack is part of the parent element..
190                 var p = node.parent;
191                 if (p == null) {
192                         
193                         return "";
194                 }
195                 
196                 var pfqn  = p.fqn();
197                 if (pfqn == null) {
198                         return "";
199                 }
200                 var p_parts =pfqn.split("."); 
201                 var ns = p_parts[0];
202                 var gir =  Palete.Gir.factory(ns);
203                 var cls = gir.classes.get(p_parts[1]);
204                 var mdef = cls.methods.get(pk[0]);
205                 if (mdef == null) {
206                         print("could not find method : %s\n", pk[0]);
207                         return "";
208                 }
209                 /*
210                 var generator = new Json.Generator ();
211                 var n = new Json.Node(Json.NodeType.OBJECT);
212                 n.set_object(mdef.toJSON());
213                 generator.set_root(n);
214                 generator.indent = 4;
215                 generator.pretty = true;
216                     
217                 print(generator.to_data(null));
218                 */
219                 string[]  pbody  = {};
220                 switch(pk[0]) {
221
222                         case "pack_start":
223                                 pbody += @"$pad    <property name=\"pack_type\">start</property>\n";
224                                 break;
225                         
226                         case "pack_end":
227                                 pbody += @"$pad    <property name=\"pack_type\">start</property>\n";
228                                 break;
229                                 
230                         case "add":
231                                 //pbody += @"$pad    <property name=\"pack_type\">start</property>\n";
232                                  pbody += @"$pad    <property name=\"expand\">False</property>\n";
233                                 pbody += @"$pad    <property name=\"fill\">True</property>\n";
234                                 pbody += @"$pad    <property name=\"position\">1</property>\n";
235                                 var pack = @"$pad<packing>\n" +
236                                         string.joinv("", pbody) + 
237                                                 @"$pad</packing>\n";
238                                 return pack;
239                 
240                         case "set_model":
241                                 print ("set_model not handled yet..");
242                                 return "";
243                         
244                         default:
245                                 print ("unknown pack type: %s", pk[0]);
246                                 break;
247                                 
248                 }
249                         
250                 var pad = this.pad;
251                  
252                 for (var i = 2; i < mdef.paramset.params.size; i++) {
253                         var poff = i - 1;
254                         if (poff > (pk.length-1)) {
255                                 break;
256                         }
257                         
258                         var key = mdef.paramset.params.get(i).name;
259                         var val = pk[poff];
260                         pbody += @"$pad    <property name=\"$key\">$val</property>\n";
261                 
262                 }
263                 if (pbody.length < 1) {
264                         var generator = new Json.Generator ();
265                         var n = new Json.Node(Json.NodeType.OBJECT);
266                         n.set_object(mdef.toJSON());
267                         generator.set_root(n);
268                         generator.indent = 4;
269                         generator.pretty = true;
270                             
271                         print(generator.to_data(null));
272                         return "";
273                 }
274                 
275                 var pack = @"$pad<packing>\n" +
276                                 string.joinv("", pbody) + 
277                                 @"$pad</packing>\n";
278                 return pack;
279
280         }
281     
282 }