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,
31 XObject.prototype.init.call(this);
32 this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
45 headers_visible : false ,
46 enable_tree_lines : true ,
49 XObject.prototype.init.call(this);
51 this.selection = this.el.get_selection();
52 this.selection.set_mode( Gtk.SelectionMode.SINGLE);
55 var description = new Pango.FontDescription.c_new();
56 description.set_size(8000);
57 this.el.modify_font(description);
62 'button-press-event' : function(tv, ev) {
68 if (!this.el.get_path_at_pos(ev.button.x,ev.button.y, res)) {
69 return false; //not on a element.
73 if (ev.type != Gdk.EventType.BUTTON_PRESS || ev.button.button != 3) {
75 if (res.column.title != 'value') {
76 return false; // ignore..
78 if ( LeftPanel.editing) {
81 var renderer = LeftPanel.editableColumn.items[0].el; // set has_entry..
82 LeftPanel.editableColumn.items[0].el.stop_editing();
83 var type = LeftPanel.get('model').getType(res.path.to_string());
86 var LeftTree = imports.Builder.LeftTree.LeftTree;
87 var provider = LeftTree.getPaleteProvider();
89 var opts = provider.findOptions(type);
92 LeftPanel.editableColumn.setOptions([]);
93 renderer.has_entry = true;
95 LeftPanel.editableColumn.setOptions(opts);
96 renderer.has_entry = false;
100 Seed.print("click" + ev.type);
107 if (res.column.title == 'value') {
110 if (!LeftPanelPopup.el) LeftPanelPopup.init();
111 LeftPanelPopup.el.set_screen(Gdk.Screen.get_default());
112 LeftPanelPopup.el.show_all();
113 LeftPanelPopup.el.popup(null, null, null, null, 3, ev.button.time);
114 Seed.print("click:" + res.column.title);
120 'row-activated' : function()
122 console.print('row activated');
123 // always set the cmobo entry to not ediable..
135 pack : [ 'set_model' ],
136 xtype : Gtk.ListStore,
140 XObject.prototype.init.call(this);
141 this.el.set_column_types ( 5, [
142 GObject.TYPE_STRING, // 0 real key
143 GObject.TYPE_STRING, // 1 real value
144 GObject.TYPE_STRING, // 2 visable key
145 GObject.TYPE_STRING, // 3 visable value
146 GObject.TYPE_STRING, // 4 need to store type of!!!
153 toShort: function(str) {
154 var a = typeof(str) == 'string' ? str.split("\n") : [];
155 return a.length > 1 ? a[0] + '....' : '' + str;
161 RightEditor.el.hide();
167 var LeftTree = imports.Builder.LeftTree.LeftTree;
168 var provider = LeftTree.getPaleteProvider();
171 var iter = new Gtk.TreeIter();
173 if (typeof(ar[i]) == 'object') {
177 var type = provider.findType(ar, i, ar[i]);
179 this.el.append(iter);
180 var p = this.el.get_path(iter).to_string();
182 this.el.set_value(iter, 0, i);
183 this.el.set_value(iter, 1, '' + ar[i]);
184 this.el.set_value(iter, 2, i);
185 this.el.set_value(iter, 3, this.toShort(ar[i]));
186 this.el.set_value(iter, 4, type);
188 ar.listeners = ar.listeners || {};
189 for (var i in ar.listeners ) {
190 this.el.append(iter);
191 var p = this.el.get_path(iter).to_string();
194 this.el.set_value(iter, 0, '!'+ i );
195 this.el.set_value(iter, 1, '' + ar.listeners[i]);
196 this.el.set_value(iter, 2, '<b>'+ i + '</b>');
198 this.el.set_value(iter, 3, '' + this.toShort(ar.listeners[i]));
199 this.el.set_value(iter, 4, 'function');
206 add : function( info ) {
207 // info includes key, val, skel, etype..
209 type = info.type.toLowerCase();
210 var data = this.toJS();
212 if (info.etype == 'events') {
213 data.listeners = data.listeners || { };
214 if (typeof(data.listeners[info.key]) != 'undefined') {
215 return; //already set!
218 if (typeof(data[info.key]) != 'undefined') {
223 if (typeof(info.val) == 'undefined') {
226 if (info.type == 'boolean') {
229 if (type == 'number') {
237 if (info.etype == 'events') {
239 data.listeners[info.key] = info.val;
242 data[info.key] = info.val;
246 var map = this.load(data);
248 var LeftTree = imports.Builder.LeftTree.LeftTree;
250 LeftTree.get('model').changed(data, true);
252 var type = LeftPanel.get('model').getType(map[k]);
255 var LeftTree = imports.Builder.LeftTree.LeftTree;
256 var provider = LeftTree.getPaleteProvider();
258 var opts = provider.findOptions(type);
259 var renderer = LeftPanel.editableColumn.items[0].el;
261 if (opts === false) {
262 LeftPanel.editableColumn.setOptions([]);
263 renderer.has_entry = true; /// probably does not have any effect.
265 LeftPanel.editableColumn.setOptions(opts);
266 renderer.has_entry = false;
270 this.startEditing(map[k]);
273 LeftPanel.get('view').el.row_activated(
274 new Gtk.TreePath.from_string(map[k]),
275 LeftPanel.editableColumn.el
282 * start editing path (or selected if not set..)
283 * @param {String|false} path (optional) treepath to edit - selected tree gets
285 * @param {Number} 0 or 1 (optional)- column to edit.
287 startEditing : function(path, col)
289 // fix tp (treepath) and path string..
291 if (typeof(path) == 'string') {
292 tp = new Gtk.TreePath.from_string(path);
294 var iter = new Gtk.TreeIter();
295 var s = LeftPanel.get('view').selection;
296 s.get_selected(this.el, iter);
297 tp = this.el.get_path(iter);
298 path = tp.to_string();
301 // which colum is to be edited..
303 if (typeof(col) == 'undefined') {
304 colObj = (!k.length || k == '|') ?
305 LeftPanel.propertyColumn : LeftPanel.editableColumn;
307 colObj = col ? LeftPanel.propertyColumn : LeftPanel.editableColumn;
310 // make sure the pulldown is set correctly..
311 // not really needed for second col...
312 var type = LeftPanel.get('model').getType(path);
313 var opts = provider.findOptions(type);
314 var renderer = LeftPanel.editableColumn.items[0].el;
316 if (opts === false) {
317 LeftPanel.editableColumn.setOptions([]);
318 renderer.has_entry = true; /// probably does not have any effect.
320 LeftPanel.editableColumn.setOptions(opts);
321 renderer.has_entry = false;
325 // iter now has row...
326 GLib.timeout_add(0, 100, function() {
328 colObj.items[0].el.editable = true; // esp. need for col 0..
329 LeftPanel.get('view').el.set_cursor_on_cell(
340 deleteSelected : function()
342 var data = this.toJS();
343 var iter = new Gtk.TreeIter();
344 var s = LeftPanel.get('view').selection;
345 s.get_selected(this.el, iter);
348 var gval = new GObject.Value('');
349 LeftPanel.get('model').el.get_value(iter, 0 ,gval);
351 var val = gval.value;
354 if (!data.listeners || typeof(data.listeners[ val.substring(1)]) == 'undefined') {
357 delete data.listeners[ val.substring(1)];
358 if (!XObject.keys(data.listeners).length) {
359 delete data.listeners;
363 if (typeof(data[val]) == 'undefined') {
371 var LeftTree = imports.Builder.LeftTree.LeftTree;
372 LeftTree.get('model').changed(data, true);
379 changed : function(str, doRefresh)
381 if (!this.activePath) {
384 var iter = new Gtk.TreeIter();
385 this.el.get_iter(iter, new Gtk.TreePath.from_string(this.activePath));
387 this.el.set_value(iter, 1, '' +str);
388 this.el.set_value(iter, 3, '' + this.toShort(str));
389 // update the tree...
390 var LeftTree = imports.Builder.LeftTree.LeftTree;
391 LeftTree.get('model').changed(this.toJS(), doRefresh);
395 var iter = new Gtk.TreeIter();
396 LeftPanel.get('model').el.get_iter_first(iter);
401 var k = this.getValue(iter, 0);
404 ar.listeners = ar.listeners || {};
405 ar.listeners[ k.substring(1)] = this.getValue(iter, 1);
408 ar[ k ] = this.getValue(iter, 1);
411 if (! LeftPanel.get('model').el.iter_next(iter)) {
417 Seed.print(JSON.stringify(ar));
419 // convert the list into a json string..
423 getType :function(treepath_str)
425 var iter = new Gtk.TreeIter();
426 this.el.get_iter(iter, new Gtk.TreePath.from_string(treepath_str));
428 var gval = new GObject.Value('');
429 LeftPanel.get('model').el.get_value(iter,4 ,gval);
430 return gval.value + '';
433 /** get's a value, and tries to use type column to work out what type */
434 getValue: function (iter, col) {
436 var gval = new GObject.Value('');
437 LeftPanel.get('model').el.get_value(iter, col ,gval);
438 var val = '' + gval.value;
442 var type = this.getType(this.el.get_path(iter).to_string());
443 //print("TYPE: " +type + " - val:" + val);
444 switch(type.toLowerCase()) {
448 return parseFloat(val); // Nan ?? invalid!!?
450 return val == 'true' ? true : false;
457 editSelected: function( e)
459 print("EDIT SELECTED?");
460 var iter = new Gtk.TreeIter();
461 var s = LeftPanel.get('view').selection;
462 s.get_selected(LeftPanel.get('model').el, iter);
463 var m = LeftPanel.get('model');
465 var gval = new GObject.Value('');
466 this.el.get_value(iter, 0 ,gval);
467 var val = '' + gval.value;
469 gval = new GObject.Value('');
470 this.el.get_value(iter, 1 ,gval);
471 var rval = gval.value;
472 var activePath = this.el.get_path(iter).to_string();
473 this.activePath = activePath ;
477 var showEditor = false;
483 if (rval.match(/function/g) || rval.match(/\n/g)) {
490 this.activePath = false;
491 GLib.timeout_add(0, 1, function() {
492 // Gdk.threads_enter();
493 RightEditor.el.show();
494 RightEditor.get('view').load( rval );
498 _this.activePath = activePath ;
500 // Gdk.threads_leave();
506 RightEditor.el.hide();
508 var type = this.getValue(iter,4);
509 print("type = " + type);
511 if (type == 'boolean') {
512 // let's show a pulldown..
513 //LeftPanel.editableColumn.setOptions([ 'true' , 'false']);
516 val = ! this.getValue(iter,1);
518 this.activePath = false;
520 GLib.timeout_add(0, 1, function() {
521 // Gdk.threads_enter();
525 _this.activePath = activePath ;
526 _this.changed(''+val,true);
532 //LeftPanel.editableColumn.el.has_entry = true; // alwo editing?
533 // otherwise we are going to show the text editor..
545 xtype: Gtk.TreeViewColumn,
546 pack : ['append_column'],
550 XObject.prototype.init.call(this);
551 this.el.add_attribute(this.items[0].el , 'markup', 2 );
552 LeftPanel.propertyColumn= this;
556 xtype : Gtk.CellRendererText,
558 pack : ['pack_start'],
561 'editing-started' : function(r, e, p) {
562 LeftPanel.get('model').activePath = p;
565 edited : function(r,p, t) {
567 // since our visiable col is differnt from the editable one..
568 var model = LeftPanel.get('model');
569 var path = LeftPanel.get('model').activePath;
570 var iter = new Gtk.TreeIter();
571 model.el.get_iter(iter, new Gtk.TreePath.from_string(path));
572 model.el.set_value(iter, 0, t);
573 model.el.set_value(iter, 2, t);
575 LeftPanel.get('model').activePath = false;
576 var LeftTree = imports.Builder.LeftTree.LeftTree;
577 LeftTree.get('model').changed(LeftPanel.get('model').toJS(), true);
578 this.el.editable = false;
580 //this.el.has_entry = false;
589 xtype: Gtk.TreeViewColumn,
590 pack : ['append_column'],
594 XObject.prototype.init.call(this);
595 this.el.add_attribute(this.items[0].el , 'text', 3 );
596 this.el.add_attribute(this.items[0].el , 'sensitive', 3 );
597 this.el.add_attribute(this.items[0].el , 'editable', 3 );
598 // this.el.set_cell_data_func(cell, age_cell_data_func, NULL, NULL);
600 LeftPanel.editableColumn= this;
602 setOptions : function(ar)
604 //this.items[0].el.has_entry = false; // stop editable.
605 //this.items[0].el.editable = false;
606 var m = this.items[0].el.model;
608 var iter = new Gtk.TreeIter();
609 ar.forEach(function(i) {
612 m.set_value(iter, 0, i);
624 var ret = new Gtk.CellRendererCombo();
625 ret.model = new Gtk.ListStore();
626 ret.model.set_column_types ( 1, [
627 GObject.TYPE_STRING, // 0 real key
633 pack : ['pack_start'],
639 edited : function(r,p, t) {
640 LeftPanel.editing = false;
641 print("EDITED? p:" + p + " t:" + t);
642 LeftPanel.get('model').changed(t, true);
643 LeftPanel.get('model').activePath = false;
644 //this.el.has_entry = false;
647 'editing-started' : function(r, e, p) {
648 LeftPanel.editing = true;
649 // console.log('editing started');
650 // r.has_entry = false;
651 LeftPanel.get('model').editSelected(e);