Fix #8032 - speed up add remove of errors from tree
[roobuilder] / src / Builder4 / WindowLeftProps.bjs
index 26bbea5..7df8fe4 100644 (file)
@@ -1,7 +1,9 @@
 {
  "build_module" : "builder",
+ "gen_extended" : false,
  "items" : [
   {
+   "# Gee.ArrayList<Gtk.Widget>? error_widgets" : "null",
    "# JsRender.JsRender file" : "",
    "# JsRender.Node node" : "",
    "# Xcls_MainWindow main_window" : "null",
    "@ void show_add_props" : "(string type)",
    "@ void show_editor" : "(JsRender.JsRender file, JsRender.Node node, JsRender.NodeProp prop)",
    "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
+   "bool hexpand" : true,
+   "bool loading" : false,
+   "bool vexpand" : true,
    "id" : "LeftProps",
+   "int last_error_counter" : "-1",
    "items" : [
     {
      "$ xns" : "Gtk",
-     "* pack" : "pack_start,false,true,0",
      "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL",
+     "bool hexpand" : true,
      "items" : [
       {
        "$ xns" : "Gtk",
-       "* pack" : "add",
        "int margin_end" : 5,
        "int margin_start" : 5,
        "string label" : "Add:",
       {
        "$ tooltip_text" : "\"Add Property\"",
        "$ xns" : "Gtk",
-       "* pack" : "add",
        "bool always_show_image" : true,
        "bool hexpand" : true,
-       "items" : [
-        {
-         "$ xns" : "Gtk",
-         "* pack" : "set_image",
-         "utf8 icon_name" : "format-justify-left",
-         "xtype" : "Image"
-        }
-       ],
        "listeners" : {
         "clicked" : [
          "  ( ) => {",
          "}"
         ]
        },
+       "string icon_name" : "format-justify-left",
        "string label" : "Property",
        "xtype" : "Button"
       },
       {
        "$ tooltip_text" : "\"Add Event Code\"",
        "$ xns" : "Gtk",
-       "* pack" : "add",
        "bool always_show_image" : true,
        "bool hexpand" : true,
-       "items" : [
-        {
-         "$ xns" : "Gtk",
-         "* pack" : "set_image",
-         "utf8 icon_name" : "appointment-new",
-         "xtype" : "Image"
-        }
-       ],
        "listeners" : {
         "clicked" : [
          "  ( ) => {",
          "}"
         ]
        },
+       "string icon_name" : "appointment-new",
        "string label" : "Event",
        "xtype" : "Button"
       },
       {
        "$ xns" : "Gtk",
-       "* pack" : "add",
-       "bool always_show_image" : true,
-       "bool hexpand" : true,
        "items" : [
         {
          "$ xns" : "Gtk",
-         "* pack" : false,
-         "id" : "AddPropertyPopup",
+         "* prop" : "popover",
+         "id" : "addpop",
          "items" : [
           {
            "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "id: _this.{ID} (Vala)",
-           "listeners" : {
-            "activate" : [
-             " ()  => {",
-             " \t// is this userdef or special??",
-             "    _this.addProp( new JsRender.NodeProp.prop(\"id\") );",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Using _this.{ID} will map to this element",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "pack: Pack method (Vala)",
-           "listeners" : {
-            "activate" : [
-             "  ( ) => {",
-             "// is this userdef?",
-             "    _this.addProp( new JsRender.NodeProp.special(\"pack\", \"add\") );",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "how to pack this element onto parent, (method, 2nd arg, 3rd arg) .. the 1st argument is filled by the element",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "ctor: Alterative to default contructor (Vala)",
-           "listeners" : {
-            "activate" : [
-             "  ( ) => {",
-             "",
-             "      _this.addProp( new JsRender.NodeProp.special(\"ctor\") );",
-             "}"
-            ]
-           },
-           "tooltip_markup" : [
-            "eg. ",
-            "",
-            "new Clutter.Image.from_file(.....)"
-           ],
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "init: initialziation code (vala)",
-           "listeners" : {
-            "activate" : [
-             "  ( ) => {",
-             "      _this.addProp( new JsRender.NodeProp.special(\"init\",\"{\\n\\n}\\n\" ) );",
-             "",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "This code is called after the ctor",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "cms-id: (Roo JS/Pman library)",
-           "listeners" : {
-            "activate" : [
-             " ()  => {",
-             " ",
-             "    _this.addProp( new JsRender.NodeProp.prop(\"cms-id\",\"string\", \"\" ) );",
-             "",
-             " ",
-             "    ",
-             "}"
-            ]
-           },
-           "tooltip_markup" : [
-            "set the cms-id for this element, when converted to javascript, the html value will be wrapped with Pman.Cms.content({cms-id},{original-html})",
-            ""
+           "* prop" : "child",
+           "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
+           "int spacing" : 0,
+           "items" : [
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "id: _this.{ID} (Vala)",
+               "string tooltip_text" : "Using _this.{ID} will map to this element",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               " ()  => {",
+               " \t_this.addpop.el.hide();",
+               " \t// is this userdef or special??",
+               " \tvar add = new JsRender.NodeProp.prop(\"id\");",
+               " \tif (_this.node.has_prop_key(add)) {",
+               "\t \treturn;",
+               " \t}",
+               " \t",
+               " \t_this.node.add_prop( add );",
+               " \t",
+               " \t_this.view.editProp( add );",
+               " \t",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "pack: Pack method (Vala)",
+               "string tooltip_text" : "how to pack this element onto parent, (method, 2nd arg, 3rd arg) .. the 1st argument is filled by the element",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) => {",
+               " ",
+               "",
+               "  \t_this.addpop.el.hide();",
+               " \t// is this userdef or special??",
+               " \tvar add = new JsRender.NodeProp.special(\"pack\", \"add\");",
+               " \tif (_this.node.has_prop_key(add)) {",
+               "\t \treturn;",
+               " \t}",
+               " \t",
+               " \t_this.node.add_prop( add );",
+               " \t",
+               " \t_this.view.editProp( add );",
+               " \t",
+               "",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "ctor: Alterative to default contructor (Vala)",
+               "string tooltip_text" : [
+                "eg. ",
+                "",
+                "new Clutter.Image.from_file(.....)"
+               ],
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) => {",
+               "   ",
+               "  \t_this.addpop.el.hide();",
+               " \t// is this userdef or special??",
+               " \tvar add = new JsRender.NodeProp.special(\"ctor\");",
+               " \tif (_this.node.has_prop_key(add)) {",
+               "\t \treturn;",
+               " \t}",
+               " \t",
+               " \t_this.node.add_prop( add );",
+               " \t",
+               " \t_this.view.editProp( add );",
+               " \t",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "init: initialziation code (vala)",
+               "string tooltip_text" : "This code is called after the ctor",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) => {",
+               "    ",
+               "  \t_this.addpop.el.hide();",
+               " \t// is this userdef or special??",
+               " \tvar add =  new JsRender.NodeProp.special(\"init\",\"{\\n\\n}\\n\" ) ;",
+               " \tif (_this.node.has_prop_key(add)) {",
+               "\t \treturn;",
+               " \t}",
+               " \t",
+               " \t_this.node.add_prop( add );",
+               " \t",
+               " \t_this.view.editProp( add );",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "cms-id: (Roo JS/Pman library)",
+               "string tooltip_text" : [
+                "set the cms-id for this element, when converted to javascript, the html value will be wrapped with Pman.Cms.content({cms-id},{original-html})",
+                ""
+               ],
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               " ()  => {",
+               "    \t_this.addpop.el.hide();",
+               " ",
+               " \t// is this userdef or special??",
+               " \tvar add =   new JsRender.NodeProp.prop(\"cms-id\",\"string\", \"\" ) ;",
+               " \tif (_this.node.has_prop_key(add)) {",
+               "\t \treturn;",
+               " \t}",
+               " \t",
+               " \t_this.node.add_prop( add );",
+               " \t",
+               " \t_this.view.editProp( add );",
+               "    ",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL",
+             "$ xns" : "Gtk",
+             "xtype" : "Separator"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "String",
+               "string tooltip_text" : "Add a user defined string property",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "(self) => {",
+               "  \t_this.addpop.el.hide();",
+               "\t_this.view.popover.show(",
+               "\t\t_this.view.el, ",
+               "\t\t_this.node, ",
+               "\t\t new JsRender.NodeProp.user(\"\", \"string\", \"\") ,",
+               "\t\t-1,  ",
+               "\t\ttrue",
+               "\t);",
+               " ",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "Number",
+               "string tooltip_text" : "Add a user defined number property",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) =>{",
+               " ",
+               "       \t_this.addpop.el.hide();",
+               "       _this.view.popover.show(",
+               "\t\t_this.view.el, ",
+               "\t\t_this.node, ",
+               "\t\t new JsRender.NodeProp.user(\"\", \"int\", \"0\") ,",
+               "\t\t-1,  ",
+               "\t\ttrue",
+               "\t);",
+               " ",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "Boolean",
+               "string tooltip_text" : "Add a user defined boolean property",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) =>{",
+               "  ",
+               "  \t_this.addpop.el.hide();",
+               "   _this.view.popover.show(",
+               "\t\t_this.view.el, ",
+               "\t\t_this.node, ",
+               "\t\t new JsRender.NodeProp.user(\"\", \"bool\", \"true\") ,",
+               "\t\t-1,  ",
+               "\t\ttrue",
+               "\t); ",
+               " ",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL",
+             "$ xns" : "Gtk",
+             "xtype" : "Separator"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "Javascript Function",
+               "string tooltip_text" : "Add a javascript  function",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) =>{",
+               "  \t_this.addpop.el.hide();",
+               "   _this.view.popover.show(",
+               "\t\t_this.view.el, ",
+               "\t\t_this.node, ",
+               "\t\t new JsRender.NodeProp.jsmethod(\"\") ,",
+               "\t\t-1,  ",
+               "\t\ttrue",
+               "\t);",
+               "",
+               " ",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "Vala Method",
+               "string tooltip_text" : "Add a user defined method to a object",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) =>{",
+               "  \t_this.addpop.el.hide();",
+               "    _this.view.popover.show(",
+               "\t\t_this.view.el, ",
+               "\t\t_this.node, ",
+               "\t\t new JsRender.NodeProp.valamethod(\"\") ,",
+               "\t\t-1,  ",
+               "\t\ttrue",
+               "\t); ",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "Vala Signal",
+               "string tooltip_text" : "Add a user defined signal to a object",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) =>{",
+               " \t_this.addpop.el.hide(); ",
+               "  _this.view.popover.show(",
+               "\t\t_this.view.el, ",
+               "\t\t_this.node, ",
+               "\t\t new JsRender.NodeProp.sig(\"\" ) ,",
+               "\t\t-1,  ",
+               "\t\ttrue",
+               "\t);    ",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL",
+             "$ xns" : "Gtk",
+             "xtype" : "Separator"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "Flexy - If",
+               "string tooltip_text" : "Add a flexy if (for HTML templates)",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) =>{",
+               "  \t_this.addpop.el.hide();",
+               " \t_this.view.popover.show(",
+               "\t\t_this.view.el, ",
+               "\t\t_this.node, ",
+               "\t\t new JsRender.NodeProp.prop(\"flexy:if\", \"string\", \"value_or_condition\") ,",
+               "\t\t-1,  ",
+               "\t\ttrue",
+               "\t);",
+               "",
+               "",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "Flexy - Include",
+               "string tooltip_text" : "Add a flexy include (for HTML templates)",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) =>{",
+               "  \t_this.addpop.el.hide();",
+               " \t_this.view.popover.show(",
+               "\t\t_this.view.el, ",
+               "\t\t_this.node, ",
+               "\t\t new JsRender.NodeProp.prop(\"flexy:include\", \"string\", \"name_of_file.html\") ,",
+               "\t\t-1,  ",
+               "\t\ttrue",
+               "\t);",
+               "",
+               "  ",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            },
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "Flexy - Foreach",
+               "string tooltip_text" : "Add a flexy foreach (for HTML templates)",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "  ( ) =>{",
+               "  \t_this.addpop.el.hide();",
+               " \t_this.view.popover.show(",
+               "\t\t_this.view.el, ",
+               "\t\t_this.node, ",
+               "\t\t new JsRender.NodeProp.prop(\"flexy:if\", \"string\", \"value_or_condition\") ,",
+               "\t\t-1,  ",
+               "\t\ttrue",
+               "\t);",
+               "  ",
+               "}"
+              ]
+             },
+             "tooltip_markup" : "Add a flexy include (for HTML templates)",
+             "xtype" : "Button"
+            }
            ],
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "add",
-           "xtype" : "SeparatorMenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "String",
-           "listeners" : {
-            "activate" : [
-             "(self) => {",
-             "",
-             "\t_this.view.popover.show(",
-             "\t\t_this.view.el, ",
-             "\t\t_this.node, ",
-             "\t\t new JsRender.NodeProp.prop(\"\", \"string\", \"\") ,",
-             "\t\t-1,  ",
-             "\t\ttrue",
-             "\t);",
-             "",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Add a user defined string property",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "Number",
-           "listeners" : {
-            "activate" : [
-             "  ( ) =>{",
-             "  _this.view.popover.show(",
-             "\t\t_this.view.el, ",
-             "\t\t_this.node, ",
-             "\t\t new JsRender.NodeProp.prop(\"\", \"int\", \"0\") ,",
-             "\t\t-1,  ",
-             "\t\ttrue",
-             "\t);",
-             " ",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Add a user defined number property",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "Boolean",
-           "listeners" : {
-            "activate" : [
-             "  ( ) =>{",
-             "  ",
-             "  \t",
-             "   _this.view.popover.show(",
-             "\t\t_this.view.el, ",
-             "\t\t_this.node, ",
-             "\t\t new JsRender.NodeProp.prop(\"\", \"bool\", \"true\") ,",
-             "\t\t-1,  ",
-             "\t\ttrue",
-             "\t); ",
-             " ",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Add a user defined boolean property",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "add",
-           "xtype" : "SeparatorMenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "Javascript Function",
-           "listeners" : {
-            "activate" : [
-             "  ( ) =>{",
-             "   ",
-             "   _this.view.popover.show(",
-             "\t\t_this.view.el, ",
-             "\t\t_this.node, ",
-             "\t\t new JsRender.NodeProp.jsmethod(\"\") ,",
-             "\t\t-1,  ",
-             "\t\ttrue",
-             "\t);",
-             "   ",
-             " ",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Add a user function boolean property",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "Vala Method",
-           "listeners" : {
-            "activate" : [
-             "  ( ) =>{",
-             "",
-             "    _this.view.popover.show(",
-             "\t\t_this.view.el, ",
-             "\t\t_this.node, ",
-             "\t\t new JsRender.NodeProp.valamethod(\"\") ,",
-             "\t\t-1,  ",
-             "\t\ttrue",
-             "\t); ",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Add a user function boolean property",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "Vala Signal",
-           "listeners" : {
-            "activate" : [
-             "  ( ) =>{",
-             "  _this.view.popover.show(",
-             "\t\t_this.view.el, ",
-             "\t\t_this.node, ",
-             "\t\t new JsRender.NodeProp.sig(\"\" ) ,",
-             "\t\t-1,  ",
-             "\t\ttrue",
-             "\t);    ",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Add a vala signal",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "add",
-           "xtype" : "SeparatorMenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "Flexy - If",
-           "listeners" : {
-            "activate" : [
-             "  ( ) =>{",
-             " \t_this.view.popover.show(",
-             "\t\t_this.view.el, ",
-             "\t\t_this.node, ",
-             "\t\t new JsRender.NodeProp.prop(\"flexy:if\", \"string\", \"value_or_condition\") ,",
-             "\t\t-1,  ",
-             "\t\ttrue",
-             "\t);",
-             "",
-             "",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Add a flexy if (for HTML templates)",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "Flexy - Include",
-           "listeners" : {
-            "activate" : [
-             "  ( ) =>{",
-             " \t_this.view.popover.show(",
-             "\t\t_this.view.el, ",
-             "\t\t_this.node, ",
-             "\t\t new JsRender.NodeProp.prop(\"flexy:include\", \"string\", \"name_of_file.html\") ,",
-             "\t\t-1,  ",
-             "\t\ttrue",
-             "\t);",
-             "",
-             "  ",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Add a flexy include (for HTML templates)",
-           "xtype" : "MenuItem"
-          },
-          {
-           "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "Flexy - Foreach",
-           "listeners" : {
-            "activate" : [
-             "  ( ) =>{",
-             "  ",
-             "   \t_this.view.popover.show(",
-             "\t\t_this.view.el, ",
-             "\t\t_this.node, ",
-             "\t\t new JsRender.NodeProp.prop(\"flexy:foreach\", \"string\", \"array,key,value\") ,",
-             "\t\t-1,  ",
-             "\t\ttrue",
-             "\t);",
-             "",
-             "    ",
-             "}"
-            ]
-           },
-           "tooltip_markup" : "Add a flexy foreach (for HTML templates)",
-           "xtype" : "MenuItem"
+           "xtype" : "Box"
           }
          ],
-         "xtype" : "Menu"
-        },
-        {
-         "$ Gtk.Stock stock" : "Gtk.Stock.ADD",
-         "$ icon_size" : "Gtk.IconSize.MENU",
-         "$ xns" : "Gtk",
-         "* pack" : "set_image",
-         "xtype" : "Image"
+         "xtype" : "Popover"
         }
        ],
-       "listeners" : {
-        "button_press_event" : [
-         "  (self, ev) => {",
-         "    _this.before_edit();",
-         "    ",
-         "        ",
-         "    var p = _this.AddPropertyPopup;",
-         "    p.el.set_screen(Gdk.Screen.get_default());",
-         "    p.el.show_all();",
-         "     p.el.popup(null, null, null, ev.button, ev.time);",
-         "     return true;",
-         "}"
-        ]
-       },
        "string label" : "Other",
-       "xtype" : "Button"
+       "xtype" : "MenuButton"
       }
      ],
      "xtype" : "Box"
       "}",
       ""
      ],
-     "* pack" : "pack_end,true,true,0",
+     "bool hexpand" : true,
+     "bool vexpand" : true,
      "id" : "EditProps",
      "items" : [
       {
+       "# Xcls_PopoverProperty popover" : "null",
        "$ enable_tree_lines" : true,
        "$ headers_visible" : true,
        "$ xns" : "Gtk",
-       "* init" : [
-        "{",
-        "    var selection = this.el.get_selection();",
-        "    selection.set_mode( Gtk.SelectionMode.SINGLE);",
-        "",
-        "",
-        "    var description = new Pango.FontDescription();",
-        "    description.set_size(10000);",
-        "    this.el.override_font(description);",
-        "    ",
-        "}",
-        ""
-       ],
-       "* pack" : "add",
-       "Xcls_PopoverProperty popover" : "null",
+       "* pack" : "set_child",
+       "bool hexpand" : true,
+       "bool show_row_separators" : true,
+       "bool single_click_activate" : false,
+       "bool vexpand" : true,
        "id" : "view",
        "items" : [
         {
-         "$ changed" : [
-          "function(str, doRefresh) {",
-          "    if (!this.activePath) {",
-          "        return;",
-          "    }",
-          "    var iter = new Gtk.TreeIter();",
-          "    ",
-          "    _this.setTreeIter(prop);",
-          "    this.el.get_iter(iter, new Gtk.TreePath.from_string(this.activePath));",
-          "    ",
-          "    this.el.set_value(iter, 1, '' +str);",
-          "    this.el.set_value(iter, 3, '' + this.toShort(str));",
-          "    var type = this.getIterValue(iter, 4);",
+         "$ xns" : "Gtk",
+         "* pack" : false,
+         "id" : "deletemenu",
+         "items" : [
+          {
+           "$ xns" : "Gtk",
+           "* prop" : "child",
+           "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
+           "int spacing" : 0,
+           "items" : [
+            {
+             "$ xns" : "Gtk",
+             "bool has_frame" : false,
+             "items" : [
+              {
+               "$ xns" : "Gtk",
+               "* prop" : "child",
+               "Gtk.Align halign" : "Gtk.Align.START",
+               "string label" : "Delete Property / Method",
+               "xtype" : "Label"
+              }
+             ],
+             "listeners" : {
+              "clicked" : [
+               "( ) => {",
+               "\t",
+               "",
+               "\tvar n = (JsRender.NodeProp) _this.selmodel.el.selected_item;",
+               "",
+               "\t_this.deletemenu.el.hide();",
+               "\t_this.node.remove_prop(n);",
+               "}",
+               ""
+              ]
+             },
+             "string label" : "Delete",
+             "xtype" : "Button"
+            }
+           ],
+           "xtype" : "Box"
+          }
+         ],
+         "xtype" : "Popover"
+        },
+        {
+         "$ xns" : "Gtk",
+         "listeners" : {
+          "pressed" : [
+           "(n_press, in_x, in_y) => {",
+           "",
+           "\tGLib.debug(\"Prssed %d\", (int)  this.el.get_current_button());",
+           "\t",
+           "\tvar col = _this.view.getColAt(in_x, in_y);",
+           "\tif (col != 0) {",
+           "\t\treturn;",
+           "\t}",
+           "\tstring pos;",
+           "\tvar row = _this.view.getRowAt(in_x, in_y, out pos);",
+           "\t",
+           "\tif (row < 0) {",
+           "\t\treturn;",
+           "",
+           "\t}",
+           "\tGLib.debug(\"hit row %d\", row);",
+           "\tvar prop = _this.selmodel.getPropAt(row);",
+           "\t_this.selmodel.selectProp(prop);",
+           "",
+           "\t//var point_at = _this.view.getWidgetAtRow(row);",
+           "\t",
+           "\t    \t// need to shift down, as ev.y does not inclucde header apparently..",
+           "     \t// or popover might be trying to do a central?",
+           "//\t _this.view.editPropertyDetails(prop, (int) in_y + 12); ",
+           "  \t _this.stop_editor();",
+           "     _this.view.popover.show(",
+           " \t\t\t_this.view.el, ",
+           " \t\t\t_this.node, prop,  ",
+           "\t\t (int)in_y);",
+           "    ",
+           "    ",
+           "      ",
+           "}",
+           ""
+          ]
+         },
+         "xtype" : "GestureClick"
+        },
+        {
+         "$ xns" : "Gtk",
+         "listeners" : {
+          "pressed" : [
+           "(n_press, in_x, in_y) => {",
+           "",
+           "\t",
+           "\t ",
+           "\tstring pos;",
+           "\tvar row = _this.view.getRowAt(in_x, in_y, out pos);",
+           "\t",
+           "\tif (row < 0) {",
+           "\t\treturn;",
+           "",
+           "\t}",
+           "\t",
+           "\t_this.stop_editor();",
+           "\tGLib.debug(\"hit row %d\", row);",
+           "\tvar prop = _this.selmodel.getPropAt(row);",
+           "\t_this.selmodel.selectProp(prop);",
+           "\t",
+           "\t",
+           "\t",
+           "\tGLib.debug(\"Prssed %d\", (int)  this.el.get_current_button());",
+           "\t//_this.deletemenu.el.set_parent(_this.view.el);",
+           "\tif (_this.deletemenu.el.parent == null) {",
+           "\t\t_this.deletemenu.el.set_parent(_this.main_window.el);",
+           "\t}",
+           "\t",
+           "\t",
+           "\t ",
+           "\t_this.deletemenu.el.set_offset(",
+           "\t\t\t(int)in_x  - _this.view.el.get_width() ,",
+           "\t\t\t(int)in_y - _this.view.el.get_height()",
+           "\t\t);",
+           "\t_this.deletemenu.el.set_position(Gtk.PositionType.BOTTOM); ",
+           "    _this.deletemenu.el.popup();",
+           "      ",
+           "}",
+           ""
+          ]
+         },
+         "uint button" : 3,
+         "xtype" : "GestureClick"
+        },
+        {
+         "$ xns" : "Gtk",
+         "* prop" : "model",
+         "bool can_unselect" : true,
+         "id" : "selmodel",
+         "items" : [
+          {
+           "$ xns" : "GLib",
+           "* ctor" : "new GLib.ListStore(typeof(JsRender.NodeProp))",
+           "* prop" : "model",
+           "id" : "model",
+           "xtype" : "ListStore"
+          }
+         ],
+         "xtype" : "SingleSelection",
+         "| JsRender.NodeProp getPropAt" : [
+          "(uint row) {",
           "",
-          "    this.el.set_value(iter, 5, type + ' : ' + str);",
-          "    // update the tree...  ",
+          "\treturn   (JsRender.NodeProp) this.el.get_item(row);",
           "",
-          "    this.get('/LeftTree.model').changed(this.toJS(), doRefresh); ",
-          "}",
-          ""
+          "\t ",
+          "}"
          ],
-         "$ columns" : [
-          "     typeof(JsRender.NodeProp),  // 0 key type",
-          "     typeof(string),  // 1 display_key",
-          "     typeof(string),  // 2 display_value",
-          "     typeof(string),  // 3 display_tooltip",
-          " \t\ttypeof(string)  // 4 sortable value",
-          "/*",
-          "   \t0, prop,",
-          "        \t1, prop.to_display_name(),",
-          "        \t2, dis_val.",
-          "            3,  \"<tt>\" +  GLib.Markup.escape_text(key + \" \" +kvalue) + \"</tt>\",",
-          "            4, \"0 \" + prop.name",
-          "            ",
-          "        ); ",
-          "        */"
+         "| int propToRow" : [
+          "(JsRender.NodeProp prop) {",
+          "\tfor (var i = 0 ; i < this.el.n_items; i++) {",
+          "\t\tvar r = (JsRender.NodeProp)this.el.get_item(i);",
+          "\t\tif (r.equals(prop)) {",
+          "\t\t\treturn i;",
+          "\t\t\t",
+          "\t\t}",
+          "\t}",
+          "\treturn -1;",
+          "\t ",
+          "}"
          ],
-         "$ xns" : "Gtk",
-         "* pack" : "set_model",
-         "id" : "model",
-         "n_columns" : 5,
-         "xtype" : "TreeStore"
+         "| void selectProp" : [
+          "(JsRender.NodeProp prop) {",
+          "\tfor (var i = 0 ; i < this.el.n_items; i++) {",
+          "\t\tvar r = (JsRender.NodeProp)this.el.get_item(i);",
+          "\t\tif (r.equals(prop)) {",
+          "\t\t\tthis.el.selected = i;",
+          "\t\t\treturn;",
+          "\t\t}",
+          "\t}",
+          "\t ",
+          "}"
+         ],
+         "| void startEditing" : [
+          "(JsRender.NodeProp prop) {",
+          "\t// should we call select?? - caller does int (from windowstate)",
+          "\t",
+          "}"
+         ]
         },
         {
-         "$ resizable" : true,
          "$ xns" : "Gtk",
-         "* init" : [
-          " this.el.add_attribute(_this.keyrender.el , \"markup\", 1 ); // 1 is the key.",
-          " //this.el.add_attribute(_this.keyrender.el , \"text\", 1 );",
-          "  "
-         ],
          "* pack" : "append_column",
+         "bool expand" : true,
+         "bool resizable" : true,
          "id" : "keycol",
          "items" : [
           {
            "$ xns" : "Gtk",
-           "* pack" : "pack_start,false",
-           "id" : "keyrender",
-           "xtype" : "CellRendererText"
+           "* prop" : "factory",
+           "listeners" : {
+            "bind" : [
+             "(listitem) => {",
+             " var lb = (Gtk.Label) ((Gtk.ListItem)listitem).get_child();",
+             " var item = (JsRender.NodeProp) ((Gtk.ListItem)listitem).get_item();",
+             "",
+             "",
+             "item.bind_property(\"to_display_name_prop\",",
+             "                    lb, \"label\",",
+             "                   GLib.BindingFlags.SYNC_CREATE);",
+             "item.bind_property(\"to_tooltip_name_prop\",",
+             "                    lb, \"tooltip_markup\",",
+             "                   GLib.BindingFlags.SYNC_CREATE);",
+             "// was item (1) in old layout",
+             " ",
+             "",
+             "}",
+             ""
+            ],
+            "setup" : [
+             "(listitem) => {",
+             "\tvar lbl = new Gtk.Label(\"\");",
+             " \t((Gtk.ListItem)listitem).set_child(lbl);",
+             " \tlbl.justify = Gtk.Justification.LEFT;",
+             " \tlbl.xalign = 1;",
+             " \tlbl.use_markup = true;",
+             "\tlbl.ellipsize = Pango.EllipsizeMode.START;",
+             " \t/*lbl.changed.connect(() => {",
+             "\t\t// notify and save the changed value...",
+             "\t \t//var prop = (JsRender.NodeProp) ((Gtk.ListItem)listitem.get_item());",
+             "         ",
+             "        //prop.val = lbl.text;",
+             "        //_this.updateIter(iter,prop);",
+             "        _this.changed();",
+             "\t});",
+             "\t*/",
+             "\t((Gtk.ListItem)listitem).activatable = true;",
+             "}",
+             ""
+            ]
+           },
+           "xtype" : "SignalListItemFactory"
           }
          ],
          "title" : "Property",
-         "xtype" : "TreeViewColumn"
+         "xtype" : "ColumnViewColumn"
         },
         {
-         "$ resizable" : true,
          "$ xns" : "Gtk",
-         "* init" : [
-          "{",
-          "\t",
-          " ",
-          "",
-          "\t",
-          "\tthis.el.add_attribute(_this.valrender.el , \"text\", 2 );",
-          " ",
-          "}",
-          ""
-         ],
          "* pack" : "append_column",
+         "bool expand" : true,
+         "bool resizable" : true,
          "id" : "valcol",
          "items" : [
           {
-           "$ editable" : false,
-           "$ has_entry" : true,
            "$ xns" : "Gtk",
-           "* pack" : "pack_start,true",
-           "id" : "valrender",
-           "items" : [
-            {
-             "$ columns" : "typeof(string)",
-             "$ xns" : "Gtk",
-             "* pack" : false,
-             "* prop" : "model",
-             "id" : "valrendermodel",
-             "n_columns" : 1,
-             "xtype" : "ListStore"
-            }
-           ],
+           "* prop" : "factory",
+           "bool is_setting" : false,
            "listeners" : {
-            "edited" : [
-             "  (path, newtext) => {",
-             "    GLib.debug(\"Valrender  - signal:edited\\n\");",
-             "  ",
-             "        this.el.editable = false;",
-             "    ",
+            "bind" : [
+             "(listitem) => {",
+             "\t this.is_setting = true;",
              "",
-             "        Gtk.TreeIter  iter;",
-             "        _this.model.el.get_iter(out iter, new Gtk.TreePath.from_string(path));",
-             "        GLib.Value gval;",
+             "",
+             "\tvar bx = (Gtk.Box) ((Gtk.ListItem)listitem).get_child();",
+             " ",
+             "\t",
+             "\t",
+             "\t",
+             "\tvar elbl = (Gtk.EditableLabel)bx.get_first_child();",
+             "\tvar lbl = (Gtk.Label) elbl.get_next_sibling();",
+             "\tvar cb  = (Gtk.DropDown) lbl.get_next_sibling();",
+             "\t// decide if it's a combo or editable text..",
+             "\tvar model = (Gtk.StringList) cb.model;",
+             " ",
+             "\telbl.hide();",
+             "\tlbl.hide();",
+             "\tcb.hide();",
+             "\t",
+             "\tvar prop = (JsRender.NodeProp) ((Gtk.ListItem)listitem).get_item();",
+             "\t//GLib.debug(\"prop = %s\", prop.get_type().name());",
+             "\t//GLib.debug(\"prop.val = %s\", prop.val);",
+             "\t//GLib.debug(\"prop.key = %s\", prop.to_display_name());",
+             "\t ",
+             "    var use_textarea =  prop.useTextArea();",
+             "    ",
+             "    ",
+             "    var pal = _this.file.project.palete;",
              "        ",
-             "         _this.model.el.get_value(iter,0, out gval);",
-             "        var prop = (JsRender.NodeProp)gval;",
-             "        prop.val = newtext;",
-             "        _this.updateIter(iter,prop);",
-             "        _this.changed();",
-             "          ",
-             "}"
-            ],
-            "editing_started" : [
-             "( editable, path) => {",
-             "    //_this.editing = true;",
-             "    GLib.debug(\"editing started called\\n\");",
-             "    if (!_this.allow_edit) {",
-             "       ",
-             "         GLib.debug(\"val - editing_Started\\n\");",
-             "        this.el.editable = false; // make sure it's not editor...",
-             "   ",
-             "         ",
-             "        return;",
+             "    string[] opts;",
+             "    var has_opts = pal.typeOptions(_this.node.fqn(), prop.name, prop.rtype, out opts);",
+             "    ",
+             "    if (!has_opts && prop.ptype == JsRender.NodePropType.RAW) {",
+             "      \tuse_textarea = true;",
              "    }",
-             "     _this.allow_edit =false;",
              "    ",
-             "   ",
-             "     if (  this.el.has_entry ) {",
-             "   ",
-             "         Gtk.TreeIter  iter;",
-             "        _this.model.el.get_iter(out iter, new Gtk.TreePath.from_string(path));",
-             "        GLib.Value gval;",
-             "                      ",
-             "",
-             "      ",
-             "         //   this.get('/LeftPanel.model').activePath  = path;",
-             "       _this.model.el.get_value(iter,0, out gval);",
              "    ",
-             "",
-             "        var prop = (JsRender.NodeProp)gval;",
-             "        var combo =        (Gtk.ComboBox)editable;",
-             "",
-             "        var entry =  (Gtk.Entry) combo.get_child();        ",
-             "        entry.set_text(prop.val);",
+             "    if (use_textarea) {",
+             "    \tprop.bind_property(\"val_short\",",
+             "                    lbl, \"label\",",
+             "                   GLib.BindingFlags.SYNC_CREATE);",
+             "        prop.bind_property(\"val_tooltip\",",
+             "                    lbl, \"tooltip_markup\",",
+             "                   GLib.BindingFlags.SYNC_CREATE);",
+             "        lbl.show();",
+             "\t\tthis.is_setting = false;        ",
+             "        return;",
+             "    \t",
              "    }",
-             "   ",
-             "}"
+             "     ",
+             "        ",
+             "        ",
+             "        ",
+             "        ",
+             "        // others... - fill in options for true/false?",
+             "           // GLib.debug (ktype.up());",
+             "    if (has_opts) {",
+             "\t",
+             "\t\twhile(model.get_n_items() > 0) {",
+             "\t\t\tmodel.remove(0);",
+             "\t\t}",
+             "\t\tcb.show();",
+             " \t\t// can not remove - hopefully always empty.",
+             "\t\tvar sel = -1;",
+             "\t\tfor(var i = 0; i < opts.length; i ++) {",
+             "\t\t\tmodel.append( opts[i]);",
+             "\t\t\t// not sure this is a great idea... ",
+             "\t\t\tif (opts[i].down() == prop.val.down()) {",
+             "\t\t\t\tsel = i;",
+             "\t\t\t}",
+             "\t\t}",
+             "\t\tGLib.debug(\"Set selected item to %d\", sel);",
+             "\t\tcb.set_selected(sel > -1 ? sel : Gtk.INVALID_LIST_POSITION); ",
+             "\t\tthis.is_setting = false;        ",
+             "\t\treturn ;",
+             "    }",
+             "                                  ",
+             "\t// see if type is a Enum.",
+             "\t// triggers a changed event",
+             " ",
+             "\telbl.set_text(prop.val);",
+             " ",
+             "\telbl.show();",
+             "\tthis.is_setting = false;        \t\t ",
+             "\t",
+             "\t",
+             "\t",
+             " ",
+             "",
+             "}",
+             ""
+            ],
+            "setup" : [
+             "(listitem) => {",
+             "\tvar hb = new Gtk.Box(Gtk.Orientation.HORIZONTAL,0);",
+             "\tvar elbl  = new Gtk.EditableLabel(\"\");",
+             "\telbl.hexpand = true;",
+             "\thb.append(elbl);",
+             "\tvar lbl  = new Gtk.Label(\"\");",
+             "\thb.append(lbl);",
+             "\tlbl.hexpand = true;",
+             "\tlbl.use_markup = true;",
+             "\tlbl.xalign =0;",
+             "\tlbl.ellipsize = Pango.EllipsizeMode.END;",
+             "\tvar cb = new Gtk.DropDown(new Gtk.StringList({}), null);",
+             "\tcb.hexpand = true;",
+             " ",
+             "\thb.append(cb);",
+             "\t((Gtk.ListItem)listitem).set_child(hb);",
+             "\t ",
+             "\t var ef = new Gtk.EventControllerFocus();",
+             "\t ef.enter.connect(() => {",
+             " \t\t _this.stop_editor();",
+             " \t\t  var prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();",
+             "\t\t _this.selmodel.selectProp(prop);\t\t",
+             "\t });",
+             "\t elbl.add_controller(ef);",
+             "\t ",
+             "\t ",
+             "\t  // dropdown??? - stop editing, and highliht node",
+             "\t var tb = (Gtk.ToggleButton) cb.get_first_child();",
+             "\t tb.clicked.connect(() => {",
+             "\t\t var prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();",
+             "\t\t\t",
+             "\t \t _this.stop_editor();",
+             "\t \t _this.selmodel.selectProp(prop);",
+             "\t \t ",
+             "\t });",
+             " \telbl.changed.connect(() => {",
+             "\t\t// notify and save the changed value...",
+             "\t \t",
+             "        //_this.updateIter(iter,prop);",
+             "        // this should happen automatically",
+             "        ",
+             "        if (!_this.loading && !this.is_setting) {",
+             "\t\t    var prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();",
+             "\t\t\t ",
+             "\t\t ",
+             "\t\t    prop.val = elbl.text;",
+             "        \t GLib.debug(\"calling changed\");",
+             "\t        _this.changed();",
+             "\t       ",
+             "        }",
+             "        ",
+             "\t});",
+             "\t",
+             "\t",
+             "\tcb.notify[\"selected\"].connect(() => {",
+             "\t\t// dropdown selection changed.",
+             "\t\t",
+             "\t\t",
+             "\t\t",
+             "        //_this.updateIter(iter,prop);",
+             "        if (!_this.loading && !this.is_setting) {",
+             "\t\t    var prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();",
+             "\t\t    var model = (Gtk.StringList)cb.model;",
+             "\t\t    prop.val =   model.get_string(cb.selected);",
+             "\t\t    GLib.debug(\"property set to %s\", prop.val);",
+             "        \tGLib.debug(\"calling changed\");",
+             "\t        _this.changed();",
+             "\t         ",
+             "        }",
+             "        ",
+             "\t\t",
+             "\t});",
+             "\tvar gc = new Gtk.GestureClick();",
+             "\tlbl.add_controller(gc);",
+             "\tgc.pressed.connect(() => {",
+             "\t \tvar prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();",
+             "\t\t _this.stop_editor();",
+             "\t    _this.show_editor(_this.file, prop.parent, prop);",
+             "\t});",
+             "\t  ",
+             "\t",
+             "\t",
+             "}",
+             ""
             ]
            },
-           "text_column" : 0,
-           "xtype" : "CellRendererCombo",
-           "|              void setOptions" : [
-            "(string[] ar) {",
-            "\tvar m = _this.valrendermodel.el;",
-            "\tm.clear();",
-            "\tGtk.TreeIter iret;",
-            "    for (var i =0; i < ar.length; i++) {",
-            "        m.append(out iret);",
-            "        m.set_value(iret, 0, ar[i]);",
-            "    }",
-            "",
-            "}"
-           ]
+           "xtype" : "SignalListItemFactory"
           }
          ],
          "title" : "Value",
-         "xtype" : "TreeViewColumn"
+         "xtype" : "ColumnViewColumn"
         },
         {
          "$ xns" : "Gtk",
          "items" : [
           {
            "$ xns" : "Gtk",
-           "* pack" : "append",
-           "label" : "Delete",
-           "listeners" : {
-            "activate" : [
-             "  ( )  =>{",
-             "\t_this.deleteSelected();",
-             "}"
-            ]
-           },
-           "xtype" : "MenuItem"
+           "* prop" : "child",
+           "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
+           "int spacing" : 0,
+           "items" : [
+            {
+             "$ xns" : "Gtk",
+             "label" : "Delete",
+             "listeners" : {
+              "activate" : [
+               "  ( )  =>{",
+               "\t_this.deleteSelected();",
+               "\t",
+               "}"
+              ]
+             },
+             "xtype" : "Button"
+            }
+           ],
+           "xtype" : "Box"
           }
          ],
-         "xtype" : "Menu"
+         "xtype" : "Popover"
         }
        ],
-       "listeners" : {
-        "button_press_event" : [
-         "  ( ev)  => {",
-         " ",
-         "    Gtk.TreeViewColumn col;",
-         "    int cell_x;",
-         "    int cell_y;",
-         "    Gtk.TreePath path;",
-         "    ",
-         "    // event x /y are relative to the widget..",
-         "    if (!this.el.get_path_at_pos((int)ev.x, (int) ev.y, out path, out col, out cell_x, out cell_y )) {",
-         "        GLib.debug(\"nothing selected on click\");",
-         "        GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {",
-         "            this.el.get_selection().unselect_all();",
-         "",
-         "            return false;",
-         "        });",
-         "         _this.before_edit();",
-         "        return false; //not on a element.",
-         "    }",
-         "    ",
-         "     ",
-         "     // single click on name..",
-         "     //if (ev.type == Gdk.EventType.2BUTTON_PRESS  && ev.button == 1 && col.title == \"Name\") {    ",
-         "     if (ev.button == 1 && col.title == \"Property\") {    ",
-         "     \t// need to shift down, as ev.y does not inclucde header apparently..",
-         "     \t// or popover might be trying to do a central?",
-         "        this.editPropertyDetails(path, (int) ev.y + 12); ",
-         "         ",
-         "        return false;",
-         "    }",
-         "    ",
-         "    ",
-         "    ",
-         "    ",
-         "     // right click.",
-         "     if (ev.type == Gdk.EventType.BUTTON_PRESS  && ev.button == 3) {    ",
-         "        // show popup!.   ",
-         "        //if (col.title == \"Value\") {",
-         "         //     _this.before_edit();",
-         "         //    return false;",
-         "         //}",
-         "",
-         "        var p = _this.ContextMenu;",
-         "",
-         "        p.el.set_screen(Gdk.Screen.get_default());",
-         "        p.el.show_all();",
-         "        p.el.popup(null, null, null,  ev.button, ev.time);",
-         "        //Seed.print(\"click:\" + res.column.title);",
-         "        // select the ",
-         "        GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {",
-         "  ",
-         "            this.el.get_selection().select_path(path);",
-         "            return false;",
-         "        });",
-         "         _this.before_edit();",
-         "        return false;",
-         "    }",
-         "    ",
-         "     ",
-         "    if (col.title != \"Value\") {",
-         "        GLib.debug(\"col title != Value\");",
-         "        ",
-         "        GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {",
-         "            this.el.get_selection().select_path(path);",
-         "            return false;",
-         "        });",
-         "        ",
-         "        _this.before_edit();",
-         "          //  XObject.error(\"column is not value?\");",
-         "        return false; // ignore.. - key click.. ??? should we do this??",
-         "    }",
-         "    ",
-         "    ",
-         "    // if the cell can be edited with a pulldown",
-         "    // then we should return true... - and let the start_editing handle it?",
-         "    ",
-         "    ",
-         "    ",
-         "    ",
-         "    ",
-         "      ",
-         "   //             _this.before_edit(); <<< we really need to stop the other editor..",
-         "     _this.keyrender.el.stop_editing(false);",
-         "    _this.keyrender.el.editable  =false;",
-         "    ",
-         "           ",
-         "    return _this.startEditingValue(path); // assumes selected row..",
-         "        ",
-         "   ",
-         "",
-         "              ",
-         "   ",
-         "}"
-        ]
-       },
-       "tooltip_column" : 3,
-       "xtype" : "TreeView",
-       "| void editPropertyDetails" : [
-        "(Gtk.TreePath path, int y) {",
+       "string name" : "leftprops-view",
+       "xtype" : "ColumnView",
+       "| Gtk.Widget? getWidgetAtRow" : [
+        "(uint row) {",
+        "/*",
+        "    \t",
+        "from    \thttps://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465",
+        "    \tvar colview = gesture.widget;",
+        "    \tvar line_no = check_list_widget(colview, x,y);",
+        "         if (line_no > -1) {",
+        "    \t\tvar item = colview.model.get_item(line_no);",
+        "    \t\t ",
+        "    \t}",
+        "    \t*/",
+        "\t\t//GLib.debug(\"Get Widget At Row %d\", (int)row);",
+        "        var  child = this.el.get_first_child(); ",
+        "    \tvar line_no = -1; ",
+        "    \tvar reading_header = true;",
         "",
-        "    ",
-        "\t",
-        "",
-        "     _this.before_edit();",
-        "      _this.stop_editor();",
-        "\t  ",
-        "     _this.keyrender.el.stop_editing(false);",
-        "     _this.keyrender.el.editable  =false;",
+        "    \twhile (child != null) {",
+        "\t\t\t//GLib.debug(\"Got %s\", child.get_type().name());",
+        "    \t    if (reading_header) {",
+        "\t\t\t ",
+        "\t\t\t   ",
+        "\t\t\t\tif (child.get_type().name() != \"GtkColumnListView\") {",
+        "\t\t\t\t\tchild = child.get_next_sibling();",
+        "\t\t\t\t\tcontinue;",
+        "\t\t\t\t}",
+        "\t\t\t\tchild = child.get_first_child(); ",
+        "\t\t\t\treading_header = false;",
+        "\t\t\t\tcontinue;",
+        "\t        }",
+        "\t\t    if (child.get_type().name() != \"GtkColumnViewRowWidget\") {",
+        "    \t\t    child = child.get_next_sibling();",
+        "    \t\t    continue;",
+        "\t\t    }",
+        "\t\t    line_no++;",
+        "\t\t\tif (line_no == row) {",
+        "\t\t\t\t//GLib.debug(\"Returning widget %s\", child.get_type().name());",
+        "\t\t\t    return (Gtk.Widget)child;",
+        "\t\t    }",
+        "\t        child = child.get_next_sibling(); ",
+        "    \t}",
+        "\t\t//GLib.debug(\"Rturning null\");",
+        "        return null;",
         "",
-        "     _this.valrender.el.stop_editing(false);",
-        "     _this.valrender.el.editable  =false;",
-        "     Gtk.TreeIter iter;",
-        "      var mod = this.el.get_model();",
-        "\t  mod.get_iter (out iter, path);",
-        "\t  ",
-        "   ",
-        "\tGLib.Value gval;",
+        " }"
+       ],
+       "| int getColAt" : [
+        "(double x,  double y) {",
+        "/*",
+        "    \t",
+        "from    \thttps://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465",
+        "    \t  ",
+        "    \t*/",
+        "\t\t//Gtk.Allocation alloc = { 0, 0, 0, 0 };",
+        "        var  child = this.el.get_first_child(); ",
+        "    \t ",
+        "    \tvar col = 0;",
+        "    \tvar offx = 0;",
+        "    \twhile (child != null) {",
+        "\t\t\tGLib.debug(\"Got %s\", child.get_type().name());",
+        "\t\t\t",
+        "\t\t\tif (child.get_type().name() == \"GtkColumnViewRowWidget\") {",
+        "\t\t\t\tchild = child.get_first_child();",
+        "\t\t\t\tcontinue;",
+        "\t\t\t}",
+        "\t\t\t",
+        "\t\t\t//child.get_allocation(out alloc);",
+        "\t\t\tif (x <  (child.get_width() + offx)) {",
+        "\t\t\t\treturn col;",
+        "\t\t\t}",
+        "\t\t\toffx += child.get_width();",
+        "\t\t\tcol++;",
+        "\t\t\tchild = child.get_next_sibling();",
+        "\t\t}",
+        "    \t     ",
+        "\t\t\t  ",
+        "        return -1;",
         "",
-        "     mod.get_value(iter,0, out gval);",
+        " }"
+       ],
+       "| int getRowAt" : [
+        "(double x,  double  y, out string pos) {",
         "",
-        "    this.popover.show(_this.view.el, _this.node, (JsRender.NodeProp)gval,   y);",
-        "       ",
-        "    ",
-        "}",
-        ""
+        "\tpos = \"\";",
+        "\tvar w = this.el.pick(x, y, Gtk.PickFlags.DEFAULT);",
+        "\t//GLib.debug(\"got widget %s\", w == null ? \"nothing\" : w.get_type().name());",
+        "\tif (w == null) {",
+        "\t\treturn -1;",
+        "\t}",
+        "\t",
+        "\tvar row= w.get_ancestor(GLib.Type.from_name(\"GtkColumnViewRowWidget\"));",
+        "\tif (row == null) {",
+        "\t\treturn -1;",
+        "\t}",
+        "\t",
+        "\t//GLib.debug(\"got colview %s\", row == null ? \"nothing\" : row.get_type().name());",
+        "\t ",
+        "\tvar rn = 0;",
+        "\tvar cr = row;",
+        "\t ",
+        "\twhile (cr.get_prev_sibling() != null) {",
+        "\t\trn++;",
+        "\t\tcr = cr.get_prev_sibling();",
+        "\t}",
+        "\t",
+        "\t//GLib.debug(\"row number is %d\", rn);",
+        "\t//GLib.debug(\"click %d, %d\", (int)x, (int)y);",
+        "\t// above or belw",
+        "\tGraphene.Rect  bounds;",
+        "\trow.compute_bounds(this.el, out bounds);",
+        "\t//GLib.debug(\"click x=%d, y=%d, w=%d, h=%d\", ",
+        "\t//\t(int)bounds.get_x(), (int)bounds.get_y(),",
+        "\t//\t(int)bounds.get_width(), (int)bounds.get_height()",
+        "\t//\t);",
+        "\tvar ypos = y - bounds.get_y();",
+        "\t//GLib.debug(\"rel ypos = %d\", (int)ypos);\t",
+        "\tvar rpos = 100.0 * (ypos / bounds.get_height());",
+        "\t//GLib.debug(\"rel pos = %d %%\", (int)rpos);",
+        "\tpos = \"over\";",
+        "\t",
+        "\tif (rpos > 80) {",
+        "\t\tpos = \"below\";",
+        "\t} else if (rpos < 20) {",
+        "\t\tpos = \"above\";",
+        "\t} ",
+        "\treturn rn;",
+        " }"
+       ],
+       "| void editProp" : [
+        "(JsRender.NodeProp prop) ",
+        "{",
+        "\tvar sm = _this.selmodel.el;",
+        " ",
+        "\t\tvar sr = -1;",
+        "\t\tGLib.debug(\"finding node\");",
+        "\t\t_this.selmodel.selectProp(prop);",
+        "\t\t",
+        "\t\tfor (var i = 0 ; i < sm.n_items; i++) {",
+        "\t\t\tvar r = (JsRender.NodeProp)sm.get_item(i);",
+        "\t\t\tif (r.equals(prop)) {",
+        "\t\t\t\tsr = i;",
+        "\t\t\t\tbreak;",
+        "\t\t\t}",
+        "\t\t}",
+        "\t\tif (sr < 0) {",
+        "\t\t\tGLib.debug(\"finding node - cant find it\");",
+        "\t\t\t \t\t",
+        "\t\t\treturn;",
+        "\t\t}",
+        "\t\tvar r = this.getWidgetAtRow(sr);",
+        "\t\tGLib.debug(\"r = %s\", r.get_type().name());",
+        "\t\tvar ca = r.get_first_child();",
+        "\t\tvar ll = (Gtk.Label)ca.get_first_child();",
+        "\t\tvar cb = ca.get_next_sibling();",
+        "\t\tvar b = cb.get_first_child();",
+        "\t\tvar e = (Gtk.EditableLabel) b.get_first_child();",
+        "\t\tvar l = (Gtk.Label) e.get_next_sibling();",
+        "\t\tvar d = (Gtk.DropDown) l.get_next_sibling();",
+        "\t\t",
+        "\t\tGLib.debug(\"row key = %s\", ll.label);",
+        "\t\tif (e.get_visible()) {",
+        "\t\t\t_this.stop_editor();",
+        "\t\t\te.start_editing();",
+        "\t\t\t//GLib.Timeout.add_once(500, () => {",
+        "\t\t\t//\tvar st = (Gtk.Stack) e.get_first_child();",
+        "\t\t\t//\tvar ed = (Gtk.Entry) st.get_visible_child();",
+        "\t\t\t//\ted.grab_focus_without_selecting();",
+        "\t\t\t//});",
+        "\t\t\treturn;",
+        "\t\t}",
+        "\t\tif (d.get_visible()) {",
+        "\t\t\t_this.stop_editor();",
+        "\t\t\td.activate();",
+        "\t\t\treturn;",
+        "\t\t}",
+        "\t\tif (l.get_visible()) {",
+        "\t\t \t_this.stop_editor();",
+        "\t    \t_this.show_editor(_this.file, prop.parent, prop);",
+        "\t\t",
+        "\t\t}",
+        "\t\t",
+        "\t\t",
+        "\t\t",
+        "\t\t//gtkcolumnviewrowwidget",
+        "\t\t  // cell widet",
+        "\t\t  // cell widget",
+        "\t\t  \t// box",
+        "\t\t  \t\t// entry / label / dropdown",
+        "\t\t \t\t",
+        "\t\t ",
+        "}"
        ]
       }
      ],
     }
    ],
    "xtype" : "Box",
-   "|              string keyFormat" : [
+   "| string keyFormat" : [
     "(string val, string type) {",
     "    ",
     "    // Glib.markup_escape_text(val);",
     "",
     "}"
    ],
-   "|              string keySortFormat" : [
+   "| string keySortFormat" : [
     "(string key) {",
     "    // listeners first - with 0",
     "    // specials",
     "",
     "}"
    ],
-   "|              void addProp" : [
-    " (JsRender.NodeProp prop) {",
-    "      // info includes key, val, skel, etype..",
-    "      //console.dump(info);",
-    "        //type = info.type.toLowerCase();",
-    "        //var data = this.toJS();",
-    "          ",
-    "     ",
-    "    ",
-    "              ",
-    "    if (prop.ptype == JsRender.NodePropType.LISTENER) {",
-    "        if (this.node.listeners.has_key(prop.name)) {",
-    "            return;",
-    "        }",
-    "        this.node.listeners.set(prop.name,prop);",
-    "    } else  {",
-    "         assert(this.node != null);",
-    "         assert(this.node.props != null);",
-    "        if (this.node.props.has_key(prop.to_index_key())) {",
-    "            return;",
-    "        }",
-    "        this.node.props.set(prop.to_index_key(),prop);",
-    "    }",
-    "            ",
-    "      ",
-    "    // add a row???",
-    "    this.load(this.file, this.node);",
-    "    ",
-    "    ",
-    "    ",
-    "    /// need to find the row which I've just added..",
-    "    ",
-    "    ",
-    "    var s = this.view.el.get_selection();",
-    "    s.unselect_all();",
-    "    ",
-    "    GLib.debug(\"trying to find new iter\");",
-    "  ",
-    "    this.model.el.foreach((model, path, iter) => {",
-    "        GLib.Value gval;",
-    "        this.model.el.get_value(iter, 0 , out gval);",
-    "        ",
-    "        var iprop = (JsRender.NodeProp)gval;",
-    "        if (iprop.to_index_key() != prop.to_index_key()) {",
-    "        \treturn false; // continue?",
-    "        }",
-    "        ",
-    "        // delay this?",
-    "        GLib.Timeout.add_full(GLib.Priority.DEFAULT,40 , () => {",
-    "        \t/*",
-    "    \t\tif (prop.name == \"\") { // empty string for key name.",
-    "        \t\t_this.view.editPropertyDetails(this.model.el.get_path(iter));",
-    "        \t\treturn false;",
-    "        \t}",
-    "        \t*/",
-    "        \t",
-    "            this.startEditingValue(this.model.el.get_path(iter));",
-    "            return false;",
-    "        });",
-    "        //s.select_iter(iter);",
-    "        return true; ",
-    "    });",
-    "    ",
-    "    ",
-    "    ",
-    "              ",
-    "}",
-    ""
-   ],
-   "|              void deleteSelected" : [
+   "| void deleteSelected" : [
     " () {",
     "    ",
-    "        this.stop_editor();",
+    "\t\treturn;",
+    "\t\t/*",
     "        ",
     "        Gtk.TreeIter iter;",
     "        Gtk.TreeModel mod;",
     "        GLib.Value gval;",
     "        mod.get_value(iter, 0 , out gval);",
     "        var prop = (JsRender.NodeProp)gval;",
+    "        if (prop == null) {",
+    "\t        this.load(this.file, this.node);    ",
+    "        \treturn;",
+    "    \t}",
+    "    \t// stop editor after fetching property - otherwise prop is null.",
+    "        this.stop_editor();",
     "        ",
+    "            \t",
     "        switch(prop.ptype) {",
     "            case JsRender.NodePropType.LISTENER:",
     "                this.node.listeners.unset(prop.to_index_key());",
     "        this.load(this.file, this.node);",
     "        ",
     "        _this.changed();",
+    "        */",
     "}"
    ],
-   "|              void finish_editing" : [
-    "() {",
-    "     // ",
-    "    this.before_edit();",
-    "}"
-   ],
-   "|              void load" : [
+   "| void load" : [
     "(JsRender.JsRender file, JsRender.Node? node) ",
     "{",
     "\t// not sure when to initialize this - we should do it on setting main window really.    ",
+    "\t",
+    "\tthis.loading = true;",
     "    if (this.view.popover == null) {",
     " \t\t   this.view.popover = new Xcls_PopoverProperty();",
     " \t\t   this.view.popover.mainwindow = _this.main_window;",
     "\t}",
     "    ",
     "    ",
-    "    ",
+    "    if (this.node != null) {",
+    "    \tthis.node.dupeProps(); // ensures removeall will not do somethign silly",
+    "    \t",
+    "    }",
     "    ",
     "    GLib.debug(\"load leftprops\\n\");",
-    "    this.before_edit();",
+    "",
     "    this.node = node;",
     "    this.file = file;",
     "    ",
     " ",
-    "    this.model.el.clear();",
+    "    this.model.el.remove_all();",
     "              ",
     "    //this.get('/RightEditor').el.hide();",
     "    if (node ==null) {",
     "        return ;",
     "    }",
-    "     ",
-    "    ",
     "",
-    "    //var provider = this.get('/LeftTree').getPaleteProvider();",
-    "    Gtk.TreeIter iter;",
-    "    ",
-    "   ",
-    "    ",
-    "     ",
-    "    ",
-    "    // really need a way to sort the hashmap...",
-    "    var m = this.model.el;",
-    "    ",
-    "    var miter = node.listeners.map_iterator();",
-    "    var i = 0;",
-    "    ",
-    "    while(miter.next()) {",
-    "        i++;",
-    "        m.append(out iter,null);",
-    "        ",
-    "        this.updateIter(iter,  miter.get_value());",
-    "        ",
-    "         ",
-    "     }",
-    "     ",
-    "      ",
-    "    miter = node.props.map_iterator();",
+    "    node.loadProps(this.model.el, _this.main_window.windowstate.project); ",
     "    ",
     "    ",
-    "   while(miter.next()) {",
-    "           i++;",
-    "        m.append(out iter,null);",
-    "         this.updateIter(iter, miter.get_value());",
-    "         ",
-    "   }",
-    "   GLib.debug(\"clear selection\\n\");",
-    "   // clear selection?",
-    "   this.model.el.set_sort_column_id(4,Gtk.SortType.ASCENDING); // sort by real key..",
-    "   ",
-    "   this.view.el.get_selection().unselect_all();",
+    "   //GLib.debug(\"clear selection\\n\");",
     "   ",
+    "   \tthis.loading = false;",
+    "    this.selmodel.el.set_selected(Gtk.INVALID_LIST_POSITION);",
+    "    this.updateErrors();",
+    "   // clear selection?",
+    "  //this.model.el.set_sort_column_id(4,Gtk.SortType.ASCENDING); // sort by real key..",
     "   ",
+    "   // this.view.el.get_selection().unselect_all();",
     "   ",
+    "  // _this.keycol.el.set_max_width(_this.EditProps.el.get_allocated_width()/ 2);",
+    "  // _this.valcol.el.set_max_width(_this.EditProps.el.get_allocated_width()/ 2);",
     "   ",
     "}",
     ""
    ],
-   "|              void startEditingKey" : [
-    "( Gtk.TreePath path) {",
-    "    ",
-    "     if (!this.stop_editor()) {",
-    "        return;",
-    "     }",
-    "  ",
-    "    // others... - fill in options for true/false?",
-    "    ",
-    "       ",
-    "    GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {",
-    "        this.allow_edit  = true;",
-    "        this.keyrender.el.editable = true;",
-    "     ",
-    "        this.view.el.set_cursor_on_cell(",
-    "            path,",
-    "            this.keycol.el,",
-    "            this.keyrender.el,",
-    "            true",
-    "        );",
-    "               ",
-    "        return false;",
-    "    });",
-    "      ",
-    "    ",
-    "}",
-    ""
-   ],
-   "|              void updateIter" : [
-    "(Gtk.TreeIter iter, JsRender.NodeProp prop) {",
-    "",
-    "    //print(\"update Iter %s, %s\\n\", key,kvalue);",
-    "    ",
-    "    var dl = prop.val.strip().split(\"\\n\");",
-    "",
-    "    var dis_val = dl.length > 1 ? (dl[0].strip()+ \"...\") : dl[0];",
-    "    ",
-    "    if (prop.ptype == JsRender.NodePropType.LISTENER) {",
+   "| void removeErrors" : [
+    "() {",
+    "\t\tif (this.error_widgets == null || this.error_widgets.size < 1) {",
+    " \t\treturn;",
+    "\t}",
+    "\tforeach(var child in this.error_widgets) {",
+    "\t",
+    "\t\tif (child.has_css_class(\"node-err\")) {",
+    "\t\t\tchild.remove_css_class(\"node-err\");",
+    "\t\t}",
+    "\t\tif (child.has_css_class(\"node-warn\")) {",
+    "\t\t\tchild.remove_css_class(\"node-warn\");",
+    "\t\t}",
+    "\t\t",
+    "\t\tif (child.has_css_class(\"node-depr\")) {",
+    "\t\t\tchild.remove_css_class(\"node-depr\");",
+    "\t\t}",
+    "\t}",
+    "\tthis.error_widgets  = null;",
+    "\treturn;",
+    "\t//GLib.debug(\"Rturning null\");",
     "     ",
-    "       ",
-    "        ",
-    "        this.model.el.set(iter, ",
-    "        \t0, prop,",
-    "        \t1, prop.to_display_name(),",
-    "        \t2, dis_val,",
-    "            3,  \"<tt>\" +  GLib.Markup.escape_text(prop.to_tooltip()) + \"</tt>\",",
-    "            4,  prop.to_sort_key(),",
-    "            -1",
-    "        ); ",
-    "        return;",
-    "    }",
-    "    ",
-    "",
-    "",
-    "    this.model.el.set(iter, ",
-    "            0, prop,",
-    "        \t1, prop.to_display_name(),",
-    "        \t2, dis_val,",
-    "            3,  \"<tt>\" +  GLib.Markup.escape_text(prop.to_tooltip()) + \"</tt>\",",
-    "            4, prop.to_sort_key(),",
-    "            -1",
-    "            ",
-    "        ); ",
     "}"
    ],
-   "| bool startEditingValue" : [
-    "( Gtk.TreePath path) {",
-    "",
-    "     // ONLY return true if editing is allowed - eg. combo..",
-    "",
-    "    GLib.debug(\"start editing?\\n\");",
-    "    if (!this.stop_editor()) {",
-    "        GLib.debug(\"stop editor failed\\n\");",
-    "        return false;",
-    "    }",
-    "    ",
-    "    Gtk.TreeIter iter;",
-    "",
-    "    var mod = this.model.el;",
-    "    mod.get_iter (out iter, path);",
-    "    ",
-    "    GLib.Value gval;",
-    "    mod.get_value(iter, 0 , out gval);",
-    "    var prop  = (JsRender.NodeProp)gval;",
-    "",
-    "",
-    "    ",
-    "    var use_textarea = false;",
-    "",
-    "    //------------ things that require the text editor...",
-    "    ",
-    "    if (prop.ptype == JsRender.NodePropType.LISTENER) {",
-    "        use_textarea = true;",
-    "    }",
-    "    if (prop.ptype == JsRender.NodePropType.METHOD) { ",
-    "        use_textarea = true;",
-    "    }",
-    "    if (prop.ptype == JsRender.NodePropType.RAW) { // raw string",
-    "        use_textarea = true;",
-    "    }",
-    "    if ( prop.name == \"init\" && prop.ptype == JsRender.NodePropType.SPECIAL) {",
-    "        use_textarea = true;",
-    "    }",
-    "    if (prop.val.length > 40) { // long value...",
-    "        use_textarea = true;",
-    "    }",
-    "    ",
-    "    ",
-    "    ",
-    "    if (use_textarea) {",
-    "        GLib.debug(\"Call show editor\\n\");",
-    "        GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {",
-    "            this.view.el.get_selection().select_path(path);",
-    "            ",
-    "            this.show_editor(file, node, prop);",
-    "            ",
-    "            return false;",
-    "        });",
-    "       ",
-    "        ",
-    "        return false;",
-    "    }",
-    "    ",
-    "     var pal = this.file.project.palete;",
-    "    ",
-    "    string[] opts;",
-    "    var has_opts = pal.typeOptions(this.node.fqn(), prop.name, prop.rtype, out opts);",
-    "    ",
-    "    ",
-    "    ",
-    "    // others... - fill in options for true/false?",
-    "    GLib.debug(\"turn on editing %s \\n\" , mod.get_path(iter).to_string());",
-    "   ",
-    "      // GLib.debug (ktype.up());",
-    "    if (has_opts) {",
-    "            GLib.debug(\"start editing try/false)???\");",
-    "            this.valrender.el.has_entry = false;",
-    "          ",
-    "            this.valrender.setOptions(opts);",
-    "            ",
-    "            this.valrender.el.has_entry = false;",
-    "            this.valrender.el.editable = true;",
-    "             this.allow_edit  = true;",
-    "             GLib.Timeout.add_full(GLib.Priority.DEFAULT,100 , () => {",
-    "                 this.view.el.set_cursor_on_cell(",
-    "\t                path,",
-    "\t                this.valcol.el,",
-    "\t                this.valrender.el,",
-    "\t                true",
-    "                );",
-    "                return false;",
-    "            });",
-    "            return true;",
-    "    }",
-    "                              ",
-    "       // see if type is a Enum.",
-    "       ",
-    "       ",
-    "   ",
-    "        ",
-    "   ",
-    "     opts =  {  };",
-    "    this.valrender.setOptions(opts);",
-    "   ",
-    "   GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {",
-    "        ",
-    "        // at this point - work out the type...",
-    "        // if its' a combo... then show the options..",
-    "        this.valrender.el.has_entry = true;",
-    "        ",
-    "        this.valrender.el.editable = true;            ",
-    "    ",
-    "        ",
-    "        this.allow_edit  = true;",
-    "        ",
-    "        ",
-    "        ",
-    "        ",
-    "",
-    "        this.view.el.set_cursor_on_cell(",
-    "            path,",
-    "            this.valcol.el,",
-    "            this.valrender.el,",
-    "            true",
-    "        );",
-    "        return false;",
-    "    });",
-    "    return false;",
-    "}",
-    ""
-   ],
-   "| void before_edit" : [
-    "()",
-    "{",
+   "| void updateErrors" : [
+    "() {",
+    "\tvar file = this.file;",
+    "\tif (file == null) {",
+    "\t\treturn;",
+    "\t}",
+    "\tvar ar = file.getErrors();",
+    "\tif (ar == null || ar.size < 1) {",
+    "\t\tif (this.last_error_counter != file.error_counter) {",
+    "\t\t\tthis.removeErrors();",
+    "\t\t}",
     "",
-    "    GLib.debug(\"before edit - stop editing\\n\");",
-    "    ",
-    "  // these do not appear to trigger save...",
-    "    _this.keyrender.el.stop_editing(false);",
-    "    _this.keyrender.el.editable  =false;",
+    "\t\tthis.last_error_counter = file.error_counter ;",
     "",
-    "    _this.valrender.el.stop_editing(false);",
-    "    _this.valrender.el.editable  =false;    ",
-    "    ",
-    "    ",
-    "// technicall stop the popup editor..",
+    "\t\treturn;",
+    "\t}",
+    " \tif (this.last_error_counter == file.error_counter) {",
+    "\t\treturn;",
+    "\t}",
+    "\tthis.removeErrors();",
+    "\tthis.error_widgets = new Gee.ArrayList<Gtk.Widget>();",
+    "\tforeach(var diag in ar) { ",
+    "\t",
+    "\t\t ",
+    "//        print(\"get inter\\n\");",
+    "\t    var node = file.lineToNode( (int)diag.range.start.line) ;",
+    "\t    if (node == null || this.node == null || node.oid != this.node.oid) {",
+    "\t    \tcontinue;",
+    "    \t}",
+    "    \tvar prop = node.lineToProp( (int)diag.range.start.line) ;",
+    "    \tif (prop == null) {",
+    "    \t\tcontinue;",
+    "\t\t}",
+    "    \tvar row = _this.selmodel.propToRow(prop);",
+    "    \tif (row < 0) {",
+    "    \t\tcontinue;",
+    "\t\t}",
+    "    \tvar w = this.view.getWidgetAtRow(row);",
+    "    \tif (w == null) {",
+    "    \t\treturn;",
+    "\t\t}",
     "",
-    "}",
-    ""
-   ],
-   "| void reload" : [
-    "() {",
-    "\tthis.load(this.file, this.node);",
-    "}",
-    ""
+    "\t\t",
+    "  \t\tvar ed = diag.category.down();",
+    "\t\tif (ed != \"err\" && w.has_css_class(\"node-err\")) {",
+    "\t\t\tcontinue;",
+    "\t\t}",
+    "\t\tthis.error_widgets.add(w);\t\t",
+    "\t\tif (ed == \"err\" && w.has_css_class(\"node-warn\")) {",
+    "\t\t\tw.remove_css_class(\"node-warn\");",
+    "\t\t}",
+    "\t\tif (ed == \"err\" && w.has_css_class(\"node-depr\")) {",
+    "\t\t\tw.remove_css_class(\"node-depr\");",
+    "\t\t}",
+    "\t\tif (!w.has_css_class(\"node-\"+ ed)) {",
+    "\t\t\tw.add_css_class(\"node-\" + ed);",
+    "\t\t}",
+    "\t\t",
+    "\t}",
+    "\t",
+    "}"
    ]
   }
  ],
- "modOrder" : "",
- "name" : "WindowLeftProps",
- "parent" : "",
- "path" : "/home/alan/gitlive/roobuilder/src/Builder4/WindowLeftProps.bjs",
- "permname" : "",
- "title" : ""
+ "name" : "WindowLeftProps"
 }
\ No newline at end of file