meson.build.o7QLX02
[roobuilder] / src / Builder4 / WindowLeftTree.vala
index 87dadcb..a56c215 100644 (file)
-    static Xcls_WindowLeftTree  _WindowLeftTree;
-
-    public class Xcls_WindowLeftTree : Object
-    {
-        public Gtk.Box el;
-        private Xcls_WindowLeftTree  _this;
-
-        public static Xcls_WindowLeftTree singleton()
-        {
-            if (_WindowLeftTree == null) {
-                _WindowLeftTree= new Xcls_WindowLeftTree();
-            }
-            return _WindowLeftTree;
-        }
-        public Xcls_viewwin viewwin;
-        public Xcls_view view;
-        public Xcls_drop drop;
-        public Xcls_selmodel selmodel;
-        public Xcls_model model;
-        public Xcls_maincol maincol;
-        public Xcls_LeftTreeMenu LeftTreeMenu;
-
-            // my vars (def)
-        public signal bool before_node_change ();
-        public Xcls_MainWindow main_window;
-        public signal void changed ();
-        public signal void node_selected (JsRender.Node? node);
-
-        // ctor
-        public Xcls_WindowLeftTree()
-        {
-            _this = this;
-            this.el = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 );
-
-            // my vars (dec)
-            this.main_window = null;
-
-            // set gobject values
-            this.el.hexpand = true;
-            this.el.vexpand = true;
-            var child_1 = new Xcls_ListView2( _this );
-            child_1.ref();
-            this.el.append( child_1.el );
-            new Xcls_viewwin( _this );
-            this.el.append( _this.viewwin.el );
-        }
-
-        // user defined functions
-        public void onresize () {
-         
-                
-               //GLib.debug("Got allocation width of scrolled view %d", allocation.width );
-        //     _this.maincol.el.set_max_width( _this.viewwin.el.get_width()  - 32 );
-        }
-        public JsRender.Node? getActiveElement () { // return path to actie node.
-        
-             
-               return _this.selmodel.getSelectedNode();
-            
-            
-        }
-        public JsRender.JsRender getActiveFile () {
-            return this.main_window.windowstate.file;
-        }
-        public class Xcls_ListView2 : Object
-        {
-            public Gtk.ListView el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_ListView2(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                var child_1 = new Xcls_SignalListItemFactory3( _this );
-                child_1.ref();
-                this.el = new Gtk.ListView( null, child_1.el );
-
-                // my vars (dec)
-
-                // set gobject values
-            }
-
-            // user defined functions
-        }
-        public class Xcls_SignalListItemFactory3 : Object
-        {
-            public Gtk.SignalListItemFactory el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_SignalListItemFactory3(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.SignalListItemFactory();
-
-                // my vars (dec)
-
-                // set gobject values
-            }
-
-            // user defined functions
-        }
-
-
-        public class Xcls_viewwin : Object
-        {
-            public Gtk.ScrolledWindow el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_viewwin(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                _this.viewwin = this;
-                this.el = new Gtk.ScrolledWindow();
-
-                // my vars (dec)
-
-                // set gobject values
-                this.el.has_frame = true;
-                this.el.hexpand = true;
-                this.el.vexpand = true;
-                new Xcls_view( _this );
-                this.el.child = _this.view.el;
-                new Xcls_LeftTreeMenu( _this );
-
-                // init method
-
-                this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
-            }
-
-            // user defined functions
-        }
-        public class Xcls_view : Object
-        {
-            public Gtk.ColumnView el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-            public bool blockChanges;
-            public bool headers_visible;
-            public string lastEventSource;
-            public bool button_is_pressed;
-            public Gtk.CssProvider css;
-
-            // ctor
-            public Xcls_view(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                _this.view = this;
-                new Xcls_selmodel( _this );
-                this.el = new Gtk.ColumnView( _this.selmodel.el );
-
-                // my vars (dec)
-                this.blockChanges = false;
-                this.headers_visible = false;
-                this.lastEventSource = "";
-                this.button_is_pressed = false;
-
-                // set gobject values
-                this.el.name = "left-tree-view";
-                this.el.hexpand = false;
-                this.el.vexpand = true;
-                var child_2 = new Xcls_GestureClick6( _this );
-                child_2.ref();
-                this.el.add_controller(  child_2.el );
-                var child_3 = new Xcls_GestureClick7( _this );
-                child_3.ref();
-                this.el.add_controller(  child_3.el );
-                var child_4 = new Xcls_DragSource8( _this );
-                child_4.ref();
-                this.el.add_controller(  child_4.el );
-                var child_5 = new Xcls_EventControllerKey9( _this );
-                child_5.ref();
-                this.el.add_controller(  child_5.el );
-                new Xcls_drop( _this );
-                this.el.add_controller(  _this.drop.el );
-                new Xcls_maincol( _this );
-                this.el.append_column ( _this.maincol.el  );
-                var child_8 = new Xcls_ColumnViewColumn15( _this );
-                child_8.ref();
-                this.el.append_column ( child_8.el  );
-
-                // init method
-
-                {
-                 
-                  this.css = new Gtk.CssProvider();
-                //     try {
-                               this.css.load_from_string("
-                #left-tree-view { font-size: 12px;}    
-                .drag-over  { background-color:#88a3bc; }
-                .drag-below  {   
-                 border-bottom-width: 5px; 
-                 border-bottom-style: solid;
-                 border-bottom-color: #88a3bc;
-                }
-                .drag-above  {
-                 border-top-width: 5px;
-                 border-top-style: solid;
-                 border-top-color: #88a3bc;
-                }
-                #left-tree-view indent {
-                -gtk-icon-size : 2px;
-                }
-                ");
-                
-                       Gtk.StyleContext.add_provider_for_display(
-                               this.el.get_display(),
-                               this.css,
-                               Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
-                       );
-                       
-                         
-                }
-            }
-
-            // user defined functions
-            public Gtk.Widget? getWidgetAtRow (uint row) {
-            /*
-                       
-            from       https://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465
-                       var colview = gesture.widget;
-                       var line_no = check_list_widget(colview, x,y);
-                     if (line_no > -1) {
-                               var item = colview.model.get_item(line_no);
-                                
-                       }
-                       */
-                       //GLib.debug("Get Widget At Row %d", (int)row);
-                    var  child = this.el.get_first_child(); 
-                       var line_no = -1; 
-                       var reading_header = true;
-                
-                       while (child != null) {
-                               GLib.debug("Got %s", child.get_type().name());
-                          
-                          if (reading_header) {
-                                       
-            
-                                       if (child.get_type().name() != "GtkColumnListView") {
-                                          
-                                               child = child.get_next_sibling();
-                                               continue;
-                                       }
-                                       // should be columnlistview
-                                       child = child.get_first_child(); 
-                                
-                                
-                                       
-                                       reading_header = false;
-                                        
-                           }
-                           
-                         
-                           
-                           line_no++;
-                               if (line_no == row) {
-                                       //GLib.debug("Returning widget %s", child.get_type().name());
-                                   return (Gtk.Widget)child;
-                           }
-                       child = child.get_next_sibling(); 
-                       }
-                       //GLib.debug("Rturning null");
-                    return null;
-            
-             }
-            public int getColAt (double x,  double y) {
-            /*
-                       
-            from       https://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465
-                         
-                       */
-                       //Gtk.Allocation alloc = { 0, 0, 0, 0 };
-                       //GLib.debug("Cehck %d, %d", x,y);
-                    var  child = this.el.get_first_child(); 
-                        
-                       var col = 0;
-                       var offx = 0;
-                       while (child != null) {
-                               
-                               if (child.get_type().name() == "GtkColumnViewRowWidget") {
-                                       child = child.get_first_child();
-                                       continue;
-                               }
-                               
-                               //child.get_allocation(out alloc);
-                               if (x <  (child.get_width() + offx)) {
-                                       return col;
-                               }
-                               return 1;
-                               //offx += child.get_width();
-                               //col++;
-                               //child = child.get_next_sibling();
-                       }
-                            
-                                 
-                    return -1;
-            
-             }
-            public int getRowAt (double x,  double in_y, out string pos) {
-            
-            
-                
-            
-            /*
-                       
-            from       https://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465
-                       var colview = gesture.widget;
-                       var line_no = check_list_widget(colview, x,y);
-                     if (line_no > -1) {
-                               var item = colview.model.get_item(line_no);
-                                
-                       }
-                       */
-                        
-                       
-                       //GLib.debug("offset = %d  y = %d", (int) voff, (int) in_y);
-                       var y = in_y + _this.viewwin.el.vadjustment.value; 
-                    var  child = this.el.get_first_child(); 
-                       //Gtk.Allocation alloc = { 0, 0, 0, 0 };
-                       var line_no = -1; 
-                       var reading_header = true;
-                       var real_y = 0;
-                       var header_height  = 0;
-                       pos = "none";
-                       var h = 0;
-                       while (child != null) {
-                               //GLib.debug("Got %s", child.get_type().name());
-                           if (reading_header) {
-                                       
-            
-                                       if (child.get_type().name() != "GtkColumnListView") {
-                                       h += child.get_height();
-                                               child = child.get_next_sibling();
-                                               continue;
-                                       }
-                                       // should be columnlistview
-                                       child = child.get_first_child(); 
-                                   GLib.debug("header height=%d", h);
-                                       header_height =  h;
-                                       
-                                       reading_header = false;
-                                       
-                       }
-                       
-                           if (child.get_type().name() != "GtkColumnViewRowWidget") {
-                                   child = child.get_next_sibling();
-                                   continue;
-                           }
-                           
-                               if (y < header_height) {
-                               return -1;
-                       }
-                           
-                           line_no++;
-                               var hh = child.get_height();
-                               //child.get_allocation(out alloc);
-                               //GLib.debug("got cell xy = %d,%d  w,h= %d,%d", alloc.x, alloc.y, alloc.width, alloc.height);
-                               //GLib.debug("row %d y= %d %s", line_no, (int) (header_height + alloc.y),
-                               
-                               //      child.visible ? "VIS" : "hidden");
-            
-                           if (y >  (header_height + real_y) && y <= (header_height +  real_y + hh) ) {
-                               if (y > ( header_height + real_y + (hh * 0.8))) {
-                                       pos = "below";
-                               } else if (y > ( header_height + real_y + (hh * 0.2))) {
-                                       pos = "over";
-                                       } else {
-                                               pos = "above";
-                                       }
-                                GLib.debug("getRowAt return : %d, %s", line_no, pos);
-                                   return line_no;
-                           }
-             
-            
-                           if (real_y + hh > y) {
-                               return -1;
-                       }
-                       real_y += hh;
-                       child = child.get_next_sibling(); 
-                       }
-                    return -1;
-            
-             }
-            public Gtk.Widget? getWidgetAt (double x,  double in_y) {
-            /*
-                       
-            from       https://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465
-                       var colview = gesture.widget;
-                       var line_no = check_list_widget(colview, x,y);
-                     if (line_no > -1) {
-                               var item = colview.model.get_item(line_no);
-                                
-                       }
-                       */
-                       var y = in_y + _this.viewwin.el.vadjustment.value; 
-                    var  child = this.el.get_first_child(); 
-                       //Gtk.Allocation alloc = { 0, 0, 0, 0 };
-                       var line_no = -1; 
-                       var reading_header = true;
-                       var curr_y = 0;
-                       var header_height  = 0;
-                       var h = 0;
-                       while (child != null) {
-                               //GLib.debug("Got %s", child.get_type().name());
-                       if (reading_header) {
-                                       
-            
-                                       if (child.get_type().name() != "GtkColumnListView") {
-                                       h += child.get_height();
-                                               child = child.get_next_sibling();
-                                               continue;
-                                       }
-                                       // should be columnlistview
-                                       child = child.get_first_child(); 
-                                   GLib.debug("header height=%d", h);
-                                       header_height =  h;
-                                       
-                                       reading_header = false;
-                                       
-                       }
-                           line_no++;
-            
-                               if (y < header_height) {
-                               return null;
-                       }
-            
-                               var hh = child.get_height();
-                               //GLib.debug("got cell xy = %d,%d  w,h= %d,%d", alloc.x, alloc.y, alloc.width, alloc.height);
-            
-                           if (y > curr_y && y <= header_height + hh + curr_y ) {
-                                   return (Gtk.Widget)child;
-                           }
-                           curr_y +=  hh ;
-            
-                           if (curr_y > y) {
-                               return null;
-                       }
-                       child = child.get_next_sibling(); 
-                       }
-                    return null;
-            
-             }
-        }
-        public class Xcls_GestureClick6 : Object
-        {
-            public Gtk.GestureClick el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_GestureClick6(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.GestureClick();
-
-                // my vars (dec)
-
-                // set gobject values
-
-                //listeners
-                this.el.released.connect( (n_press, x, y) => {
-                 
-                    _this.view.button_is_pressed = false;
-                
-                
-                });
-                this.el.pressed.connect( (n_press, x, y) => {
-                 
-                    //console.log("button press?");
-                    
-                    //this.el.set_state(Gtk.EventSequenceState.CLAIMED);
-                
-                
-                    
-                    _this.view.button_is_pressed = true;
-                      
-                    _this.view.lastEventSource = "tree";
-                    if (! _this.before_node_change() ) {
-                       GLib.debug("before_node_change return false");
-                       return ;
-                    }
-                    
-                        // nothing there -show dialog
-                    if (_this.model.el.get_n_items() < 1) {
-                           _this.main_window.windowstate.showAddObject(_this.view.el, null);
-                        GLib.debug("no items");
-                           return ;
-                    }
-                    string pos;
-                    var row = _this.view.getRowAt(x,y, out pos );
-                    if (row < 0) {
-                           GLib.debug("no row selected items");
-                           return;
-                    }
-                    
-                    var node =   _this.selmodel.getNodeAt(row);
-                    if (node == null) {
-                       GLib.warning("No node found at row %d", row);
-                       return;
-                       }
-                
-                     
-                     
-                    if (_this.view.getColAt(x,y) > 0 ) {
-                           GLib.debug("add colum clicked.");
-                        var fqn = node.fqn();
-                       var cn = _this.main_window.windowstate.project.palete.getChildList(fqn, false);
-                               if (cn.size < 1) {
-                                       return ;
-                               }
-                
-                               _this.main_window.windowstate.leftTreeBeforeChange();
-                               //_this.view.el.get_selection().select_path(res);
-                               GLib.debug("Button Pressed - start show window");
-                               _this.main_window.windowstate.showAddObject(_this.view.el, node);
-                               GLib.debug("Button Pressed - finsihed show window");
-                       return ;
-                       }
-                    
-                        
-                     
-                });
-            }
-
-            // user defined functions
-        }
-
-        public class Xcls_GestureClick7 : Object
-        {
-            public Gtk.GestureClick el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_GestureClick7(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.GestureClick();
-
-                // my vars (dec)
-
-                // set gobject values
-                this.el.button = 3;
-
-                //listeners
-                this.el.pressed.connect( (n_press, x, y) => {
-                
-                       
-                         
-                        
-                    if (_this.model.el.get_n_items() < 1) {
-                 
-                        GLib.debug("no items");
-                           return ;
-                    }
-                    string pos;
-                    var row = _this.view.getRowAt(x,y, out pos );
-                    if (row < 0) {
-                           GLib.debug("no row selected items");
-                           return;
-                    }
-                    
-                    var node =   _this.selmodel.getNodeAt(row);
-                    if (node == null) {
-                       GLib.warning("No node found at row %d", row);
-                       return;
-                       }
-                       _this.model.selectNode(node);
-                     
-                     
-                     
-                       GLib.debug("Prssed %d", (int)  this.el.get_current_button());
-                       //_this.deletemenu.el.set_parent(_this.view.el);
-                       _this.LeftTreeMenu.el.set_parent(_this.view.el);
-                       
-                       
-                       //Gtk.Allocation rect;
-                       //_this.view.el.get_allocation(out rect);
-                       //_this.deletemenu.el.set_has_arrow(false);
-                       _this.LeftTreeMenu.el.set_position(Gtk.PositionType.BOTTOM); 
-                       
-                               
-                       _this.LeftTreeMenu.el.set_offset( 
-                                       (int)x  ,
-                                       (int)y - (int)_this.view.el.get_height());
-                
-                    _this.LeftTreeMenu.el.popup();
-                      
-                });
-            }
-
-            // user defined functions
-        }
-
-        public class Xcls_DragSource8 : Object
-        {
-            public Gtk.DragSource el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_DragSource8(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.DragSource();
-
-                // my vars (dec)
-
-                // set gobject values
-                this.el.actions = Gdk.DragAction.COPY   | Gdk.DragAction.MOVE   ;
-
-                //listeners
-                this.el.prepare.connect( (x, y) => {
-                
-                       
-                       
-                ///    ( drag_context, data, info, time) => {
-                            
-                
-                       //print("drag-data-get");
-                       var ndata = _this.selmodel.getSelectedNode();
-                       if (ndata == null) {
-                               GLib.debug("return empty string - no selection..");
-                               return null;
-                        
-                       }
-                
-                  
-                       //data.set_text(tp,tp.length);   
-                
-                       var     str = ndata.toJsonString();
-                       GLib.debug("prepare  store: %s", str);
-                       GLib.Value ov = GLib.Value(typeof(string));
-                       ov.set_string(str);
-                       var cont = new Gdk.ContentProvider.for_value(ov);
-                    /*
-                       GLib.Value v = GLib.Value(typeof(string));
-                       //var str = drop.read_text( [ "text/plain" ] 0);
-                        
-                               cont.get_value(ref v);
-                        
-                       }
-                       GLib.debug("set %s", v.get_string());
-                      */  
-                       return cont;
-                        
-                        
-                });
-                this.el.drag_begin.connect( ( drag )  => {
-                       GLib.debug("SOURCE: drag-begin");
-                        
-                    // find what is selected in our tree...
-                   var data = _this.selmodel.getSelectedNode();
-                       if (data == null) {
-                               return  ;
-                       }
-                        
-                    var xname = data.fqn();
-                    GLib.debug ("XNAME  IS %s", xname);
-                
-                       var widget = _this.view.getWidgetAtRow(_this.selmodel.el.selected);
-                       
-                       
-                    var paintable = new Gtk.WidgetPaintable(widget);
-                    this.el.set_icon(paintable, 0,0);
-                            
-                 
-                });
-            }
-
-            // user defined functions
-        }
-
-        public class Xcls_EventControllerKey9 : Object
-        {
-            public Gtk.EventControllerKey el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_EventControllerKey9(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.EventControllerKey();
-
-                // my vars (dec)
-
-                // set gobject values
-
-                //listeners
-                this.el.key_pressed.connect( (keyval, keycode, state) => {
-                
-                 
-                
-                       if (keyval != Gdk.Key.Delete && keyval != Gdk.Key.BackSpace)  {
-                               return true;
-                       }
-                
-                       _this.model.deleteSelected();
-                       return true;
-                
-                });
-            }
-
-            // user defined functions
-        }
-
-        public class Xcls_drop : Object
-        {
-            public Gtk.DropTarget el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-            public Gtk.Widget? highlightWidget;
-            public JsRender.Node? lastDragNode;
-            public string lastDragString;
-
-            // ctor
-            public Xcls_drop(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                _this.drop = this;
-                this.el = new Gtk.DropTarget ( typeof(string) ,
+static Xcls_WindowLeftTree  _WindowLeftTree;
+
+public class Xcls_WindowLeftTree : Object
+{
+       public Gtk.Box el;
+       private Xcls_WindowLeftTree  _this;
+
+       public static Xcls_WindowLeftTree singleton()
+       {
+               if (_WindowLeftTree == null) {
+                   _WindowLeftTree= new Xcls_WindowLeftTree();
+               }
+               return _WindowLeftTree;
+       }
+       public Xcls_viewwin viewwin;
+       public Xcls_view view;
+       public Xcls_drop drop;
+       public Xcls_selmodel selmodel;
+       public Xcls_model model;
+       public Xcls_maincol maincol;
+       public Xcls_LeftTreeMenu LeftTreeMenu;
+
+               // my vars (def)
+       public signal bool before_node_change ();
+       public Xcls_MainWindow main_window;
+       public signal void changed ();
+       public signal void node_selected (JsRender.Node? node);
+
+       // ctor
+       public Xcls_WindowLeftTree()
+       {
+               _this = this;
+               this.el = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 );
+
+               // my vars (dec)
+               this.main_window = null;
+
+               // set gobject values
+               this.el.hexpand = true;
+               this.el.vexpand = true;
+               var child_1 = new Xcls_ListView2( _this );
+               child_1.ref();
+               this.el.append( child_1.el );
+               new Xcls_viewwin( _this );
+               this.el.append( _this.viewwin.el );
+       }
+
+       // user defined functions
+       public void onresize () {
+        
+                
+               //GLib.debug("Got allocation width of scrolled view %d", allocation.width );
+       //      _this.maincol.el.set_max_width( _this.viewwin.el.get_width()  - 32 );
+       }
+       public JsRender.Node? getActiveElement () { // return path to actie node.
+       
+            
+               return _this.selmodel.getSelectedNode();
+           
+           
+       }
+       public JsRender.JsRender getActiveFile () {
+           return this.main_window.windowstate.file;
+       }
+       public class Xcls_ListView2 : Object
+       {
+               public Gtk.ListView el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_ListView2(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       var child_1 = new Xcls_SignalListItemFactory3( _this );
+                       child_1.ref();
+                       this.el = new Gtk.ListView( null, child_1.el );
+
+                       // my vars (dec)
+
+                       // set gobject values
+               }
+
+               // user defined functions
+       }
+       public class Xcls_SignalListItemFactory3 : Object
+       {
+               public Gtk.SignalListItemFactory el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_SignalListItemFactory3(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.SignalListItemFactory();
+
+                       // my vars (dec)
+
+                       // set gobject values
+               }
+
+               // user defined functions
+       }
+
+
+       public class Xcls_viewwin : Object
+       {
+               public Gtk.ScrolledWindow el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_viewwin(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       _this.viewwin = this;
+                       this.el = new Gtk.ScrolledWindow();
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       this.el.has_frame = true;
+                       this.el.hexpand = true;
+                       this.el.vexpand = true;
+                       new Xcls_view( _this );
+                       this.el.child = _this.view.el;
+                       new Xcls_LeftTreeMenu( _this );
+
+                       // init method
+
+                       this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
+               }
+
+               // user defined functions
+       }
+       public class Xcls_view : Object
+       {
+               public Gtk.ColumnView el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+               public bool blockChanges;
+               public bool headers_visible;
+               public string lastEventSource;
+               public bool button_is_pressed;
+               public Gtk.CssProvider css;
+
+               // ctor
+               public Xcls_view(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       _this.view = this;
+                       new Xcls_selmodel( _this );
+                       this.el = new Gtk.ColumnView( _this.selmodel.el );
+
+                       // my vars (dec)
+                       this.blockChanges = false;
+                       this.headers_visible = false;
+                       this.lastEventSource = "";
+                       this.button_is_pressed = false;
+
+                       // set gobject values
+                       this.el.name = "left-tree-view";
+                       this.el.hexpand = false;
+                       this.el.vexpand = true;
+                       var child_2 = new Xcls_GestureClick6( _this );
+                       child_2.ref();
+                       this.el.add_controller(  child_2.el );
+                       var child_3 = new Xcls_GestureClick7( _this );
+                       child_3.ref();
+                       this.el.add_controller(  child_3.el );
+                       var child_4 = new Xcls_DragSource8( _this );
+                       child_4.ref();
+                       this.el.add_controller(  child_4.el );
+                       var child_5 = new Xcls_EventControllerKey9( _this );
+                       child_5.ref();
+                       this.el.add_controller(  child_5.el );
+                       new Xcls_drop( _this );
+                       this.el.add_controller(  _this.drop.el );
+                       new Xcls_maincol( _this );
+                       this.el.append_column ( _this.maincol.el  );
+                       var child_8 = new Xcls_ColumnViewColumn15( _this );
+                       child_8.ref();
+                       this.el.append_column ( child_8.el  );
+
+                       // init method
+
+                       {
+                        
+                         this.css = new Gtk.CssProvider();
+                       //      try {
+                                       this.css.load_from_string("
+                       #left-tree-view { font-size: 12px;}     
+                       .drag-over  { background-color:#88a3bc; }
+                       .drag-below  {   
+                        border-bottom-width: 5px; 
+                        border-bottom-style: solid;
+                        border-bottom-color: #88a3bc;
+                       }
+                       .drag-above  {
+                        border-top-width: 5px;
+                        border-top-style: solid;
+                        border-top-color: #88a3bc;
+                       }
+                       #left-tree-view indent {
+                       -gtk-icon-size : 2px;
+                       }
+                       #left-tree-view indent:nth-last-child(2)  {
+                       min-width: 24px;
+                       }
+                       ");
+                       
+                               Gtk.StyleContext.add_provider_for_display(
+                                       this.el.get_display(),
+                                       this.css,
+                                       Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
+                               );
+                               
+                                 
+                       }
+               }
+
+               // user defined functions
+               public Gtk.Widget? getWidgetAtRow (uint row) {
+               /*
+                       
+               from            https://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465
+                       var colview = gesture.widget;
+                       var line_no = check_list_widget(colview, x,y);
+                        if (line_no > -1) {
+                               var item = colview.model.get_item(line_no);
+                                
+                       }
+                       */
+                               //GLib.debug("Get Widget At Row %d", (int)row);
+                       var  child = this.el.get_first_child(); 
+                       var line_no = -1; 
+                       var reading_header = true;
+                        
+                       while (child != null) {
+                                       GLib.debug("Got %s", child.get_type().name());
+                          
+                          if (reading_header) {
+                                               
+               
+                                               if (child.get_type().name() != "GtkColumnListView") {
+                                                  
+                                                       child = child.get_next_sibling();
+                                                       continue;
+                                               }
+                                               // should be columnlistview
+                                               child = child.get_first_child(); 
+                                        
+                                        
+                                               
+                                               reading_header = false;
+                                                
+                                   }
+                                   
+                                 
+                           
+                                   line_no++;
+                                       if (line_no == row) {
+                                               //GLib.debug("Returning widget %s", child.get_type().name());
+                                           return (Gtk.Widget)child;
+                                   }
+                               child = child.get_next_sibling(); 
+                       }
+                               //GLib.debug("Rturning null");
+                       return null;
+               
+                }
+               public int getColAt (double x,  double y) {
+               /*
+                       
+               from            https://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465
+                         
+                       */
+                               //Gtk.Allocation alloc = { 0, 0, 0, 0 };
+                               //GLib.debug("Cehck %d, %d", x,y);
+                       var  child = this.el.get_first_child(); 
+                        
+                       var col = 0;
+                       var offx = 0;
+                       while (child != null) {
+                                       
+                                       if (child.get_type().name() == "GtkColumnViewRowWidget") {
+                                               child = child.get_first_child();
+                                               continue;
+                                       }
+                                       
+                                       //child.get_allocation(out alloc);
+                                       if (x <  (child.get_width() + offx)) {
+                                               return col;
+                                       }
+                                       return 1;
+                                       //offx += child.get_width();
+                                       //col++;
+                                       //child = child.get_next_sibling();
+                               }
+                            
+                                         
+                       return -1;
+               
+                }
+               public int getRowAt (double x,  double in_y, out string pos) {
+               
+               
+                        
+               
+               /*
+                       
+               from            https://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465
+                       var colview = gesture.widget;
+                       var line_no = check_list_widget(colview, x,y);
+                        if (line_no > -1) {
+                               var item = colview.model.get_item(line_no);
+                                
+                       }
+                       */
+                                
+                               
+                               //GLib.debug("offset = %d  y = %d", (int) voff, (int) in_y);
+                       var y = in_y + _this.viewwin.el.vadjustment.value; 
+                       var  child = this.el.get_first_child(); 
+                       //Gtk.Allocation alloc = { 0, 0, 0, 0 };
+                       var line_no = -1; 
+                       var reading_header = true;
+                       var real_y = 0;
+                       var header_height  = 0;
+                       pos = "none";
+                       var h = 0;
+                       while (child != null) {
+                                       //GLib.debug("Got %s", child.get_type().name());
+                           if (reading_header) {
+                                               
+               
+                                               if (child.get_type().name() != "GtkColumnListView") {
+                                               h += child.get_height();
+                                                       child = child.get_next_sibling();
+                                                       continue;
+                                               }
+                                               // should be columnlistview
+                                               child = child.get_first_child(); 
+                                           GLib.debug("header height=%d", h);
+                                               header_height =  h;
+                                               
+                                               reading_header = false;
+                                               
+                               }
+                               
+                                   if (child.get_type().name() != "GtkColumnViewRowWidget") {
+                                   child = child.get_next_sibling();
+                                   continue;
+                                   }
+                                   
+                                       if (y < header_height) {
+                                       return -1;
+                               }
+                                   
+                                   line_no++;
+                                       var hh = child.get_height();
+                                       //child.get_allocation(out alloc);
+                                       //GLib.debug("got cell xy = %d,%d  w,h= %d,%d", alloc.x, alloc.y, alloc.width, alloc.height);
+                                       //GLib.debug("row %d y= %d %s", line_no, (int) (header_height + alloc.y),
+                                       
+                                       //      child.visible ? "VIS" : "hidden");
+               
+                                   if (y >  (header_height + real_y) && y <= (header_height +  real_y + hh) ) {
+                                       if (y > ( header_height + real_y + (hh * 0.8))) {
+                                               pos = "below";
+                                       } else if (y > ( header_height + real_y + (hh * 0.2))) {
+                                               pos = "over";
+                                       } else {
+                                               pos = "above";
+                                               }
+                                        GLib.debug("getRowAt return : %d, %s", line_no, pos);
+                                           return line_no;
+                                   }
+                
+               
+                                   if (real_y + hh > y) {
+                                       return -1;
+                               }
+                               real_y += hh;
+                               child = child.get_next_sibling(); 
+                       }
+                       return -1;
+               
+                }
+               public Gtk.Widget? getWidgetAt (double x,  double in_y) {
+               /*
+                       
+               from            https://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465
+                       var colview = gesture.widget;
+                       var line_no = check_list_widget(colview, x,y);
+                        if (line_no > -1) {
+                               var item = colview.model.get_item(line_no);
+                                
+                       }
+                       */
+                       var y = in_y + _this.viewwin.el.vadjustment.value; 
+                       var  child = this.el.get_first_child(); 
+                       //Gtk.Allocation alloc = { 0, 0, 0, 0 };
+                       var line_no = -1; 
+                       var reading_header = true;
+                       var curr_y = 0;
+                       var header_height  = 0;
+                       var h = 0;
+                       while (child != null) {
+                                       //GLib.debug("Got %s", child.get_type().name());
+                               if (reading_header) {
+                                               
+               
+                                               if (child.get_type().name() != "GtkColumnListView") {
+                                               h += child.get_height();
+                                                       child = child.get_next_sibling();
+                                                       continue;
+                                               }
+                                               // should be columnlistview
+                                               child = child.get_first_child(); 
+                                           GLib.debug("header height=%d", h);
+                                               header_height =  h;
+                                               
+                                               reading_header = false;
+                                               
+                               }
+                                   line_no++;
+               
+                                       if (y < header_height) {
+                                       return null;
+                               }
+               
+                                       var hh = child.get_height();
+                                       //GLib.debug("got cell xy = %d,%d  w,h= %d,%d", alloc.x, alloc.y, alloc.width, alloc.height);
+               
+                                   if (y > curr_y && y <= header_height + hh + curr_y ) {
+                                           return (Gtk.Widget)child;
+                                   }
+                                   curr_y +=  hh ;
+               
+                                   if (curr_y > y) {
+                                       return null;
+                               }
+                               child = child.get_next_sibling(); 
+                       }
+                       return null;
+               
+                }
+       }
+       public class Xcls_GestureClick6 : Object
+       {
+               public Gtk.GestureClick el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_GestureClick6(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.GestureClick();
+
+                       // my vars (dec)
+
+                       // set gobject values
+
+                       //listeners
+                       this.el.released.connect( (n_press, x, y) => {
+                        
+                           _this.view.button_is_pressed = false;
+                       
+                       
+                       });
+                       this.el.pressed.connect( (n_press, x, y) => {
+                        
+                           //console.log("button press?");
+                           
+                           //this.el.set_state(Gtk.EventSequenceState.CLAIMED);
+                       
+                       
+                           
+                           _this.view.button_is_pressed = true;
+                             
+                           _this.view.lastEventSource = "tree";
+                           if (! _this.before_node_change() ) {
+                               GLib.debug("before_node_change return false");
+                              return ;
+                           }
+                           
+                                // nothing there -show dialog
+                           if (_this.model.el.get_n_items() < 1) {
+                                   _this.main_window.windowstate.showAddObject(_this.view.el, null);
+                               GLib.debug("no items");
+                                   return ;
+                           }
+                           string pos;
+                           var row = _this.view.getRowAt(x,y, out pos );
+                           if (row < 0) {
+                                   GLib.debug("no row selected items");
+                                   return;
+                           }
+                           
+                           var node =   _this.selmodel.getNodeAt(row);
+                           if (node == null) {
+                               GLib.warning("No node found at row %d", row);
+                               return;
+                               }
+                       
+                            
+                            
+                           if (_this.view.getColAt(x,y) > 0 ) {
+                                   GLib.debug("add colum clicked.");
+                               var fqn = node.fqn();
+                               var cn = _this.main_window.windowstate.project.palete.getChildList(fqn, false);
+                                       if (cn.size < 1) {
+                                               return ;
+                                       }
+                       
+                                       _this.main_window.windowstate.leftTreeBeforeChange();
+                                       //_this.view.el.get_selection().select_path(res);
+                                       GLib.debug("Button Pressed - start show window");
+                                       _this.main_window.windowstate.showAddObject(_this.view.el, node);
+                                       GLib.debug("Button Pressed - finsihed show window");
+                               return ;
+                               }
+                           
+                                
+                            
+                       });
+               }
+
+               // user defined functions
+       }
+
+       public class Xcls_GestureClick7 : Object
+       {
+               public Gtk.GestureClick el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_GestureClick7(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.GestureClick();
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       this.el.button = 3;
+
+                       //listeners
+                       this.el.pressed.connect( (n_press, x, y) => {
+                       
+                               
+                                 
+                                
+                           if (_this.model.el.get_n_items() < 1) {
+                        
+                               GLib.debug("no items");
+                                   return ;
+                           }
+                           string pos;
+                           var row = _this.view.getRowAt(x,y, out pos );
+                           if (row < 0) {
+                                   GLib.debug("no row selected items");
+                                   return;
+                           }
+                           
+                           var node =   _this.selmodel.getNodeAt(row);
+                           if (node == null) {
+                               GLib.warning("No node found at row %d", row);
+                               return;
+                               }
+                               _this.model.selectNode(node);
+                            
+                            
+                            
+                               GLib.debug("Prssed %d", (int)  this.el.get_current_button());
+                               //_this.deletemenu.el.set_parent(_this.view.el);
+                               _this.LeftTreeMenu.el.set_parent(_this.view.el);
+                               
+                               
+                               //Gtk.Allocation rect;
+                               //_this.view.el.get_allocation(out rect);
+                               //_this.deletemenu.el.set_has_arrow(false);
+                               _this.LeftTreeMenu.el.set_position(Gtk.PositionType.BOTTOM); 
+                               
+                                       
+                               _this.LeftTreeMenu.el.set_offset( 
+                                               (int)x  ,
+                                               (int)y - (int)_this.view.el.get_height());
+                       
+                           _this.LeftTreeMenu.el.popup();
+                             
+                       });
+               }
+
+               // user defined functions
+       }
+
+       public class Xcls_DragSource8 : Object
+       {
+               public Gtk.DragSource el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_DragSource8(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.DragSource();
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       this.el.actions = Gdk.DragAction.COPY   | Gdk.DragAction.MOVE   ;
+
+                       //listeners
+                       this.el.prepare.connect( (x, y) => {
+                       
+                               
+                               
+                       ///     ( drag_context, data, info, time) => {
+                                   
+                       
+                               //print("drag-data-get");
+                               var ndata = _this.selmodel.getSelectedNode();
+                               if (ndata == null) {
+                                       GLib.debug("return empty string - no selection..");
+                                       return null;
+                                
+                               }
+                       
+                         
+                               //data.set_text(tp,tp.length);   
+                       
+                               var     str = ndata.toJsonString();
+                               GLib.debug("prepare  store: %s", str);
+                               GLib.Value ov = GLib.Value(typeof(string));
+                               ov.set_string(str);
+                               var cont = new Gdk.ContentProvider.for_value(ov);
+                           /*
+                               GLib.Value v = GLib.Value(typeof(string));
+                               //var str = drop.read_text( [ "text/plain" ] 0);
+                                
+                                       cont.get_value(ref v);
+                                
+                               }
+                               GLib.debug("set %s", v.get_string());
+                             */  
+                               return cont;
+                                
+                                
+                       });
+                       this.el.drag_begin.connect( ( drag )  => {
+                               GLib.debug("SOURCE: drag-begin");
+                                
+                           // find what is selected in our tree...
+                          var data = _this.selmodel.getSelectedNode();
+                               if (data == null) {
+                                       return  ;
+                               }
+                                
+                           var xname = data.fqn();
+                           GLib.debug ("XNAME  IS %s", xname);
+                       
+                               var widget = _this.view.getWidgetAtRow(_this.selmodel.el.selected);
+                               
+                               
+                           var paintable = new Gtk.WidgetPaintable(widget);
+                           this.el.set_icon(paintable, 0,0);
+                                   
+                        
+                       });
+               }
+
+               // user defined functions
+       }
+
+       public class Xcls_EventControllerKey9 : Object
+       {
+               public Gtk.EventControllerKey el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_EventControllerKey9(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.EventControllerKey();
+
+                       // my vars (dec)
+
+                       // set gobject values
+
+                       //listeners
+                       this.el.key_pressed.connect( (keyval, keycode, state) => {
+                       
+                        
+                       
+                               if (keyval != Gdk.Key.Delete && keyval != Gdk.Key.BackSpace)  {
+                                       return true;
+                               }
+                       
+                               _this.model.deleteSelected();
+                               return true;
+                       
+                       });
+               }
+
+               // user defined functions
+       }
+
+       public class Xcls_drop : Object
+       {
+               public Gtk.DropTarget el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+               public Gtk.Widget? highlightWidget;
+               public JsRender.Node? lastDragNode;
+               public string lastDragString;
+
+               // ctor
+               public Xcls_drop(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       _this.drop = this;
+                       this.el = new Gtk.DropTarget ( typeof(string) ,
                Gdk.DragAction.COPY   | Gdk.DragAction.MOVE   );
 
-                // my vars (dec)
-                this.highlightWidget = null;
-                this.lastDragNode = null;
-                this.lastDragString = "";
-
-                // set gobject values
-
-                //listeners
-                this.el.accept.connect( (drop) => {
-                
-                       GLib.debug("got DropTarget:accept");
-                 
-                // NOT REALLY NEEDED? = put stuff in drop?
-                
-                
-                /* (  ctx, x, y, time)  => {
-                      //Seed.print("TARGET: drag-drop");
-                   
-                   
-                    var src = Gtk.drag_get_source_widget(ctx);
-                     
-                   if (src != this.el) {
-                   
-                    
-                       
-                       this.drag_in_motion = false;   
-                            // request data that will be recieved by the recieve...              
-                        Gtk.drag_get_data
-                        (
-                                this.el,         // will receive 'drag-data-received' signal 
-                                ctx,        // represents the current state of the DnD 
-                                Gdk.Atom.intern("application/json",true),    // the target type we want 
-                                time            // time stamp 
-                        );
-                
-                         
-                        // No target offered by source => error
-                   
-                
-                         return  false;
-                     }
-                     
-                     // handle drop around self..
-                     
-                                  
-                            
-                    //print("GETTING POS");
-                    var  targetData = "";
-                    
-                    Gtk.TreePath path;
-                    Gtk.TreeViewDropPosition pos;
-                    var isOver = _this.view.el.get_dest_row_at_pos(this.drag_x,this.drag_y, out path, out pos);
-                    
-                    // if there are not items in the tree.. the we have to set isOver to true for anything..
-                    var isEmpty = false;
-                    if (_this.model.el.iter_n_children(null) < 1) {
-                        print("got NO children?\n");
-                        isOver = true; //??? 
-                        isEmpty = true;
-                        pos = Gtk.TreeViewDropPosition.INTO_OR_AFTER;
-                    }
-                    
-                     
-                     
-                    //var action = Gdk.DragAction.COPY;
-                        // unless we are copying!!! ctl button..
-                    
-                    var action = (ctx.get_actions() & Gdk.DragAction.MOVE) > 0 ?
-                                 Gdk.DragAction.COPY  : Gdk.DragAction.MOVE ;
-                                // Gdk.DragAction.MOVE : Gdk.DragAction.COPY ;
-                
-                      
-                    if (_this.model.el.iter_n_children(null) < 1) {
-                        // no children.. -- asume it's ok..
-                        
-                        targetData = "|%d|".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);
-                         
-                        // continue through to allow drop...
-                
-                    } else {
-                                
-                                
-                    
-                                
-                                
-                                //print("ISOVER? " + isOver);
-                        if (!isOver) {
-                            
-                            Gtk.drag_finish (ctx, false, false, time);        // drop failed..
-                            return true; // not over apoint!?! - no action on drop or motion..
-                        }
-                                
-                        // drag node is parent of child..
-                        //console.log("SRC TREEPATH: " + src.treepath);
-                        //console.log("TARGET TREEPATH: " + data.path.to_string());
-                        
-                        // nned to check a  few here..
-                        //Gtk.TreeViewDropPosition.INTO_OR_AFTER
-                        //Gtk.TreeViewDropPosition.INTO_OR_BEFORE
-                        //Gtk.TreeViewDropPosition.AFTER
-                        //Gtk.TreeViewDropPosition.BEFORE
-                        
-                        // locally dragged items to not really use the 
-                        var selection_text = this.dragData;
-                        
-                        
-                        
-                        if (selection_text == null || selection_text.length < 1) {
-                            //print("Error  - drag selection text returned NULL");
-                          
-                             Gtk.drag_finish (ctx, false, false, time);        // drop failed..
-                             return true; /// -- fixme -- this is not really correct..
-                        }                
-                                
-                                // see if we are dragging into ourself?
-                                print ("got selection text of  " + selection_text);
-                        
-                        var target_path = path.to_string();
-                        //print("target_path="+target_path);
-                
-                        // 
-                        if (selection_text  == target_path) {
-                            print("self drag ?? == we should perhaps allow copy onto self..\n");
-                            
-                             Gtk.drag_finish (ctx, false, false, time);        // drop failed..
-                
-                             return true; /// -- fixme -- this is not really correct..
-                
-                        }
-                                
-                        // check that 
-                        //print("DUMPING DATA");
-                        //console.dump(data);
-                        // path, pos
-                        
-                        //print(data.path.to_string() +' => '+  data.pos);
-                        
-                        // dropList is a list of xtypes that this node could be dropped on.
-                        // it is set up when we start to drag..
-                        
-                        
-                        targetData = _this.model.findDropNodeByPath( path.to_string(), this.dropList, pos);
-                            
-                        print("targetDAta: " + targetData +"\n");
-                        
-                        if (targetData.length < 1) {
-                            //print("Can not find drop node path");
-                             
-                            Gtk.drag_finish (ctx, false, false, time);        // drop failed..
-                            return true;
-                        }
-                                    
-                                
-                                
-                                // continue on to allow drop..
-                  }
-                        // at this point, drag is not in motion... -- as checked above... - so it's a real drop event..
-                
-                
-                     var delete_selection_data = false;
-                        
-                    if (action == Gdk.DragAction.ASK)  {
-                        // Ask the user to move or copy, then set the ctx action. 
-                    }
-                
-                    if (action == Gdk.DragAction.MOVE) {
-                        delete_selection_data = true;
-                    }
-                      
-                                // drag around.. - reorder..
-                    _this.model.moveNode(targetData, action);
-                        
-                       
-                        
-                        
-                        
-                        // we can send stuff to souce here...
-                
-                
-                // do we always say failure, so we handle the reall drop?
-                    Gtk.drag_finish (ctx, false, false,time); //delete_selection_data, time);
-                
-                    return true;
-                 
-                 
-                 
-                 
-                 
-                 
-                }
-                */
-                       return true;
-                });
-                this.el.motion.connect( (  x, y) => {
-                 
-                       string pos; // over / before / after..
-                
-                    GLib.debug("got drag motion");
-                
-                    GLib.Value v = GLib.Value(typeof(string));
-                       //var str = drop.read_text( [ "text/plain" ] 0);
-                       var cont = this.el.current_drop.get_drag().content ;
-                       try {
-                               cont.get_value(ref v);
-                       } catch (GLib.Error e) {
-                           GLib.debug("failed to get drag value");
-                               return Gdk.DragAction.COPY;      
-                       
-                       }
-                
-                       GLib.debug("got %s", v.get_string());
-                         
-                       if (this.lastDragString != v.get_string() || this.lastDragNode == null) {
-                               // still dragging same node
-                 
-                               this.lastDragNode = new JsRender.Node(); 
-                               this.lastDragNode.loadFromJsonString(v.get_string(), 1);
-                       }
-                    
-                
-                       var drop_on_to = _this.main_window.windowstate.file.palete().getDropList(
-                                               this.lastDragNode.fqn());
-                     
-                     string[] str = {};
-                     foreach(var dp in drop_on_to) {
-                       str += dp;
-                       }
-                       GLib.debug("droplist: %s", string.joinv(", ", str));
-                     
-                     
-                    // if there are not items in the tree.. the we have to set isOver to true for anything..
-                 
-                    if (_this.model.el.n_items < 1) {
-                       // FIXME check valid drop types?
-                       if (drop_on_to.contains("*top")) {
-                                       this.addHighlight(_this.view.el, "over");
-                               } else {
-                                       this.addHighlight(null, "");            
-                               }
-                
-                               return Gdk.DragAction.COPY; // no need to highlight?
-                     
-                    }
-                    
-                    
-                       GLib.debug("check is over");
-                        
-                    // if path of source and dest are inside each other..
-                    // need to add source info to drag?
-                    // the fail();
-                       var row = _this.view.getRowAt(x,y, out pos);
-                       
-                       if (row < 0) {
-                               this.addHighlight(null, "");    
-                               return Gdk.DragAction.COPY;
-                       }
-                       var tr = (Gtk.TreeListRow)_this.view.el.model.get_object(row);
-                       
-                       var node =  (JsRender.Node)tr.get_item();
-                       
-                       GLib.debug("Drop over node: %s", node.fqn());
-                       
-                
-                       if (pos == "above" || pos == "below") {
-                               if (node.parent == null) {
-                                       GLib.debug("no parent try center");
-                                       pos = "over";
-                               } else {
-                                        
-                                       if (!drop_on_to.contains(node.parent.fqn())) {
-                                               GLib.debug("drop on does not contain %s - try center" , node.parent.fqn());
-                                               pos = "over";
-                                       } else {
-                                               GLib.debug("drop  contains %s - using %s" , node.parent.fqn(), pos);
-                                       }
-                               }
-                               
-                       }
-                       if (pos == "over") {
-                               if (!drop_on_to.contains(node.fqn())) {
-                                       GLib.debug("drop on does not contain %s - try center" , node.fqn());
-                                       this.addHighlight(null, ""); 
-                                       return Gdk.DragAction.COPY;             
-                               }
-                       }
-                       
-                       
-                           // _this.view.highlightDropPath("", (Gtk.TreeViewDropPosition)0);
-                       var w = _this.view.getWidgetAt(x,y);
-                       this.addHighlight(w, pos); 
-                    return Gdk.DragAction.COPY;                        
-                });
-                this.el.leave.connect( ( ) => {
-                       this.addHighlight(null,"");
-                
-                });
-                this.el.drop.connect( (v, x, y) => {
-                       
-                       this.addHighlight(null,"");
-                 
-                 
-                 
-                       var pos = "";
-                       // -- get position..
-                       if (this.lastDragString != v.get_string() || this.lastDragNode == null) {
-                               // still dragging same node
-                 
-                               this.lastDragNode = new JsRender.Node(); 
-                               this.lastDragNode.loadFromJsonString(v.get_string(), 1);
-                       }
-                    
-                            
-                       
-                    var dropNode = new JsRender.Node(); 
-                       dropNode.loadFromJsonString(v.get_string(), 1);
-                       var drop_on_to = _this.main_window.windowstate.file.palete().getDropList(dropNode.fqn());
-                   
-                    // if there are not items in the tree.. the we have to set isOver to true for anything..
-                 
-                    if (_this.model.el.n_items < 1) {
-                       // FIXME check valid drop types?
-                       if (!drop_on_to.contains("*top")) {
-                                       GLib.debug("drop on to list does not contain top?");
-                                       return false;   
-                               }
-                               // add new node to top..
-                               
-                               
-                                var m = (GLib.ListStore) _this.model.el.model;
-                       _this.main_window.windowstate.file.tree = dropNode;  
-                    
-                   
-                               m.append(dropNode);
-                               _this.model.selectNode(dropNode);       
-                               _this.changed();
-                               return true; // no need to highlight?
-                     
-                    }
-                
-                
-                
-                       var row = _this.view.getRowAt(x,y, out pos);
-                       if (row < 0) {
-                               return   false; //Gdk.DragAction.COPY;
-                       }
-                       var tr = (Gtk.TreeListRow)_this.view.el.model.get_object(row);
-                       
-                       var node =  (JsRender.Node)tr.get_item();
-                
-                       if (pos == "above" || pos == "below") {
-                               if (node.parent == null) {
-                                       pos = "over";
-                               } else {
-                                       if (!drop_on_to.contains(node.parent.fqn())) {
-                                               pos = "over";
-                                       } else {
-                                               GLib.debug("drop  contains %s - using %s" , node.parent.fqn(), pos);
-                                       }
-                               }
-                               
-                       }
-                       if (pos == "over") {
-                               if (!drop_on_to.contains(node.fqn())) {
-                                       GLib.debug("drop on does not contain %s - try center" , node.fqn());
-                                       return false;
-                
-                               }
-                       }
-                       
-                       switch(pos) {
-                               case "over":
-                                       node.appendChild(dropNode);
-                                       _this.model.selectNode(dropNode); 
-                                       _this.changed();                                                
-                                       return true;
-                                       
-                               case "above":
-                                       GLib.debug("Above - insertBefore");
-                               
-                                       node.parent.insertBefore(dropNode, node);
-                                       _this.model.selectNode(dropNode);                       
-                                       _this.changed();
-                                       return true;
-                                       
-                               case "below":
-                                       GLib.debug("Below - insertAfter");              
-                                       node.parent.insertAfter(dropNode, node);
-                                       _this.model.selectNode(dropNode);       
-                                       _this.changed();
-                                       // select it
-                                       return true;
-                                       
-                               default:
-                                       // should not happen
-                                       return false;
-                       }
-                       
-                       
-                     
-                               
-                               
-                
-                });
-            }
-
-            // user defined functions
-            public void addHighlight (Gtk.Widget? w, string hl) {
-               if (this.highlightWidget != null) {
-                       var ww  = this.highlightWidget;
-                       GLib.debug("clear drag from previous highlight");
-                       if (ww.has_css_class("drag-below")) {
-                                ww.remove_css_class("drag-below");
-                       }
-                       if (ww.has_css_class("drag-above")) {
-                                ww.remove_css_class("drag-above");
-                       }
-                       if (ww.has_css_class("drag-over")) {
-                                ww.remove_css_class("drag-over");
-                       }
-               }
-               if (w != null) {
-                       GLib.debug("add drag=%s to widget", hl);        
-                       if (!w.has_css_class("drag-" + hl)) {
-                               w.add_css_class("drag-" + hl);
-                       }
-               }
-               this.highlightWidget = w;
-            }
-        }
-
-        public class Xcls_selmodel : Object
-        {
-            public Gtk.SingleSelection el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_selmodel(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                _this.selmodel = this;
-                new Xcls_model( _this );
-                this.el = new Gtk.SingleSelection( _this.model.el );
-
-                // my vars (dec)
-
-                // set gobject values
-
-                //listeners
-                this.el.selection_changed.connect( (position, n_items) => {
-                
-                       
-                               
-                               //if (!this.button_is_pressed && !this.key_is_pressed) {
-                                       // then event was started by some other action
-                                       // which should manually trigger all the events..
-                               //      print("SKIPPING select - no button or key pressed\n");
-                               //      return;
-                               //}
-                
-                
-                                if (_this.view.blockChanges) { // probably not needed.. 
-                                       GLib.debug("SKIPPING select - blockchanges set..");     
-                                  return  ;
-                                }
-                
-                                 if (!_this.before_node_change( ) ) {
-                                        _this.view.blockChanges = true;
-                                        _this.selmodel.el.unselect_all();
-                                        _this.view.blockChanges = false;
-                                        
-                                        return;
-                                }
-                                if (_this.main_window.windowstate.file == null) {
-                                       GLib.debug("SKIPPING select windowstate file is not set...");     
-                                       return;
-                                } 
-                                
-                                //var render = this.get('/LeftTree').getRenderer();                
-                               GLib.debug("LEFT TREE -> view -> selection changed called");
-                               
-                               
-                               // -- it appears that the selection is not updated.
-                                // select the node...
-                                //_this.selmodel.el.set_selected(row);
-                 
-                                GLib.debug("LEFT TREE -> view -> selection changed TIMEOUT CALLED");
-                
-                           var snode = _this.selmodel.getSelectedNode();
-                           if (snode == null) {
-                
-                                GLib.debug("selected rows < 1");
-                               //??this.model.load( false);
-                               _this.node_selected(null);
-                               
-                               return   ;
-                           }
-                        
-                           // why dup_?
-                           
-                
-                           GLib.debug ("calling left_tree.node_selected");
-                           _this.node_selected(snode);
-                          
-                            
-                           
-                            
-                           // no need to scroll. it's in the view as we clicked on it.
-                          // _this.view.el.scroll_to_cell(new Gtk.TreePath.from_string(_this.model.activePath), null, true, 0.1f,0.0f);
-                           
-                           return  ;
-                });
-            }
-
-            // user defined functions
-            public JsRender.Node? getSelectedNode () {
-              if (this.el.selected_item == null) {
-                       return null;
-              }                                
-               var tr = (Gtk.TreeListRow)this.el.selected_item;
-               return (JsRender.Node)tr.get_item();
-                
-            }
-            public JsRender.Node getNodeAt (uint row) {
-            
-               var tr = (Gtk.TreeListRow)this.el.get_item(row);
-               
-               var a = tr.get_item();;   
-               GLib.debug("get_item (2) = %s", a.get_type().name());
-               
-               
-               return (JsRender.Node)tr.get_item();
-                
-            }
-        }
-        public class Xcls_model : Object
-        {
-            public Gtk.TreeListModel el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_model(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                _this.model = this;
-                this.el = this.updateModel(null);
-
-                // my vars (dec)
-
-                // set gobject values
-            }
-
-            // user defined functions
-            public void loadFile (JsRender.JsRender f) {
-                //console.dump(f);
-                
-                _this.drop.highlightWidget = null;
-                
-                var m = (GLib.ListStore) this.el.model;
-               m.remove_all();
-                _this.main_window.windowstate.leftTreeNodeSelected(null);
-                // needed???
-                _this.main_window.windowstate.file = f;
-                
-               
-                if (f.tree == null) {
-                   try {
-                       f.loadItems( );
-                    } catch (Error e) {
-                               return;
-                    }
-                }
-                // if it's still null?
-                if (f.tree == null) {
-                       _this.main_window.windowstate.showAddObject(_this.view.el, null);
-                
-                    return;
-                }
-               m.append(f.tree);
-               // expand???
-            
-            /*
-                if (f.tree.readItems().size < 1) {
-                    // single item..
-                    
-                    //this.get('/Window.leftvpaned').el.set_position(80);
-                    // select first...
-                    _this.view.el.set_cursor( 
-                        new  Gtk.TreePath.from_string("0"), null, false);
-                    
-                    
-                } else {
-                      //this.get('/Window.leftvpaned').el.set_position(200);
-                }
-              */  
-                
-                
-            
-                //_this.maincol.el.set_max_width(_this.viewwin.el.get_allocated_width() - 32);
-             
-                _this.selmodel.el.set_selected(Gtk.INVALID_LIST_POSITION);
-               
-                return;
-             
-                        
-            }
-            public void deleteSelected () {
-            
-            
-               
-               var node = _this.selmodel.getSelectedNode();
-               
-            
-                 if (node == null) {
-                       GLib.debug("delete Selected - no node slected?");
-                    return;
-                 }
-                _this.selmodel.el.unselect_all();
-                
-                node.remove();
-               GLib.debug("delete Selected - done");
-                _this.changed();
-            /*    
-                print("DELETE SELECTED?");
-                //_this.view.blockChanges = true;
-                print("GET SELECTION?");
-            
-                var s = _this.view.el.get_selection();
-                
-                print("GET  SELECTED?");
-               Gtk.TreeIter iter;
-                Gtk.TreeModel mod;
-            
-                
-                if (!s.get_selected(out mod, out iter)) {
-                    return; // nothing seleted..
-                }
-                  
-            
-            
-                this.activePath= "";      
-                print("GET  vnode value?");
-            
-                GLib.Value value;
-                this.el.get_value(iter, 2, out value);
-                var data = (JsRender.Node)(value.get_object());
-                print("removing node from Render\n");
-                if (data.parent == null) {
-                   _this.main_window.windowstate.file.tree = null;
-                } else {
-                    data.remove();
-                }
-                print("removing node from Tree\n");    
-                s.unselect_all();
-                this.el.remove(ref iter);
-            
-                
-                
-                
-                // 
-                
-                
-            
-            
-                this.activePath= ""; // again!?!?      
-                //this.changed(null,true);
-                
-                _this.changed();
-                
-                _this.view.blockChanges = false;
-                */
-            }
-            public Gtk.TreeListModel updateModel (GLib.ListStore? m) {
-               this.el = new Gtk.TreeListModel(
-                       m != null ? m : new GLib.ListStore(typeof(JsRender.Node)), //..... << that's our store..
-                       false, // passthru
-                       true, // autexpand
-                       (item) => {
-                               return ((JsRender.Node)item).childstore;
-                       
-                       }
-               );
-               if (_this.selmodel.el == null) {
-                       return this.el;
-               }
-               _this.selmodel.el.set_model(this.el);
-               return this.el;
-            }
-            public void selectNode (JsRender.Node node) 
-            {
-               var row = -1;
-               var s = (Gtk.SingleSelection)_this.view.el.model;
-               for (var i = 0; i < s.n_items; i++) {
-                       //GLib.debug("check node %s", s.get_item(i).get_type().name());
-                       var lr = (Gtk.TreeListRow)s.get_item(i);
-                       GLib.debug("check node %s", lr.get_item().get_type().name());
-                       if (((JsRender.Node)lr.get_item()).oid == node.oid) {
-                               row  = i;
-                               break;
-                       }
-               }
-               if (row < 0) {
-                       // select none?
-                       GLib.debug("Could not find node");
-                       return;
-               }
-               GLib.debug("Select %d", row);
-               s.set_selected(row);
-               _this.node_selected(node);                      
-               
-            
-            }
-        }
-
-
-        public class Xcls_maincol : Object
-        {
-            public Gtk.ColumnViewColumn el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_maincol(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                _this.maincol = this;
-                var child_1 = new Xcls_SignalListItemFactory14( _this );
-                child_1.ref();
-                this.el = new Gtk.ColumnViewColumn( "Property", child_1.el );
-
-                // my vars (dec)
-
-                // set gobject values
-                this.el.id = "maincol";
-                this.el.expand = true;
-                this.el.resizable = true;
-            }
-
-            // user defined functions
-        }
-        public class Xcls_SignalListItemFactory14 : Object
-        {
-            public Gtk.SignalListItemFactory el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_SignalListItemFactory14(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.SignalListItemFactory();
-
-                // my vars (dec)
-
-                // set gobject values
-
-                //listeners
-                this.el.setup.connect( (listitem) => {
-                       
-                       var expand = new Gtk.TreeExpander();
-                        
-                       expand.set_indent_for_depth(true);
-                       expand.set_indent_for_icon(true);
-                       var hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL,0);
-                       var icon = new Gtk.Image();
-                       var lbl = new Gtk.Label("");
-                       lbl.use_markup = true;
-                       lbl.ellipsize = Pango.EllipsizeMode.END;
-                       
-                       icon.margin_end = 4;
-                       lbl.justify = Gtk.Justification.LEFT;
-                       lbl.xalign = 0;
-                
-                //     listitem.activatable = true; ??
-                       
-                       hbox.append(icon);
-                       hbox.append(lbl);
-                       expand.set_child(hbox);
-                       ((Gtk.ListItem)listitem).set_child(expand);
-                       
-                });
-                this.el.bind.connect( (listitem) => {
-                        GLib.debug("listitme is is %s", ((Gtk.ListItem)listitem).get_type().name());
-                       
-                       //var expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child();
-                       var expand = (Gtk.TreeExpander)  ((Gtk.ListItem)listitem).get_child();
-                        
-                        
-                       var hbox = (Gtk.Box) expand.child;
-                 
-                       
-                       var img = (Gtk.Image) hbox.get_first_child();
-                       var lbl = (Gtk.Label) img.get_next_sibling();
-                       
-                       var lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item();
-                       var node = (JsRender.Node) lr.get_item();
-                       
-                   GLib.debug("node is %s", node.get_type().name());
-                // was item (1) in old layout
-                
-                       
-                 
-                        /* 
-                       var ic = Gtk.IconTheme.get_for_display(_this.el.get_display());
-                    var clsname = node.fqn();
-                    
-                    var clsb = clsname.split(".");
-                    var sub = clsb.length > 1 ? clsb[1].down()  : "";
-                     
-                    var fn = "/usr/share/glade/pixmaps/hicolor/16x16/actions/widget-gtk-" + sub + ".png";
-                    try { 
-                        
-                                
-                               if (FileUtils.test (fn, FileTest.IS_REGULAR)) {
-                                   img.set_from_file(fn);
-                                        
-                               } else {
-                                       img.set_from_paintable(
-                                               ic.lookup_icon (
-                                                       "media-playback-stop", null,  16,1, 
-                                                Gtk.TextDirection.NONE, 0
-                                       )
-                                        );
-                               }
-                       } catch (GLib.Error e) {}
-                    */
-                    expand.set_hide_expander( !node.hasChildren() );
-                       expand.set_list_row(lr);
-                       
-                       node.bind_property("iconFilename",
-                                    img, "file",
-                                   GLib.BindingFlags.SYNC_CREATE);
-                       
-                       node.bind_property("nodeTitleProp",
-                                    lbl, "label",
-                                   GLib.BindingFlags.SYNC_CREATE);
-                       node.bind_property("nodeTipProp",
-                                    lbl, "tooltip_markup",
-                                   GLib.BindingFlags.SYNC_CREATE);
-                       // bind image...
-                       
-                });
-            }
-
-            // user defined functions
-        }
-
-
-        public class Xcls_ColumnViewColumn15 : Object
-        {
-            public Gtk.ColumnViewColumn el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_ColumnViewColumn15(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                var child_1 = new Xcls_SignalListItemFactory16( _this );
-                child_1.ref();
-                this.el = new Gtk.ColumnViewColumn( "Add", child_1.el );
-
-                // my vars (dec)
-
-                // set gobject values
-                this.el.fixed_width = 25;
-            }
-
-            // user defined functions
-        }
-        public class Xcls_SignalListItemFactory16 : Object
-        {
-            public Gtk.SignalListItemFactory el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_SignalListItemFactory16(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.SignalListItemFactory();
-
-                // my vars (dec)
-
-                // set gobject values
-
-                //listeners
-                this.el.setup.connect( (listitem) => {
-                
-                        
-                       var icon = new Gtk.Image();
-                        
-                       ((Gtk.ListItem)listitem).set_child(icon);
-                });
-                this.el.bind.connect( (listitem) => {
-                
-                       var img = (Gtk.Image) ((Gtk.ListItem)listitem).get_child(); 
-                       var lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item();
-                       var node = (JsRender.Node) lr.get_item();
-                       
-                  
-                    var ic = Gtk.IconTheme.get_for_display(_this.el.get_display());
-                       img.set_from_paintable(
-                               ic.lookup_icon (
-                                       "list-add", null,  16,1, 
-                                        Gtk.TextDirection.NONE, 0
-                               )
-                        );
-                        
-                       var fqn = node.fqn();
-                    var cn = _this.main_window.windowstate.project.palete.getChildList(fqn, false);
-                
-                       img.set_visible(cn.size > 0 ? true : false);
-                        
-                });
-            }
-
-            // user defined functions
-        }
-
-
-
-        public class Xcls_LeftTreeMenu : Object
-        {
-            public Gtk.Popover el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_LeftTreeMenu(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                _this.LeftTreeMenu = this;
-                this.el = new Gtk.Popover();
-
-                // my vars (dec)
-
-                // set gobject values
-                var child_1 = new Xcls_Box18( _this );
-                this.el.child = child_1.el;
-            }
-
-            // user defined functions
-        }
-        public class Xcls_Box18 : Object
-        {
-            public Gtk.Box el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_Box18(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 );
-
-                // my vars (dec)
-
-                // set gobject values
-                var child_1 = new Xcls_Button19( _this );
-                child_1.ref();
-                this.el.append( child_1.el );
-                var child_2 = new Xcls_Button20( _this );
-                child_2.ref();
-                this.el.append( child_2.el );
-                var child_3 = new Xcls_Button21( _this );
-                child_3.ref();
-                this.el.append( child_3.el );
-            }
-
-            // user defined functions
-        }
-        public class Xcls_Button19 : Object
-        {
-            public Gtk.Button el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_Button19(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.Button();
-
-                // my vars (dec)
-
-                // set gobject values
-                this.el.label = "Delete Element";
-
-                //listeners
-                this.el.clicked.connect( ( ) => {
-                _this.LeftTreeMenu.el.hide();
-                 _this.model.deleteSelected();
-                _this.changed();
-                });
-            }
-
-            // user defined functions
-        }
-
-        public class Xcls_Button20 : Object
-        {
-            public Gtk.Button el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_Button20(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.Button();
-
-                // my vars (dec)
-
-                // set gobject values
-                this.el.label = "Save as Template";
-
-                //listeners
-                this.el.clicked.connect( () => {
-                _this.LeftTreeMenu.el.hide();
-                     DialogSaveTemplate.singleton().showIt(
-                            (Gtk.Window) _this.el.get_root (), 
-                            _this.main_window.windowstate.file.palete(), 
-                            _this.getActiveElement()
-                    );
-                     
-                    
-                });
-            }
-
-            // user defined functions
-        }
-
-        public class Xcls_Button21 : Object
-        {
-            public Gtk.Button el;
-            private Xcls_WindowLeftTree  _this;
-
-
-                // my vars (def)
-
-            // ctor
-            public Xcls_Button21(Xcls_WindowLeftTree _owner )
-            {
-                _this = _owner;
-                this.el = new Gtk.Button();
-
-                // my vars (dec)
-
-                // set gobject values
-                this.el.label = "Save as Module";
-
-                //listeners
-                this.el.clicked.connect( () => {
-                    
-                    _this.LeftTreeMenu.el.hide();
-                    var node = _this.getActiveElement();
-                      
-                     
-                     var sm = DialogSaveModule.singleton();
-                     
-                     
-                    sm.showIt(
-                            (Gtk.Window) _this.el.get_root (), 
-                            _this.main_window.windowstate.project, 
-                            node
-                     );
-                     /*
-                     gtk4 migration - disabled this part.. probably not used muchanyway
-                     
-                     
-                     if (name.length < 1) {
-                            return;
-                  
-                     }
-                     node.set_prop( new JsRender.NodeProp.special("xinclude", name));
-                     node.items.clear();
-                
-                
-                    var s = _this.view.el.get_selection();
-                    
-                    print("GET  SELECTED?");
-                    Gtk.TreeIter iter;
-                    Gtk.TreeModel mod;
-                
-                    
-                    if (!s.get_selected(out mod, out iter)) {
-                        return; // nothing seleted..
-                    }
-                    Gtk.TreeIter citer;
-                    var n_cn = mod.iter_n_children(iter) -1;
-                    for (var i = n_cn; i > -1; i--) {
-                        mod.iter_nth_child(out citer, iter, i);
-                        
-                
-                        print("removing node from Tree\n");    
-                    
-                        _this.model.el.remove(ref citer);
-                    }
-                    _this.changed();
-                    _this.node_selected(node, "tree");
-                     */
-                    
-                });
-            }
-
-            // user defined functions
-        }
-
-
-
-
-    }
+                       // my vars (dec)
+                       this.highlightWidget = null;
+                       this.lastDragNode = null;
+                       this.lastDragString = "";
+
+                       // set gobject values
+
+                       //listeners
+                       this.el.accept.connect( (drop) => {
+                       
+                               GLib.debug("got DropTarget:accept");
+                        
+                       // NOT REALLY NEEDED? = put stuff in drop?
+                       
+                       
+                       /* (  ctx, x, y, time)  => {
+                             //Seed.print("TARGET: drag-drop");
+                          
+                          
+                           var src = Gtk.drag_get_source_widget(ctx);
+                            
+                          if (src != this.el) {
+                          
+                           
+                              
+                              this.drag_in_motion = false;   
+                                   // request data that will be recieved by the recieve...              
+                               Gtk.drag_get_data
+                               (
+                                       this.el,         // will receive 'drag-data-received' signal 
+                                       ctx,        // represents the current state of the DnD 
+                                       Gdk.Atom.intern("application/json",true),    // the target type we want 
+                                       time            // time stamp 
+                               );
+                       
+                                
+                               // No target offered by source => error
+                          
+                       
+                                return  false;
+                            }
+                            
+                            // handle drop around self..
+                            
+                                         
+                                   
+                           //print("GETTING POS");
+                           var  targetData = "";
+                           
+                           Gtk.TreePath path;
+                           Gtk.TreeViewDropPosition pos;
+                           var isOver = _this.view.el.get_dest_row_at_pos(this.drag_x,this.drag_y, out path, out pos);
+                           
+                           // if there are not items in the tree.. the we have to set isOver to true for anything..
+                           var isEmpty = false;
+                           if (_this.model.el.iter_n_children(null) < 1) {
+                               print("got NO children?\n");
+                               isOver = true; //??? 
+                               isEmpty = true;
+                               pos = Gtk.TreeViewDropPosition.INTO_OR_AFTER;
+                           }
+                           
+                            
+                            
+                           //var action = Gdk.DragAction.COPY;
+                               // unless we are copying!!! ctl button..
+                           
+                           var action = (ctx.get_actions() & Gdk.DragAction.MOVE) > 0 ?
+                                        Gdk.DragAction.COPY  : Gdk.DragAction.MOVE ;
+                                       // Gdk.DragAction.MOVE : Gdk.DragAction.COPY ;
+                       
+                             
+                           if (_this.model.el.iter_n_children(null) < 1) {
+                               // no children.. -- asume it's ok..
+                               
+                               targetData = "|%d|".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);
+                                
+                               // continue through to allow drop...
+                       
+                           } else {
+                                       
+                                       
+                           
+                                       
+                                       
+                                       //print("ISOVER? " + isOver);
+                               if (!isOver) {
+                                   
+                                   Gtk.drag_finish (ctx, false, false, time);        // drop failed..
+                                   return true; // not over apoint!?! - no action on drop or motion..
+                               }
+                                       
+                               // drag node is parent of child..
+                               //console.log("SRC TREEPATH: " + src.treepath);
+                               //console.log("TARGET TREEPATH: " + data.path.to_string());
+                               
+                               // nned to check a  few here..
+                               //Gtk.TreeViewDropPosition.INTO_OR_AFTER
+                               //Gtk.TreeViewDropPosition.INTO_OR_BEFORE
+                               //Gtk.TreeViewDropPosition.AFTER
+                               //Gtk.TreeViewDropPosition.BEFORE
+                               
+                               // locally dragged items to not really use the 
+                               var selection_text = this.dragData;
+                               
+                               
+                               
+                               if (selection_text == null || selection_text.length < 1) {
+                                   //print("Error  - drag selection text returned NULL");
+                                 
+                                    Gtk.drag_finish (ctx, false, false, time);        // drop failed..
+                                    return true; /// -- fixme -- this is not really correct..
+                               }                
+                                       
+                                       // see if we are dragging into ourself?
+                                       print ("got selection text of  " + selection_text);
+                               
+                               var target_path = path.to_string();
+                               //print("target_path="+target_path);
+                       
+                               // 
+                               if (selection_text  == target_path) {
+                                   print("self drag ?? == we should perhaps allow copy onto self..\n");
+                                   
+                                    Gtk.drag_finish (ctx, false, false, time);        // drop failed..
+                       
+                                    return true; /// -- fixme -- this is not really correct..
+                       
+                               }
+                                       
+                               // check that 
+                               //print("DUMPING DATA");
+                               //console.dump(data);
+                               // path, pos
+                               
+                               //print(data.path.to_string() +' => '+  data.pos);
+                               
+                               // dropList is a list of xtypes that this node could be dropped on.
+                               // it is set up when we start to drag..
+                               
+                               
+                               targetData = _this.model.findDropNodeByPath( path.to_string(), this.dropList, pos);
+                                   
+                               print("targetDAta: " + targetData +"\n");
+                               
+                               if (targetData.length < 1) {
+                                   //print("Can not find drop node path");
+                                    
+                                   Gtk.drag_finish (ctx, false, false, time);        // drop failed..
+                                   return true;
+                               }
+                                           
+                                       
+                                       
+                                       // continue on to allow drop..
+                         }
+                               // at this point, drag is not in motion... -- as checked above... - so it's a real drop event..
+                       
+                       
+                            var delete_selection_data = false;
+                               
+                           if (action == Gdk.DragAction.ASK)  {
+                               // Ask the user to move or copy, then set the ctx action. 
+                           }
+                       
+                           if (action == Gdk.DragAction.MOVE) {
+                               delete_selection_data = true;
+                           }
+                             
+                                       // drag around.. - reorder..
+                           _this.model.moveNode(targetData, action);
+                               
+                              
+                               
+                               
+                               
+                               // we can send stuff to souce here...
+                       
+                       
+                       // do we always say failure, so we handle the reall drop?
+                           Gtk.drag_finish (ctx, false, false,time); //delete_selection_data, time);
+                       
+                           return true;
+                        
+                        
+                        
+                        
+                        
+                        
+                       }
+                       */
+                               return true;
+                       });
+                       this.el.motion.connect( (  x, y) => {
+                        
+                               string pos; // over / before / after..
+                       
+                           GLib.debug("got drag motion");
+                       
+                           GLib.Value v = GLib.Value(typeof(string));
+                               //var str = drop.read_text( [ "text/plain" ] 0);
+                               var cont = this.el.current_drop.get_drag().content ;
+                               try {
+                                       cont.get_value(ref v);
+                               } catch (GLib.Error e) {
+                                   GLib.debug("failed to get drag value");
+                                       return Gdk.DragAction.COPY;      
+                               
+                               }
+                       
+                               GLib.debug("got %s", v.get_string());
+                                 
+                               if (this.lastDragString != v.get_string() || this.lastDragNode == null) {
+                                       // still dragging same node
+                        
+                                       this.lastDragNode = new JsRender.Node(); 
+                                       this.lastDragNode.loadFromJsonString(v.get_string(), 1);
+                               }
+                           
+                       
+                               var drop_on_to = _this.main_window.windowstate.file.palete().getDropList(
+                                                       this.lastDragNode.fqn());
+                            
+                            string[] str = {};
+                            foreach(var dp in drop_on_to) {
+                               str += dp;
+                               }
+                               GLib.debug("droplist: %s", string.joinv(", ", str));
+                            
+                            
+                           // if there are not items in the tree.. the we have to set isOver to true for anything..
+                        
+                           if (_this.model.el.n_items < 1) {
+                               // FIXME check valid drop types?
+                               if (drop_on_to.contains("*top")) {
+                                               this.addHighlight(_this.view.el, "over");
+                                       } else {
+                                               this.addHighlight(null, "");            
+                                       }
+                       
+                                       return Gdk.DragAction.COPY; // no need to highlight?
+                            
+                           }
+                           
+                           
+                               GLib.debug("check is over");
+                                
+                           // if path of source and dest are inside each other..
+                           // need to add source info to drag?
+                           // the fail();
+                               var row = _this.view.getRowAt(x,y, out pos);
+                               
+                               if (row < 0) {
+                                       this.addHighlight(null, "");    
+                                       return Gdk.DragAction.COPY;
+                               }
+                               var tr = (Gtk.TreeListRow)_this.view.el.model.get_object(row);
+                               
+                               var node =  (JsRender.Node)tr.get_item();
+                               
+                               GLib.debug("Drop over node: %s", node.fqn());
+                               
+                       
+                               if (pos == "above" || pos == "below") {
+                                       if (node.parent == null) {
+                                               GLib.debug("no parent try center");
+                                               pos = "over";
+                                       } else {
+                                                
+                                               if (!drop_on_to.contains(node.parent.fqn())) {
+                                                       GLib.debug("drop on does not contain %s - try center" , node.parent.fqn());
+                                                       pos = "over";
+                                               } else {
+                                                       GLib.debug("drop  contains %s - using %s" , node.parent.fqn(), pos);
+                                               }
+                                       }
+                                       
+                               }
+                               if (pos == "over") {
+                                       if (!drop_on_to.contains(node.fqn())) {
+                                               GLib.debug("drop on does not contain %s - try center" , node.fqn());
+                                               this.addHighlight(null, ""); 
+                                               return Gdk.DragAction.COPY;             
+                                       }
+                               }
+                               
+                               
+                                   // _this.view.highlightDropPath("", (Gtk.TreeViewDropPosition)0);
+                               var w = _this.view.getWidgetAt(x,y);
+                               this.addHighlight(w, pos); 
+                           return Gdk.DragAction.COPY;                 
+                       });
+                       this.el.leave.connect( ( ) => {
+                               this.addHighlight(null,"");
+                       
+                       });
+                       this.el.drop.connect( (v, x, y) => {
+                               
+                               this.addHighlight(null,"");
+                        
+                        
+                        
+                               var pos = "";
+                               // -- get position..
+                               if (this.lastDragString != v.get_string() || this.lastDragNode == null) {
+                                       // still dragging same node
+                        
+                                       this.lastDragNode = new JsRender.Node(); 
+                                       this.lastDragNode.loadFromJsonString(v.get_string(), 1);
+                               }
+                           
+                                    
+                              
+                           var dropNode = new JsRender.Node(); 
+                               dropNode.loadFromJsonString(v.get_string(), 1);
+                               var drop_on_to = _this.main_window.windowstate.file.palete().getDropList(dropNode.fqn());
+                          
+                           // if there are not items in the tree.. the we have to set isOver to true for anything..
+                        
+                           if (_this.model.el.n_items < 1) {
+                               // FIXME check valid drop types?
+                               if (!drop_on_to.contains("*top")) {
+                                               GLib.debug("drop on to list does not contain top?");
+                                               return false;   
+                                       }
+                                       // add new node to top..
+                                       
+                                       
+                                        var m = (GLib.ListStore) _this.model.el.model;
+                               _this.main_window.windowstate.file.tree = dropNode;  
+                           
+                          
+                                       m.append(dropNode);
+                                       _this.model.selectNode(dropNode);       
+                                       _this.changed();
+                                       return true; // no need to highlight?
+                            
+                           }
+                       
+                       
+                       
+                               var row = _this.view.getRowAt(x,y, out pos);
+                               if (row < 0) {
+                                       return   false; //Gdk.DragAction.COPY;
+                               }
+                               var tr = (Gtk.TreeListRow)_this.view.el.model.get_object(row);
+                               
+                               var node =  (JsRender.Node)tr.get_item();
+                       
+                               if (pos == "above" || pos == "below") {
+                                       if (node.parent == null) {
+                                               pos = "over";
+                                       } else {
+                                               if (!drop_on_to.contains(node.parent.fqn())) {
+                                                       pos = "over";
+                                               } else {
+                                                       GLib.debug("drop  contains %s - using %s" , node.parent.fqn(), pos);
+                                               }
+                                       }
+                                       
+                               }
+                               if (pos == "over") {
+                                       if (!drop_on_to.contains(node.fqn())) {
+                                               GLib.debug("drop on does not contain %s - try center" , node.fqn());
+                                               return false;
+                       
+                                       }
+                               }
+                               
+                               switch(pos) {
+                                       case "over":
+                                               node.appendChild(dropNode);
+                                               _this.model.selectNode(dropNode); 
+                                               _this.changed();                                                
+                                               return true;
+                                               
+                                       case "above":
+                                               GLib.debug("Above - insertBefore");
+                                       
+                                               node.parent.insertBefore(dropNode, node);
+                                               _this.model.selectNode(dropNode);                       
+                                               _this.changed();
+                                               return true;
+                                               
+                                       case "below":
+                                               GLib.debug("Below - insertAfter");              
+                                               node.parent.insertAfter(dropNode, node);
+                                               _this.model.selectNode(dropNode);       
+                                               _this.changed();
+                                               // select it
+                                               return true;
+                                               
+                                       default:
+                                               // should not happen
+                                               return false;
+                               }
+                               
+                               
+                            
+                                       
+                                       
+                       
+                       });
+               }
+
+               // user defined functions
+               public void addHighlight (Gtk.Widget? w, string hl) {
+                       if (this.highlightWidget != null) {
+                               var ww  = this.highlightWidget;
+                               GLib.debug("clear drag from previous highlight");
+                               if (ww.has_css_class("drag-below")) {
+                                        ww.remove_css_class("drag-below");
+                               }
+                               if (ww.has_css_class("drag-above")) {
+                                        ww.remove_css_class("drag-above");
+                               }
+                               if (ww.has_css_class("drag-over")) {
+                                        ww.remove_css_class("drag-over");
+                               }
+                       }
+                       if (w != null) {
+                               GLib.debug("add drag=%s to widget", hl);        
+                               if (!w.has_css_class("drag-" + hl)) {
+                                       w.add_css_class("drag-" + hl);
+                               }
+                       }
+                       this.highlightWidget = w;
+               }
+       }
+
+       public class Xcls_selmodel : Object
+       {
+               public Gtk.SingleSelection el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_selmodel(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       _this.selmodel = this;
+                       new Xcls_model( _this );
+                       this.el = new Gtk.SingleSelection( _this.model.el );
+
+                       // my vars (dec)
+
+                       // set gobject values
+
+                       //listeners
+                       this.el.selection_changed.connect( (position, n_items) => {
+                       
+                               
+                                       
+                                       //if (!this.button_is_pressed && !this.key_is_pressed) {
+                                               // then event was started by some other action
+                                               // which should manually trigger all the events..
+                                       //      print("SKIPPING select - no button or key pressed\n");
+                                       //      return;
+                                       //}
+                       
+                       
+                                        if (_this.view.blockChanges) { // probably not needed.. 
+                                               GLib.debug("SKIPPING select - blockchanges set..");     
+                                          return  ;
+                                        }
+                       
+                                         if (!_this.before_node_change( ) ) {
+                                                _this.view.blockChanges = true;
+                                                _this.selmodel.el.unselect_all();
+                                                _this.view.blockChanges = false;
+                                                
+                                                return;
+                                        }
+                                        if (_this.main_window.windowstate.file == null) {
+                                               GLib.debug("SKIPPING select windowstate file is not set...");     
+                                               return;
+                                        } 
+                                        
+                                        //var render = this.get('/LeftTree').getRenderer();                
+                                       GLib.debug("LEFT TREE -> view -> selection changed called");
+                                       
+                                       
+                                       // -- it appears that the selection is not updated.
+                                        // select the node...
+                                        //_this.selmodel.el.set_selected(row);
+                        
+                                        GLib.debug("LEFT TREE -> view -> selection changed TIMEOUT CALLED");
+                       
+                                   var snode = _this.selmodel.getSelectedNode();
+                                   if (snode == null) {
+                       
+                                        GLib.debug("selected rows < 1");
+                                       //??this.model.load( false);
+                                       _this.node_selected(null);
+                                       
+                                       return   ;
+                                   }
+                                
+                                   // why dup_?
+                                   
+                       
+                                   GLib.debug ("calling left_tree.node_selected");
+                                   _this.node_selected(snode);
+                                  
+                                    
+                                   
+                                    
+                                   // no need to scroll. it's in the view as we clicked on it.
+                                  // _this.view.el.scroll_to_cell(new Gtk.TreePath.from_string(_this.model.activePath), null, true, 0.1f,0.0f);
+                                   
+                                   return  ;
+                       });
+               }
+
+               // user defined functions
+               public JsRender.Node? getSelectedNode () {
+                 if (this.el.selected_item == null) {
+                               return null;
+                 }                             
+                  var tr = (Gtk.TreeListRow)this.el.selected_item;
+                  return (JsRender.Node)tr.get_item();
+                        
+               }
+               public JsRender.Node getNodeAt (uint row) {
+               
+                  var tr = (Gtk.TreeListRow)this.el.get_item(row);
+                  
+                  var a = tr.get_item();;   
+                  GLib.debug("get_item (2) = %s", a.get_type().name());
+                       
+                  
+                  return (JsRender.Node)tr.get_item();
+                        
+               }
+       }
+       public class Xcls_model : Object
+       {
+               public Gtk.TreeListModel el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_model(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       _this.model = this;
+                       this.el = this.updateModel(null);
+
+                       // my vars (dec)
+
+                       // set gobject values
+               }
+
+               // user defined functions
+               public void loadFile (JsRender.JsRender f) {
+                   //console.dump(f);
+                   
+                   _this.drop.highlightWidget = null;
+                   
+                   var m = (GLib.ListStore) this.el.model;
+                       m.remove_all();
+                   _this.main_window.windowstate.leftTreeNodeSelected(null);
+                   // needed???
+                   _this.main_window.windowstate.file = f;
+                   
+                  
+                   if (f.tree == null) {
+                           try {
+                               f.loadItems( );
+                       } catch (Error e) {
+                               return;
+                       }
+                   }
+                   // if it's still null?
+                   if (f.tree == null) {
+                               _this.main_window.windowstate.showAddObject(_this.view.el, null);
+                   
+                       return;
+                   }
+                       m.append(f.tree);
+                       // expand???
+               
+               /*
+                   if (f.tree.readItems().size < 1) {
+                       // single item..
+                       
+                       //this.get('/Window.leftvpaned').el.set_position(80);
+                       // select first...
+                       _this.view.el.set_cursor( 
+                           new  Gtk.TreePath.from_string("0"), null, false);
+                       
+                       
+                   } else {
+                         //this.get('/Window.leftvpaned').el.set_position(200);
+                   }
+                 */  
+                   
+                   
+               
+                   //_this.maincol.el.set_max_width(_this.viewwin.el.get_allocated_width() - 32);
+                
+                   _this.selmodel.el.set_selected(Gtk.INVALID_LIST_POSITION);
+                  
+                   return;
+                
+                           
+               }
+               public void deleteSelected () {
+               
+               
+                       
+                       var node = _this.selmodel.getSelectedNode();
+                       
+               
+                    if (node == null) {
+                       GLib.debug("delete Selected - no node slected?");
+                            return;
+                    }
+                   _this.selmodel.el.unselect_all();
+                   
+                   node.remove();
+                       GLib.debug("delete Selected - done");
+                   _this.changed();
+               /*    
+                   print("DELETE SELECTED?");
+                   //_this.view.blockChanges = true;
+                   print("GET SELECTION?");
+               
+                   var s = _this.view.el.get_selection();
+                   
+                   print("GET  SELECTED?");
+                  Gtk.TreeIter iter;
+                   Gtk.TreeModel mod;
+               
+                   
+                   if (!s.get_selected(out mod, out iter)) {
+                       return; // nothing seleted..
+                   }
+                     
+               
+               
+                   this.activePath= "";      
+                   print("GET  vnode value?");
+               
+                   GLib.Value value;
+                   this.el.get_value(iter, 2, out value);
+                   var data = (JsRender.Node)(value.get_object());
+                   print("removing node from Render\n");
+                   if (data.parent == null) {
+                      _this.main_window.windowstate.file.tree = null;
+                   } else {
+                       data.remove();
+                   }
+                   print("removing node from Tree\n");    
+                   s.unselect_all();
+                   this.el.remove(ref iter);
+               
+                   
+                   
+                   
+                   // 
+                   
+                   
+               
+               
+                   this.activePath= ""; // again!?!?      
+                   //this.changed(null,true);
+                   
+                   _this.changed();
+                   
+                   _this.view.blockChanges = false;
+                   */
+               }
+               public Gtk.TreeListModel updateModel (GLib.ListStore? m) {
+                       this.el = new Gtk.TreeListModel(
+                               m != null ? m : new GLib.ListStore(typeof(JsRender.Node)), //..... << that's our store..
+                               false, // passthru
+                               true, // autexpand
+                               (item) => {
+                                       return ((JsRender.Node)item).childstore;
+                               
+                               }
+                       );
+                       if (_this.selmodel.el == null) {
+                               return this.el;
+                       }
+                       _this.selmodel.el.set_model(this.el);
+                       return this.el;
+               }
+               public void selectNode (JsRender.Node node) 
+               {
+                       var row = -1;
+                       var s = (Gtk.SingleSelection)_this.view.el.model;
+                       for (var i = 0; i < s.n_items; i++) {
+                               //GLib.debug("check node %s", s.get_item(i).get_type().name());
+                               var lr = (Gtk.TreeListRow)s.get_item(i);
+                               GLib.debug("check node %s", lr.get_item().get_type().name());
+                               if (((JsRender.Node)lr.get_item()).oid == node.oid) {
+                                       row  = i;
+                                       break;
+                               }
+                       }
+                       if (row < 0) {
+                               // select none?
+                               GLib.debug("Could not find node");
+                               return;
+                       }
+                       GLib.debug("Select %d", row);
+                       s.set_selected(row);
+                       _this.view.el.scroll_to(row, null, Gtk.ListScrollFlags.SELECT, null);
+                       //_this.node_selected(node);                    
+                       
+               
+               }
+       }
+
+
+       public class Xcls_maincol : Object
+       {
+               public Gtk.ColumnViewColumn el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_maincol(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       _this.maincol = this;
+                       var child_1 = new Xcls_SignalListItemFactory14( _this );
+                       child_1.ref();
+                       this.el = new Gtk.ColumnViewColumn( "Property", child_1.el );
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       this.el.id = "maincol";
+                       this.el.expand = true;
+                       this.el.resizable = true;
+               }
+
+               // user defined functions
+       }
+       public class Xcls_SignalListItemFactory14 : Object
+       {
+               public Gtk.SignalListItemFactory el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_SignalListItemFactory14(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.SignalListItemFactory();
+
+                       // my vars (dec)
+
+                       // set gobject values
+
+                       //listeners
+                       this.el.setup.connect( (listitem) => {
+                               
+                               var expand = new Gtk.TreeExpander();
+                                
+                               expand.set_indent_for_depth(true);
+                               expand.set_indent_for_icon(true);
+                               var hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL,0);
+                               var icon = new Gtk.Image();
+                               var lbl = new Gtk.Label("");
+                               lbl.use_markup = true;
+                               lbl.ellipsize = Pango.EllipsizeMode.END;
+                               
+                               icon.margin_end = 4;
+                               lbl.justify = Gtk.Justification.LEFT;
+                               lbl.xalign = 0;
+                       
+                       //      listitem.activatable = true; ??
+                               
+                               hbox.append(icon);
+                               hbox.append(lbl);
+                               expand.set_child(hbox);
+                               ((Gtk.ListItem)listitem).set_child(expand);
+                               
+                       });
+                       this.el.bind.connect( (listitem) => {
+                                GLib.debug("listitme is is %s", ((Gtk.ListItem)listitem).get_type().name());
+                               
+                               //var expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child();
+                               var expand = (Gtk.TreeExpander)  ((Gtk.ListItem)listitem).get_child();
+                                
+                                
+                               var hbox = (Gtk.Box) expand.child;
+                        
+                               
+                               var img = (Gtk.Image) hbox.get_first_child();
+                               var lbl = (Gtk.Label) img.get_next_sibling();
+                               
+                               var lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item();
+                               var node = (JsRender.Node) lr.get_item();
+                               
+                          GLib.debug("node is %s", node.get_type().name());
+                       // was item (1) in old layout
+                       
+                               
+                        
+                                /* 
+                               var ic = Gtk.IconTheme.get_for_display(_this.el.get_display());
+                           var clsname = node.fqn();
+                           
+                           var clsb = clsname.split(".");
+                           var sub = clsb.length > 1 ? clsb[1].down()  : "";
+                            
+                           var fn = "/usr/share/glade/pixmaps/hicolor/16x16/actions/widget-gtk-" + sub + ".png";
+                           try { 
+                                
+                                        
+                                       if (FileUtils.test (fn, FileTest.IS_REGULAR)) {
+                                           img.set_from_file(fn);
+                                                
+                                       } else {
+                                               img.set_from_paintable(
+                                                       ic.lookup_icon (
+                                                               "media-playback-stop", null,  16,1, 
+                                                        Gtk.TextDirection.NONE, 0
+                                               )
+                                                );
+                                       }
+                               } catch (GLib.Error e) {}
+                           */
+                           expand.set_hide_expander( !node.hasChildren() );
+                               expand.set_list_row(lr);
+                               
+                               node.bind_property("iconFilename",
+                                           img, "file",
+                                          GLib.BindingFlags.SYNC_CREATE);
+                               
+                               node.bind_property("nodeTitleProp",
+                                           lbl, "label",
+                                          GLib.BindingFlags.SYNC_CREATE);
+                               node.bind_property("nodeTipProp",
+                                           lbl, "tooltip_markup",
+                                          GLib.BindingFlags.SYNC_CREATE);
+                               // bind image...
+                               
+                       });
+               }
+
+               // user defined functions
+       }
+
+
+       public class Xcls_ColumnViewColumn15 : Object
+       {
+               public Gtk.ColumnViewColumn el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_ColumnViewColumn15(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       var child_1 = new Xcls_SignalListItemFactory16( _this );
+                       child_1.ref();
+                       this.el = new Gtk.ColumnViewColumn( "Add", child_1.el );
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       this.el.fixed_width = 25;
+               }
+
+               // user defined functions
+       }
+       public class Xcls_SignalListItemFactory16 : Object
+       {
+               public Gtk.SignalListItemFactory el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_SignalListItemFactory16(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.SignalListItemFactory();
+
+                       // my vars (dec)
+
+                       // set gobject values
+
+                       //listeners
+                       this.el.setup.connect( (listitem) => {
+                       
+                                
+                               var icon = new Gtk.Image();
+                                
+                               ((Gtk.ListItem)listitem).set_child(icon);
+                       });
+                       this.el.bind.connect( (listitem) => {
+                       
+                               var img = (Gtk.Image) ((Gtk.ListItem)listitem).get_child(); 
+                               var lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item();
+                               var node = (JsRender.Node) lr.get_item();
+                               
+                         
+                           var ic = Gtk.IconTheme.get_for_display(_this.el.get_display());
+                               img.set_from_paintable(
+                                       ic.lookup_icon (
+                                               "list-add", null,  16,1, 
+                                                Gtk.TextDirection.NONE, 0
+                                       )
+                                );
+                                
+                               var fqn = node.fqn();
+                           var cn = _this.main_window.windowstate.project.palete.getChildList(fqn, false);
+                       
+                               img.set_visible(cn.size > 0 ? true : false);
+                                
+                       });
+               }
+
+               // user defined functions
+       }
+
+
+
+       public class Xcls_LeftTreeMenu : Object
+       {
+               public Gtk.Popover el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_LeftTreeMenu(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       _this.LeftTreeMenu = this;
+                       this.el = new Gtk.Popover();
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       var child_1 = new Xcls_Box18( _this );
+                       this.el.child = child_1.el;
+               }
+
+               // user defined functions
+       }
+       public class Xcls_Box18 : Object
+       {
+               public Gtk.Box el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_Box18(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 );
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       var child_1 = new Xcls_Button19( _this );
+                       child_1.ref();
+                       this.el.append( child_1.el );
+                       var child_2 = new Xcls_Button20( _this );
+                       child_2.ref();
+                       this.el.append( child_2.el );
+                       var child_3 = new Xcls_Button21( _this );
+                       child_3.ref();
+                       this.el.append( child_3.el );
+               }
+
+               // user defined functions
+       }
+       public class Xcls_Button19 : Object
+       {
+               public Gtk.Button el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_Button19(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.Button();
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       this.el.label = "Delete Element";
+
+                       //listeners
+                       this.el.clicked.connect( ( ) => {
+                       _this.LeftTreeMenu.el.hide();
+                        _this.model.deleteSelected();
+                       _this.changed();
+                       });
+               }
+
+               // user defined functions
+       }
+
+       public class Xcls_Button20 : Object
+       {
+               public Gtk.Button el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_Button20(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.Button();
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       this.el.label = "Save as Template";
+
+                       //listeners
+                       this.el.clicked.connect( () => {
+                       _this.LeftTreeMenu.el.hide();
+                            DialogSaveTemplate.singleton().showIt(
+                                   (Gtk.Window) _this.el.get_root (), 
+                                   _this.main_window.windowstate.file.palete(), 
+                                   _this.getActiveElement()
+                           );
+                            
+                           
+                       });
+               }
+
+               // user defined functions
+       }
+
+       public class Xcls_Button21 : Object
+       {
+               public Gtk.Button el;
+               private Xcls_WindowLeftTree  _this;
+
+
+                       // my vars (def)
+
+               // ctor
+               public Xcls_Button21(Xcls_WindowLeftTree _owner )
+               {
+                       _this = _owner;
+                       this.el = new Gtk.Button();
+
+                       // my vars (dec)
+
+                       // set gobject values
+                       this.el.label = "Save as Module";
+
+                       //listeners
+                       this.el.clicked.connect( () => {
+                           
+                           _this.LeftTreeMenu.el.hide();
+                           var node = _this.getActiveElement();
+                             
+                            
+                            var sm = DialogSaveModule.singleton();
+                            
+                            
+                           sm.showIt(
+                                   (Gtk.Window) _this.el.get_root (), 
+                                   _this.main_window.windowstate.project, 
+                                   node
+                            );
+                            /*
+                            gtk4 migration - disabled this part.. probably not used muchanyway
+                            
+                            
+                            if (name.length < 1) {
+                                   return;
+                         
+                            }
+                            node.set_prop( new JsRender.NodeProp.special("xinclude", name));
+                            node.items.clear();
+                       
+                       
+                           var s = _this.view.el.get_selection();
+                           
+                           print("GET  SELECTED?");
+                           Gtk.TreeIter iter;
+                           Gtk.TreeModel mod;
+                       
+                           
+                           if (!s.get_selected(out mod, out iter)) {
+                               return; // nothing seleted..
+                           }
+                           Gtk.TreeIter citer;
+                           var n_cn = mod.iter_n_children(iter) -1;
+                           for (var i = n_cn; i > -1; i--) {
+                               mod.iter_nth_child(out citer, iter, i);
+                               
+                       
+                               print("removing node from Tree\n");    
+                           
+                               _this.model.el.remove(ref citer);
+                           }
+                           _this.changed();
+                           _this.node_selected(node, "tree");
+                            */
+                           
+                       });
+               }
+
+               // user defined functions
+       }
+
+
+
+
+}