Fix #8032 - speed up add remove of errors from tree
[roobuilder] / src / Builder4 / WindowLeftProps.bjs
index 369cd6a..7df8fe4 100644 (file)
@@ -3,6 +3,7 @@
  "gen_extended" : false,
  "items" : [
   {
+   "# Gee.ArrayList<Gtk.Widget>? error_widgets" : "null",
    "# JsRender.JsRender file" : "",
    "# JsRender.Node node" : "",
    "# Xcls_MainWindow main_window" : "null",
@@ -18,6 +19,7 @@
    "bool loading" : false,
    "bool vexpand" : true,
    "id" : "LeftProps",
+   "int last_error_counter" : "-1",
    "items" : [
     {
      "$ xns" : "Gtk",
       },
       {
        "$ xns" : "Gtk",
-       "bool always_show_image" : true,
-       "bool hexpand" : true,
        "items" : [
         {
          "$ xns" : "Gtk",
-         "* pack" : false,
-         "bool autohide" : true,
-         "id" : "AddPropertyPopup",
+         "* prop" : "popover",
+         "id" : "addpop",
          "items" : [
           {
            "$ xns" : "Gtk",
            "items" : [
             {
              "$ xns" : "Gtk",
-             "label" : "id: _this.{ID} (Vala)",
+             "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.AddPropertyPopup.el.hide();",
+               " \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",
                " \t_this.view.editProp( add );",
                " \t",
-               "\t",
                "}"
               ]
              },
-             "tooltip_markup" : "Using _this.{ID} will map to this element",
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "pack: Pack method (Vala)",
+             "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.AddPropertyPopup.el.hide();",
+               "  \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)) {",
                "}"
               ]
              },
-             "tooltip_markup" : "how to pack this element onto parent, (method, 2nd arg, 3rd arg) .. the 1st argument is filled by the element",
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "ctor: Alterative to default contructor (Vala)",
+             "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" : [
                "  ( ) => {",
                "   ",
-               " _this.AddPropertyPopup.el.hide();",
+               "  \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)) {",
                "}"
               ]
              },
-             "tooltip_markup" : [
-              "eg. ",
-              "",
-              "new Clutter.Image.from_file(.....)"
-             ],
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "init: initialziation code (vala)",
+             "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" : [
                "  ( ) => {",
                "    ",
-               " _this.AddPropertyPopup.el.hide();",
+               "  \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)) {",
                "}"
               ]
              },
-             "tooltip_markup" : "This code is called after the ctor",
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "cms-id: (Roo JS/Pman library)",
+             "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" : [
                " ()  => {",
-               "   ",
-               " _this.AddPropertyPopup.el.hide();",
+               "    \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)) {",
                "}"
               ]
              },
-             "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})",
-              ""
-             ],
              "xtype" : "Button"
             },
             {
             },
             {
              "$ xns" : "Gtk",
-             "label" : "String",
+             "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) => {",
-               "     _this.AddPropertyPopup.el.hide();",
+               "  \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(\"\", \"string\", \"\") ,",
+               "\t\t new JsRender.NodeProp.user(\"\", \"string\", \"\") ,",
                "\t\t-1,  ",
                "\t\ttrue",
                "\t);",
                "}"
               ]
              },
-             "tooltip_markup" : "Add a user defined string property",
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "Number",
+             "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" : [
                "  ( ) =>{",
-               "      _this.AddPropertyPopup.el.hide();",
-               "      ",
+               " ",
+               "       \t_this.addpop.el.hide();",
                "       _this.view.popover.show(",
                "\t\t_this.view.el, ",
                "\t\t_this.node, ",
-               "\t\t new JsRender.NodeProp.prop(\"\", \"int\", \"0\") ,",
+               "\t\t new JsRender.NodeProp.user(\"\", \"int\", \"0\") ,",
                "\t\t-1,  ",
                "\t\ttrue",
                "\t);",
                "}"
               ]
              },
-             "tooltip_markup" : "Add a user defined number property",
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "Boolean",
+             "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.AddPropertyPopup.el.hide();",
+               "  \t_this.addpop.el.hide();",
                "   _this.view.popover.show(",
                "\t\t_this.view.el, ",
                "\t\t_this.node, ",
-               "\t\t new JsRender.NodeProp.prop(\"\", \"bool\", \"true\") ,",
+               "\t\t new JsRender.NodeProp.user(\"\", \"bool\", \"true\") ,",
                "\t\t-1,  ",
                "\t\ttrue",
                "\t); ",
                "}"
               ]
              },
-             "tooltip_markup" : "Add a user defined boolean property",
              "xtype" : "Button"
             },
             {
             },
             {
              "$ xns" : "Gtk",
-             "label" : "Javascript Function",
+             "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" : [
                "  ( ) =>{",
-               "  _this.AddPropertyPopup.el.hide(); ",
+               "  \t_this.addpop.el.hide();",
                "   _this.view.popover.show(",
                "\t\t_this.view.el, ",
                "\t\t_this.node, ",
                "}"
               ]
              },
-             "tooltip_markup" : "Add a user function boolean property",
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "Vala Method",
+             "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" : [
                "  ( ) =>{",
-               "_this.AddPropertyPopup.el.hide();",
+               "  \t_this.addpop.el.hide();",
                "    _this.view.popover.show(",
                "\t\t_this.view.el, ",
                "\t\t_this.node, ",
                "}"
               ]
              },
-             "tooltip_markup" : "Add a user function boolean property",
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "Vala Signal",
+             "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" : [
                "  ( ) =>{",
-               "  _this.AddPropertyPopup.el.hide();",
+               " \t_this.addpop.el.hide(); ",
                "  _this.view.popover.show(",
                "\t\t_this.view.el, ",
                "\t\t_this.node, ",
                "}"
               ]
              },
-             "tooltip_markup" : "Add a vala signal",
              "xtype" : "Button"
             },
             {
             },
             {
              "$ xns" : "Gtk",
-             "label" : "Flexy - If",
+             "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.AddPropertyPopup.el.hide();",
+               "  \t_this.addpop.el.hide();",
                " \t_this.view.popover.show(",
                "\t\t_this.view.el, ",
                "\t\t_this.node, ",
                "}"
               ]
              },
-             "tooltip_markup" : "Add a flexy if (for HTML templates)",
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "Flexy - Include",
+             "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.AddPropertyPopup.el.hide();",
+               "  \t_this.addpop.el.hide();",
                " \t_this.view.popover.show(",
                "\t\t_this.view.el, ",
                "\t\t_this.node, ",
                "}"
               ]
              },
-             "tooltip_markup" : "Add a flexy include (for HTML templates)",
              "xtype" : "Button"
             },
             {
              "$ xns" : "Gtk",
-             "label" : "Flexy - Foreach",
+             "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.AddPropertyPopup.el.hide();",
+               "  \t_this.addpop.el.hide();",
                " \t_this.view.popover.show(",
                "\t\t_this.view.el, ",
                "\t\t_this.node, ",
          "xtype" : "Popover"
         }
        ],
-       "listeners" : {
-        "clicked" : [
-         "( ) => {",
-         "  //_this.before_edit();",
-         "  ",
-         "        ",
-         "    var p = _this.AddPropertyPopup;",
-         "    ",
-         " //\tGtk.Allocation rect;",
-         "\t//this.el.get_allocation(out rect);",
-         "\tif (p.el.parent == null) {",
-         "\t\t p.el.set_parent(this.el);",
-         "\t }",
-         "    //p.el.set_pointing_to(rect);",
-         "\tp.el.show();",
-         "\tp.el.set_position(Gtk.PositionType.BOTTOM);",
-         "\tp.el.autohide = true;",
-         "     return;",
-         "",
-         "}",
-         ""
-        ]
-       },
-       "string icon_name" : "list-add",
        "string label" : "Other",
-       "xtype" : "Button"
+       "xtype" : "MenuButton"
       }
      ],
      "xtype" : "Box"
      "id" : "EditProps",
      "items" : [
       {
+       "# Xcls_PopoverProperty popover" : "null",
        "$ enable_tree_lines" : true,
        "$ headers_visible" : true,
        "$ xns" : "Gtk",
-       "* init" : [
-        "{",
-        " ",
-        "  \tthis.css = new Gtk.CssProvider();",
-        "\t ",
-        "\t\tthis.css.load_from_string(\"",
-        "#leftprops-view { font-size: 12px;}",
-        "\t ",
-        "#leftprops-view  dropdown button { ",
-        "\t\t\tmin-height: 16px;\t\t\t ",
-        "\t\t\toutline-offset : 0;",
-        "\t\t}",
-        "#leftprops-view cell dropdown label  {",
-        " \t\tpadding-top:0px;",
-        "\t\tpadding-bottom:0px;",
-        "}",
-        "#leftprops-view cell   { ",
-        " \t\tpadding-top:2px;",
-        "\t\tpadding-bottom:2px;",
-        "\t\t}",
-        "#leftprops-view cell label,  #leftprops-view cell editablelable {",
-        " \t\tpadding-top:4px;",
-        "\t\tpadding-bottom:4px;",
-        "}\");",
-        " ",
-        "\t\tGtk.StyleContext.add_provider_for_display(",
-        "\t\tthis.el.get_display(),",
-        "\t\tthis.css,",
-        "\t\tGtk.STYLE_PROVIDER_PRIORITY_APPLICATION",
-        "\t);",
-        "\t\t",
-        "   ",
-        "}",
-        ""
-       ],
        "* pack" : "set_child",
-       "Gtk.CssProvider css" : "",
-       "Xcls_PopoverProperty popover" : "null",
        "bool hexpand" : true,
        "bool show_row_separators" : true,
        "bool single_click_activate" : false,
            "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 ",
           "}"
          ],
+         "| 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 ",
+          "}"
+         ],
          "| void selectProp" : [
           "(JsRender.NodeProp prop) {",
           "\tfor (var i = 0 ; i < this.el.n_items; i++) {",
         "    \t\t ",
         "    \t}",
         "    \t*/",
-        "\t\tGLib.debug(\"Get Widget At Row %d\", (int)row);",
+        "\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;",
         "",
         "    \twhile (child != null) {",
-        "\t\t\tGLib.debug(\"Got %s\", child.get_type().name());",
+        "\t\t\t//GLib.debug(\"Got %s\", child.get_type().name());",
         "    \t    if (reading_header) {",
         "\t\t\t ",
         "\t\t\t   ",
         "\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    }",
         "\t\t    line_no++;",
         "\t\t\tif (line_no == row) {",
-        "\t\t\t\tGLib.debug(\"Returning widget %s\", child.get_type().name());",
+        "\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\tGLib.debug(\"Rturning null\");",
+        "\t\t//GLib.debug(\"Rturning null\");",
         "        return null;",
         "",
         " }"
         " }"
        ],
        "| int getRowAt" : [
-        "(double x,  double in_y, out string pos) {",
-        "",
+        "(double x,  double  y, out string pos) {",
         "",
+        "\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 ",
-        "",
-        "/*",
-        "    \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 ",
-        " \t\t",
-        " \t\t//GLib.debug(\"offset = %d  y = %d\", (int) voff, (int) in_y);",
-        "    \tvar y = in_y + _this.EditProps.el.vadjustment.value; ",
-        "        var  child = this.el.get_first_child(); ",
-        "    \t//Gtk.Allocation alloc = { 0, 0, 0, 0 };",
-        "    \tvar line_no = -1; ",
-        "    \tvar reading_header = true;",
-        "    \tvar real_y = 0;",
-        "    \tvar header_height  = 0;",
-        "    \tpos = \"none\";",
-        "    \tvar h = 0;",
-        "    \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\tif (child.get_type().name() != \"GtkColumnListView\") {",
-        "\t\t\t        h += child.get_height();",
-        "\t\t\t\t\tchild = child.get_next_sibling();",
-        "\t\t\t\t\tcontinue;",
-        "\t\t\t\t}",
-        "\t\t\t\t// should be columnlistview",
-        "\t\t\t\tchild = child.get_first_child(); ",
-        "\t\t\t    GLib.debug(\"header height=%d\", h);",
-        "\t\t\t\theader_height =  h;",
-        "\t\t\t\t",
-        "\t\t\t\treading_header = false;",
-        "\t\t\t\t",
-        "\t        }",
-        "\t        ",
-        "\t\t    if (child.get_type().name() != \"GtkColumnViewRowWidget\") {",
-        "    \t\t    child = child.get_next_sibling();",
-        "    \t\t    continue;",
-        "\t\t    }",
-        "\t\t    ",
-        "\t\t \tif (y < header_height) {",
-        "\t\t    \treturn -1;",
-        "\t    \t}",
-        "\t\t    ",
-        "\t\t    line_no++;",
-        "\t\t\tvar hh = child.get_height();",
-        "\t\t\t//child.get_allocation(out alloc);",
-        "\t\t\t//GLib.debug(\"got cell xy = %d,%d  w,h= %d,%d\", alloc.x, alloc.y, alloc.width, alloc.height);",
-        "\t\t\t//GLib.debug(\"row %d y= %d %s\", line_no, (int) (header_height + alloc.y),",
-        "\t\t\t",
-        "\t\t\t//\tchild.visible ? \"VIS\" : \"hidden\");",
-        "",
-        "\t\t    if (y >  (header_height + real_y) && y <= (header_height +  real_y + hh) ) {",
-        "\t\t    \tif (y > ( header_height + real_y + (hh * 0.8))) {",
-        "\t\t    \t\tpos = \"below\";",
-        "\t    \t\t} else if (y > ( header_height + real_y + (hh * 0.2))) {",
-        "\t    \t\t\tpos = \"over\";",
-        "    \t\t\t} else {",
-        "    \t\t\t\tpos = \"above\";",
-        "\t\t\t\t}",
-        "\t\t    \t GLib.debug(\"getRowAt return : %d, %s\", line_no, pos);",
-        "\t\t\t    return line_no;",
-        "\t\t    }",
-        " ",
-        "",
-        "\t\t    if (real_y + hh > y) {",
-        "\t\t        return -1;",
-        "\t        }",
-        "\t        real_y += hh;",
-        "\t        child = child.get_next_sibling(); ",
-        "    \t}",
-        "        return -1;",
-        "",
+        "\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" : [
     "",
     "}"
    ],
-   "| void a_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);",
-    "    ",
-    "    ",
-    "     ",
-    "    ",
-    "    GLib.debug(\"trying to find new iter\");",
-    " ",
-    "    ",
-    "              ",
-    "}",
-    ""
-   ],
    "| void deleteSelected" : [
     " () {",
     "    ",
     "    if (node ==null) {",
     "        return ;",
     "    }",
-    "    node.loadProps(this.model.el); ",
+    "",
+    "    node.loadProps(this.model.el, _this.main_window.windowstate.project); ",
     "    ",
     "    ",
     "   //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..",
     "   ",
     "   ",
     "}",
     ""
+   ],
+   "| 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\");",
+    "     ",
+    "}"
+   ],
+   "| 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}",
+    "",
+    "\t\tthis.last_error_counter = file.error_counter ;",
+    "",
+    "\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}",
+    "",
+    "\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",
+    "}"
    ]
   }
  ],