Builder4/WindowLeftTree.bjs.XNT4LX
authorAlan Knowles <alan@roojs.com>
Fri, 12 Sep 2014 04:10:26 +0000 (12:10 +0800)
committerAlan Knowles <alan@roojs.com>
Fri, 12 Sep 2014 04:10:26 +0000 (12:10 +0800)
Builder4/WindowLeftTree.bjs
Builder4/WindowLeftTree.js.9QQ4LX
Builder4/WindowLeftTree.js
Builder4/WindowLeftTree.vala.UGJ4LX
Builder4/WindowLeftTree.vala

Builder4/WindowLeftTree.bjs
Builder4/WindowLeftTree.js
Builder4/WindowLeftTree.vala

index 824d6b9..a3ed787 100644 (file)
@@ -7,25 +7,25 @@
     "modOrder" : "",
     "items" : [
         {
-            "|          JsRender.Node? getActiveElement" : " () { // return path to actie node.\n\n     var path = this.getActivePath();\n     if (path.length < 1) {\n        return null;\n     }\n     return _this.model.pathToNode(path);\n     \n}\n",
-            "@ bool before_node_change" : "(JsRender.Node? node)",
+            "|           JsRender.Node? getActiveElement" : " () { // return path to actie node.\n\n     var path = this.getActivePath();\n     if (path.length < 1) {\n        return null;\n     }\n     return _this.model.pathToNode(path);\n     \n}\n",
             "id" : "WindowLeftTree",
+            "@ bool before_node_change" : "(JsRender.Node? node)",
             "$ shadow_type" : "Gtk.ShadowType.IN",
             "* init" : " this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);\n \n",
-            "|          string getActivePath" : " () {\n    var model = this.model;\n    var view = this.view.el;\n    if (view.get_selection().count_selected_rows() < 1) {\n        return \"\";\n    }\n    Gtk.TreeIter iter;\n    Gtk.TreeModel mod;\n    view.get_selection().get_selected(out mod, out iter);\n    return mod.get_path(iter).to_string();\n}\n",
+            "|           JsRender.JsRender getActiveFile" : "() {\n    return this.model.file;\n}\n",
             "* pack" : "add",
             "xtype" : "ScrolledWindow",
             "@ void changed" : "()",
             "$ xns" : "Gtk",
             "@ void node_selected" : "(JsRender.Node? node)",
-            "|          JsRender.JsRender getActiveFile" : "() {\n    return this.model.file;\n}\n",
             "# Xcls_MainWindow main_window" : "null",
+            "|           string getActivePath" : " () {\n    var model = this.model;\n    var view = this.view.el;\n    if (view.get_selection().count_selected_rows() < 1) {\n        return \"\";\n    }\n    Gtk.TreeIter iter;\n    Gtk.TreeModel mod;\n    view.get_selection().get_selected(out mod, out iter);\n    return mod.get_path(iter).to_string();\n}\n",
             "items" : [
                 {
                     "listeners" : {
                         "button_press_event" : "  ( ev) => {\n    //console.log(\"button press?\");\n    if (! _this.before_node_change(null) ) {\n       return true;\n    }\n\n    \n    if (ev.type != Gdk.EventType.BUTTON_PRESS  || ev.button != 3) {\n        //print(\"click\" + ev.type);\n        return false;\n    }\n    Gtk.TreePath res;\n    if (!_this.view.el.get_path_at_pos((int)ev.x,(int)ev.y, out res, null, null, null) ) {\n        return true;\n    }\n     \n    this.el.get_selection().select_path(res);\n     \n      //if (!this.get('/LeftTreeMenu').el)  { \n      //      this.get('/LeftTreeMenu').init(); \n      //  }\n        \n     _this.LeftTreeMenu.el.set_screen(Gdk.Screen.get_default());\n     _this.LeftTreeMenu.el.show_all();\n      _this.LeftTreeMenu.el.popup(null, null, null,  3, ev.time);\n     //   print(\"click:\" + res.path.to_string());\n      return true;\n}",
-                        "cursor_changed" : " ( ) => {\n\n\n     if (this.blockChanges) { // probably not needed.. \n       return  ;\n     }\n      if (!_this.before_node_change(null) ) {\n\t     this.blockChanges = true;\n\t     this.el.get_selection().unselect_all();\n\t     this.blockChanges = false;\n\t     return;\n     }\n     if (_this.model.file == null) {\n         return;\n     } \n     \n     //var render = this.get('/LeftTree').getRenderer();                \n    print(\"LEFT TREE -> view -> selection changed called\\n\");\n    \n    \n    // -- it appears that the selection is not updated.\n    \n    GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {\n         \n\n            if (this.el.get_selection().count_selected_rows() < 1) {\n\n                print(\"selected rows < 1\\n\");\n                //??this.model.load( false);\n                _this.node_selected(null);\n                \n                return false ;\n            }\n                \n                //console.log('changed');\n            var s = this.el.get_selection();\n             Gtk.TreeIter iter;\n             Gtk.TreeModel mod;\n            s.get_selected(out mod, out iter);\n            \n            \n            // var val = \"\";\n            GLib.Value value;\n            _this.model.el.get_value(iter, 2, out value);\n            _this.model.activePath = mod.get_path(iter).to_string();\n            \n            var node = (JsRender.Node)value.dup_object();\n            _this.node_selected(node);\n            return false;\n      });  \n    //_this.after_node_change(node);\n\n//        _this.model.file.changed(node, \"tree\");\n   \n    //Seed.print( value.get_string());\n    return  ;\n                \n}",
                         "drag_begin" : "( ctx)  => {\n\t//print('SOURCE: drag-begin');\n        \n        \n        //this.targetData = \"\";\n        \n        // find what is selected in our tree...\n        \n        var s = _this.view.el.get_selection();\n        if (s.count_selected_rows() < 1) {\n            return;\n        }\n        Gtk.TreeIter iter;\n        Gtk.TreeModel mod;\n        s.get_selected(out mod, out iter);\n\n        \n\n        // set some properties of the tree for use by the dropped element.\n        GLib.Value value;\n        _this.model.el.get_value(iter, 2, out value);\n        var data = (JsRender.Node)(value.dup_object());\n        var xname = data.fqn();\n         print (\"XNAME  IS \" + xname+ \"\\n\");\n        this.dragData = xname;\n        this.dropList = _this.model.file.palete().getDropList(xname);\n        \n        print (\"DROP LIST IS \" + string.joinv(\", \", this.dropList) + \"\\n\");\n        \n\n        // make the drag icon a picture of the node that was selected\n        var path = _this.model.el.get_path(iter);\n\n        //this.treepath = path.to_string();\n        \n        var pix = this.el.create_row_drag_icon ( path);\n        \n        Gtk.drag_set_icon_surface (ctx, pix) ;\n        \n        return;\n}",
+                        "cursor_changed" : " ( ) => {\n\n\n     if (this.blockChanges) { // probably not needed.. \n       return  ;\n     }\n      if (!_this.before_node_change(null) ) {\n\t     this.blockChanges = true;\n\t     this.el.get_selection().unselect_all();\n\t     this.blockChanges = false;\n\t     return;\n     }\n     if (_this.model.file == null) {\n         return;\n     } \n     \n     //var render = this.get('/LeftTree').getRenderer();                \n    print(\"LEFT TREE -> view -> selection changed called\\n\");\n    \n    \n    // -- it appears that the selection is not updated.\n    \n    GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {\n         \n\n            if (this.el.get_selection().count_selected_rows() < 1) {\n\n                print(\"selected rows < 1\\n\");\n                //??this.model.load( false);\n                _this.node_selected(null);\n                \n                return false ;\n            }\n                \n                //console.log('changed');\n            var s = this.el.get_selection();\n             Gtk.TreeIter iter;\n             Gtk.TreeModel mod;\n            s.get_selected(out mod, out iter);\n            \n            \n            // var val = \"\";\n            GLib.Value value;\n            _this.model.el.get_value(iter, 2, out value);\n            _this.model.activePath = mod.get_path(iter).to_string();\n            \n            var node = (JsRender.Node)value.dup_object();\n            _this.node_selected(node);\n            return false;\n      });  \n    //_this.after_node_change(node);\n\n//        _this.model.file.changed(node, \"tree\");\n   \n    //Seed.print( value.get_string());\n    return  ;\n                \n}",
                         "drag_end" : "  (drag_context) => {\n\t//Seed.print('LEFT-TREE: drag-end');\n        this.dragData = \"\";\n        this.dropList = null;\n//        this.targetData = \"\";\n        this.highlightDropPath(\"\",0);\n//        return true;\n}",
                         "drag_motion" : " ( ctx, x, y, time)  => {\n \n    // the point of this is to detect where an item could be dropped..\n        print(\"got drag motion\");\n       this.drag_in_motion = true;\n       this.drag_x = x;\n       this.drag_y = y;\n       \n            // request data that will be recieved by the recieve...              \n        Gtk.drag_get_data\n        (\n                this.el,         // will receive 'drag-data-received' signal \n                ctx,        // represents the current state of the DnD \n                Gdk.Atom.intern(\"STRING\",true),    // the target type we want \n                time            // time stamp \n        );\n    return true;\n       \n}",
                         "drag_data_get" : " ( drag_context, data, info, time) => {\n\n\n     print(\"drag-data-get\");\n     var s = this.el.get_selection();\n     if (s.count_selected_rows() < 1) {\n            data.set_text(\"\",0);     \n             print(\"return empty string - no selection..\");\n            return;\n        }\n     \n     Gtk.TreeIter iter;\n     Gtk.TreeModel mod;\n     \n     s.get_selected(out mod, out iter);\n     \n    \n    var tp = mod.get_path(iter).to_string();\n    data.set_text(tp,tp.length);\n     print(\"return \" + tp);\n}",
                         "drag_drop" : " (  ctx, x, y, time)  => {\n      //Seed.print(\"TARGET: drag-drop\");\n       this.drag_in_motion = false;   \n        // request data that will be recieved by the recieve...              \n    Gtk.drag_get_data\n    (\n            this.el,         // will receive 'drag-data-received' signal \n            ctx,        // represents the current state of the DnD \n            Gdk.Atom.intern(\"STRING\",true),    // the target type we want \n            time            // time stamp \n    );\n\n     \n    // No target offered by source => error\n   \n\n    return  false;\n}"
                     },
                     "# string dragData" : "",
-                    "|          void selectNode" : "(string treepath_str) {\n    //this.selection.select_path(new  Gtk.TreePath.from_string( treepath_str));\n     var tp = new Gtk.TreePath.from_string(treepath_str);\n     \n     this.el.set_cursor(tp, null, false);  \n     this.el.scroll_to_cell(tp, null, false, 0,0);\n}\n",
                     "# int drag_x" : "",
                     "# string[] dropList" : "",
                     "id" : "view",
                     "# int drag_y" : "",
                     "* init" : "{\n    var description = new Pango.FontDescription();\n    description.set_size(8000);\n    this.el.modify_font(description);\n\n    var selection = this.el.get_selection();\n    selection.set_mode( Gtk.SelectionMode.SINGLE);\n\n\n    // is this really needed??\n    /*\n    this.selection.signal['changed'].connect(function() {\n\t    _this.get('/LeftTree.view').listeners.cursor_changed.apply(\n\t        _this.get('/LeftTree.view'), [ _this.get('/LeftTree.view'), '']\n\t    );\n    });\n    */\n    Gtk.drag_source_set (\n\t    this.el,            /* widget will be drag-able */\n\t    Gdk.ModifierType.BUTTON1_MASK,       /* modifier that will start a drag */\n\t    Builder4.Application.targetList,            /* lists of target to support */\n\t    Gdk.DragAction.COPY   | Gdk.DragAction.MOVE           /* what to do with data after dropped */\n    );\n\n    // ?? needed??\n    //Gtk.drag_source_add_text_targets(this.el); \n\n    Gtk.drag_dest_set\n    (\n        this.el,              /* widget that will accept a drop */\n        Gtk.DestDefaults.MOTION  | Gtk.DestDefaults.HIGHLIGHT,\n        Builder4.Application.targetList,            /* lists of target to support */\n        Gdk.DragAction.COPY   | Gdk.DragAction.MOVE       /* what to do with data after dropped */\n    );\n\n    //Gtk.drag_dest_set_target_list(this.el, Builder.Application.targetList);\n    //Gtk.drag_dest_add_text_targets(this.el);\n}\n",
-                    "|          void highlightDropPath" : " ( string treepath, Gtk.TreeViewDropPosition pos) {\n\n        // highlighting for drag/drop\n        if (treepath.length > 0) {\n            this.el.set_drag_dest_row(  new  Gtk.TreePath.from_string( treepath ), pos);\n          } else {\n            this.el.set_drag_dest_row(null, Gtk.TreeViewDropPosition.INTO_OR_AFTER);\n         }\n             \n}",
                     "tooltip_column" : 1,
                     "* pack" : "add",
                     "xtype" : "TreeView",
                     "$ enable_tree_lines" : true,
                     "$ headers_visible" : false,
+                    "|           void highlightDropPath" : " ( string treepath, Gtk.TreeViewDropPosition pos) {\n\n        // highlighting for drag/drop\n        if (treepath.length > 0) {\n            this.el.set_drag_dest_row(  new  Gtk.TreePath.from_string( treepath ), pos);\n          } else {\n            this.el.set_drag_dest_row(null, Gtk.TreeViewDropPosition.INTO_OR_AFTER);\n         }\n             \n}",
                     "# bool drag_in_motion" : "",
                     "# bool blockChanges" : false,
                     "$ xns" : "Gtk",
+                    "|           void selectNode" : "(string treepath_str) {\n    //this.selection.select_path(new  Gtk.TreePath.from_string( treepath_str));\n     var tp = new Gtk.TreePath.from_string(treepath_str);\n     \n     this.el.set_cursor(tp, null, false);  \n     this.el.scroll_to_cell(tp, null, false, 0,0);\n}\n",
                     "items" : [
                         {
-                            "|          void dropNode" : "(string target_data_str, JsRender.Node node, bool show_templates) {\n//         print(\"drop Node\");\n     // console.dump(node);\n  //    console.dump(target_data);\n  \n  \n        // 0 = before , 1=after 2/3 onto\n  \n  \n        var target_data= target_data_str.split(\"|\");\n  \n        var parent_str = target_data[0].length > 0 ? target_data[0] : \"\";\n        var pos = target_data.length > 1 ? int.parse(target_data[1]) : 2; // ontop..\n  \n  \n        Gtk.TreePath tree_path  =   parent_str.length > 0 ? new  Gtk.TreePath.from_string( parent_str ) : null;\n        \n        \n        \n        //print(\"add \" + tp + \"@\" + target_data[1]  );\n        \n        JsRender.Node parentNode = null;\n        \n        Gtk.TreeIter iter_after;\n        Gtk.TreeIter iter_par ;\n        \n       \n         if (target_data.length == 3 && target_data[2].length > 0) {\n            node.props.set(\"* prop\", target_data[2]);\n        }\n\n        Gtk.TreePath expand_parent = null;\n        \n        // we only need to show the template if it's come from else where?\n         if (show_templates) {\n             var new_node = Xcls_DialogTemplateSelect.singleton().show( this.file.palete(), node);\n             node = new_node;\n        }        \n        \n         //print(\"pos is %d  \\n\".printf(pos));\n        \n         Gtk.TreeIter n_iter; \n         \n         if ( parent_str.length < 1) {\n              this.el.append(out n_iter, null); // drop at top level..\n              node.parent = null;\n              this.file.tree = node;\n              \n              \n        } else   if (pos  < 2) {\n            //print(target_data[1]  > 0 ? 'insert_after' : 'insert_before');\n            \n            this.el.get_iter(out iter_after, tree_path );            \n            this.el.iter_parent(out iter_par, iter_after);\n            expand_parent = this.el.get_path(iter_par);\n            \n            GLib.Value value;\n            this.el.get_value( iter_par, 2, out value);\n            parentNode =  (JsRender.Node)value.dup_object();\n            \n            \n            this.el.get_value( iter_after, 2, out value);\n            var relNode =  (JsRender.Node)value.dup_object();\n            \n            if ( pos  > 0 ) {\n             \n                this.el.insert_after(out n_iter,    iter_par  , iter_after);\n                var ix = parentNode.items.index_of(relNode);\n                parentNode.items.insert(ix+1, node);\n                \n            } else {\n                this.el.insert_before(out n_iter,  iter_par  , iter_after);\n                var ix = parentNode.items.index_of(relNode);\n                parentNode.items.insert(ix, node);\n \n            }\n            node.parent = parentNode;\n            \n            \n            \n        } else {\n           //  print(\"appending to  \" + parent_str);\n            this.el.get_iter(out iter_par, tree_path);\n            this.el.append(out n_iter,   iter_par );\n            expand_parent = this.el.get_path(iter_par);\n            \n            GLib.Value value;\n            this.el.get_value( iter_par, 2, out value);\n            parentNode =  (JsRender.Node)value.dup_object();\n            node.parent = parentNode;\n            parentNode.items.add(node);\n        }\n        \n        // reparent node in tree...\n       \n        \n        // why only on no parent???\n        \n        //if (node.parent = null) {\n             \n           \n            \n        //}\n        \n        \n        // work out what kind of packing to use.. -- should be in \n        if (!node.has(\"pack\")   && parent_str.length > 1) {\n            \n            this.file.palete().fillPack(node,parentNode);\n            \n            \n        }\n        \n        // add the node...\n        \n        this.el.set(n_iter, 0, node.nodeTitle(), 1, node.nodeTip(), -1  );\n        var o = new GLib.Value(typeof(Object));\n        o.set_object((Object)node);\n        \n        this.el.set_value(n_iter, 2, o);\n        \n        \n        \n        \n// load children - if it has any..\n      \n        if (node.items.size > 0) {\n            this.load(node.items, n_iter);\n            _this.view.el.expand_row(this.el.get_path(n_iter), true);\n        } else if (expand_parent != null && !_this.view.el.is_row_expanded(expand_parent)) {\n           _this.view.el.expand_row(expand_parent,true);\n        }\n\n        //if (tp != null && (node.items.length() > 0 || pos > 1)) {\n        //    _this.view.el.expand_row(this.el.get_path(iter_par), true);\n       // }\n        // wee need to get the empty proptypes from somewhere..\n        \n        //var olditer = this.activeIter;\n        this.activePath = this.el.get_path(n_iter).to_string();\n\n\n        \n        \n        _this.view.el.set_cursor(this.el.get_path(n_iter), null, false);\n        _this.changed();\n     \n        \n            \n}\n",
-                            "|   void updateSelected" : "() {\n  \n   \n    var s = _this.view.el.get_selection();\n    \n     Gtk.TreeIter iter;\n    Gtk.TreeModel mod;\n    \n    \n    \n    if (!s.get_selected(out mod, out iter)) {\n        return; // nothing seleted..\n    }\n  \n  GLib.Value value;\n    this.el.get_value(iter, 2, out value);\n    var node = (JsRender.Node)(value.get_object());\n    \n      this.el.set(iter, 0, node.nodeTitle(),\n                1, node.nodeTip(), -1\n        );\n}\n",
-                            "|          void moveNode" : "(string target_data, Gdk.DragAction action) \n{\n   \n   /// target_data = \"path|pos\");\n   \n   \n    //print(\"MOVE NODE\");\n    // console.dump(target_data);\n    Gtk.TreeIter old_iter;\n    Gtk.TreeModel mod;\n    \n    var s = _this.view.el.get_selection();\n    s.get_selected(out mod , out old_iter);\n    mod.get_path(old_iter);\n    \n    var node = this.pathToNode(mod.get_path(old_iter).to_string());\n    //console.dump(node);\n    if (node == null) {\n        print(\"moveNode: ERROR - node is null?\");\n    }\n    \n    \n\n    // needs to drop first, otherwise the target_data \n    // treepath will be invalid.\n\n    \n    if ((action & Gdk.DragAction.MOVE) > 0) {\n            print(\"REMOVING OLD NODE : \" + target_data + \"\\n\");\n            node.remove();\n            this.dropNode(target_data, node, false);\n            this.el.remove(ref old_iter);\n            \n            \n                         \n    } else {\n        print(\"DROPPING NODE // copy: \" + target_data + \"\\n\");\n        node = node.deepClone();\n        this.dropNode(target_data, node, false);\n    }\n    _this.changed();\n    this.activePath= \"\";\n    //this.updateNode(false,true);\n}\n",
+                            "|           string findDropNode" : " (string treepath_str, string[] targets) {\n\n    // this is used by the dragdrop code in the roo version AFAIR..\n\n    //var path = treepath_str.replace(/^builder-/, '');\n    // treemap is depreciated... - should really check if model has any entries..\n\n    if (this.el.iter_n_children(null) < 1) {\n        //print(\"NO KEYS\");\n        return \"|%d\".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);\n    }\n    //print(\"FIND treepath: \" + path);\n    //console.dump(this.treemap);\n    \n    //if (!treepath_str.match(/^builder-/)) {\n    //    return []; // nothing!\n    //}\n    if (targets.length > 0 && targets[0] == \"*\") {\n        return  treepath_str;\n    }\n    return this.findDropNodeByPath(treepath_str,targets, -1);\n}\n",
                             "currentTree" : false,
-                            "|          void load" : "(Gee.ArrayList<JsRender.Node> tr, Gtk.TreeIter? iter) \n{\n    Gtk.TreeIter citer;\n    //this.insert(citer,iter,0);\n    for(var i =0 ; i < tr.size; i++) {\n        if (iter != null) {\n            this.el.insert(out citer,iter,-1); // why not append?\n        } else {\n            this.el.append(out citer,null);\n        }\n        \n        this.el.set(citer, 0, tr.get(i).nodeTitle(),\n                1, tr.get(i).nodeTip(), -1\n        );\n        var o = new GLib.Value(typeof(Object));\n        o.set_object((Object)tr.get(i));\n        \n        this.el.set_value(citer, 2, o);\n        \n        if (tr.get(i).items.size > 0) {\n            this.load(tr.get(i).items, citer);\n        }\n     \n    }\n\n    \n}",
                             "id" : "model",
-                            "|          string findDropNodeByPath" : " (string treepath_str, string[] targets, int in_pref = -1) {\n\n    var path = treepath_str; // dupe it..\n    \n    int pref = in_pref < 0  ?  Gtk.TreeViewDropPosition.INTO_OR_AFTER : in_pref;\n    \n    var last = \"\";\n    \n    //console.dump(this.treemap);\n    \n    print(\"findDropNodeByPath : got path length %d / %s\\n\", path.length, path);\n    \n    if (path.length == 0) {\n        // top drop. // just return empty..\n        return \"|%d\".printf((int)pref) ;\n        \n    }\n    \n    \n    while (path.length > 0) {\n        //print(\"LOOKING FOR PATH: \" + path);\n        var node_data = this.pathToNode(path);\n        \n        if (node_data == null) {\n            print(\"node not found\");\n            return null;\n        }\n        \n        var xname = node_data.fqn();\n        var match = \"\";\n        var prop = \"\";\n        \n        for (var i =0; i < targets.length; i++)  {\n            var tg = targets[i];\n            if ((tg == xname)  ) {\n                match = tg;\n                break;\n            }\n            // if target is \"xxxx:name\"\n            if (tg.contains(xname +\":\")) {\n                match = tg;\n                var ar = tg.split(\":\");\n                prop = ar[1];\n                break;\n            }\n        }\n        \n        if (match.length > 0) {\n            if (last.length > 0) { // pref is after/before..\n                // then it's after last\n                if (pref > 1) {\n                    return \"\";\n                }\n                return last + \"|%d\".printf((int)pref) + \"|\" + prop;\n\n                \n            }\n            return path + \"|%d\".printf( (int) Gtk.TreeViewDropPosition.INTO_OR_AFTER) + \"|\" + prop;\n        }\n        last = \"\" + path;\n        var par = path.split(\":\");\n        string [] ppar = {};\n        for (var i = 0; i < par.length-1; i++) {\n            ppar += par[i];\n        }\n        \n        path = string.joinv(\":\", ppar);\n\n\n    }\n    \n    return \"\";\n            \n}\n",
                             "* init" : "print(\"model initialized\");\n\n",
+                            "|           void loadFile" : "(JsRender.JsRender f) {\n    //console.dump(f);\n    this.el.clear();\n    this.file = f;\n    \n    \n//    if (!f) {\n//        console.log('missing file');\n//        return;\n//    }\n    \n    // load the file if not loaded..\n    if (f.tree == null) {\n        f.loadItems( );\n    }\n    // if it's still null?\n    if (f.tree == null) {\n        return;\n    }\n    \n    /// this.get('/Window').setTitle(f.project.getName() + ' - ' + f.name);\n    \n    //if (f.items.length && typeof(f.items[0]) == 'string') {\n    \n        //this.get('/RightEditor').el.show();\n        //this.get('/RightEditor.view').load( f.items[0]);\n    //    return;\n    //}\n    //print(\"LOAD\");\n    //print(JSON.stringify(f.items, null,4));\n    //console.dump(f.items);\n    var o = new Gee.ArrayList<JsRender.Node>();\n    o.add(f.tree);\n    this.load(o,null);\n    \n    _this.view.el.expand_all();\n\n    if (f.tree.items.size < 1) {\n        // single item..\n        \n        //this.get('/Window.leftvpaned').el.set_position(80);\n        // select first...\n        _this.view.el.set_cursor( \n            new  Gtk.TreePath.from_string(\"0\"), null, false);\n        \n        \n    } else {\n          //this.get('/Window.leftvpaned').el.set_position(200);\n    }\n    \n    return;\n    /*    \n    \n    //print(\"hide right editior\");\n    //this.get('/RightEditor').el.hide();\n    //this.get('/Editor').el.hide();\n    //print(\"set current tree\");\n    //this.currentTree = this.toJS(false, false)[0];\n    //console.dump(this.currentTree);\n    //this.currentTree = this.currentTree || { items: [] };\n    //_this.renderView();\n    //console.dump(this.map);\n    //var RightPalete     = imports.Builder.RightPalete.RightPalete;\n    \n    \n    var pm = this.get('/RightPalete.model');\n    // set up provider..\n    \n    this.get('/RightPalete').provider = this.get('/LeftTree').getPaleteProvider();\n    \n    if (!this.get('/RightPalete').provider) {\n        print (\"********* PALETE PROVIDER MISSING?!!\");\n    }\n    this.get('/LeftTree').renderView();\n    \n    pm.load( this.get('/LeftTree').getPaleteProvider().gatherList(this.listAllTypes()));\n    \n    \n            \n    this.get('/Window.view-notebook').el.set_current_page(\n        this.get('/LeftTree.model').file.getType()== 'Roo' ? 0 : -1);\n        */\n            \n}\n",
                             "# JsRender.JsRender? file" : "null",
+                            "|    void updateSelected" : "() {\n  \n   \n    var s = _this.view.el.get_selection();\n    \n     Gtk.TreeIter iter;\n    Gtk.TreeModel mod;\n    \n    \n    \n    if (!s.get_selected(out mod, out iter)) {\n        return; // nothing seleted..\n    }\n  \n  GLib.Value value;\n    this.el.get_value(iter, 2, out value);\n    var node = (JsRender.Node)(value.get_object());\n    \n      this.el.set(iter, 0, node.nodeTitle(),\n                1, node.nodeTip(), -1\n        );\n}\n",
                             "* pack" : "set_model",
                             "xtype" : "TreeStore",
-                            "|          string findDropNode" : " (string treepath_str, string[] targets) {\n\n    // this is used by the dragdrop code in the roo version AFAIR..\n\n    //var path = treepath_str.replace(/^builder-/, '');\n    // treemap is depreciated... - should really check if model has any entries..\n\n    if (this.el.iter_n_children(null) < 1) {\n        //print(\"NO KEYS\");\n        return \"|%d\".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);\n    }\n    //print(\"FIND treepath: \" + path);\n    //console.dump(this.treemap);\n    \n    //if (!treepath_str.match(/^builder-/)) {\n    //    return []; // nothing!\n    //}\n    if (targets.length > 0 && targets[0] == \"*\") {\n        return  treepath_str;\n    }\n    return this.findDropNodeByPath(treepath_str,targets, -1);\n}\n",
+                            "|           string findDropNodeByPath" : " (string treepath_str, string[] targets, int in_pref = -1) {\n\n    var path = treepath_str; // dupe it..\n    \n    int pref = in_pref < 0  ?  Gtk.TreeViewDropPosition.INTO_OR_AFTER : in_pref;\n    \n    var last = \"\";\n    \n    //console.dump(this.treemap);\n    \n    print(\"findDropNodeByPath : got path length %d / %s\\n\", path.length, path);\n    \n    if (path.length == 0) {\n        // top drop. // just return empty..\n        return \"|%d\".printf((int)pref) ;\n        \n    }\n    \n    \n    while (path.length > 0) {\n        //print(\"LOOKING FOR PATH: \" + path);\n        var node_data = this.pathToNode(path);\n        \n        if (node_data == null) {\n            print(\"node not found\");\n            return null;\n        }\n        \n        var xname = node_data.fqn();\n        var match = \"\";\n        var prop = \"\";\n        \n        for (var i =0; i < targets.length; i++)  {\n            var tg = targets[i];\n            if ((tg == xname)  ) {\n                match = tg;\n                break;\n            }\n            // if target is \"xxxx:name\"\n            if (tg.contains(xname +\":\")) {\n                match = tg;\n                var ar = tg.split(\":\");\n                prop = ar[1];\n                break;\n            }\n        }\n        \n        if (match.length > 0) {\n            if (last.length > 0) { // pref is after/before..\n                // then it's after last\n                if (pref > 1) {\n                    return \"\";\n                }\n                return last + \"|%d\".printf((int)pref) + \"|\" + prop;\n\n                \n            }\n            return path + \"|%d\".printf( (int) Gtk.TreeViewDropPosition.INTO_OR_AFTER) + \"|\" + prop;\n        }\n        last = \"\" + path;\n        var par = path.split(\":\");\n        string [] ppar = {};\n        for (var i = 0; i < par.length-1; i++) {\n            ppar += par[i];\n        }\n        \n        path = string.joinv(\":\", ppar);\n\n\n    }\n    \n    return \"\";\n            \n}\n",
+                            "|           void moveNode" : "(string target_data, Gdk.DragAction action) \n{\n   \n   /// target_data = \"path|pos\");\n   \n   \n    //print(\"MOVE NODE\");\n    // console.dump(target_data);\n    Gtk.TreeIter old_iter;\n    Gtk.TreeModel mod;\n    \n    var s = _this.view.el.get_selection();\n    s.get_selected(out mod , out old_iter);\n    mod.get_path(old_iter);\n    \n    var node = this.pathToNode(mod.get_path(old_iter).to_string());\n    //console.dump(node);\n    if (node == null) {\n        print(\"moveNode: ERROR - node is null?\");\n    }\n    \n    \n\n    // needs to drop first, otherwise the target_data \n    // treepath will be invalid.\n\n    \n    if ((action & Gdk.DragAction.MOVE) > 0) {\n            print(\"REMOVING OLD NODE : \" + target_data + \"\\n\");\n            node.remove();\n            this.dropNode(target_data, node, false);\n            this.el.remove(ref old_iter);\n            \n            \n                         \n    } else {\n        print(\"DROPPING NODE // copy: \" + target_data + \"\\n\");\n        node = node.deepClone();\n        this.dropNode(target_data, node, false);\n    }\n    _this.changed();\n    this.activePath= \"\";\n    //this.updateNode(false,true);\n}\n",
                             "# string activePath" : "\"\"",
                             "$ columns" : "typeof(string),typeof(string),typeof(Object)",
-                            "|          void loadFile" : "(JsRender.JsRender f) {\n    //console.dump(f);\n    this.el.clear();\n    this.file = f;\n    \n    \n//    if (!f) {\n//        console.log('missing file');\n//        return;\n//    }\n    \n    // load the file if not loaded..\n    if (f.tree == null) {\n        f.loadItems( );\n    }\n    // if it's still null?\n    if (f.tree == null) {\n        return;\n    }\n    \n    /// this.get('/Window').setTitle(f.project.getName() + ' - ' + f.name);\n    \n    //if (f.items.length && typeof(f.items[0]) == 'string') {\n    \n        //this.get('/RightEditor').el.show();\n        //this.get('/RightEditor.view').load( f.items[0]);\n    //    return;\n    //}\n    //print(\"LOAD\");\n    //print(JSON.stringify(f.items, null,4));\n    //console.dump(f.items);\n    var o = new Gee.ArrayList<JsRender.Node>();\n    o.add(f.tree);\n    this.load(o,null);\n    \n    _this.view.el.expand_all();\n\n    if (f.tree.items.size < 1) {\n        // single item..\n        \n        //this.get('/Window.leftvpaned').el.set_position(80);\n        // select first...\n        _this.view.el.set_cursor( \n            new  Gtk.TreePath.from_string(\"0\"), null, false);\n        \n        \n    } else {\n          //this.get('/Window.leftvpaned').el.set_position(200);\n    }\n    \n    return;\n    /*    \n    \n    //print(\"hide right editior\");\n    //this.get('/RightEditor').el.hide();\n    //this.get('/Editor').el.hide();\n    //print(\"set current tree\");\n    //this.currentTree = this.toJS(false, false)[0];\n    //console.dump(this.currentTree);\n    //this.currentTree = this.currentTree || { items: [] };\n    //_this.renderView();\n    //console.dump(this.map);\n    //var RightPalete     = imports.Builder.RightPalete.RightPalete;\n    \n    \n    var pm = this.get('/RightPalete.model');\n    // set up provider..\n    \n    this.get('/RightPalete').provider = this.get('/LeftTree').getPaleteProvider();\n    \n    if (!this.get('/RightPalete').provider) {\n        print (\"********* PALETE PROVIDER MISSING?!!\");\n    }\n    this.get('/LeftTree').renderView();\n    \n    pm.load( this.get('/LeftTree').getPaleteProvider().gatherList(this.listAllTypes()));\n    \n    \n            \n    this.get('/Window.view-notebook').el.set_current_page(\n        this.get('/LeftTree.model').file.getType()== 'Roo' ? 0 : -1);\n        */\n            \n}\n",
-                            "|          void deleteSelected" : "() {\n    \n    print(\"DELETE SELECTED?\");\n    //_this.view.blockChanges = true;\n    print(\"GET SELECTION?\");\n\n    var s = _this.view.el.get_selection();\n    \n    print(\"GET  SELECTED?\");\n   Gtk.TreeIter iter;\n    Gtk.TreeModel mod;\n\n    \n    if (!s.get_selected(out mod, out iter)) {\n        return; // nothing seleted..\n    }\n      \n\n\n    this.activePath= \"\";      \n    print(\"GET  vnode value?\");\n\n    GLib.Value value;\n    this.el.get_value(iter, 2, out value);\n    var data = (JsRender.Node)(value.get_object());\n    print(\"removing node from Render\\n\");\n    if (data.parent == null) {\n        this.file.tree = null;\n    } else {\n        data.remove();\n    }\n    print(\"removing node from Tree\\n\");    \n    s.unselect_all();\n    this.el.remove(ref iter);\n\n    \n    \n    \n    // \n    \n    \n\n\n    this.activePath= \"\"; // again!?!?      \n    //this.changed(null,true);\n    \n    _this.changed();\n    \n    _this.view.blockChanges = false;\n}\n",
+                            "|           void load" : "(Gee.ArrayList<JsRender.Node> tr, Gtk.TreeIter? iter) \n{\n    Gtk.TreeIter citer;\n    //this.insert(citer,iter,0);\n    for(var i =0 ; i < tr.size; i++) {\n        if (iter != null) {\n            this.el.insert(out citer,iter,-1); // why not append?\n        } else {\n            this.el.append(out citer,null);\n        }\n        \n        this.el.set(citer, 0, tr.get(i).nodeTitle(),\n                1, tr.get(i).nodeTip(), -1\n        );\n        var o = new GLib.Value(typeof(Object));\n        o.set_object((Object)tr.get(i));\n        \n        this.el.set_value(citer, 2, o);\n        \n        if (tr.get(i).items.size > 0) {\n            this.load(tr.get(i).items, citer);\n        }\n     \n    }\n\n    \n}",
+                            "|           void deleteSelected" : "() {\n    \n    print(\"DELETE SELECTED?\");\n    //_this.view.blockChanges = true;\n    print(\"GET SELECTION?\");\n\n    var s = _this.view.el.get_selection();\n    \n    print(\"GET  SELECTED?\");\n   Gtk.TreeIter iter;\n    Gtk.TreeModel mod;\n\n    \n    if (!s.get_selected(out mod, out iter)) {\n        return; // nothing seleted..\n    }\n      \n\n\n    this.activePath= \"\";      \n    print(\"GET  vnode value?\");\n\n    GLib.Value value;\n    this.el.get_value(iter, 2, out value);\n    var data = (JsRender.Node)(value.get_object());\n    print(\"removing node from Render\\n\");\n    if (data.parent == null) {\n        this.file.tree = null;\n    } else {\n        data.remove();\n    }\n    print(\"removing node from Tree\\n\");    \n    s.unselect_all();\n    this.el.remove(ref iter);\n\n    \n    \n    \n    // \n    \n    \n\n\n    this.activePath= \"\"; // again!?!?      \n    //this.changed(null,true);\n    \n    _this.changed();\n    \n    _this.view.blockChanges = false;\n}\n",
                             "# Project.Project? project" : "null",
                             "n_columns" : 3,
                             "$ xns" : "Gtk",
-                            "|          JsRender.Node pathToNode" : "(string path) {\n \n     \n     Gtk.TreeIter   iter;\n     _this.model.el.get_iter_from_string(out iter, path);\n     \n     GLib.Value value;\n     _this.model.el.get_value(iter, 2, out value);\n     \n     return (JsRender.Node)value.dup_object();\n\n}",
+                            "|           JsRender.Node pathToNode" : "(string path) {\n \n     \n     Gtk.TreeIter   iter;\n     _this.model.el.get_iter_from_string(out iter, path);\n     \n     GLib.Value value;\n     _this.model.el.get_value(iter, 2, out value);\n     \n     return (JsRender.Node)value.dup_object();\n\n}",
+                            "|           void dropNode" : "(string target_data_str, JsRender.Node node, bool show_templates) {\n//         print(\"drop Node\");\n     // console.dump(node);\n  //    console.dump(target_data);\n  \n  \n        // 0 = before , 1=after 2/3 onto\n  \n  \n        var target_data= target_data_str.split(\"|\");\n  \n        var parent_str = target_data[0].length > 0 ? target_data[0] : \"\";\n        var pos = target_data.length > 1 ? int.parse(target_data[1]) : 2; // ontop..\n  \n  \n        Gtk.TreePath tree_path  =   parent_str.length > 0 ? new  Gtk.TreePath.from_string( parent_str ) : null;\n        \n        \n        \n        //print(\"add \" + tp + \"@\" + target_data[1]  );\n        \n        JsRender.Node parentNode = null;\n        \n        Gtk.TreeIter iter_after;\n        Gtk.TreeIter iter_par ;\n        \n       \n         if (target_data.length == 3 && target_data[2].length > 0) {\n            node.props.set(\"* prop\", target_data[2]);\n        }\n\n        Gtk.TreePath expand_parent = null;\n        \n        // we only need to show the template if it's come from else where?\n         if (show_templates) {\n             var new_node = Xcls_DialogTemplateSelect.singleton().show( this.file.palete(), node);\n             if (new_node != null) {\n                 node = new_node;\n             }\n        }        \n        \n         //print(\"pos is %d  \\n\".printf(pos));\n        \n         Gtk.TreeIter n_iter; \n         \n         if ( parent_str.length < 1) {\n              this.el.append(out n_iter, null); // drop at top level..\n              node.parent = null;\n              this.file.tree = node;\n              \n              \n        } else   if (pos  < 2) {\n            //print(target_data[1]  > 0 ? 'insert_after' : 'insert_before');\n            \n            this.el.get_iter(out iter_after, tree_path );            \n            this.el.iter_parent(out iter_par, iter_after);\n            expand_parent = this.el.get_path(iter_par);\n            \n            GLib.Value value;\n            this.el.get_value( iter_par, 2, out value);\n            parentNode =  (JsRender.Node)value.dup_object();\n            \n            \n            this.el.get_value( iter_after, 2, out value);\n            var relNode =  (JsRender.Node)value.dup_object();\n            \n            if ( pos  > 0 ) {\n             \n                this.el.insert_after(out n_iter,    iter_par  , iter_after);\n                var ix = parentNode.items.index_of(relNode);\n                parentNode.items.insert(ix+1, node);\n                \n            } else {\n                this.el.insert_before(out n_iter,  iter_par  , iter_after);\n                var ix = parentNode.items.index_of(relNode);\n                parentNode.items.insert(ix, node);\n \n            }\n            node.parent = parentNode;\n            \n            \n            \n        } else {\n           //  print(\"appending to  \" + parent_str);\n            this.el.get_iter(out iter_par, tree_path);\n            this.el.append(out n_iter,   iter_par );\n            expand_parent = this.el.get_path(iter_par);\n            \n            GLib.Value value;\n            this.el.get_value( iter_par, 2, out value);\n            parentNode =  (JsRender.Node)value.dup_object();\n            node.parent = parentNode;\n            parentNode.items.add(node);\n        }\n        \n        // reparent node in tree...\n       \n        \n        // why only on no parent???\n        \n        //if (node.parent = null) {\n             \n           \n            \n        //}\n        \n        \n        // work out what kind of packing to use.. -- should be in \n        if (!node.has(\"pack\")   && parent_str.length > 1) {\n            \n            this.file.palete().fillPack(node,parentNode);\n            \n            \n        }\n        \n        // add the node...\n        \n        this.el.set(n_iter, 0, node.nodeTitle(), 1, node.nodeTip(), -1  );\n        var o = new GLib.Value(typeof(Object));\n        o.set_object((Object)node);\n        \n        this.el.set_value(n_iter, 2, o);\n        \n        \n        \n        \n// load children - if it has any..\n      \n        if (node.items.size > 0) {\n            this.load(node.items, n_iter);\n            _this.view.el.expand_row(this.el.get_path(n_iter), true);\n        } else if (expand_parent != null && !_this.view.el.is_row_expanded(expand_parent)) {\n           _this.view.el.expand_row(expand_parent,true);\n        }\n\n        //if (tp != null && (node.items.length() > 0 || pos > 1)) {\n        //    _this.view.el.expand_row(this.el.get_path(iter_par), true);\n       // }\n        // wee need to get the empty proptypes from somewhere..\n        \n        //var olditer = this.activeIter;\n        this.activePath = this.el.get_path(n_iter).to_string();\n\n\n        \n        \n        _this.view.el.set_cursor(this.el.get_path(n_iter), null, false);\n        _this.changed();\n     \n        \n            \n}\n",
                             "$ listAllTypes" : "function() {\n    var s = this.get('/LeftTree.view').selection;\n    print (\"LIST ALL TYPES: \" + s.count_selected_rows() );\n    \n    if (s.count_selected_rows() > 0) {\n        var iter = new Gtk.TreeIter();    \n        s.get_selected(this.el, iter);\n\n        // set some properties of the tree for use by the dropped element.\n        var value = new GObject.Value('');\n        this.el.get_value(iter, 2, value);\n        var data = JSON.parse(value.value);\n        \n        \n        var xname = this.get('/LeftTree.model').file.guessName(data);\n        console.log('selected:' + xname);\n        if (xname.length) {\n            return [ xname ];\n        }\n        return []; // could not find it..\n    }\n    \n    var ret = [ ];\n    \n   var _this = this;\n    function addall(li)\n    {\n        li.forEach(function(el) {\n            // this is specific to roo!!!?\n            if (!el) { // skip empty?\n                return;\n            }\n            var fullpath =  _this.file.guessName(el);\n            if (fullpath.length && ret.indexOf(fullpath) < 0) {\n                ret.push(fullpath);\n            }\n            \n            \n            if (el.items && el.items.length) {\n                addall(el.items);\n            }\n            \n        });\n        \n        \n    }\n    \n    addall([this.currentTree]);\n    \n    // only if we have nothing, should we add '*top'\n    if (!ret.length) {\n        ret = [ '*top' ];\n    }\n    //console.log('all types in tree');\n    //console.dump(ret);\n    \n    return ret;\n                            \n}\n"
                         },
                         {
                             "* init" : "  this.el.add_attribute(_this.renderer.el , \"markup\", 0 );\n ",
-                            "xtype" : "TreeViewColumn",
                             "* pack" : "append_column",
+                            "xtype" : "TreeViewColumn",
                             "$ xns" : "Gtk",
                             "items" : [
                                 {
                                     "id" : "renderer",
-                                    "* pack" : "pack_start,true",
                                     "xtype" : "CellRendererText",
+                                    "* pack" : "pack_start,true",
                                     "$ xns" : "Gtk"
                                 }
                             ]
@@ -90,8 +90,8 @@
                 },
                 {
                     "id" : "LeftTreeMenu",
-                    "* pack" : false,
                     "xtype" : "Menu",
+                    "* pack" : false,
                     "$ xns" : "Gtk",
                     "items" : [
                         {
@@ -99,8 +99,8 @@
                                 "activate" : "  ( ) => {\n    \n    print(\"ACTIVATE?\");\n    \n  \n     _this.model.deleteSelected();\n}"
                             },
                             "label" : "Delete Element",
-                            "* pack" : "add",
                             "xtype" : "MenuItem",
+                            "* pack" : "add",
                             "$ xns" : "Gtk"
                         },
                         {
                                 "activate" : "  () => {\n\n     DialogSaveTemplate.singleton().show(\n            (Gtk.Window) _this.el.get_toplevel (), \n            _this.model.file.palete(), \n            _this.getActiveElement()\n    );\n     \n    \n}"
                             },
                             "label" : "Save as Template",
-                            "* pack" : "add",
                             "xtype" : "MenuItem",
+                            "* pack" : "add",
                             "$ xns" : "Gtk"
                         },
                         {
                                 "activate" : "  () => {\n    var node = _this.getActiveElement();\n     var name = DialogSaveModule.singleton().show(\n            (Gtk.Window) _this.el.get_toplevel (), \n            _this.model.file.project, \n            node\n     );\n     if (name.length < 1) {\n            return;\n  \n     }\n     node.props.set(\"* xinclude\", name);\n     node.items.clear();\n\n\n    var s = _this.view.el.get_selection();\n    \n    print(\"GET  SELECTED?\");\n    Gtk.TreeIter iter;\n    Gtk.TreeModel mod;\n\n    \n    if (!s.get_selected(out mod, out iter)) {\n        return; // nothing seleted..\n    }\n    Gtk.TreeIter citer;\n    var n_cn = mod.iter_n_children(iter) -1;\n    for (var i = n_cn; i > -1; i--) {\n        mod.iter_nth_child(out citer, iter, i);\n        \n\n        print(\"removing node from Tree\\n\");    \n    \n        _this.model.el.remove(ref citer);\n    }\n    _this.changed();\n    _this.node_selected(node);\n     \n    \n}"
                             },
                             "label" : "Save as Module",
-                            "* pack" : "add",
                             "xtype" : "MenuItem",
+                            "* pack" : "add",
                             "$ xns" : "Gtk"
                         }
                     ]
index c644ab7..d91b483 100644 (file)
@@ -19,9 +19,17 @@ WindowLeftTree=new XObject({
          return _this.model.pathToNode(path);
          
     },
-    before_node_change : "(JsRender.Node? node)",
     id : "WindowLeftTree",
+    before_node_change : "(JsRender.Node? node)",
     shadow_type : Gtk.ShadowType.IN,
+    getActiveFile : () {
+        return this.model.file;
+    },
+    xtype : "ScrolledWindow",
+    changed : "()",
+    xns : Gtk,
+    node_selected : "(JsRender.Node? node)",
+    main_window : "null",
     getActivePath : () {
         var model = this.model;
         var view = this.view.el;
@@ -33,28 +41,17 @@ WindowLeftTree=new XObject({
         view.get_selection().get_selected(out mod, out iter);
         return mod.get_path(iter).to_string();
     },
-    xtype : "ScrolledWindow",
-    changed : "()",
-    xns : Gtk,
-    node_selected : "(JsRender.Node? node)",
-    getActiveFile : () {
-        return this.model.file;
-    },
-    main_window : "null",
     items : [
        {
             dragData : "",
-            selectNode : (string treepath_str) {
-                //this.selection.select_path(new  Gtk.TreePath.from_string( treepath_str));
-                 var tp = new Gtk.TreePath.from_string(treepath_str);
-                 
-                 this.el.set_cursor(tp, null, false);  
-                 this.el.scroll_to_cell(tp, null, false, 0,0);
-            },
             drag_x : "",
             dropList : "",
             id : "view",
             drag_y : "",
+            tooltip_column : 1,
+            xtype : "TreeView",
+            enable_tree_lines : TRUE,
+            headers_visible : FALSE,
             highlightDropPath : ( string treepath, Gtk.TreeViewDropPosition pos) {
             
                     // highlighting for drag/drop
@@ -65,13 +62,16 @@ WindowLeftTree=new XObject({
                      }
                          
             },
-            tooltip_column : 1,
-            xtype : "TreeView",
-            enable_tree_lines : TRUE,
-            headers_visible : FALSE,
             drag_in_motion : "",
             blockChanges : false,
             xns : Gtk,
+            selectNode : (string treepath_str) {
+                //this.selection.select_path(new  Gtk.TreePath.from_string( treepath_str));
+                 var tp = new Gtk.TreePath.from_string(treepath_str);
+                 
+                 this.el.set_cursor(tp, null, false);  
+                 this.el.scroll_to_cell(tp, null, false, 0,0);
+            },
             listeners : {
                button_press_event : ( ev) => {
                       //console.log("button press?");
@@ -101,6 +101,47 @@ WindowLeftTree=new XObject({
                        //   print("click:" + res.path.to_string());
                         return true;
                   },
+               drag_begin : ( ctx)  => {
+                       //print('SOURCE: drag-begin');
+                          
+                          
+                          //this.targetData = "";
+                          
+                          // find what is selected in our tree...
+                          
+                          var s = _this.view.el.get_selection();
+                          if (s.count_selected_rows() < 1) {
+                              return;
+                          }
+                          Gtk.TreeIter iter;
+                          Gtk.TreeModel mod;
+                          s.get_selected(out mod, out iter);
+                  
+                          
+                  
+                          // set some properties of the tree for use by the dropped element.
+                          GLib.Value value;
+                          _this.model.el.get_value(iter, 2, out value);
+                          var data = (JsRender.Node)(value.dup_object());
+                          var xname = data.fqn();
+                           print ("XNAME  IS " + xname+ "\n");
+                          this.dragData = xname;
+                          this.dropList = _this.model.file.palete().getDropList(xname);
+                          
+                          print ("DROP LIST IS " + string.joinv(", ", this.dropList) + "\n");
+                          
+                  
+                          // make the drag icon a picture of the node that was selected
+                          var path = _this.model.el.get_path(iter);
+                  
+                          //this.treepath = path.to_string();
+                          
+                          var pix = this.el.create_row_drag_icon ( path);
+                          
+                          Gtk.drag_set_icon_surface (ctx, pix) ;
+                          
+                          return;
+                  },
                cursor_changed : ( ) => {
                   
                   
@@ -159,47 +200,6 @@ WindowLeftTree=new XObject({
                       return  ;
                                   
                   },
-               drag_begin : ( ctx)  => {
-                       //print('SOURCE: drag-begin');
-                          
-                          
-                          //this.targetData = "";
-                          
-                          // find what is selected in our tree...
-                          
-                          var s = _this.view.el.get_selection();
-                          if (s.count_selected_rows() < 1) {
-                              return;
-                          }
-                          Gtk.TreeIter iter;
-                          Gtk.TreeModel mod;
-                          s.get_selected(out mod, out iter);
-                  
-                          
-                  
-                          // set some properties of the tree for use by the dropped element.
-                          GLib.Value value;
-                          _this.model.el.get_value(iter, 2, out value);
-                          var data = (JsRender.Node)(value.dup_object());
-                          var xname = data.fqn();
-                           print ("XNAME  IS " + xname+ "\n");
-                          this.dragData = xname;
-                          this.dropList = _this.model.file.palete().getDropList(xname);
-                          
-                          print ("DROP LIST IS " + string.joinv(", ", this.dropList) + "\n");
-                          
-                  
-                          // make the drag icon a picture of the node that was selected
-                          var path = _this.model.el.get_path(iter);
-                  
-                          //this.treepath = path.to_string();
-                          
-                          var pix = this.el.create_row_drag_icon ( path);
-                          
-                          Gtk.drag_set_icon_surface (ctx, pix) ;
-                          
-                          return;
-                  },
                drag_end : (drag_context) => {
                        //Seed.print('LEFT-TREE: drag-end');
                           this.dragData = "";
@@ -512,156 +512,115 @@ WindowLeftTree=new XObject({
             },
             items : [
                {
-                    dropNode : (string target_data_str, JsRender.Node node, bool show_templates) {
-                    //         print("drop Node");
-                         // console.dump(node);
-                      //    console.dump(target_data);
-                      
-                      
-                            // 0 = before , 1=after 2/3 onto
-                      
-                      
-                            var target_data= target_data_str.split("|");
-                      
-                            var parent_str = target_data[0].length > 0 ? target_data[0] : "";
-                            var pos = target_data.length > 1 ? int.parse(target_data[1]) : 2; // ontop..
-                      
-                      
-                            Gtk.TreePath tree_path  =   parent_str.length > 0 ? new  Gtk.TreePath.from_string( parent_str ) : null;
-                            
-                            
-                            
-                            //print("add " + tp + "@" + target_data[1]  );
-                            
-                            JsRender.Node parentNode = null;
-                            
-                            Gtk.TreeIter iter_after;
-                            Gtk.TreeIter iter_par ;
-                            
-                           
-                             if (target_data.length == 3 && target_data[2].length > 0) {
-                                node.props.set("* prop", target_data[2]);
-                            }
+                    findDropNode : (string treepath_str, string[] targets) {
                     
-                            Gtk.TreePath expand_parent = null;
+                        // this is used by the dragdrop code in the roo version AFAIR..
+                    
+                        //var path = treepath_str.replace(/^builder-/, '');
+                        // treemap is depreciated... - should really check if model has any entries..
+                    
+                        if (this.el.iter_n_children(null) < 1) {
+                            //print("NO KEYS");
+                            return "|%d".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);
+                        }
+                        //print("FIND treepath: " + path);
+                        //console.dump(this.treemap);
+                        
+                        //if (!treepath_str.match(/^builder-/)) {
+                        //    return []; // nothing!
+                        //}
+                        if (targets.length > 0 && targets[0] == "*") {
+                            return  treepath_str;
+                        }
+                        return this.findDropNodeByPath(treepath_str,targets, -1);
+                    },
+                    currentTree : false,
+                    id : "model",
+                    loadFile : (JsRender.JsRender f) {
+                        //console.dump(f);
+                        this.el.clear();
+                        this.file = f;
+                        
+                        
+                    //    if (!f) {
+                    //        console.log('missing file');
+                    //        return;
+                    //    }
+                        
+                        // load the file if not loaded..
+                        if (f.tree == null) {
+                            f.loadItems( );
+                        }
+                        // if it's still null?
+                        if (f.tree == null) {
+                            return;
+                        }
+                        
+                        /// this.get('/Window').setTitle(f.project.getName() + ' - ' + f.name);
+                        
+                        //if (f.items.length && typeof(f.items[0]) == 'string') {
+                        
+                            //this.get('/RightEditor').el.show();
+                            //this.get('/RightEditor.view').load( f.items[0]);
+                        //    return;
+                        //}
+                        //print("LOAD");
+                        //print(JSON.stringify(f.items, null,4));
+                        //console.dump(f.items);
+                        var o = new Gee.ArrayList<JsRender.Node>();
+                        o.add(f.tree);
+                        this.load(o,null);
+                        
+                        _this.view.el.expand_all();
+                    
+                        if (f.tree.items.size < 1) {
+                            // single item..
                             
-                            // we only need to show the template if it's come from else where?
-                             if (show_templates) {
-                                 var new_node = Xcls_DialogTemplateSelect.singleton().show( this.file.palete(), node);
-                                 node = new_node;
-                            }        
+                            //this.get('/Window.leftvpaned').el.set_position(80);
+                            // select first...
+                            _this.view.el.set_cursor( 
+                                new  Gtk.TreePath.from_string("0"), null, false);
                             
-                             //print("pos is %d  \n".printf(pos));
                             
-                             Gtk.TreeIter n_iter; 
-                             
-                             if ( parent_str.length < 1) {
-                                  this.el.append(out n_iter, null); // drop at top level..
-                                  node.parent = null;
-                                  this.file.tree = node;
-                                  
-                                  
-                            } else   if (pos  < 2) {
-                                //print(target_data[1]  > 0 ? 'insert_after' : 'insert_before');
-                                
-                                this.el.get_iter(out iter_after, tree_path );            
-                                this.el.iter_parent(out iter_par, iter_after);
-                                expand_parent = this.el.get_path(iter_par);
-                                
-                                GLib.Value value;
-                                this.el.get_value( iter_par, 2, out value);
-                                parentNode =  (JsRender.Node)value.dup_object();
-                                
-                                
-                                this.el.get_value( iter_after, 2, out value);
-                                var relNode =  (JsRender.Node)value.dup_object();
-                                
-                                if ( pos  > 0 ) {
-                                 
-                                    this.el.insert_after(out n_iter,    iter_par  , iter_after);
-                                    var ix = parentNode.items.index_of(relNode);
-                                    parentNode.items.insert(ix+1, node);
-                                    
-                                } else {
-                                    this.el.insert_before(out n_iter,  iter_par  , iter_after);
-                                    var ix = parentNode.items.index_of(relNode);
-                                    parentNode.items.insert(ix, node);
-                     
-                                }
-                                node.parent = parentNode;
-                                
-                                
-                                
-                            } else {
-                               //  print("appending to  " + parent_str);
-                                this.el.get_iter(out iter_par, tree_path);
-                                this.el.append(out n_iter,   iter_par );
-                                expand_parent = this.el.get_path(iter_par);
-                                
-                                GLib.Value value;
-                                this.el.get_value( iter_par, 2, out value);
-                                parentNode =  (JsRender.Node)value.dup_object();
-                                node.parent = parentNode;
-                                parentNode.items.add(node);
-                            }
-                            
-                            // reparent node in tree...
-                           
-                            
-                            // why only on no parent???
-                            
-                            //if (node.parent = null) {
-                                 
-                               
-                                
-                            //}
-                            
-                            
-                            // work out what kind of packing to use.. -- should be in 
-                            if (!node.has("pack")   && parent_str.length > 1) {
-                                
-                                this.file.palete().fillPack(node,parentNode);
-                                
+                        } else {
+                              //this.get('/Window.leftvpaned').el.set_position(200);
+                        }
+                        
+                        return;
+                        /*    
+                        
+                        //print("hide right editior");
+                        //this.get('/RightEditor').el.hide();
+                        //this.get('/Editor').el.hide();
+                        //print("set current tree");
+                        //this.currentTree = this.toJS(false, false)[0];
+                        //console.dump(this.currentTree);
+                        //this.currentTree = this.currentTree || { items: [] };
+                        //_this.renderView();
+                        //console.dump(this.map);
+                        //var RightPalete     = imports.Builder.RightPalete.RightPalete;
+                        
+                        
+                        var pm = this.get('/RightPalete.model');
+                        // set up provider..
+                        
+                        this.get('/RightPalete').provider = this.get('/LeftTree').getPaleteProvider();
+                        
+                        if (!this.get('/RightPalete').provider) {
+                            print ("********* PALETE PROVIDER MISSING?!!");
+                        }
+                        this.get('/LeftTree').renderView();
+                        
+                        pm.load( this.get('/LeftTree').getPaleteProvider().gatherList(this.listAllTypes()));
+                        
+                        
                                 
-                            }
-                            
-                            // add the node...
-                            
-                            this.el.set(n_iter, 0, node.nodeTitle(), 1, node.nodeTip(), -1  );
-                            var o = new GLib.Value(typeof(Object));
-                            o.set_object((Object)node);
-                            
-                            this.el.set_value(n_iter, 2, o);
-                            
-                            
-                            
-                            
-                    // load children - if it has any..
-                          
-                            if (node.items.size > 0) {
-                                this.load(node.items, n_iter);
-                                _this.view.el.expand_row(this.el.get_path(n_iter), true);
-                            } else if (expand_parent != null && !_this.view.el.is_row_expanded(expand_parent)) {
-                               _this.view.el.expand_row(expand_parent,true);
-                            }
-                    
-                            //if (tp != null && (node.items.length() > 0 || pos > 1)) {
-                            //    _this.view.el.expand_row(this.el.get_path(iter_par), true);
-                           // }
-                            // wee need to get the empty proptypes from somewhere..
-                            
-                            //var olditer = this.activeIter;
-                            this.activePath = this.el.get_path(n_iter).to_string();
-                    
-                    
-                            
-                            
-                            _this.view.el.set_cursor(this.el.get_path(n_iter), null, false);
-                            _this.changed();
-                         
-                            
+                        this.get('/Window.view-notebook').el.set_current_page(
+                            this.get('/LeftTree.model').file.getType()== 'Roo' ? 0 : -1);
+                            */
                                 
                     },
+                    file : "null",
                     updateSelected : () {
                       
                        
@@ -684,79 +643,7 @@ WindowLeftTree=new XObject({
                                     1, node.nodeTip(), -1
                             );
                     },
-                    moveNode : (string target_data, Gdk.DragAction action) 
-                    {
-                       
-                       /// target_data = "path|pos");
-                       
-                       
-                        //print("MOVE NODE");
-                        // console.dump(target_data);
-                        Gtk.TreeIter old_iter;
-                        Gtk.TreeModel mod;
-                        
-                        var s = _this.view.el.get_selection();
-                        s.get_selected(out mod , out old_iter);
-                        mod.get_path(old_iter);
-                        
-                        var node = this.pathToNode(mod.get_path(old_iter).to_string());
-                        //console.dump(node);
-                        if (node == null) {
-                            print("moveNode: ERROR - node is null?");
-                        }
-                        
-                        
-                    
-                        // needs to drop first, otherwise the target_data 
-                        // treepath will be invalid.
-                    
-                        
-                        if ((action & Gdk.DragAction.MOVE) > 0) {
-                                print("REMOVING OLD NODE : " + target_data + "\n");
-                                node.remove();
-                                this.dropNode(target_data, node, false);
-                                this.el.remove(ref old_iter);
-                                
-                                
-                                             
-                        } else {
-                            print("DROPPING NODE // copy: " + target_data + "\n");
-                            node = node.deepClone();
-                            this.dropNode(target_data, node, false);
-                        }
-                        _this.changed();
-                        this.activePath= "";
-                        //this.updateNode(false,true);
-                    },
-                    currentTree : false,
-                    load : (Gee.ArrayList<JsRender.Node> tr, Gtk.TreeIter? iter) 
-                    {
-                        Gtk.TreeIter citer;
-                        //this.insert(citer,iter,0);
-                        for(var i =0 ; i < tr.size; i++) {
-                            if (iter != null) {
-                                this.el.insert(out citer,iter,-1); // why not append?
-                            } else {
-                                this.el.append(out citer,null);
-                            }
-                            
-                            this.el.set(citer, 0, tr.get(i).nodeTitle(),
-                                    1, tr.get(i).nodeTip(), -1
-                            );
-                            var o = new GLib.Value(typeof(Object));
-                            o.set_object((Object)tr.get(i));
-                            
-                            this.el.set_value(citer, 2, o);
-                            
-                            if (tr.get(i).items.size > 0) {
-                                this.load(tr.get(i).items, citer);
-                            }
-                         
-                        }
-                    
-                        
-                    },
-                    id : "model",
+                    xtype : "TreeStore",
                     findDropNodeByPath : (string treepath_str, string[] targets, int in_pref = -1) {
                     
                         var path = treepath_str; // dupe it..
@@ -831,115 +718,78 @@ WindowLeftTree=new XObject({
                         return "";
                                 
                     },
-                    file : "null",
-                    xtype : "TreeStore",
-                    findDropNode : (string treepath_str, string[] targets) {
-                    
-                        // this is used by the dragdrop code in the roo version AFAIR..
+                    moveNode : (string target_data, Gdk.DragAction action) 
+                    {
+                       
+                       /// target_data = "path|pos");
+                       
+                       
+                        //print("MOVE NODE");
+                        // console.dump(target_data);
+                        Gtk.TreeIter old_iter;
+                        Gtk.TreeModel mod;
+                        
+                        var s = _this.view.el.get_selection();
+                        s.get_selected(out mod , out old_iter);
+                        mod.get_path(old_iter);
+                        
+                        var node = this.pathToNode(mod.get_path(old_iter).to_string());
+                        //console.dump(node);
+                        if (node == null) {
+                            print("moveNode: ERROR - node is null?");
+                        }
+                        
+                        
                     
-                        //var path = treepath_str.replace(/^builder-/, '');
-                        // treemap is depreciated... - should really check if model has any entries..
+                        // needs to drop first, otherwise the target_data 
+                        // treepath will be invalid.
                     
-                        if (this.el.iter_n_children(null) < 1) {
-                            //print("NO KEYS");
-                            return "|%d".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);
-                        }
-                        //print("FIND treepath: " + path);
-                        //console.dump(this.treemap);
                         
-                        //if (!treepath_str.match(/^builder-/)) {
-                        //    return []; // nothing!
-                        //}
-                        if (targets.length > 0 && targets[0] == "*") {
-                            return  treepath_str;
+                        if ((action & Gdk.DragAction.MOVE) > 0) {
+                                print("REMOVING OLD NODE : " + target_data + "\n");
+                                node.remove();
+                                this.dropNode(target_data, node, false);
+                                this.el.remove(ref old_iter);
+                                
+                                
+                                             
+                        } else {
+                            print("DROPPING NODE // copy: " + target_data + "\n");
+                            node = node.deepClone();
+                            this.dropNode(target_data, node, false);
                         }
-                        return this.findDropNodeByPath(treepath_str,targets, -1);
+                        _this.changed();
+                        this.activePath= "";
+                        //this.updateNode(false,true);
                     },
                     activePath : "\"\"",
                     columns : typeof(string),typeof(string),typeof(Object),
-                    loadFile : (JsRender.JsRender f) {
-                        //console.dump(f);
-                        this.el.clear();
-                        this.file = f;
-                        
-                        
-                    //    if (!f) {
-                    //        console.log('missing file');
-                    //        return;
-                    //    }
-                        
-                        // load the file if not loaded..
-                        if (f.tree == null) {
-                            f.loadItems( );
-                        }
-                        // if it's still null?
-                        if (f.tree == null) {
-                            return;
-                        }
-                        
-                        /// this.get('/Window').setTitle(f.project.getName() + ' - ' + f.name);
-                        
-                        //if (f.items.length && typeof(f.items[0]) == 'string') {
-                        
-                            //this.get('/RightEditor').el.show();
-                            //this.get('/RightEditor.view').load( f.items[0]);
-                        //    return;
-                        //}
-                        //print("LOAD");
-                        //print(JSON.stringify(f.items, null,4));
-                        //console.dump(f.items);
-                        var o = new Gee.ArrayList<JsRender.Node>();
-                        o.add(f.tree);
-                        this.load(o,null);
-                        
-                        _this.view.el.expand_all();
-                    
-                        if (f.tree.items.size < 1) {
-                            // single item..
+                    load : (Gee.ArrayList<JsRender.Node> tr, Gtk.TreeIter? iter) 
+                    {
+                        Gtk.TreeIter citer;
+                        //this.insert(citer,iter,0);
+                        for(var i =0 ; i < tr.size; i++) {
+                            if (iter != null) {
+                                this.el.insert(out citer,iter,-1); // why not append?
+                            } else {
+                                this.el.append(out citer,null);
+                            }
                             
-                            //this.get('/Window.leftvpaned').el.set_position(80);
-                            // select first...
-                            _this.view.el.set_cursor( 
-                                new  Gtk.TreePath.from_string("0"), null, false);
+                            this.el.set(citer, 0, tr.get(i).nodeTitle(),
+                                    1, tr.get(i).nodeTip(), -1
+                            );
+                            var o = new GLib.Value(typeof(Object));
+                            o.set_object((Object)tr.get(i));
                             
+                            this.el.set_value(citer, 2, o);
                             
-                        } else {
-                              //this.get('/Window.leftvpaned').el.set_position(200);
-                        }
-                        
-                        return;
-                        /*    
-                        
-                        //print("hide right editior");
-                        //this.get('/RightEditor').el.hide();
-                        //this.get('/Editor').el.hide();
-                        //print("set current tree");
-                        //this.currentTree = this.toJS(false, false)[0];
-                        //console.dump(this.currentTree);
-                        //this.currentTree = this.currentTree || { items: [] };
-                        //_this.renderView();
-                        //console.dump(this.map);
-                        //var RightPalete     = imports.Builder.RightPalete.RightPalete;
-                        
-                        
-                        var pm = this.get('/RightPalete.model');
-                        // set up provider..
-                        
-                        this.get('/RightPalete').provider = this.get('/LeftTree').getPaleteProvider();
-                        
-                        if (!this.get('/RightPalete').provider) {
-                            print ("********* PALETE PROVIDER MISSING?!!");
+                            if (tr.get(i).items.size > 0) {
+                                this.load(tr.get(i).items, citer);
+                            }
+                         
                         }
-                        this.get('/LeftTree').renderView();
-                        
-                        pm.load( this.get('/LeftTree').getPaleteProvider().gatherList(this.listAllTypes()));
-                        
+                    
                         
-                                
-                        this.get('/Window.view-notebook').el.set_current_page(
-                            this.get('/LeftTree.model').file.getType()== 'Roo' ? 0 : -1);
-                            */
-                                
                     },
                     deleteSelected : () {
                         
@@ -1005,6 +855,158 @@ WindowLeftTree=new XObject({
                          
                          return (JsRender.Node)value.dup_object();
                     
+                    },
+                    dropNode : (string target_data_str, JsRender.Node node, bool show_templates) {
+                    //         print("drop Node");
+                         // console.dump(node);
+                      //    console.dump(target_data);
+                      
+                      
+                            // 0 = before , 1=after 2/3 onto
+                      
+                      
+                            var target_data= target_data_str.split("|");
+                      
+                            var parent_str = target_data[0].length > 0 ? target_data[0] : "";
+                            var pos = target_data.length > 1 ? int.parse(target_data[1]) : 2; // ontop..
+                      
+                      
+                            Gtk.TreePath tree_path  =   parent_str.length > 0 ? new  Gtk.TreePath.from_string( parent_str ) : null;
+                            
+                            
+                            
+                            //print("add " + tp + "@" + target_data[1]  );
+                            
+                            JsRender.Node parentNode = null;
+                            
+                            Gtk.TreeIter iter_after;
+                            Gtk.TreeIter iter_par ;
+                            
+                           
+                             if (target_data.length == 3 && target_data[2].length > 0) {
+                                node.props.set("* prop", target_data[2]);
+                            }
+                    
+                            Gtk.TreePath expand_parent = null;
+                            
+                            // we only need to show the template if it's come from else where?
+                             if (show_templates) {
+                                 var new_node = Xcls_DialogTemplateSelect.singleton().show( this.file.palete(), node);
+                                 if (new_node != null) {
+                                     node = new_node;
+                                 }
+                            }        
+                            
+                             //print("pos is %d  \n".printf(pos));
+                            
+                             Gtk.TreeIter n_iter; 
+                             
+                             if ( parent_str.length < 1) {
+                                  this.el.append(out n_iter, null); // drop at top level..
+                                  node.parent = null;
+                                  this.file.tree = node;
+                                  
+                                  
+                            } else   if (pos  < 2) {
+                                //print(target_data[1]  > 0 ? 'insert_after' : 'insert_before');
+                                
+                                this.el.get_iter(out iter_after, tree_path );            
+                                this.el.iter_parent(out iter_par, iter_after);
+                                expand_parent = this.el.get_path(iter_par);
+                                
+                                GLib.Value value;
+                                this.el.get_value( iter_par, 2, out value);
+                                parentNode =  (JsRender.Node)value.dup_object();
+                                
+                                
+                                this.el.get_value( iter_after, 2, out value);
+                                var relNode =  (JsRender.Node)value.dup_object();
+                                
+                                if ( pos  > 0 ) {
+                                 
+                                    this.el.insert_after(out n_iter,    iter_par  , iter_after);
+                                    var ix = parentNode.items.index_of(relNode);
+                                    parentNode.items.insert(ix+1, node);
+                                    
+                                } else {
+                                    this.el.insert_before(out n_iter,  iter_par  , iter_after);
+                                    var ix = parentNode.items.index_of(relNode);
+                                    parentNode.items.insert(ix, node);
+                     
+                                }
+                                node.parent = parentNode;
+                                
+                                
+                                
+                            } else {
+                               //  print("appending to  " + parent_str);
+                                this.el.get_iter(out iter_par, tree_path);
+                                this.el.append(out n_iter,   iter_par );
+                                expand_parent = this.el.get_path(iter_par);
+                                
+                                GLib.Value value;
+                                this.el.get_value( iter_par, 2, out value);
+                                parentNode =  (JsRender.Node)value.dup_object();
+                                node.parent = parentNode;
+                                parentNode.items.add(node);
+                            }
+                            
+                            // reparent node in tree...
+                           
+                            
+                            // why only on no parent???
+                            
+                            //if (node.parent = null) {
+                                 
+                               
+                                
+                            //}
+                            
+                            
+                            // work out what kind of packing to use.. -- should be in 
+                            if (!node.has("pack")   && parent_str.length > 1) {
+                                
+                                this.file.palete().fillPack(node,parentNode);
+                                
+                                
+                            }
+                            
+                            // add the node...
+                            
+                            this.el.set(n_iter, 0, node.nodeTitle(), 1, node.nodeTip(), -1  );
+                            var o = new GLib.Value(typeof(Object));
+                            o.set_object((Object)node);
+                            
+                            this.el.set_value(n_iter, 2, o);
+                            
+                            
+                            
+                            
+                    // load children - if it has any..
+                          
+                            if (node.items.size > 0) {
+                                this.load(node.items, n_iter);
+                                _this.view.el.expand_row(this.el.get_path(n_iter), true);
+                            } else if (expand_parent != null && !_this.view.el.is_row_expanded(expand_parent)) {
+                               _this.view.el.expand_row(expand_parent,true);
+                            }
+                    
+                            //if (tp != null && (node.items.length() > 0 || pos > 1)) {
+                            //    _this.view.el.expand_row(this.el.get_path(iter_par), true);
+                           // }
+                            // wee need to get the empty proptypes from somewhere..
+                            
+                            //var olditer = this.activeIter;
+                            this.activePath = this.el.get_path(n_iter).to_string();
+                    
+                    
+                            
+                            
+                            _this.view.el.set_cursor(this.el.get_path(n_iter), null, false);
+                            _this.changed();
+                         
+                            
+                                
                     },
                     listAllTypes : function() {
                         var s = this.get('/LeftTree.view').selection;
index b3b6b6c..a0481ca 100644 (file)
@@ -45,7 +45,7 @@ public class Xcls_WindowLeftTree : Object
         this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);    }
 
     // user defined functions 
-    public          JsRender.Node? getActiveElement () { // return path to actie node.
+    public           JsRender.Node? getActiveElement () { // return path to actie node.
     
          var path = this.getActivePath();
          if (path.length < 1) {
@@ -54,7 +54,10 @@ public class Xcls_WindowLeftTree : Object
          return _this.model.pathToNode(path);
          
     }
-    public          string getActivePath () {
+    public           JsRender.JsRender getActiveFile () {
+        return this.model.file;
+    }
+    public           string getActivePath () {
         var model = this.model;
         var view = this.view.el;
         if (view.get_selection().count_selected_rows() < 1) {
@@ -65,9 +68,6 @@ public class Xcls_WindowLeftTree : Object
         view.get_selection().get_selected(out mod, out iter);
         return mod.get_path(iter).to_string();
     }
-    public          JsRender.JsRender getActiveFile () {
-        return this.model.file;
-    }
     public class Xcls_view : Object 
     {
         public Gtk.TreeView el;
@@ -172,6 +172,47 @@ public class Xcls_WindowLeftTree : Object
                  //   print("click:" + res.path.to_string());
                   return true;
             });
+            this.el.drag_begin.connect( ( ctx)  => {
+               //print('SOURCE: drag-begin');
+                    
+                    
+                    //this.targetData = "";
+                    
+                    // find what is selected in our tree...
+                    
+                    var s = _this.view.el.get_selection();
+                    if (s.count_selected_rows() < 1) {
+                        return;
+                    }
+                    Gtk.TreeIter iter;
+                    Gtk.TreeModel mod;
+                    s.get_selected(out mod, out iter);
+            
+                    
+            
+                    // set some properties of the tree for use by the dropped element.
+                    GLib.Value value;
+                    _this.model.el.get_value(iter, 2, out value);
+                    var data = (JsRender.Node)(value.dup_object());
+                    var xname = data.fqn();
+                     print ("XNAME  IS " + xname+ "\n");
+                    this.dragData = xname;
+                    this.dropList = _this.model.file.palete().getDropList(xname);
+                    
+                    print ("DROP LIST IS " + string.joinv(", ", this.dropList) + "\n");
+                    
+            
+                    // make the drag icon a picture of the node that was selected
+                    var path = _this.model.el.get_path(iter);
+            
+                    //this.treepath = path.to_string();
+                    
+                    var pix = this.el.create_row_drag_icon ( path);
+                    
+                    Gtk.drag_set_icon_surface (ctx, pix) ;
+                    
+                    return;
+            });
             this.el.cursor_changed.connect( ( ) => {
             
             
@@ -230,47 +271,6 @@ public class Xcls_WindowLeftTree : Object
                 return  ;
                             
             });
-            this.el.drag_begin.connect( ( ctx)  => {
-               //print('SOURCE: drag-begin');
-                    
-                    
-                    //this.targetData = "";
-                    
-                    // find what is selected in our tree...
-                    
-                    var s = _this.view.el.get_selection();
-                    if (s.count_selected_rows() < 1) {
-                        return;
-                    }
-                    Gtk.TreeIter iter;
-                    Gtk.TreeModel mod;
-                    s.get_selected(out mod, out iter);
-            
-                    
-            
-                    // set some properties of the tree for use by the dropped element.
-                    GLib.Value value;
-                    _this.model.el.get_value(iter, 2, out value);
-                    var data = (JsRender.Node)(value.dup_object());
-                    var xname = data.fqn();
-                     print ("XNAME  IS " + xname+ "\n");
-                    this.dragData = xname;
-                    this.dropList = _this.model.file.palete().getDropList(xname);
-                    
-                    print ("DROP LIST IS " + string.joinv(", ", this.dropList) + "\n");
-                    
-            
-                    // make the drag icon a picture of the node that was selected
-                    var path = _this.model.el.get_path(iter);
-            
-                    //this.treepath = path.to_string();
-                    
-                    var pix = this.el.create_row_drag_icon ( path);
-                    
-                    Gtk.drag_set_icon_surface (ctx, pix) ;
-                    
-                    return;
-            });
             this.el.drag_end.connect( (drag_context) => {
                //Seed.print('LEFT-TREE: drag-end');
                     this.dragData = "";
@@ -583,14 +583,7 @@ public class Xcls_WindowLeftTree : Object
         }
 
         // user defined functions 
-        public          void selectNode (string treepath_str) {
-            //this.selection.select_path(new  Gtk.TreePath.from_string( treepath_str));
-             var tp = new Gtk.TreePath.from_string(treepath_str);
-             
-             this.el.set_cursor(tp, null, false);  
-             this.el.scroll_to_cell(tp, null, false, 0,0);
-        }
-        public          void highlightDropPath ( string treepath, Gtk.TreeViewDropPosition pos) {
+        public           void highlightDropPath ( string treepath, Gtk.TreeViewDropPosition pos) {
         
                 // highlighting for drag/drop
                 if (treepath.length > 0) {
@@ -600,6 +593,13 @@ public class Xcls_WindowLeftTree : Object
                  }
                      
         }
+        public           void selectNode (string treepath_str) {
+            //this.selection.select_path(new  Gtk.TreePath.from_string( treepath_str));
+             var tp = new Gtk.TreePath.from_string(treepath_str);
+             
+             this.el.set_cursor(tp, null, false);  
+             this.el.scroll_to_cell(tp, null, false, 0,0);
+        }
     }
     public class Xcls_model : Object 
     {
@@ -631,157 +631,113 @@ public class Xcls_WindowLeftTree : Object
             print("model initialized");        }
 
         // user defined functions 
-        public          void dropNode (string target_data_str, JsRender.Node node, bool show_templates) {
-        //         print("drop Node");
-             // console.dump(node);
-          //    console.dump(target_data);
-          
-          
-                // 0 = before , 1=after 2/3 onto
-          
-          
-                var target_data= target_data_str.split("|");
-          
-                var parent_str = target_data[0].length > 0 ? target_data[0] : "";
-                var pos = target_data.length > 1 ? int.parse(target_data[1]) : 2; // ontop..
-          
-          
-                Gtk.TreePath tree_path  =   parent_str.length > 0 ? new  Gtk.TreePath.from_string( parent_str ) : null;
-                
-                
-                
-                //print("add " + tp + "@" + target_data[1]  );
-                
-                JsRender.Node parentNode = null;
-                
-                Gtk.TreeIter iter_after;
-                Gtk.TreeIter iter_par ;
-                
-               
-                 if (target_data.length == 3 && target_data[2].length > 0) {
-                    node.props.set("* prop", target_data[2]);
-                }
+        public           string findDropNode (string treepath_str, string[] targets) {
         
-                Gtk.TreePath expand_parent = null;
+            // this is used by the dragdrop code in the roo version AFAIR..
+        
+            //var path = treepath_str.replace(/^builder-/, '');
+            // treemap is depreciated... - should really check if model has any entries..
+        
+            if (this.el.iter_n_children(null) < 1) {
+                //print("NO KEYS");
+                return "|%d".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);
+            }
+            //print("FIND treepath: " + path);
+            //console.dump(this.treemap);
+            
+            //if (!treepath_str.match(/^builder-/)) {
+            //    return []; // nothing!
+            //}
+            if (targets.length > 0 && targets[0] == "*") {
+                return  treepath_str;
+            }
+            return this.findDropNodeByPath(treepath_str,targets, -1);
+        }
+        public           void loadFile (JsRender.JsRender f) {
+            //console.dump(f);
+            this.el.clear();
+            this.file = f;
+            
+            
+        //    if (!f) {
+        //        console.log('missing file');
+        //        return;
+        //    }
+            
+            // load the file if not loaded..
+            if (f.tree == null) {
+                f.loadItems( );
+            }
+            // if it's still null?
+            if (f.tree == null) {
+                return;
+            }
+            
+            /// this.get('/Window').setTitle(f.project.getName() + ' - ' + f.name);
+            
+            //if (f.items.length && typeof(f.items[0]) == 'string') {
+            
+                //this.get('/RightEditor').el.show();
+                //this.get('/RightEditor.view').load( f.items[0]);
+            //    return;
+            //}
+            //print("LOAD");
+            //print(JSON.stringify(f.items, null,4));
+            //console.dump(f.items);
+            var o = new Gee.ArrayList<JsRender.Node>();
+            o.add(f.tree);
+            this.load(o,null);
+            
+            _this.view.el.expand_all();
+        
+            if (f.tree.items.size < 1) {
+                // single item..
                 
-                // we only need to show the template if it's come from else where?
-                 if (show_templates) {
-                     var new_node = Xcls_DialogTemplateSelect.singleton().show( this.file.palete(), node);
-                     node = new_node;
-                }        
+                //this.get('/Window.leftvpaned').el.set_position(80);
+                // select first...
+                _this.view.el.set_cursor( 
+                    new  Gtk.TreePath.from_string("0"), null, false);
                 
-                 //print("pos is %d  \n".printf(pos));
                 
-                 Gtk.TreeIter n_iter; 
-                 
-                 if ( parent_str.length < 1) {
-                      this.el.append(out n_iter, null); // drop at top level..
-                      node.parent = null;
-                      this.file.tree = node;
-                      
-                      
-                } else   if (pos  < 2) {
-                    //print(target_data[1]  > 0 ? 'insert_after' : 'insert_before');
-                    
-                    this.el.get_iter(out iter_after, tree_path );            
-                    this.el.iter_parent(out iter_par, iter_after);
-                    expand_parent = this.el.get_path(iter_par);
-                    
-                    GLib.Value value;
-                    this.el.get_value( iter_par, 2, out value);
-                    parentNode =  (JsRender.Node)value.dup_object();
-                    
+            } else {
+                  //this.get('/Window.leftvpaned').el.set_position(200);
+            }
+            
+            return;
+            /*    
+            
+            //print("hide right editior");
+            //this.get('/RightEditor').el.hide();
+            //this.get('/Editor').el.hide();
+            //print("set current tree");
+            //this.currentTree = this.toJS(false, false)[0];
+            //console.dump(this.currentTree);
+            //this.currentTree = this.currentTree || { items: [] };
+            //_this.renderView();
+            //console.dump(this.map);
+            //var RightPalete     = imports.Builder.RightPalete.RightPalete;
+            
+            
+            var pm = this.get('/RightPalete.model');
+            // set up provider..
+            
+            this.get('/RightPalete').provider = this.get('/LeftTree').getPaleteProvider();
+            
+            if (!this.get('/RightPalete').provider) {
+                print ("********* PALETE PROVIDER MISSING?!!");
+            }
+            this.get('/LeftTree').renderView();
+            
+            pm.load( this.get('/LeftTree').getPaleteProvider().gatherList(this.listAllTypes()));
+            
+            
                     
-                    this.el.get_value( iter_after, 2, out value);
-                    var relNode =  (JsRender.Node)value.dup_object();
-                    
-                    if ( pos  > 0 ) {
-                     
-                        this.el.insert_after(out n_iter,    iter_par  , iter_after);
-                        var ix = parentNode.items.index_of(relNode);
-                        parentNode.items.insert(ix+1, node);
-                        
-                    } else {
-                        this.el.insert_before(out n_iter,  iter_par  , iter_after);
-                        var ix = parentNode.items.index_of(relNode);
-                        parentNode.items.insert(ix, node);
-         
-                    }
-                    node.parent = parentNode;
-                    
-                    
-                    
-                } else {
-                   //  print("appending to  " + parent_str);
-                    this.el.get_iter(out iter_par, tree_path);
-                    this.el.append(out n_iter,   iter_par );
-                    expand_parent = this.el.get_path(iter_par);
-                    
-                    GLib.Value value;
-                    this.el.get_value( iter_par, 2, out value);
-                    parentNode =  (JsRender.Node)value.dup_object();
-                    node.parent = parentNode;
-                    parentNode.items.add(node);
-                }
-                
-                // reparent node in tree...
-               
-                
-                // why only on no parent???
-                
-                //if (node.parent = null) {
-                     
-                   
-                    
-                //}
-                
-                
-                // work out what kind of packing to use.. -- should be in 
-                if (!node.has("pack")   && parent_str.length > 1) {
-                    
-                    this.file.palete().fillPack(node,parentNode);
-                    
-                    
-                }
-                
-                // add the node...
-                
-                this.el.set(n_iter, 0, node.nodeTitle(), 1, node.nodeTip(), -1  );
-                var o = new GLib.Value(typeof(Object));
-                o.set_object((Object)node);
-                
-                this.el.set_value(n_iter, 2, o);
-                
-                
-                
-                
-        // load children - if it has any..
-              
-                if (node.items.size > 0) {
-                    this.load(node.items, n_iter);
-                    _this.view.el.expand_row(this.el.get_path(n_iter), true);
-                } else if (expand_parent != null && !_this.view.el.is_row_expanded(expand_parent)) {
-                   _this.view.el.expand_row(expand_parent,true);
-                }
-        
-                //if (tp != null && (node.items.length() > 0 || pos > 1)) {
-                //    _this.view.el.expand_row(this.el.get_path(iter_par), true);
-               // }
-                // wee need to get the empty proptypes from somewhere..
-                
-                //var olditer = this.activeIter;
-                this.activePath = this.el.get_path(n_iter).to_string();
-        
-        
-                
-                
-                _this.view.el.set_cursor(this.el.get_path(n_iter), null, false);
-                _this.changed();
-             
-                
+            this.get('/Window.view-notebook').el.set_current_page(
+                this.get('/LeftTree.model').file.getType()== 'Roo' ? 0 : -1);
+                */
                     
         }
-        public   void updateSelected () {
+        public    void updateSelected () {
           
            
             var s = _this.view.el.get_selection();
@@ -803,78 +759,7 @@ public class Xcls_WindowLeftTree : Object
                         1, node.nodeTip(), -1
                 );
         }
-        public          void moveNode (string target_data, Gdk.DragAction action) 
-        {
-           
-           /// target_data = "path|pos");
-           
-           
-            //print("MOVE NODE");
-            // console.dump(target_data);
-            Gtk.TreeIter old_iter;
-            Gtk.TreeModel mod;
-            
-            var s = _this.view.el.get_selection();
-            s.get_selected(out mod , out old_iter);
-            mod.get_path(old_iter);
-            
-            var node = this.pathToNode(mod.get_path(old_iter).to_string());
-            //console.dump(node);
-            if (node == null) {
-                print("moveNode: ERROR - node is null?");
-            }
-            
-            
-        
-            // needs to drop first, otherwise the target_data 
-            // treepath will be invalid.
-        
-            
-            if ((action & Gdk.DragAction.MOVE) > 0) {
-                    print("REMOVING OLD NODE : " + target_data + "\n");
-                    node.remove();
-                    this.dropNode(target_data, node, false);
-                    this.el.remove(ref old_iter);
-                    
-                    
-                                 
-            } else {
-                print("DROPPING NODE // copy: " + target_data + "\n");
-                node = node.deepClone();
-                this.dropNode(target_data, node, false);
-            }
-            _this.changed();
-            this.activePath= "";
-            //this.updateNode(false,true);
-        }
-        public          void load (Gee.ArrayList<JsRender.Node> tr, Gtk.TreeIter? iter) 
-        {
-            Gtk.TreeIter citer;
-            //this.insert(citer,iter,0);
-            for(var i =0 ; i < tr.size; i++) {
-                if (iter != null) {
-                    this.el.insert(out citer,iter,-1); // why not append?
-                } else {
-                    this.el.append(out citer,null);
-                }
-                
-                this.el.set(citer, 0, tr.get(i).nodeTitle(),
-                        1, tr.get(i).nodeTip(), -1
-                );
-                var o = new GLib.Value(typeof(Object));
-                o.set_object((Object)tr.get(i));
-                
-                this.el.set_value(citer, 2, o);
-                
-                if (tr.get(i).items.size > 0) {
-                    this.load(tr.get(i).items, citer);
-                }
-             
-            }
-        
-            
-        }
-        public          string findDropNodeByPath (string treepath_str, string[] targets, int in_pref = -1) {
+        public           string findDropNodeByPath (string treepath_str, string[] targets, int in_pref = -1) {
         
             var path = treepath_str; // dupe it..
             
@@ -948,113 +833,78 @@ public class Xcls_WindowLeftTree : Object
             return "";
                     
         }
-        public          string findDropNode (string treepath_str, string[] targets) {
-        
-            // this is used by the dragdrop code in the roo version AFAIR..
-        
-            //var path = treepath_str.replace(/^builder-/, '');
-            // treemap is depreciated... - should really check if model has any entries..
-        
-            if (this.el.iter_n_children(null) < 1) {
-                //print("NO KEYS");
-                return "|%d".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);
-            }
-            //print("FIND treepath: " + path);
-            //console.dump(this.treemap);
-            
-            //if (!treepath_str.match(/^builder-/)) {
-            //    return []; // nothing!
-            //}
-            if (targets.length > 0 && targets[0] == "*") {
-                return  treepath_str;
-            }
-            return this.findDropNodeByPath(treepath_str,targets, -1);
-        }
-        public          void loadFile (JsRender.JsRender f) {
-            //console.dump(f);
-            this.el.clear();
-            this.file = f;
-            
+        public           void moveNode (string target_data, Gdk.DragAction action) 
+        {
+           
+           /// target_data = "path|pos");
+           
+           
+            //print("MOVE NODE");
+            // console.dump(target_data);
+            Gtk.TreeIter old_iter;
+            Gtk.TreeModel mod;
             
-        //    if (!f) {
-        //        console.log('missing file');
-        //        return;
-        //    }
+            var s = _this.view.el.get_selection();
+            s.get_selected(out mod , out old_iter);
+            mod.get_path(old_iter);
             
-            // load the file if not loaded..
-            if (f.tree == null) {
-                f.loadItems( );
-            }
-            // if it's still null?
-            if (f.tree == null) {
-                return;
+            var node = this.pathToNode(mod.get_path(old_iter).to_string());
+            //console.dump(node);
+            if (node == null) {
+                print("moveNode: ERROR - node is null?");
             }
             
-            /// this.get('/Window').setTitle(f.project.getName() + ' - ' + f.name);
-            
-            //if (f.items.length && typeof(f.items[0]) == 'string') {
             
-                //this.get('/RightEditor').el.show();
-                //this.get('/RightEditor.view').load( f.items[0]);
-            //    return;
-            //}
-            //print("LOAD");
-            //print(JSON.stringify(f.items, null,4));
-            //console.dump(f.items);
-            var o = new Gee.ArrayList<JsRender.Node>();
-            o.add(f.tree);
-            this.load(o,null);
-            
-            _this.view.el.expand_all();
         
-            if (f.tree.items.size < 1) {
-                // single item..
+            // needs to drop first, otherwise the target_data 
+            // treepath will be invalid.
+        
+            
+            if ((action & Gdk.DragAction.MOVE) > 0) {
+                    print("REMOVING OLD NODE : " + target_data + "\n");
+                    node.remove();
+                    this.dropNode(target_data, node, false);
+                    this.el.remove(ref old_iter);
+                    
+                    
+                                 
+            } else {
+                print("DROPPING NODE // copy: " + target_data + "\n");
+                node = node.deepClone();
+                this.dropNode(target_data, node, false);
+            }
+            _this.changed();
+            this.activePath= "";
+            //this.updateNode(false,true);
+        }
+        public           void load (Gee.ArrayList<JsRender.Node> tr, Gtk.TreeIter? iter) 
+        {
+            Gtk.TreeIter citer;
+            //this.insert(citer,iter,0);
+            for(var i =0 ; i < tr.size; i++) {
+                if (iter != null) {
+                    this.el.insert(out citer,iter,-1); // why not append?
+                } else {
+                    this.el.append(out citer,null);
+                }
                 
-                //this.get('/Window.leftvpaned').el.set_position(80);
-                // select first...
-                _this.view.el.set_cursor( 
-                    new  Gtk.TreePath.from_string("0"), null, false);
+                this.el.set(citer, 0, tr.get(i).nodeTitle(),
+                        1, tr.get(i).nodeTip(), -1
+                );
+                var o = new GLib.Value(typeof(Object));
+                o.set_object((Object)tr.get(i));
                 
+                this.el.set_value(citer, 2, o);
                 
-            } else {
-                  //this.get('/Window.leftvpaned').el.set_position(200);
-            }
-            
-            return;
-            /*    
-            
-            //print("hide right editior");
-            //this.get('/RightEditor').el.hide();
-            //this.get('/Editor').el.hide();
-            //print("set current tree");
-            //this.currentTree = this.toJS(false, false)[0];
-            //console.dump(this.currentTree);
-            //this.currentTree = this.currentTree || { items: [] };
-            //_this.renderView();
-            //console.dump(this.map);
-            //var RightPalete     = imports.Builder.RightPalete.RightPalete;
-            
-            
-            var pm = this.get('/RightPalete.model');
-            // set up provider..
-            
-            this.get('/RightPalete').provider = this.get('/LeftTree').getPaleteProvider();
-            
-            if (!this.get('/RightPalete').provider) {
-                print ("********* PALETE PROVIDER MISSING?!!");
+                if (tr.get(i).items.size > 0) {
+                    this.load(tr.get(i).items, citer);
+                }
+             
             }
-            this.get('/LeftTree').renderView();
-            
-            pm.load( this.get('/LeftTree').getPaleteProvider().gatherList(this.listAllTypes()));
-            
+        
             
-                    
-            this.get('/Window.view-notebook').el.set_current_page(
-                this.get('/LeftTree.model').file.getType()== 'Roo' ? 0 : -1);
-                */
-                    
         }
-        public          void deleteSelected () {
+        public           void deleteSelected () {
             
             print("DELETE SELECTED?");
             //_this.view.blockChanges = true;
@@ -1104,7 +954,7 @@ public class Xcls_WindowLeftTree : Object
             
             _this.view.blockChanges = false;
         }
-        public          JsRender.Node pathToNode (string path) {
+        public           JsRender.Node pathToNode (string path) {
          
              
              Gtk.TreeIter   iter;
@@ -1115,6 +965,158 @@ public class Xcls_WindowLeftTree : Object
              
              return (JsRender.Node)value.dup_object();
         
+        }
+        public           void dropNode (string target_data_str, JsRender.Node node, bool show_templates) {
+        //         print("drop Node");
+             // console.dump(node);
+          //    console.dump(target_data);
+          
+          
+                // 0 = before , 1=after 2/3 onto
+          
+          
+                var target_data= target_data_str.split("|");
+          
+                var parent_str = target_data[0].length > 0 ? target_data[0] : "";
+                var pos = target_data.length > 1 ? int.parse(target_data[1]) : 2; // ontop..
+          
+          
+                Gtk.TreePath tree_path  =   parent_str.length > 0 ? new  Gtk.TreePath.from_string( parent_str ) : null;
+                
+                
+                
+                //print("add " + tp + "@" + target_data[1]  );
+                
+                JsRender.Node parentNode = null;
+                
+                Gtk.TreeIter iter_after;
+                Gtk.TreeIter iter_par ;
+                
+               
+                 if (target_data.length == 3 && target_data[2].length > 0) {
+                    node.props.set("* prop", target_data[2]);
+                }
+        
+                Gtk.TreePath expand_parent = null;
+                
+                // we only need to show the template if it's come from else where?
+                 if (show_templates) {
+                     var new_node = Xcls_DialogTemplateSelect.singleton().show( this.file.palete(), node);
+                     if (new_node != null) {
+                         node = new_node;
+                     }
+                }        
+                
+                 //print("pos is %d  \n".printf(pos));
+                
+                 Gtk.TreeIter n_iter; 
+                 
+                 if ( parent_str.length < 1) {
+                      this.el.append(out n_iter, null); // drop at top level..
+                      node.parent = null;
+                      this.file.tree = node;
+                      
+                      
+                } else   if (pos  < 2) {
+                    //print(target_data[1]  > 0 ? 'insert_after' : 'insert_before');
+                    
+                    this.el.get_iter(out iter_after, tree_path );            
+                    this.el.iter_parent(out iter_par, iter_after);
+                    expand_parent = this.el.get_path(iter_par);
+                    
+                    GLib.Value value;
+                    this.el.get_value( iter_par, 2, out value);
+                    parentNode =  (JsRender.Node)value.dup_object();
+                    
+                    
+                    this.el.get_value( iter_after, 2, out value);
+                    var relNode =  (JsRender.Node)value.dup_object();
+                    
+                    if ( pos  > 0 ) {
+                     
+                        this.el.insert_after(out n_iter,    iter_par  , iter_after);
+                        var ix = parentNode.items.index_of(relNode);
+                        parentNode.items.insert(ix+1, node);
+                        
+                    } else {
+                        this.el.insert_before(out n_iter,  iter_par  , iter_after);
+                        var ix = parentNode.items.index_of(relNode);
+                        parentNode.items.insert(ix, node);
+         
+                    }
+                    node.parent = parentNode;
+                    
+                    
+                    
+                } else {
+                   //  print("appending to  " + parent_str);
+                    this.el.get_iter(out iter_par, tree_path);
+                    this.el.append(out n_iter,   iter_par );
+                    expand_parent = this.el.get_path(iter_par);
+                    
+                    GLib.Value value;
+                    this.el.get_value( iter_par, 2, out value);
+                    parentNode =  (JsRender.Node)value.dup_object();
+                    node.parent = parentNode;
+                    parentNode.items.add(node);
+                }
+                
+                // reparent node in tree...
+               
+                
+                // why only on no parent???
+                
+                //if (node.parent = null) {
+                     
+                   
+                    
+                //}
+                
+                
+                // work out what kind of packing to use.. -- should be in 
+                if (!node.has("pack")   && parent_str.length > 1) {
+                    
+                    this.file.palete().fillPack(node,parentNode);
+                    
+                    
+                }
+                
+                // add the node...
+                
+                this.el.set(n_iter, 0, node.nodeTitle(), 1, node.nodeTip(), -1  );
+                var o = new GLib.Value(typeof(Object));
+                o.set_object((Object)node);
+                
+                this.el.set_value(n_iter, 2, o);
+                
+                
+                
+                
+        // load children - if it has any..
+              
+                if (node.items.size > 0) {
+                    this.load(node.items, n_iter);
+                    _this.view.el.expand_row(this.el.get_path(n_iter), true);
+                } else if (expand_parent != null && !_this.view.el.is_row_expanded(expand_parent)) {
+                   _this.view.el.expand_row(expand_parent,true);
+                }
+        
+                //if (tp != null && (node.items.length() > 0 || pos > 1)) {
+                //    _this.view.el.expand_row(this.el.get_path(iter_par), true);
+               // }
+                // wee need to get the empty proptypes from somewhere..
+                
+                //var olditer = this.activeIter;
+                this.activePath = this.el.get_path(n_iter).to_string();
+        
+        
+                
+                
+                _this.view.el.set_cursor(this.el.get_path(n_iter), null, false);
+                _this.changed();
+             
+                
+                    
         }
     }
     public class Xcls_TreeViewColumn4 : Object