fix line numbering issues with vala generator - hopefully fixes completion in node...
[roobuilder] / src / Builder4 / WindowLeftTree.vala
index a56c215..87dadcb 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;
-                       }
-                       #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) ,
+    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) ,
                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.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
-       }
-
-
-
-
-}
+                // 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
+        }
+
+
+
+
+    }