1 //<Script type="text/javascript">
5 GLib = imports.gi.GLib;
6 GObject = imports.gi.GObject;
7 Pango = imports.gi.Pango ;
9 XObject = imports.XObject.XObject;
10 console = imports.console;
13 LeftPanelPopup = imports.Builder.LeftPanelPopup.LeftPanelPopup;
14 RightEditor = imports.Builder.RightEditor.RightEditor;
17 * really the properties..
21 LeftPanel = new XObject({
23 xtype: Gtk.ScrolledWindow,
25 pack : [ 'pack_end', true, true, 0 ],
26 shadow_type : Gtk.ShadowType.IN,
29 XObject.prototype.init.call(this);
30 this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
39 headers_visible : false ,
40 enable_tree_lines : true ,
43 XObject.prototype.init.call(this);
45 this.selection = this.el.get_selection();
46 this.selection.set_mode( Gtk.SelectionMode.SINGLE);
49 var description = new Pango.FontDescription.c_new();
50 description.set_size(8000);
51 this.el.modify_font(description);
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);
64 this.el.get_path_at_pos(ev.button.x,ev.button.y, res);
66 if (res.column.title == 'value') {
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);
82 pack : [ 'set_model' ],
83 xtype : Gtk.ListStore,
87 XObject.prototype.init.call(this);
88 this.el.set_column_types ( 5, [
89 GObject.TYPE_STRING, // 0 real key
90 GObject.TYPE_STRING, // 1 real value
91 GObject.TYPE_STRING, // 2 visable key
92 GObject.TYPE_STRING, // 3 visable value
93 GObject.TYPE_STRING, // 4 need to store type of!!!
100 toShort: function(str) {
101 var a = typeof(str) == 'string' ? str.split("\n") : [];
102 return a.length > 1 ? a[0] + '....' : '' + str;
108 RightEditor.el.hide();
115 var iter = new Gtk.TreeIter();
117 if (typeof(ar[i]) == 'object') {
120 this.el.append(iter);
121 var p = this.el.get_path(iter).to_string();
123 this.el.set_value(iter, 0, i);
124 this.el.set_value(iter, 1, '' + ar[i]);
125 this.el.set_value(iter, 2, i);
126 this.el.set_value(iter, 3, this.toShort(ar[i]));
127 this.el.set_value(iter, 4, typeof(ar[i]));
129 ar.listeners = ar.listeners || {};
130 for (var i in ar.listeners ) {
131 this.el.append(iter);
132 var p = this.el.get_path(iter).to_string();
135 this.el.set_value(iter, 0, '!'+ i );
136 this.el.set_value(iter, 1, '' + ar.listeners[i]);
137 this.el.set_value(iter, 2, '<b>'+ i + '</b>');
139 this.el.set_value(iter, 3, '' + this.toShort(ar.listeners[i]));
140 this.el.set_value(iter, 4, typeof(ar[i]));
147 add : function( info ) {
148 // info includes key, val, skel, etype..
150 type = info.type.toLowerCase();
151 var data = this.toJS();
153 if (info.etype == 'events') {
154 data.listeners = data.listeners || { };
155 if (typeof(data.listeners[info.key]) != 'undefined') {
156 return; //already set!
159 if (typeof(data[info.key]) != 'undefined') {
164 if (typeof(info.val) == 'undefined') {
167 if (info.type == 'boolean') {
170 if (type == 'number') {
178 if (info.etype == 'events') {
180 data.listeners[info.key] = info.val;
183 data[info.key] = info.val;
187 var map = this.load(data);
189 var LeftTree = imports.Builder.LeftTree.LeftTree;
191 LeftTree.get('model').changed(data, true);
192 //LeftPanel.get('view').selection.select_path(new Gtk.TreePath.from_string(map[k]));
193 //this.editSelected( true )
194 GLib.timeout_add(0, 100, function() {
196 LeftPanel.get('view').el.set_cursor_on_cell(
197 new Gtk.TreePath.from_string(map[k]),
198 LeftPanel.editableColumn.el,
199 LeftPanel.editableColumn.items[0].el,
203 LeftPanel.get('view').el.row_activated(
204 new Gtk.TreePath.from_string(map[k]),
205 LeftPanel.editableColumn.el
211 deleteSelected : function()
213 var data = this.toJS();
214 var iter = new Gtk.TreeIter();
215 var s = LeftPanel.get('view').selection;
216 s.get_selected(this.el, iter);
219 var gval = new GObject.Value('');
220 LeftPanel.get('model').el.get_value(iter, 0 ,gval);
222 var val = gval.value;
225 if (!data.listeners || typeof(data.listeners[ val.substring(1)]) == 'undefined') {
228 delete data.listeners[ val.substring(1)];
229 if (!XObject.keys(data.listeners).length) {
230 delete data.listeners;
234 if (typeof(data[val]) == 'undefined') {
242 var LeftTree = imports.Builder.LeftTree.LeftTree;
243 LeftTree.get('model').changed(data, true);
250 changed : function(str, doRefresh)
252 if (!this.activePath) {
255 var iter = new Gtk.TreeIter();
256 this.el.get_iter(iter, new Gtk.TreePath.from_string(this.activePath));
258 this.el.set_value(iter, 1, '' +str);
259 this.el.set_value(iter, 3, '' + this.toShort(str));
260 // update the tree...
261 var LeftTree = imports.Builder.LeftTree.LeftTree;
262 LeftTree.get('model').changed(this.toJS(), doRefresh);
266 var iter = new Gtk.TreeIter();
267 LeftPanel.get('model').el.get_iter_first(iter);
272 var k = this.getValue(iter, 0);
275 ar.listeners = ar.listeners || {};
276 ar.listeners[ k.substring(1)] = this.getValue(iter, 1);
279 ar[ k ] = this.getValue(iter, 1);
282 if (! LeftPanel.get('model').el.iter_next(iter)) {
286 Seed.print(JSON.stringify(ar));
288 // convert the list into a json string..
292 /** get's a value, and tries to use type column to work out what type */
293 getValue: function (iter, col) {
294 var gval = new GObject.Value('');
295 LeftPanel.get('model').el.get_value(iter, col ,gval);
296 var val = '' + gval.value;
300 gval = new GObject.Value('');
301 LeftPanel.get('model').el.get_value(iter,4 ,gval);
304 return parseFloat(val);
306 return val == 'true' ? true : false;
313 editSelected: function( e)
315 print("EDIT SELECTED?");
316 var iter = new Gtk.TreeIter();
317 var s = LeftPanel.get('view').selection;
318 s.get_selected(LeftPanel.get('model').el, iter);
319 var m = LeftPanel.get('model');
321 var gval = new GObject.Value('');
322 this.el.get_value(iter, 0 ,gval);
323 var val = '' + gval.value;
325 gval = new GObject.Value('');
326 this.el.get_value(iter, 1 ,gval);
327 var rval = gval.value;
328 var activePath = this.el.get_path(iter).to_string();
329 this.activePath = activePath ;
333 var showEditor = false;
339 if (rval.match(/function/g) || rval.match(/\n/g)) {
346 this.activePath = false;
347 GLib.timeout_add(0, 1, function() {
348 // Gdk.threads_enter();
349 RightEditor.el.show();
350 RightEditor.get('view').load( rval );
354 _this.activePath = activePath ;
356 // Gdk.threads_leave();
362 RightEditor.el.hide();
364 var type = this.getValue(iter,4);
365 print("type = " + type);
367 if (type == 'boolean') {
368 // let's show a pulldown..
369 LeftPanel.editableColumn.setOptions([ 'true' , 'false']);
372 val = ! this.getValue(iter,1);
374 this.activePath = false;
376 GLib.timeout_add(0, 1, function() {
377 // Gdk.threads_enter();
381 _this.activePath = activePath ;
382 _this.changed(''+val,true);
389 // otherwise we are going to show the text editor..
392 //r.stop_editing(true);
401 xtype: Gtk.TreeViewColumn,
402 pack : ['append_column'],
406 XObject.prototype.init.call(this);
407 this.el.add_attribute(this.items[0].el , 'markup', 2 );
412 xtype : Gtk.CellRendererText,
413 pack : ['pack_start'],
420 xtype: Gtk.TreeViewColumn,
421 pack : ['append_column'],
425 XObject.prototype.init.call(this);
426 this.el.add_attribute(this.items[0].el , 'text', 3 );
427 // this.el.set_cell_data_func(cell, age_cell_data_func, NULL, NULL);
429 LeftPanel.editableColumn= this;
431 setOptions : function(ar)
433 this.items[0].el.has_entry = false; // stop editable.
434 //this.items[0].el.editable = false;
435 var m = this.items[0].el.model;
437 var iter = new Gtk.TreeIter();
438 ar.forEach(function(i) {
441 m.set_value(iter, 0, i);
448 clicked : function () {
449 this.items[0].el.has_entry = false;
457 xtype : Gtk.CellRendererText,
458 pack : ['pack_start'],
464 edited : function(r,p, t) {
465 LeftPanel.get('model').changed(t, true);
466 LeftPanel.get('model').activePath = false;
470 'editing-started' : function(r, e, p) {
471 LeftPanel.get('model').editSelected(e);
480 var ret = new Gtk.CellRendererCombo();
481 ret.model = new Gtk.ListStore();
482 ret.model.set_column_types ( 1, [
483 GObject.TYPE_STRING, // 0 real key
489 pack : ['pack_start'],
495 edited : function(r,p, t) {
496 LeftPanel.get('model').changed(t, true);
497 LeftPanel.get('model').activePath = false;
501 'editing-started' : function(r, e, p) {
502 this.el.has_entry = false;
503 LeftPanel.get('model').editSelected(e);