README.txt
[app.Builder.js] / Builder / LeftPanel.js
1 //<Script type="text/javascript">
2 Gio = imports.gi.Gio;
3 Gtk = imports.gi.Gtk;
4 Gdk = imports.gi.Gdk;
5 GLib = imports.gi.GLib;
6 GObject = imports.gi.GObject;
7 Pango = imports.gi.Pango ;
8
9 XObject = imports.XObject.XObject;
10 console = imports.console;
11
12
13 LeftPanelPopup  = imports.Builder.LeftPanelPopup.LeftPanelPopup;
14 RightEditor     = imports.Builder.RightEditor.RightEditor;
15 /**
16  * 
17  * really the properties..
18  */
19
20
21 LeftPanel = new XObject({
22         
23         xtype: Gtk.ScrolledWindow,
24         smooth_scroll : true,
25         pack : [ 'pack_end', true, true, 0 ],
26         shadow_type : Gtk.ShadowType.IN,
27         
28         init : function () {
29             XObject.prototype.init.call(this); 
30             this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
31         },
32         items : [
33             {
34                 id : 'view',
35                 
36                 xtype : Gtk.TreeView,
37                 
38                 tooltip_column : 1,
39                 headers_visible :   false ,
40                 enable_tree_lines :  true ,
41                      
42                 init : function () {
43                     XObject.prototype.init.call(this); 
44                        
45                     this.selection = this.el.get_selection();
46                     this.selection.set_mode( Gtk.SelectionMode.SINGLE);
47                  
48                     
49                     var description = new Pango.FontDescription.c_new();
50                     description.set_size(8000);
51                     this.el.modify_font(description);
52                 },     
53                 listeners : {
54                     
55                   
56                     'button-press-event' : function(tv, ev) {
57                         if (ev.type != Gdk.EventType.BUTTON_PRESS  || ev.button.button != 3) {
58                             Seed.print("click" + ev.type);
59                             return false;
60                         }
61                       
62                     
63                         var res = { }; 
64                         this.el.get_path_at_pos(ev.button.x,ev.button.y, res);
65                         
66                         if (res.column.title == 'value') {
67                             return false;
68                         }
69                         if (!LeftPanelPopup.el) LeftPanelPopup.init();
70                         LeftPanelPopup.el.set_screen(Gdk.Screen.get_default());
71                         LeftPanelPopup.el.show_all();
72                         LeftPanelPopup.el.popup(null, null, null, null, 3, ev.button.time);
73                         Seed.print("click:" + res.column.title);
74                         return false;
75                         
76                     }
77                 },
78                 items : [
79                 
80                     {
81                         id : 'model',
82                         pack : [ 'set_model' ],
83                         xtype : Gtk.ListStore,
84                         
85                         init : function ()
86                         {
87                             XObject.prototype.init.call(this); 
88                             this.el.set_column_types ( 5, [
89                                 GObject.TYPE_STRING,  // real key
90                                  GObject.TYPE_STRING, // real value 
91                                  GObject.TYPE_STRING,  // visable key
92                                  GObject.TYPE_STRING, // visable value
93                                  GObject.TYPE_STRING// need to store type of!!!
94                                 ] );
95                                     
96                             
97                          
98                         },
99                         toShort: function(str) {
100                             var a = typeof(str) == 'string' ? str.split("\n") : [];
101                             return a.length > 1 ? a[0] + '....' : '' + str;
102                         },
103                         load : function (ar)
104                         {
105                             this.el.clear();
106                             
107                             RightEditor.el.hide();
108                             if (ar === false) {
109                                 return ;
110                             }
111                             
112                             // sort!!!?
113                             var iter = new Gtk.TreeIter();
114                             for (var i in ar) {
115                                 if (typeof(ar[i]) == 'object') {
116                                     continue;
117                                 }
118                                 this.el.append(iter);
119                                 this.el.set_value(iter, 0, i);
120                                 this.el.set_value(iter, 1, '' + ar[i]);
121                                 this.el.set_value(iter, 2, i);
122                                 this.el.set_value(iter, 3, this.toShort(ar[i]));
123                                 this.el.set_value(iter, 4, typeof(ar[i]));
124                             }
125                             ar.listeners = ar.listeners || {};
126                             for (var i in ar.listeners ) {
127                                 this.el.append(iter);
128                                 this.el.set_value(iter, 0, '!'+  i  );
129                                 this.el.set_value(iter, 1, '' + ar.listeners[i]);
130                                 this.el.set_value(iter, 2, '<b>'+ i + '</b>');
131                                 
132                                 this.el.set_value(iter, 3, '' + this.toShort(ar.listeners[i]));
133                                 this.el.set_value(iter, 4, typeof(ar[i]));
134                             }
135                             
136                         },
137                         
138                         
139                         
140                         add : function(key, type,   val, skel) {
141                             type = type.toLowerCase();
142                             var data = this.toJS();
143                             if ((typeof(data[key]) != 'undefined') && 
144                                 (typeof(val) == 'undefined') ) {
145                                 return;
146                             }
147                             if (typeof(val) == 'undefined') {
148                                     
149                                 val = '';
150                                 if (type == 'boolean') {
151                                     val = true;
152                                 }
153                                 if (type == 'number') {
154                                     val = 0;
155                                 }
156                                 // utf8 == string..
157                                 
158                                 
159                             }
160                             data[key] = val;
161                             
162                             this.load(data);
163                             var LeftTree        = imports.Builder.LeftTree.LeftTree;
164                             LeftTree.get('model').changed(data, true); 
165                             
166                             
167                         },
168                         deleteSelected : function()
169                         {
170                             var data = this.toJS();
171                             var iter = new Gtk.TreeIter();
172                             var s = LeftPanel.get('view').selection;
173                             s.get_selected(this.el, iter);
174                                  
175                                
176                             var gval = new GObject.Value('');
177                             LeftPanel.get('model').el.get_value(iter, 0 ,gval);
178                             if (typeof(data[gval.value]) == 'undefined') {
179                                 return;
180                             }
181                             delete data[gval.value];
182                             this.load(data);
183                             var LeftTree        = imports.Builder.LeftTree.LeftTree;
184                             LeftTree.get('model').changed(data, true);
185                             
186                         },
187                         
188                         
189                         
190                         activeIter : false,
191                         changed : function(str, doRefresh)
192                         {
193                             if (!this.activeIter) {
194                                 return;
195                             }
196                             this.el.set_value(this.activeIter, 1, str);
197                             this.el.set_value(this.activeIter, 3, '' + this.toShort(str));
198                             // update the tree...
199                             var LeftTree        = imports.Builder.LeftTree.LeftTree;
200                             LeftTree.get('model').changed(this.toJS(), doRefresh); 
201                         },
202                         toJS: function()
203                         {
204                             var iter = new Gtk.TreeIter();
205                             LeftPanel.get('model').el.get_iter_first(iter);
206                             var ar = {};
207                                
208                             while (true) {
209                                 
210                                 var k = this.getValue(iter, 0);
211                                 Seed.print(k);
212                                 if (k[0] == '!') {
213                                     ar.listeners = ar.listeners || {};
214                                     ar.listeners[k.substring(1)] = this.getValue(iter, 1);
215                                     
216                                 } else {
217                                     ar[ k ] = this.getValue(iter, 1);
218                                 }
219                                 
220                                 if (! LeftPanel.get('model').el.iter_next(iter)) {
221                                     break;
222                                 }
223                             }
224                                 Seed.print(JSON.stringify(ar));
225                             return ar;
226                             // convert the list into a json string..
227                         
228                             
229                         },
230                         getValue: function (iter, col) {
231                             var gval = new GObject.Value('');
232                             LeftPanel.get('model').el.get_value(iter, col ,gval);
233                             var val = '' + gval.value;
234                             if (col != 1) {
235                                 return val;
236                             }
237                             gval = new GObject.Value('');
238                               LeftPanel.get('model').el.get_value(iter,4  ,gval);
239                             switch(gval.value) {
240                                 case 'number':
241                                     return parseFloat(val);
242                                 case 'boolean':
243                                     return val == 'true' ? true : false;
244                                 default: 
245                                     return val;
246                             }
247                             
248                         } 
249                           
250                         
251                     },
252
253                     {
254                         
255                         xtype: Gtk.TreeViewColumn,
256                         pack : ['append_column'],
257                         title : 'key',
258                         init : function ()
259                         {
260                             XObject.prototype.init.call(this); 
261                             this.el.add_attribute(this.items[0].el , 'markup', 2 );
262                         },
263                         items : [
264                             {
265                                 xtype : Gtk.CellRendererText,
266                                 pack : ['pack_start'],
267                             }
268                         ]
269                     },
270                             
271                     {
272                         
273                         xtype: Gtk.TreeViewColumn,
274                         pack : ['append_column'],
275                         title : 'value',
276                         init : function ()
277                         {
278                             XObject.prototype.init.call(this); 
279                             this.el.add_attribute(this.items[0].el , 'text', 3 );
280                              
281                         },
282                         items : [
283                         
284                          
285                             {
286                                 
287                                 xtype : Gtk.CellRendererText,
288                                 pack : ['pack_start'],
289                                 editable : true,
290                                 
291                                 
292                                 
293                                 listeners : {
294  
295                                     edited : function(r,p, t) {
296                                         LeftPanel.get('model').changed(t, true);
297                                         LeftPanel.get('model').activeIter = false;
298                                         
299                                     },
300                                    
301                                     'editing-started' : function(r, e, p) {
302                                         
303                                         var iter = new Gtk.TreeIter();
304                                         var s = LeftPanel.get('view').selection;
305                                         s.get_selected(LeftPanel.get('model').el, iter);
306                                          
307                                        
308                                         var gval = new GObject.Value('');
309                                         LeftPanel.get('model').el.get_value(iter, 0 ,gval);
310                                         var val = '' + gval.value;
311                                         
312                                         gval = new GObject.Value('');
313                                         LeftPanel.get('model').el.get_value(iter, 1 ,gval);
314                                         var rval = gval.value;
315                                          
316                                         LeftPanel.get('model').activeIter = iter;
317                                         //  not listener...
318                                         
319                                         var showEditor = false;
320                                         
321                                         if (val[0] == '!') {
322                                             showEditor = true;
323                                         }
324                                         if (val[0] == '|') {
325                                             if (rval.match(/function/g) || rval.match(/\n/g)) {
326                                                 showEditor = true;
327                                             }
328                                         }
329                                         
330                                         if (!showEditor) {
331                                             RightEditor.el.hide();
332
333                                             var type = LeftPanel.get('model').getValue(iter,4);
334                                             
335                                             // toggle boolean
336                                             if (type == 'boolean') {
337                                                 val = ! LeftPanel.get('model').getValue(iter,1);
338                                                 
339                                                 
340                                                 LeftPanel.get('model').activeIter = false;
341                                                 GLib.timeout_add(0, 1, function() {
342                                                     //   Gdk.threads_enter();
343                                                      
344                                                     e.editing_done();
345                                                     e.remove_widget();
346                                                     LeftPanel.get('model').activeIter = iter;
347                                                     LeftPanel.get('model').changed(''+val,true);
348                                                     
349                                              
350                                                     return false;
351                                                 });
352                                             }
353                                             
354                                             return;
355                                         }
356                                         LeftPanel.get('model').activeIter = false;
357                                         GLib.timeout_add(0, 1, function() {
358                                             //   Gdk.threads_enter();
359                                             RightEditor.el.show();
360                                             RightEditor.get('view').load( rval );
361                                             
362                                             e.editing_done();
363                                             e.remove_widget();
364                                             LeftPanel.get('model').activeIter = iter;
365                                             
366                                      //       Gdk.threads_leave();
367                                             return false;
368                                         });
369                                         //r.stop_editing(true);
370                                     }
371                                 },
372                                 
373                             }
374                         ]
375                     }
376                 
377                 ]
378             }
379         ]    
380             
381     }
382 );
383     
384      
385