Attribute changed old-javascript
[app.Builder.js] / old-javascript / Builder4 / WindowLeftProps.vala
diff --git a/old-javascript/Builder4/WindowLeftProps.vala b/old-javascript/Builder4/WindowLeftProps.vala
new file mode 100644 (file)
index 0000000..de5ecaa
--- /dev/null
@@ -0,0 +1,1645 @@
+static Xcls_LeftProps  _LeftProps;
+
+public class Xcls_LeftProps : Object 
+{
+    public Gtk.VBox el;
+    private Xcls_LeftProps  _this;
+
+    public static Xcls_LeftProps singleton()
+    {
+        if (_LeftProps == null) {
+            _LeftProps= new Xcls_LeftProps();
+        }
+        return _LeftProps;
+    }
+    public Xcls_AddPropertyPopup AddPropertyPopup;
+    public Xcls_EditProps EditProps;
+    public Xcls_view view;
+    public Xcls_model model;
+    public Xcls_keycol keycol;
+    public Xcls_keyrender keyrender;
+    public Xcls_valcol valcol;
+    public Xcls_valrender valrender;
+    public Xcls_valrendermodel valrendermodel;
+    public Xcls_ContextMenu ContextMenu;
+
+        // my vars (def)
+    public bool allow_edit;
+    public JsRender.JsRender file;
+    public signal bool stop_editor ();
+    public signal void show_editor (JsRender.JsRender file, JsRender.Node node, string type, string key);
+    public signal void changed ();
+    public signal void show_add_props (string type);
+    public Xcls_MainWindow main_window;
+    public JsRender.Node node;
+
+    // ctor 
+    public Xcls_LeftProps()
+    {
+        _this = this;
+        this.el = new Gtk.VBox( false   , 0 );
+
+        // my vars (dec)
+        this.allow_edit = false;
+        this.main_window = null;
+
+        // set gobject values
+        var child_0 = new Xcls_HBox2( _this );
+        child_0.ref();
+        this.el.pack_start (  child_0.el , false,true,0 );
+        var child_1 = new Xcls_EditProps( _this );
+        child_1.ref();
+        this.el.pack_end (  child_1.el , true,true,0 );
+    }
+
+    // user defined functions 
+    public              void before_edit ()
+    {
+    
+        print("before edit - stop editing\n");
+        
+      // these do not appear to trigger save...
+        _this.keyrender.el.stop_editing(false);
+        _this.keyrender.el.editable  =false;
+    
+        _this.valrender.el.stop_editing(false);
+        _this.valrender.el.editable  =false;    
+        
+        
+    // technicall stop the popup editor..
+    
+    }
+    public              string keySortFormat (string key) {
+        // listeners first - with 0
+        // specials
+        if (key[0] == '*') {
+            return "1 " + key;
+        }
+        // functions
+        
+        var bits = key.split(" ");
+        
+        if (key[0] == '|') {
+            return "2 " + bits[bits.length -1];
+        }
+        // signals
+        if (key[0] == '@') {
+            return "3 " + bits[bits.length -1];
+        }
+            
+        // props
+        if (key[0] == '#') {
+            return "4 " + bits[bits.length -1];
+        }
+        // the rest..
+        return "5 " + bits[bits.length -1];    
+    
+    
+    
+    }
+    public              void finish_editing () {
+         // 
+        this.before_edit();
+    }
+    public              bool startEditingValue ( Gtk.TreePath path) {
+    
+        // ONLY return true if editing is allowed - eg. combo..
+        
+                print("start editing?\n");
+                if (!this.stop_editor()) {
+                    print("stop editor failed\n");
+                    return false;
+                }
+                
+                Gtk.TreeIter iter;
+    
+                var mod = this.model.el;
+                mod.get_iter (out iter, path);
+                 
+                /*
+                    m.set(iter, 
+                            0, "listener",
+                            1, miter.get_key(),
+                            2, "<b>" + miter.get_key() + "</b>",
+                            3, miter.get_value()
+                        ); 
+                 
+                */
+                GLib.Value gval;
+                mod.get_value(iter, 3 , out gval);
+                var val = (string)gval;
+            
+                mod.get_value(iter, 1 , out gval);
+                var key = (string)gval;
+                var type_ar = key.split(" ");
+                
+                
+                
+                mod.get_value(iter, 0 , out gval);
+                var type = (string)gval;
+                
+               
+                
+                var use_textarea = false;
+    
+                //------------ things that require the text editor...
+                
+                if (type == "listener") {
+                    use_textarea = true;
+                }
+                if (key.length > 0 && key[0] == '|') { // user defined method
+                    use_textarea = true;
+                }
+                if (key.length > 0 && key[0] == '$') { // raw string
+                    use_textarea = true;
+                }
+                if (key.length > 0 && key == "* init") {
+                    use_textarea = true;
+                }
+                if (val.length > 40) { // long value...
+                    use_textarea = true;
+                }
+                
+                
+                
+                if (use_textarea) {
+                    print("Call show editor\n");
+                    GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {
+                        this.view.el.get_selection().select_path(path);
+                        
+                        this.show_editor(file, node, type, key);
+                        
+                        return false;
+                    });
+                   
+                    
+                    return false;
+                }
+                // others... - fill in options for true/false?
+               print("turn on editing %s \n" , mod.get_path(iter).to_string());
+               
+                   print (type_ar[0].up());
+                    if (type_ar.length > 1 && (
+                            type_ar[0].up() == "BOOLEAN"
+                            ||
+                            type_ar[0].up() == "BOOL"                        
+                        )) {
+                            print("start editing try/false)???");
+                            this.valrender.el.has_entry = false;
+                            string[] opts =  { "true", "false" };
+                            this.valrender.setOptions(opts);
+                            
+                            this.valrender.el.has_entry = false;
+                            this.valrender.el.editable = true;
+                             this.allow_edit  = true;
+                             GLib.Timeout.add_full(GLib.Priority.DEFAULT,100 , () => {
+                                 this.view.el.set_cursor_on_cell(
+                                    path,
+                                    this.valcol.el,
+                                    this.valrender.el,
+                                    true
+                                );
+                                return false;
+                            });
+                            return true;
+                    }
+                                          
+                    
+               
+                 string[] opts =  {  };
+                this.valrender.setOptions(opts);
+               
+               GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {
+                    
+                    // at this point - work out the type...
+                    // if its' a combo... then show the options..
+                    this.valrender.el.has_entry = true;
+                    
+                    this.valrender.el.editable = true;            
+                
+                    
+                    this.allow_edit  = true;
+                    
+                    
+                    
+                    
+    
+                    this.view.el.set_cursor_on_cell(
+                        path,
+                        this.valcol.el,
+                        this.valrender.el,
+                        true
+                    );
+                    return false;
+                });
+                return false;
+            }
+    public              void load (JsRender.JsRender file, JsRender.Node? node) 
+    {
+        print("load leftprops\n");
+        this.before_edit();
+        this.node = node;
+        this.file = file;
+        
+     
+        this.model.el.clear();
+                  
+        //this.get('/RightEditor').el.hide();
+        if (node ==null) {
+            return ;
+        }
+         
+        
+    
+        //var provider = this.get('/LeftTree').getPaleteProvider();
+        Gtk.TreeIter iter;
+        
+        //typeof(string),  // 0 key type
+         //typeof(string),  // 1 key
+         //typeof(string),  // 2 key (display)
+         //typeof(string),  // 3 value
+         //typeof(string),  // 4 value (display)
+         //typeof(string),  // 5 both (tooltip)
+        
+        
+        
+        
+        // really need a way to sort the hashmap...
+        var m = this.model.el;
+        
+        var miter = node.listeners.map_iterator();
+        var i = 0;
+        
+        while(miter.next()) {
+            i++;
+            m.append(out iter,null);
+            
+            this.updateIter(iter,  "listener", miter.get_key(), miter.get_value());
+            
+             
+         }
+         
+          
+        miter = node.props.map_iterator();
+        
+        
+       while(miter.next()) {
+               i++;
+            m.append(out iter,null);
+             this.updateIter(iter,  "prop", miter.get_key(), miter.get_value());
+             
+       }
+       print("clear selection\n");
+       // clear selection?
+       this.model.el.set_sort_column_id(6,Gtk.SortType.ASCENDING); // sort by real key..
+       
+       this.view.el.get_selection().unselect_all();
+       
+           var pane = _this.main_window.editpane.el;
+        var try_size = (i * 25) + 60; // est. 20px per line + 40px header
+        
+        // max 80%...
+        pane.set_position( 
+             ((try_size * 1.0f) /  (pane.max_position * 1.0f))  > 0.8f  ? 
+            (int) (pane.max_position * 0.2f) :
+            pane.max_position-try_size);
+        
+       
+    }
+    public              string keyFormat (string val, string type) {
+        
+        // Glib.markup_escape_text(val);
+    
+        if (type == "listener") {
+            return "<span font_weight=\"bold\" color=\"#660000\">" + 
+                GLib.Markup.escape_text(val) +
+                 "</span>";
+        }
+        // property..
+        if (val.length < 1) {
+            return "<span  color=\"#FF0000\">--empty--</span>";
+        }
+        
+        //@ = signal
+        //$ = property with 
+        //# - object properties
+        //* = special
+        // all of these... - display value is last element..
+        var ar = val.strip().split(" ");
+        
+        
+        var dval = GLib.Markup.escape_text(ar[ar.length-1]);
+        
+        
+        
+        
+        switch(val[0]) {
+            case '@': // signal // just bold balck?
+                if (dval[0] == '@') {
+                    dval = dval.substring(1);
+                }
+            
+                return @"<span  font_weight=\"bold\">@ $dval</span>";        
+            case '#': // object properties?
+                if (dval[0] == '#') {
+                    dval = dval.substring(1);
+                }
+                return @"<span  font_weight=\"bold\">$dval</span>";
+            case '*': // special
+                if (dval[0] == '*') {
+                    dval = dval.substring(1);
+                }
+                return @"<span   color=\"#0000CC\" font_weight=\"bold\">$dval</span>";            
+            case '$':
+                if (dval[0] == '$') {
+                    dval = dval.substring(1);
+                }
+                return @"<span   style=\"italic\">$dval</span>";
+           case '|': // user defined methods
+                if (dval[0] == '|') {
+                    dval = dval.substring(1);
+                }
+                return @"<span color=\"#008000\" font_weight=\"bold\">$dval</span>";
+                
+                  
+                
+            default:
+                return dval;
+        }
+          
+        
+    
+    }
+    public              void deleteSelected () {
+        
+            Gtk.TreeIter iter;
+            Gtk.TreeModel mod;
+            
+            var s = this.view.el.get_selection();
+            s.get_selected(out mod, out iter);
+                 
+                  
+            GLib.Value gval;
+            mod.get_value(iter, 0 , out gval);
+            var type = (string)gval;
+            
+            mod.get_value(iter, 1 , out gval);
+            var key = (string)gval;
+            
+            switch(type) {
+                case "listener":
+                    this.node.listeners.remove(key);
+                    break;
+                    
+                case "props":
+                    this.node.props.remove(key);
+                    break;
+            }
+            this.load(this.file, this.node);
+            
+            _this.changed();
+    }
+    public              void startEditingKey ( Gtk.TreePath path) {
+        
+         if (!this.stop_editor()) {
+            return;
+         }
+      
+        // others... - fill in options for true/false?
+        
+           
+        GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {
+            this.allow_edit  = true;
+            this.keyrender.el.editable = true;
+         
+            this.view.el.set_cursor_on_cell(
+                path,
+                this.keycol.el,
+                this.keyrender.el,
+                true
+            );
+                   
+            return false;
+        });
+          
+        
+    }
+    public              void addProp (string in_type, string key, string value, string value_type) {
+          // info includes key, val, skel, etype..
+          //console.dump(info);
+            //type = info.type.toLowerCase();
+            //var data = this.toJS();
+              
+        var type = in_type == "signals" ? "listener" : in_type;
+          
+        var fkey = (value_type.length > 0 ? value_type + " " : "") + key;
+                  
+        if (type == "listener") {
+            if (this.node.listeners.has_key(key)) {
+                return;
+            }
+            this.node.listeners.set(key,value);
+        } else  {
+        
+            if (this.node.props.has_key(fkey)) {
+                return;
+            }
+            this.node.props.set(fkey,value);
+        }
+               
+          
+        // add a row???
+        this.load(this.file, this.node);
+        
+        
+        
+        /// need to find the row which I've just added..
+        
+        
+        var s = this.view.el.get_selection();
+        s.unselect_all();
+        
+        print("trying to find new iter");
+      
+        this.model.el.foreach((model, path, iter) => {
+            GLib.Value gval;
+        
+            this.model.el.get_value(iter, 0 , out gval);
+            if ((string)gval != type) {
+                print("not type: %s = %s\n", (string)gval , type);
+                return false;
+            }
+            this.model.el.get_value(iter, 1 , out gval);
+            if ((string)gval != fkey) {
+                print("not key: %s = %s\n", (string)gval , fkey);
+                return false;
+            }
+            // delay this?
+            GLib.Timeout.add_full(GLib.Priority.DEFAULT,40 , () => {
+            
+                this.startEditingValue(this.model.el.get_path(iter));
+                return false;
+            });
+            //s.select_iter(iter);
+            return true; 
+        });
+        
+        
+        
+                  
+    }
+    public              void updateIter (Gtk.TreeIter iter,  string type, string key, string value) {
+    
+        print("update Iter %s, %s\n", key,value);
+        //typeof(string),  // 0 key type
+         //typeof(string),  // 1 key
+         //typeof(string),  // 2 key (display)
+         //typeof(string),  // 3 value
+         //typeof(string),  // 4 value (display)
+         //typeof(string),  // 5 both (tooltip)
+         //typeof(string),  // 6 key (sort)
+        
+        var dl = value.strip().split("\n");
+    
+        var dis_val = dl.length > 1 ? (dl[0].strip()+ "...") : dl[0];
+        
+        if (type == "listener") {
+         
+           
+            
+            this.model.el.set(iter, 
+                    0, type,
+                1, key,
+                2, this.keyFormat(key ,type),
+                3, value,
+                4, dis_val,
+                5, "<tt>" +  GLib.Markup.escape_text(key + " " +value) + "</tt>",
+                6,  "0 " + key
+            ); 
+            return;
+        }
+        
+    
+    
+        this.model.el.set(iter, 
+                0, "props",
+                1, key,
+                2,  this.keyFormat(key , "prop"),
+                3, value,
+                4, dis_val,
+                 5, "<tt>" + GLib.Markup.escape_text(key + " " + value) + "</tt>",
+                 6,  this.keySortFormat(key)
+            ); 
+    }
+    public class Xcls_HBox2 : Object 
+    {
+        public Gtk.HBox el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_HBox2(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.HBox( true, 0 );
+
+            // my vars (dec)
+
+            // set gobject values
+            var child_0 = new Xcls_Button3( _this );
+            child_0.ref();
+            this.el.add (  child_0.el  );
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_Button3 : Object 
+    {
+        public Gtk.Button el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_Button3(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.Button();
+
+            // my vars (dec)
+
+            // set gobject values
+            var child_0 = new Xcls_HBox4( _this );
+            child_0.ref();
+            this.el.add (  child_0.el  );
+            var child_1 = new Xcls_AddPropertyPopup( _this );
+            child_1.ref();
+
+            // listeners 
+            this.el.button_press_event.connect( (self, ev) => {
+                _this.before_edit();
+                
+                    
+                var p = _this.AddPropertyPopup;
+                p.el.set_screen(Gdk.Screen.get_default());
+                p.el.show_all();
+                 p.el.popup(null, null, null, ev.button, ev.time);
+                 return true;
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_HBox4 : Object 
+    {
+        public Gtk.HBox el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_HBox4(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.HBox( true, 0 );
+
+            // my vars (dec)
+
+            // set gobject values
+            var child_0 = new Xcls_Image5( _this );
+            child_0.ref();
+            this.el.add (  child_0.el  );
+            var child_1 = new Xcls_Label6( _this );
+            child_1.ref();
+            this.el.add (  child_1.el  );
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_Image5 : Object 
+    {
+        public Gtk.Image el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_Image5(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.Image();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.stock = Gtk.STOCK_ADD;
+            this.el.icon_size = Gtk.IconSize.MENU;
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_Label6 : Object 
+    {
+        public Gtk.Label el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_Label6(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.Label( "Other" );
+
+            // my vars (dec)
+
+            // set gobject values
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_AddPropertyPopup : Object 
+    {
+        public Gtk.Menu el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_AddPropertyPopup(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.AddPropertyPopup = this;
+            this.el = new Gtk.Menu();
+
+            // my vars (dec)
+
+            // set gobject values
+            var child_0 = new Xcls_MenuItem8( _this );
+            child_0.ref();
+            this.el.append (  child_0.el  );
+            var child_1 = new Xcls_MenuItem9( _this );
+            child_1.ref();
+            this.el.append (  child_1.el  );
+            var child_2 = new Xcls_MenuItem10( _this );
+            child_2.ref();
+            this.el.append (  child_2.el  );
+            var child_3 = new Xcls_MenuItem11( _this );
+            child_3.ref();
+            this.el.append (  child_3.el  );
+            var child_4 = new Xcls_SeparatorMenuItem12( _this );
+            child_4.ref();
+            this.el.add (  child_4.el  );
+            var child_5 = new Xcls_MenuItem13( _this );
+            child_5.ref();
+            this.el.append (  child_5.el  );
+            var child_6 = new Xcls_MenuItem14( _this );
+            child_6.ref();
+            this.el.append (  child_6.el  );
+            var child_7 = new Xcls_MenuItem15( _this );
+            child_7.ref();
+            this.el.append (  child_7.el  );
+            var child_8 = new Xcls_SeparatorMenuItem16( _this );
+            child_8.ref();
+            this.el.add (  child_8.el  );
+            var child_9 = new Xcls_MenuItem17( _this );
+            child_9.ref();
+            this.el.append (  child_9.el  );
+            var child_10 = new Xcls_MenuItem18( _this );
+            child_10.ref();
+            this.el.append (  child_10.el  );
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem8 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem8(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_markup = "Using _this.{ID} will map to this element";
+            this.el.label = "id: _this.{ID} (Vala)";
+
+            // listeners 
+            this.el.activate.connect( ()  => {
+                _this.addProp( "prop", "id", "", "");
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem9 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem9(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_markup = "how to pack this element onto parent, (method, 2nd arg, 3rd arg) .. the 1st argument is filled by the element";
+            this.el.label = "pack: Pack method (Vala)";
+
+            // listeners 
+            this.el.activate.connect( ( ) => {
+            
+                _this.addProp( "prop", "pack","add", "*");
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem10 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem10(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_markup = "eg. \n\nnew Clutter.Image.from_file(.....)";
+            this.el.label = "ctor: Alterative to default contructor";
+
+            // listeners 
+            this.el.activate.connect( ( ) => {
+            
+                _this.addProp( "prop", "ctor","", "*");
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem11 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem11(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_markup = "This code is called after the ctor";
+            this.el.label = "init: initialziation code (vala)";
+
+            // listeners 
+            this.el.activate.connect( ( ) => {
+            
+                _this.addProp( "prop",  "init", "{\n\n}\n", "*" );
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_SeparatorMenuItem12 : Object 
+    {
+        public Gtk.SeparatorMenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_SeparatorMenuItem12(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.SeparatorMenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem13 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem13(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_markup = "Add a user defined string property";
+            this.el.label = "String";
+
+            // listeners 
+            this.el.activate.connect( (self) => {
+            
+                _this.addProp( "prop", "XXXX", "","string");
+            
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem14 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem14(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_markup = "Add a user defined number property";
+            this.el.label = "Number";
+
+            // listeners 
+            this.el.activate.connect( ( ) =>{
+            
+                _this.addProp("prop",  "XXX", "0", "int");
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem15 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem15(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_markup = "Add a user defined boolean property";
+            this.el.label = "Boolean";
+
+            // listeners 
+            this.el.activate.connect( ( ) =>{
+            
+                _this.addProp( "prop", "XXX", "true", "bool");
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_SeparatorMenuItem16 : Object 
+    {
+        public Gtk.SeparatorMenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_SeparatorMenuItem16(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.SeparatorMenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem17 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem17(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_markup = "Add a user function boolean property";
+            this.el.label = "Javascript Function";
+
+            // listeners 
+            this.el.activate.connect( ( ) =>{
+            
+                _this.addProp("prop",  "XXXX", "function() { }", "| function");
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem18 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem18(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_markup = "Add a user function boolean property";
+            this.el.label = "Vala Method";
+
+            // listeners 
+            this.el.activate.connect( ( ) =>{
+            
+                _this.addProp( "prop", "XXXX", "() {\n\n}\n", "| return_type");
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_EditProps : Object 
+    {
+        public Gtk.ScrolledWindow el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+        public bool editing;
+
+        // ctor 
+        public Xcls_EditProps(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.EditProps = this;
+            this.el = new Gtk.ScrolledWindow( null, null );
+
+            // my vars (dec)
+            this.editing = false;
+
+            // set gobject values
+            this.el.shadow_type = Gtk.ShadowType.IN;
+            var child_0 = new Xcls_view( _this );
+            child_0.ref();
+            this.el.add (  child_0.el  );
+
+            // init method 
+
+            {
+              
+               this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
+            }        }
+
+        // user defined functions 
+    }
+    public class Xcls_view : Object 
+    {
+        public Gtk.TreeView el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_view(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.view = this;
+            this.el = new Gtk.TreeView();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.tooltip_column = 5;
+            this.el.enable_tree_lines = true;
+            this.el.headers_visible = true;
+            var child_0 = new Xcls_model( _this );
+            child_0.ref();
+            this.el.set_model (  child_0.el  );
+            var child_1 = new Xcls_keycol( _this );
+            child_1.ref();
+            this.el.append_column (  child_1.el  );
+            var child_2 = new Xcls_valcol( _this );
+            child_2.ref();
+            this.el.append_column (  child_2.el  );
+            var child_3 = new Xcls_ContextMenu( _this );
+            child_3.ref();
+
+            // init method 
+
+            {
+                var selection = this.el.get_selection();
+                selection.set_mode( Gtk.SelectionMode.SINGLE);
+            
+            
+                var description = new Pango.FontDescription();
+                description.set_size(8000);
+                this.el.modify_font(description);
+            }
+            // listeners 
+            this.el.button_press_event.connect( ( ev)  => {
+             
+                Gtk.TreeViewColumn col;
+                int cell_x;
+                int cell_y;
+                Gtk.TreePath path;
+                if (!this.el.get_path_at_pos((int)ev.x, (int) ev.y, out path, out col, out cell_x, out cell_y )) {
+                    print("nothing selected on click");
+                    GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {
+                        this.el.get_selection().unselect_all();
+            
+                        return false;
+                    });
+                     _this.before_edit();
+                    return false; //not on a element.
+                }
+                
+                
+                 // right click.
+                 if (ev.type == Gdk.EventType.2BUTTON_PRESS  && ev.button == 1 && col.title == "Name") {    
+                    // show popup!.   
+                    
+             
+                     _this.before_edit();
+                     
+                     _this.keyrender.el.stop_editing(false);
+                     _this.keyrender.el.editable  =false;
+                
+                     _this.valrender.el.stop_editing(false);
+                     _this.valrender.el.editable  =false;
+                       
+                      _this.startEditingKey(path); 
+                     
+                    return false;
+                }
+                
+                
+                
+                
+                 // right click.
+                 if (ev.type == Gdk.EventType.BUTTON_PRESS  && ev.button == 3) {    
+                    // show popup!.   
+                    //if (col.title == "Value") {
+                     //     _this.before_edit();
+                     //    return false;
+                     //}
+            
+                    var p = _this.ContextMenu;
+            
+                    p.el.set_screen(Gdk.Screen.get_default());
+                    p.el.show_all();
+                    p.el.popup(null, null, null,  ev.button, ev.time);
+                    //Seed.print("click:" + res.column.title);
+                    // select the 
+                    GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {
+              
+                        this.el.get_selection().select_path(path);
+                        return false;
+                    });
+                     _this.before_edit();
+                    return false;
+                }
+                
+                 
+                if (col.title != "Value") {
+                    print("col title != Value");
+                    
+                    GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {
+                        this.el.get_selection().select_path(path);
+                        return false;
+                    });
+                    
+                    _this.before_edit();
+                      //  XObject.error("column is not value?");
+                    return false; // ignore.. - key click.. ??? should we do this??
+                }
+                
+                
+                // if the cell can be edited with a pulldown
+                // then we should return true... - and let the start_editing handle it?
+                
+                
+                
+                
+                
+                  
+               //             _this.before_edit(); <<< we really need to stop the other editor..
+                 _this.keyrender.el.stop_editing(false);
+                _this.keyrender.el.editable  =false;
+                
+                       
+                return _this.startEditingValue(path); // assumes selected row..
+                    
+               
+            
+                          
+               
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_model : Object 
+    {
+        public Gtk.TreeStore el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_model(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.model = this;
+            this.el = new Gtk.TreeStore( 7,      typeof(string),  // 0 key type
+     typeof(string),  // 1 key
+     typeof(string),  // 2 key (display)
+     typeof(string),  // 3 value
+     typeof(string),   // 4 value (display)
+     typeof(string),   // 5 both (tooltip)     
+     typeof(string)   // 6 key (for sorting)
+ );
+
+            // my vars (dec)
+
+            // set gobject values
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_keycol : Object 
+    {
+        public Gtk.TreeViewColumn el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_keycol(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.keycol = this;
+            this.el = new Gtk.TreeViewColumn();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.title = "Name";
+            this.el.resizable = true;
+            var child_0 = new Xcls_keyrender( _this );
+            child_0.ref();
+            this.el.pack_start (  child_0.el , false );
+
+            // init method 
+
+            this.el.add_attribute(_this.keyrender.el , "markup", 2 );
+             this.el.add_attribute(_this.keyrender.el , "text", 1 );        }
+
+        // user defined functions 
+    }
+    public class Xcls_keyrender : Object 
+    {
+        public Gtk.CellRendererText el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_keyrender(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.keyrender = this;
+            this.el = new Gtk.CellRendererText();
+
+            // my vars (dec)
+
+            // set gobject values
+
+            // listeners 
+            this.el.editing_started.connect( (  editable, path) => {
+            
+                 Gtk.TreeIter  iter;
+                _this.model.el.get_iter(out iter, new Gtk.TreePath.from_string(path));
+                GLib.Value gval;
+                              
+            
+            
+                 //   this.get('/LeftPanel.model').activePath  = path;
+                _this.model.el.get_value(iter,1, out gval);
+                    var val = (string)gval;
+                             
+                    ((Gtk.Entry)editable).set_text(val);                 
+            });
+            this.el.edited.connect( (path, newtext) => {
+                    print("Keyrender  - signal:edited\n");
+                
+                this.el.editable = false;
+              
+             
+            
+                    Gtk.TreeIter  iter;
+                    _this.model.el.get_iter(out iter, new Gtk.TreePath.from_string(path));
+                    GLib.Value gval;
+                    
+                     _this.model.el.get_value(iter,1, out gval);
+                    var oldval = (string)gval;
+                    
+                     _this.model.el.get_value(iter,0, out gval);
+                    var ktype = (string)gval;
+                   
+                    _this.model.el.set_value(iter, 1, newtext);
+                    
+                    if (oldval == newtext) {
+                        return;
+                    }
+                    
+                    
+                    print("ktype: %s\n",ktype);
+                    switch(ktype) {
+                        case "listener":
+                            var ov = _this.node.listeners.get(oldval);
+                            _this.node.listeners.set(newtext, ov);
+                            _this.node.listeners.remove(oldval);
+                            
+                            _this.updateIter(iter,  ktype, newtext, ov);
+                            
+                            break;
+                        case "props":
+                            var ov = _this.node.props.get(oldval);
+                            _this.node.props.set(newtext, ov);
+                            _this.node.props.remove(oldval);
+                            _this.updateIter(iter,  ktype, newtext, ov);
+                            break;
+                     }
+                     _this.changed();
+                      
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_valcol : Object 
+    {
+        public Gtk.TreeViewColumn el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_valcol(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.valcol = this;
+            this.el = new Gtk.TreeViewColumn();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.title = "Value";
+            this.el.resizable = true;
+            var child_0 = new Xcls_valrender( _this );
+            child_0.ref();
+            this.el.pack_start (  child_0.el , true );
+
+            // init method 
+
+            {
+               
+               //     typeof(string),  // 0 key type
+                // typeof(string),  // 1 key
+                // typeof(string),  // 2 key (display)
+                // typeof(string),  // 3 value
+                // typeof(string)   // 4 value (display)
+            
+               
+               this.el.add_attribute(_this.valrender.el , "text", 4 );
+               //this.el.add_attribute(_this.valrender.el , "sensitive", 4 );
+               //this.el.add_attribute(this.items[0].el , 'editable', 3 );
+                      // this.el.set_cell_data_func(cell, age_cell_data_func, NULL, NULL);
+            
+             //        this.get('/LeftPanel').editableColumn= this;
+            }        }
+
+        // user defined functions 
+    }
+    public class Xcls_valrender : Object 
+    {
+        public Gtk.CellRendererCombo el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_valrender(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.valrender = this;
+            this.el = new Gtk.CellRendererCombo();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.editable = false;
+            this.el.text_column = 0;
+            this.el.has_entry = true;
+            var child_0 = new Xcls_valrendermodel( _this );
+            child_0.ref();
+            this.el.model = child_0.el;
+
+            // listeners 
+            this.el.editing_started.connect( ( editable, path) => {
+                //_this.editing = true;
+                print("editing started called\n");
+                if (!_this.allow_edit) {
+                   
+                     print("val - editing_Started\n");
+                    this.el.editable = false; // make sure it's not editor...
+               
+                     
+                    return;
+                }
+                 _this.allow_edit =false;
+                
+               
+                 if (       this.el.has_entry ) {
+               
+                     Gtk.TreeIter  iter;
+                    _this.model.el.get_iter(out iter, new Gtk.TreePath.from_string(path));
+                    GLib.Value gval;
+                                  
+            
+                  
+                     //   this.get('/LeftPanel.model').activePath  = path;
+                   _this.model.el.get_value(iter,3, out gval);
+                
+            
+                    var val = (string)gval;
+                    var combo =        (Gtk.ComboBox)editable;
+            
+                   var entry =  (Gtk.Entry) combo.get_child();        
+                entry.set_text(val);
+                }
+               
+            });
+            this.el.edited.connect( (path, newtext) => {
+                print("Valrender  - signal:edited\n");
+              
+                    this.el.editable = false;
+            /*  
+             m.set(iter, 
+                            0, "listener",
+                            1, miter.get_key(),
+                            2, "<b>" + miter.get_key() + "</b>",
+                            3, miter.get_value(),
+                            4, display_value(short);
+                        ); 
+            
+              */      
+            
+                    Gtk.TreeIter  iter;
+                    _this.model.el.get_iter(out iter, new Gtk.TreePath.from_string(path));
+                    GLib.Value gval;
+                    
+                     _this.model.el.get_value(iter,0, out gval);
+                    var ktype = (string)gval;
+                    
+                    
+                     _this.model.el.get_value(iter,3, out gval);
+                    var oldval = (string)gval;
+                    
+                     _this.model.el.get_value(iter,1, out gval);
+                    var key = (string)gval;
+                    
+                     
+                    
+                    switch(ktype) {
+                        case "listener":
+                            _this.node.listeners.set(key, newtext);
+                            _this.updateIter(iter,ktype,key,newtext);
+                            break;
+                        case "props":
+                            _this.node.props.set(key,newtext);
+                            _this.updateIter(iter,ktype, key,newtext);                
+                            break;
+                     }
+            //         _this.load(_this.file,_this.node);
+                     _this.changed();
+                      
+            });
+        }
+
+        // user defined functions 
+        public              void setOptions (string[] ar) {
+              var m = _this.valrendermodel.el;
+                m.clear();
+             Gtk.TreeIter iret;
+            for (var i =0; i < ar.length; i++) {
+                    m.append(out iret);
+                    m.set_value(iret, 0, ar[i]);
+            }
+        
+        }
+    }
+    public class Xcls_valrendermodel : Object 
+    {
+        public Gtk.ListStore el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_valrendermodel(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.valrendermodel = this;
+            this.el = new Gtk.ListStore( 1, typeof(string) );
+
+            // my vars (dec)
+
+            // set gobject values
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_ContextMenu : Object 
+    {
+        public Gtk.Menu el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_ContextMenu(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            _this.ContextMenu = this;
+            this.el = new Gtk.Menu();
+
+            // my vars (dec)
+
+            // set gobject values
+            var child_0 = new Xcls_MenuItem28( _this );
+            child_0.ref();
+            this.el.append (  child_0.el  );
+            var child_1 = new Xcls_SeparatorMenuItem29( _this );
+            child_1.ref();
+            this.el.append (  child_1.el  );
+            var child_2 = new Xcls_MenuItem30( _this );
+            child_2.ref();
+            this.el.append (  child_2.el  );
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem28 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem28(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.label = "Edit";
+
+            // listeners 
+            this.el.activate.connect( ( )  =>{
+              
+                var s = _this.view.el.get_selection();
+                Gtk.TreeIter iter;
+                Gtk.TreeModel model;
+                s.get_selected (out  model, out  iter);
+                _this.startEditingKey(model.get_path(iter));
+            });
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_SeparatorMenuItem29 : Object 
+    {
+        public Gtk.SeparatorMenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_SeparatorMenuItem29(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.SeparatorMenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+        }
+
+        // user defined functions 
+    }
+    public class Xcls_MenuItem30 : Object 
+    {
+        public Gtk.MenuItem el;
+        private Xcls_LeftProps  _this;
+
+
+            // my vars (def)
+
+        // ctor 
+        public Xcls_MenuItem30(Xcls_LeftProps _owner )
+        {
+            _this = _owner;
+            this.el = new Gtk.MenuItem();
+
+            // my vars (dec)
+
+            // set gobject values
+            this.el.label = "Delete";
+
+            // listeners 
+            this.el.activate.connect( ( )  =>{
+               _this.deleteSelected();
+            });
+        }
+
+        // user defined functions 
+    }
+}