From ee48badb20ee4af798c32c9b02bb5feb75d42beb Mon Sep 17 00:00:00 2001 From: Alan Knowles Date: Sun, 17 Mar 2024 21:44:45 +0800 Subject: [PATCH] Fix #8089 - phase 1 - code ast navigation --- .roobuilder.jcfg | 3 +- meson.build | 1 + resources/css/roobuilder.css | 55 +- src/Builder4/CodeInfo.bjs | 166 +- src/Builder4/CodeInfo.vala | 330 +++- src/Builder4/Editor.bjs | 1966 +++++++++++++--------- src/Builder4/Editor.vala | 614 ++++++- src/Builder4/GtkView.bjs | 12 +- src/Builder4/GtkView.vala | 14 +- src/Builder4/WindowLeftTree.vala | 2 +- src/JsRender/NodeToGlade.vala | 4 +- src/JsRender/NodeToVala.vala | 14 +- src/Lsp.vala | 128 +- src/Palete/LanguageClient.vala | 3 +- src/Palete/LanguageClientDummy.vala | 9 +- src/Palete/LanguageClientJavascript.vala | 12 +- src/Palete/LanguageClientVala.vala | 23 +- 17 files changed, 2383 insertions(+), 973 deletions(-) diff --git a/.roobuilder.jcfg b/.roobuilder.jcfg index 7b18131e9..b56d3388a 100644 --- a/.roobuilder.jcfg +++ b/.roobuilder.jcfg @@ -71,7 +71,8 @@ "src/JsRender/NodeToValaWrapped.vala", "src/Builder4/MainWindow.bjs", "src/Settings.vala", - "src/Palete/HoverProvider.vala" + "src/Palete/HoverProvider.vala", + "src/Builder4/CodeInfo.bjs" ] } ], diff --git a/meson.build b/meson.build index 8ed140636..f36fec127 100644 --- a/meson.build +++ b/meson.build @@ -157,6 +157,7 @@ roobuilder_src = files([ 'src/Builder4/MainWindow.vala', 'src/Settings.vala', 'src/Palete/HoverProvider.vala', + 'src/Builder4/CodeInfo.vala', ]) diff --git a/resources/css/roobuilder.css b/resources/css/roobuilder.css index 3060b80fd..592d2c68f 100644 --- a/resources/css/roobuilder.css +++ b/resources/css/roobuilder.css @@ -46,7 +46,10 @@ #left-tree-view indent:nth-last-child(2) { min-width: 24px; } - +#left-tree-view cell { + padding-top: 3px; + padding-bottom: 3px; +} #project-list { font-size: 12px; @@ -91,4 +94,54 @@ background-color: #ccc; } + +#editor-navigation indent { + -gtk-icon-size : 2px; +} +#editor-navigation { + font-size: 12px; +} +#editor-navigation cell { + padding-top: 2px; + padding-bottom: 2px; +} +.lang-class-symbolic { + color : #266b02; + font-weight: bold; +} +.lang-method-symbolic, +.lang-function-symbolic { + color : #029f2b; + font-weight: bold; + +} + +.lang-struct-field-symbolic { + color : #1111ff; +} + +tooltip { + padding: 2px; + margin: 0px 0px 0px 0px; + border-width: 1px; + border-style: solid; + border-radius: 2px; + border-color: #eee; + background-image: none; + background-color: #eee; + color: #000; + border: 0px; +} + +tooltip * { + background-color: #eee; + + padding: 5px 5px 5px 5px; + margin: 0px 0px 0px 0px; + border-width: 1px; + color: #000; + +} + + \ No newline at end of file diff --git a/src/Builder4/CodeInfo.bjs b/src/Builder4/CodeInfo.bjs index b72ad1430..850db75bb 100644 --- a/src/Builder4/CodeInfo.bjs +++ b/src/Builder4/CodeInfo.bjs @@ -12,42 +12,184 @@ "items" : [ { "$ xns" : "Gtk", - "* prop" : "start_child", + "* prop" : "end_child", "items" : [ { "$ xns" : "Gtk", - "* prop" : "child", - "xtype" : "ListView" + "items" : [ + { + "$ xns" : "WebKit", + "* prop" : "child", + "xtype" : "WebView" + } + ], + "string tab_label" : "Documentation", + "xtype" : "NotebookPage" } ], - "xtype" : "ScrolledWindow" + "xtype" : "Notebook" }, { "$ xns" : "Gtk", - "* prop" : "end_child", + "* prop" : "start_child", + "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", + "bool hexpand" : true, + "bool vexpand" : true, + "int spacing" : 0, "items" : [ { "$ xns" : "Gtk", + "bool hexpand" : true, + "bool search_mode_enabled" : true, "items" : [ { "$ xns" : "Gtk", "* prop" : "child", - "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", - "int spacing" : 0, - "xtype" : "Box" + "bool activates_default" : true, + "bool hexpand" : true, + "xtype" : "SearchEntry" } ], - "string tab_label" : "details", - "xtype" : "NotebookPage" + "xtype" : "SearchBar" + }, + { + "$ xns" : "Gtk", + "bool hexpand" : true, + "bool vexpand" : true, + "items" : [ + { + "$ xns" : "Gtk", + "* prop" : "child", + "items" : [ + { + "$ xns" : "Gtk", + "bool expand" : true, + "items" : [ + { + "$ xns" : "Gtk", + "* prop" : "factory", + "listeners" : { + "bind" : [ + "(listitem) => {", + "\t// GLib.debug(\"listitme is is %s\", ((Gtk.ListItem)listitem).get_type().name());", + "\t", + "\t//var expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child();", + "\tvar expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child();", + "\t ", + "\t ", + "\tvar hbox = (Gtk.Box) expand.child;", + " ", + "\t", + "\tvar img = (Gtk.Image) hbox.get_first_child();", + "\tvar lbl = (Gtk.Label) img.get_next_sibling();", + "\t", + "\tvar lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item();", + "\tvar node = (JsRender.Node) lr.get_item();", + "\tif (node == null || node.fqn() == \"\") {", + "\t\treturn;", + "\t}", + " ", + " expand.set_hide_expander( !node.hasChildren() );", + " \texpand.set_list_row(lr);", + " \t", + " \tnode.bind_property(\"iconResourceName\",", + " img, \"resource\",", + " GLib.BindingFlags.SYNC_CREATE);", + " \t", + " \tnode.bind_property(\"nodeTitleProp\",", + " lbl, \"label\",", + " GLib.BindingFlags.SYNC_CREATE);", + " \tnode.bind_property(\"nodeTipProp\",", + " lbl, \"tooltip_markup\",", + " GLib.BindingFlags.SYNC_CREATE);", + " \t// bind image...", + " \t", + "}", + "" + ], + "setup" : [ + "(listitem) => {", + "\t", + "\tvar expand = new Gtk.TreeExpander();", + "\t ", + "\texpand.set_indent_for_depth(true);", + "\texpand.set_indent_for_icon(true);", + "\tvar hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL,0);", + "\tvar icon = new Gtk.Image();", + "\tvar lbl = new Gtk.Label(\"\");", + "\tlbl.use_markup = true;", + "\tlbl.ellipsize = Pango.EllipsizeMode.END;", + "\t", + "\ticon.margin_end = 4;", + " \tlbl.justify = Gtk.Justification.LEFT;", + " \tlbl.xalign = 0;", + "", + "//\tlistitem.activatable = true; ??", + "\t", + "\thbox.append(icon);", + "\thbox.append(lbl);", + "\texpand.set_child(hbox);", + "\t((Gtk.ListItem)listitem).set_child(expand);", + "\t", + "}", + "" + ] + }, + "xtype" : "SignalListItemFactory" + } + ], + "string title" : "Object Navigation", + "xtype" : "ColumnViewColumn" + }, + { + "$ xns" : "Gtk", + "* prop" : "model", + "items" : [ + { + "$ Gtk.TreeListModelCreateModelFunc create_func" : [ + "(item) => {", + "\t//fixme...", + "\treturn ((JsRender.Node)item).childstore;", + "}", + "" + ], + "$ xns" : "Gtk", + "* prop" : "model", + "bool autoexpand" : true, + "bool passthrough" : false, + "items" : [ + { + "$ GLib.Type item_type" : "typeof(JsRender.Node)", + "$ xns" : "GLib", + "* prop" : "root", + "xtype" : "ListStore" + } + ], + "xtype" : "TreeListModel" + } + ], + "xtype" : "SingleSelection" + } + ], + "xtype" : "ColumnView" + } + ], + "xtype" : "ScrolledWindow" } ], - "xtype" : "Notebook" + "xtype" : "Box" } ], "xtype" : "Paned" } ], - "xtype" : "Popover" + "xtype" : "Popover", + "| void show" : [ + "(Gtk.Widget onbtn) {", + " this.el.set_parent(onbtn);", + "\tthis.el.popup();", + "}" + ] } ], "name" : "CodeInfo" diff --git a/src/Builder4/CodeInfo.vala b/src/Builder4/CodeInfo.vala index d026b0f5d..86a061fed 100644 --- a/src/Builder4/CodeInfo.vala +++ b/src/Builder4/CodeInfo.vala @@ -30,6 +30,10 @@ public class CodeInfo : Object } // user defined functions + public void show (Gtk.Widget onbtn) { + this.el.set_parent(onbtn); + this.el.popup(); + } public class Xcls_Paned1 : Object { public Gtk.Paned el; @@ -47,17 +51,167 @@ public class CodeInfo : Object // my vars (dec) // set gobject values - var child_1 = new Xcls_ScrolledWindow2( _this ); + var child_1 = new Xcls_Notebook2( _this ); + child_1.ref(); + this.el.end_child = child_1.el; + var child_2 = new Xcls_Box5( _this ); + child_2.ref(); + this.el.start_child = child_2.el; + } + + // user defined functions + } + public class Xcls_Notebook2 : Object + { + public Gtk.Notebook el; + private CodeInfo _this; + + + // my vars (def) + + // ctor + public Xcls_Notebook2(CodeInfo _owner ) + { + _this = _owner; + this.el = new Gtk.Notebook(); + + // my vars (dec) + + // set gobject values + var child_1 = new Xcls_NotebookPage3( _this , this); + child_1.ref(); + } + + // user defined functions + } + public class Xcls_NotebookPage3 : Object + { + public Gtk.NotebookPage el; + private CodeInfo _this; + + + // my vars (def) + public string tab_label; + + // ctor + public Xcls_NotebookPage3(CodeInfo _owner , Xcls_Notebook2 notebook) + { + _this = _owner; + + // my vars (dec) + this.tab_label = "Documentation"; + var child_1 = new Xcls_WebView4( _this ); + child_1.ref(); + notebook.el.append_page( child_1.el , new Gtk.Label(this.tab_label) ); + } + + // user defined functions + } + public class Xcls_WebView4 : Object + { + public WebKit.WebView el; + private CodeInfo _this; + + + // my vars (def) + + // ctor + public Xcls_WebView4(CodeInfo _owner ) + { + _this = _owner; + this.el = new WebKit.WebView(); + + // my vars (dec) + + // set gobject values + } + + // user defined functions + } + + + + public class Xcls_Box5 : Object + { + public Gtk.Box el; + private CodeInfo _this; + + + // my vars (def) + + // ctor + public Xcls_Box5(CodeInfo _owner ) + { + _this = _owner; + this.el = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 ); + + // my vars (dec) + + // set gobject values + this.el.hexpand = true; + this.el.vexpand = true; + var child_1 = new Xcls_SearchBar6( _this ); child_1.ref(); - this.el.start_child = child_1.el; - var child_2 = new Xcls_Notebook4( _this ); + this.el.append( child_1.el ); + var child_2 = new Xcls_ScrolledWindow595( _this ); child_2.ref(); - this.el.end_child = child_2.el; + this.el.append( child_2.el ); + } + + // user defined functions + } + public class Xcls_SearchBar6 : Object + { + public Gtk.SearchBar el; + private CodeInfo _this; + + + // my vars (def) + + // ctor + public Xcls_SearchBar6(CodeInfo _owner ) + { + _this = _owner; + this.el = new Gtk.SearchBar(); + + // my vars (dec) + + // set gobject values + this.el.hexpand = true; + this.el.search_mode_enabled = true; + var child_1 = new Xcls_SearchEntry1881( _this ); + child_1.ref(); + this.el.child = child_1.el; + } + + // user defined functions + } + public class Xcls_SearchEntry1881 : Object + { + public Gtk.SearchEntry el; + private CodeInfo _this; + + + // my vars (def) + + // ctor + public Xcls_SearchEntry1881(CodeInfo _owner ) + { + _this = _owner; + this.el = new Gtk.SearchEntry(); + + // my vars (dec) + + // set gobject values + this.el.hexpand = true; + this.el.activates_default = true; } // user defined functions } - public class Xcls_ScrolledWindow2 : Object + + + public class Xcls_ScrolledWindow595 : Object { public Gtk.ScrolledWindow el; private CodeInfo _this; @@ -66,7 +220,7 @@ public class CodeInfo : Object // my vars (def) // ctor - public Xcls_ScrolledWindow2(CodeInfo _owner ) + public Xcls_ScrolledWindow595(CodeInfo _owner ) { _this = _owner; this.el = new Gtk.ScrolledWindow(); @@ -74,95 +228,212 @@ public class CodeInfo : Object // my vars (dec) // set gobject values - var child_1 = new Xcls_ListView3( _this ); + this.el.hexpand = true; + this.el.vexpand = true; + var child_1 = new Xcls_ColumnView596( _this ); child_1.ref(); this.el.child = child_1.el; } // user defined functions } - public class Xcls_ListView3 : Object + public class Xcls_ColumnView596 : Object { - public Gtk.ListView el; + public Gtk.ColumnView el; private CodeInfo _this; // my vars (def) // ctor - public Xcls_ListView3(CodeInfo _owner ) + public Xcls_ColumnView596(CodeInfo _owner ) { _this = _owner; - this.el = new Gtk.ListView( null, null ); + var child_1 = new Xcls_SingleSelection35( _this ); + child_1.ref(); + this.el = new Gtk.ColumnView( child_1.el ); // my vars (dec) // set gobject values + var child_2 = new Xcls_ColumnViewColumn597( _this ); + child_2.ref(); + this.el.append_column( child_2.el ); } // user defined functions } + public class Xcls_ColumnViewColumn597 : Object + { + public Gtk.ColumnViewColumn el; + private CodeInfo _this; + + + // my vars (def) + + // ctor + public Xcls_ColumnViewColumn597(CodeInfo _owner ) + { + _this = _owner; + var child_1 = new Xcls_SignalListItemFactory95( _this ); + child_1.ref(); + this.el = new Gtk.ColumnViewColumn( "Object Navigation", child_1.el ); + // my vars (dec) - public class Xcls_Notebook4 : Object + // set gobject values + this.el.expand = true; + } + + // user defined functions + } + public class Xcls_SignalListItemFactory95 : Object { - public Gtk.Notebook el; + public Gtk.SignalListItemFactory el; private CodeInfo _this; // my vars (def) // ctor - public Xcls_Notebook4(CodeInfo _owner ) + public Xcls_SignalListItemFactory95(CodeInfo _owner ) { _this = _owner; - this.el = new Gtk.Notebook(); + this.el = new Gtk.SignalListItemFactory(); // my vars (dec) // set gobject values - var child_1 = new Xcls_NotebookPage5( _this , this); - child_1.ref(); + + //listeners + this.el.setup.connect( (listitem) => { + + var expand = new Gtk.TreeExpander(); + + expand.set_indent_for_depth(true); + expand.set_indent_for_icon(true); + var hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL,0); + var icon = new Gtk.Image(); + var lbl = new Gtk.Label(""); + lbl.use_markup = true; + lbl.ellipsize = Pango.EllipsizeMode.END; + + icon.margin_end = 4; + lbl.justify = Gtk.Justification.LEFT; + lbl.xalign = 0; + + // listitem.activatable = true; ?? + + hbox.append(icon); + hbox.append(lbl); + expand.set_child(hbox); + ((Gtk.ListItem)listitem).set_child(expand); + + }); + this.el.bind.connect( (listitem) => { + // GLib.debug("listitme is is %s", ((Gtk.ListItem)listitem).get_type().name()); + + //var expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child(); + var expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child(); + + + var hbox = (Gtk.Box) expand.child; + + + var img = (Gtk.Image) hbox.get_first_child(); + var lbl = (Gtk.Label) img.get_next_sibling(); + + var lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item(); + var node = (JsRender.Node) lr.get_item(); + if (node == null || node.fqn() == "") { + return; + } + + expand.set_hide_expander( !node.hasChildren() ); + expand.set_list_row(lr); + + node.bind_property("iconResourceName", + img, "resource", + GLib.BindingFlags.SYNC_CREATE); + + node.bind_property("nodeTitleProp", + lbl, "label", + GLib.BindingFlags.SYNC_CREATE); + node.bind_property("nodeTipProp", + lbl, "tooltip_markup", + GLib.BindingFlags.SYNC_CREATE); + // bind image... + + }); } // user defined functions } - public class Xcls_NotebookPage5 : Object + + + public class Xcls_SingleSelection35 : Object { - public Gtk.NotebookPage el; + public Gtk.SingleSelection el; private CodeInfo _this; // my vars (def) - public string tab_label; // ctor - public Xcls_NotebookPage5(CodeInfo _owner , Xcls_Notebook4 notebook) + public Xcls_SingleSelection35(CodeInfo _owner ) { _this = _owner; + var child_1 = new Xcls_TreeListModel58( _this ); + child_1.ref(); + this.el = new Gtk.SingleSelection( child_1.el ); // my vars (dec) - this.tab_label = "details"; - var child_1 = new Xcls_Box483( _this ); + + // set gobject values + } + + // user defined functions + } + public class Xcls_TreeListModel58 : Object + { + public Gtk.TreeListModel el; + private CodeInfo _this; + + + // my vars (def) + + // ctor + public Xcls_TreeListModel58(CodeInfo _owner ) + { + _this = _owner; + var child_1 = new Xcls_ListStore81( _this ); child_1.ref(); - notebook.el.append_page( child_1 , new Gtk.Label(this.tab_label) ); + this.el = new Gtk.TreeListModel( child_1.el, false, true, (item) => { + //fixme... + return ((JsRender.Node)item).childstore; +} + ); + + // my vars (dec) + + // set gobject values } // user defined functions } - public class Xcls_Box483 : Object + public class Xcls_ListStore81 : Object { - public Gtk.Box el; + public GLib.ListStore el; private CodeInfo _this; // my vars (def) // ctor - public Xcls_Box483(CodeInfo _owner ) + public Xcls_ListStore81(CodeInfo _owner ) { _this = _owner; - this.el = new Gtk.Box( Gtk.Orientation.HORIZONTAL, 0 ); + this.el = new GLib.ListStore( typeof(JsRender.Node) ); // my vars (dec) @@ -175,4 +446,7 @@ public class CodeInfo : Object + + + } diff --git a/src/Builder4/Editor.bjs b/src/Builder4/Editor.bjs index 29ed59d41..dd0a0c271 100644 --- a/src/Builder4/Editor.bjs +++ b/src/Builder4/Editor.bjs @@ -23,882 +23,1169 @@ "int last_search_end" : 0, "items" : [ { - "$ homogeneous" : false, "$ xns" : "Gtk", "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", - "bool hexpand" : true, "items" : [ { "$ xns" : "Gtk", - "id" : "save_button", - "label" : "Save", - "listeners" : { - "clicked" : [ - " () => { ", - " _this.saveContents();", - "}", - " " - ] - }, - "xtype" : "Button" - }, - { - "$ xns" : "Gtk", - "bool hexpand" : true, - "xtype" : "Label" - }, - { - "$ xns" : "Gtk", - "* ctor" : "new Gtk.Scale.with_range (Gtk.Orientation.HORIZONTAL,6, 30, 1)", - "* init" : [ - "{", - "\t//this.el.set_range(6,30);", - " \tthis.el.set_value ( BuilderApplication.settings.editor_font_size);", - " \tBuilderApplication.settings.editor_font_size_updated.connect(", - " \t\t() => {", - " \t\t\tBuilderApplication.settings.editor_font_size_inchange = true;", - " \t\t//\tGLib.debug(\"update range\");", - " \t\t \tthis.el.set_value (BuilderApplication.settings.editor_font_size);", - " \t\t \tBuilderApplication.settings.editor_font_size_inchange = false;", - " \t\t}", - "\t);", - "\t", - " ", - "}", - "" - ], - "bool draw_value" : false, - "bool has_origin" : true, - "bool sensitive" : true, - "int digits" : 0, - "int width_request" : 200, - "listeners" : { - "change_value" : [ - "(st, val ) => {", - "\tif (BuilderApplication.settings.editor_font_size_inchange) {", - "\t\treturn false;", - "\t}", - " \tBuilderApplication.settings.editor_font_size = val;", - " \treturn false;", - "}" - ] - }, - "xtype" : "Scale" - }, - { - "$ xns" : "Gtk", - "id" : "close_btn", + "* prop" : "start_child", + "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", + "int spacing" : 0, "items" : [ { + "$ homogeneous" : false, "$ xns" : "Gtk", - "* prop" : "child", - "Gtk.IconSize icon_size" : "Gtk.IconSize.NORMAL", - "string icon_name" : "window-close", - "xtype" : "Image" - } - ], - "listeners" : { - "clicked" : [ - " () => { ", - " _this.saveContents();", - " _this.window.windowstate.switchState(WindowState.State.PREVIEW);", - "}", - " " - ] - }, - "string icon_name" : "window-close", - "xtype" : "Button" - } - ], - "xtype" : "Box" - }, - { - "$ xns" : "Gtk", - "Gtk.PolicyType hscrollbar_policy" : "Gtk.PolicyType.AUTOMATIC", - "Gtk.PolicyType vscrollbar_policy" : "Gtk.PolicyType.AUTOMATIC", - "bool overlay_scrolling" : false, - "bool vexpand" : true, - "id" : "RightEditor", - "items" : [ - { - "# Gtk.CssProvider css" : "null", - "$ gboolean auto_indent" : true, - "$ xns" : "GtkSource", - "* init" : [ - "", - " ", - "\t", - " ", - " ", - "this.el.completion.add_provider(", - "\tnew Palete.CompletionProvider(_this)", - ");", - " ", - "var hover = this.el.get_hover();", - "hover.add_provider(new Palete.HoverProvider(_this));", - "", - "//this.el.completion.unblock_interactive();", - "this.el.completion.select_on_show = true; // select", - "//this.el.completion.remember_info_visibility\t = true;", - "", - "", - "var attrs = new GtkSource.MarkAttributes();", - "", - "attrs.set_icon_name ( \"process-stop\"); ", - "attrs.query_tooltip_text.connect(( mark) => {", - " GLib.debug(\"tooltip query? %s\", mark.name);", - " return strdup( mark.name);", - "});", - " attrs.query_tooltip_markup.connect(( mark) => {", - " GLib.debug(\"tooltip query? %s\", mark.name);", - " return strdup( mark.name);", - "});", - "this.el.set_mark_attributes (\"ERR\", attrs, 1);", - "attrs.ref();", - "", - "", - "var wattrs = new GtkSource.MarkAttributes();", - "wattrs.set_icon_name ( \"process-stop\"); ", - "wattrs.query_tooltip_text.connect(( mark) => {", - " GLib.debug(\"tooltip query? %s\", mark.name);", - " return strdup(mark.name);", - "});", - "wattrs.query_tooltip_markup.connect(( mark) => {", - " GLib.debug(\"tooltip query? %s\", mark.name);", - " return strdup(mark.name);", - "});", - "this.el.set_mark_attributes (\"WARN\", wattrs, 1);", - "wattrs.ref();", - "", - " ", - "var dattrs = new GtkSource.MarkAttributes();", - " ", - "dattrs.set_icon_name ( \"process-stop\"); ", - "", - "dattrs.query_tooltip_text.connect(( mark) => {", - "\tGLib.debug(\"tooltip query? %s\", mark.name);", - " return strdup(mark.name);", - "});", - "//dattrs.query_tooltip_markup.connect(( mark) => {", - "//\tGLib.debug(\"tooltip query? %s\", mark.name);", - " // return strdup(mark.name);", - "//});", - "this.el.set_mark_attributes (\"DEPR\", dattrs, 1);", - "dattrs.ref(); ", - "", - " this.el.get_space_drawer().set_matrix(null);", - " this.el.get_space_drawer().set_types_for_locations( ", - "\tGtkSource.SpaceLocationFlags.ALL,", - "\tGtkSource.SpaceTypeFlags.ALL", - ");", - "this.el.get_space_drawer().set_enable_matrix(true);", - "" - ], - "* prop" : "child", - "bool has_tooltip" : true, - "bool hexpand" : true, - "bool insert_spaces_instead_of_tabs" : true, - "bool vexpand" : true, - "boolean show_line_marks" : true, - "boolean show_line_numbers" : true, - "css_classes" : "{ \"code-editor\" }", - "gboolean highlight_current_line" : true, - "id" : "view", - "indent_width" : 4, - "items" : [ - { - "$ Gee.HashMap? xmarks" : "null", - "$ xns" : "GtkSource", - "$ xtype" : "Buffer", - "* init" : [ - "", - "var buf = this.el;", - "buf.create_tag (\"bold\", \"weight\", Pango.Weight.BOLD);", - "buf.create_tag (\"type\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#204a87\");", - "buf.create_tag (\"keyword\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#a40000\");", - "buf.create_tag (\"text\", \"weight\", Pango.Weight.NORMAL, \"foreground\", \"#729fcf\");", - "buf.create_tag (\"number\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#ad7fa8\");", - "buf.create_tag (\"method\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#729fcf\");", - "buf.create_tag (\"property\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#BC1F51\");", - "buf.create_tag (\"variable\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#A518B5\");", - "", - "", - "buf.create_tag (\"ERR\", \"weight\", Pango.Weight.BOLD, \"background\", \"pink\");", - "buf.create_tag (\"WARN\", \"weight\", Pango.Weight.BOLD, \"background\", \"#ABF4EB\");", - "buf.create_tag (\"DEPR\", \"weight\", Pango.Weight.BOLD, \"background\", \"#EEA9FF\");", - "", - "", - "" - ], - "* prop" : "buffer", - "bool check_queued" : false, - "bool enable_undo" : true, - "bool highlight_matching_brackets" : true, - "bool highlight_syntax" : true, - "id" : "buffer", - "int error_line" : "-1", - "listeners" : { - "changed" : [ - " () => {", - " // check syntax??", - " // ??needed..??", - " _this.save_button.el.sensitive = true;", - " print(\"EDITOR CHANGED\");", - " this.checkSyntax();", - " ", - " _this.dirty = true;", - "", - " // this.get('/LeftPanel.model').changed( str , false);", - " return ;", - "}", - "" - ] - }, - "| bool OLDhighlightErrorsJson" : [ - "(string type, Json.Object obj) {", - "\tGtk.TextIter start;", - "\tGtk.TextIter end; ", - "\tthis.el.get_bounds (out start, out end);", - "", - "\tthis.el.remove_source_marks (start, end, type);", - "\tGLib.debug(\"highlight errors\");\t\t ", - "", - "\t // we should highlight other types of errors..", - "", - "\tif (!obj.has_member(type)) {", - "\t\tGLib.debug(\"Return has no errors\\n\");", - "\t\treturn true;", - "\t}", - "", - "\tif (_this.window.windowstate.state != WindowState.State.CODEONLY ", - "\t\t&&", - "\t\t_this.window.windowstate.state != WindowState.State.CODE", - "\t\t) {", - "\t\tGLib.debug(\"windowstate != CODEONLY?\");", - "\t\t", - "\t\treturn true;", - "\t} ", - "", - "\t//this.marks = new Gee.HashMap();", - "\tvar err = obj.get_object_member(type);", - " ", - "\tif (_this.file == null) {", - "\t\tGLib.debug(\"file is null?\");", - "\t\treturn true;", - "", - "\t}", - "\tvar valafn = _this.file.path;", - "", - "\tif (_this.file.xtype != \"PlainFile\") {", - "", - "\t\tvalafn = \"\";", - "\t\ttry { ", - "\t\t\tvar regex = new Regex(\"\\\\.bjs$\");", - "\t\t\t// should not happen", - "\t \t\tvalafn = regex.replace(_this.file.path,_this.file.path.length , 0 , \".vala\");", - "\t\t} catch (GLib.RegexError e) {", - "\t\t\treturn true;", - "\t\t} ", - "", - "", - "", - "\t}", - "\tif (!err.has_member(valafn)) {", - "\t\tGLib.debug(\"File path has no errors\");", - "\t\treturn true;", - "\t}", - "", - "\tvar lines = err.get_object_member(valafn);", - "\t", - "\tvar offset = 1;", - "\tif (obj.has_member(\"line_offset\")) { // ?? why??", - "\t\toffset = (int)obj.get_int_member(\"line_offset\") + 1;", - "\t}", - "", - "", - "\tvar tlines = this.el.get_line_count () +1;", - "\t", - "\tif (_this.prop != null) {", - "\t", - "\t\ttlines = _this.prop.end_line + 1;", - "\t\toffset = _this.prop.start_line + 1;", - "\t", - "\t}", - "\t", - "", - "", - "\tlines.foreach_member((obj, line, node) => {", - "\t\t", - "\t Gtk.TextIter iter;", - "// print(\"get inter\\n\");", - "\t var eline = int.parse(line) - offset;", - "\t GLib.debug(\"GOT ERROR on line %s -- converted to %d (offset = %d)\\n\", line,eline, offset);", - "\t ", - "\t ", - "\t if (eline > tlines || eline < 0) {", - "\t return;", - "\t }", - "\t ", - "\t ", - "\t this.el.get_iter_at_line( out iter, eline);", - "\t //print(\"mark line\\n\");", - "\t var msg = \"\";", - "\t var ar = lines.get_array_member(line);", - "\t for (var i = 0 ; i < ar.get_length(); i++) {", - "\t \tif (ar.get_string_element(i) == \"Success\") {", - "\t \t\tcontinue;", - " \t\t}", - "\t\t\tmsg += (msg.length > 0) ? \"\\n\" : \"\";", - "\t\t\tmsg += ar.get_string_element(i);", - "\t\t}", - "\t\tif (msg == \"\") {", - "\t\t\treturn;", - "\t\t}", - "\t\tmsg = \"Line: %d\".printf(eline+1) + \" \" + msg;", - "\t this.el.create_source_mark(msg, type, iter);", - "\t GLib.debug(\"set line %d to %m\", eline, msg);", - "\t // this.marks.set(eline, msg);", - "\t} );", - "\treturn false;", - "", - "", - "", - "", - "", - "\t}", - "" - ], - "| bool checkSyntax" : [ - " () {", - " ", - " ", - " var str = this.toString();", - " ", - " // needed???", - " if (this.error_line > 0) {", - " Gtk.TextIter start;", - " Gtk.TextIter end; ", - " this.el.get_bounds (out start, out end);", - "", - " this.el.remove_source_marks (start, end, null);", - " }", - " if (str.length < 1) {", - " print(\"checkSyntax - empty string?\\n\");", - " return true;", - " }", - " ", - " // bit presumptiona", - " if (_this.file.xtype == \"PlainFile\") {", - " ", - " // assume it's gtk...", - " var oldcode =_this.file.toSource();", - " _this.file.setSource(str);", - "\t BuilderApplication.showSpinner(\"appointment soon\",\"document change pending\");", - " \t_this.file.getLanguageServer().document_change(_this.file);", - "", - " _this.file.setSource(oldcode);", - " ", - "\t\t ", - " return true;", - " ", - " }", - " if (_this.file == null) {", - " return true;", - " }", - " ", - " ", - "", - " ", - " ", - " GLib.debug(\"calling validate\"); ", - " // clear the buttons.", - " \tif (_this.prop.name == \"xns\" || _this.prop.name == \"xtype\") {", - "\t\treturn true ;", - "\t}", - "\tvar oldcode = _this.prop.val;", - "\t", - "\t_this.prop.val = str;", - "\t_this.node.updated_count++;", - " _this.file.getLanguageServer().document_change(_this.file);", - " _this.node.updated_count++;", - " _this.prop.val = oldcode;", - " ", - " ", - " //print(\"done mark line\\n\");", - " ", - " return true; // at present allow saving - even if it's invalid..", - "}", - "" - ], - "| bool highlightErrors" : [ - "( Gee.HashMap validate_res) {", - " ", - "\tthis.error_line = validate_res.size;", - "", - "\tif (this.error_line < 1) {", - "\t\treturn true;", - "\t}", - "\tvar tlines = this.el.get_line_count ();", - "\tGtk.TextIter iter;", - "\tvar valiter = validate_res.map_iterator();", - "\twhile (valiter.next()) {", - "", - "\t// print(\"get inter\\n\");", - "\t\tvar eline = valiter.get_key();", - "\t\tif (eline > tlines) {", - "\t\t\tcontinue;", - "\t\t}", - "\t\tthis.el.get_iter_at_line( out iter, eline);", - "\t\t//print(\"mark line\\n\");", - "\t\tthis.el.create_source_mark(valiter.get_value(), \"ERR\", iter);", - "\t} ", - "\treturn false;", - "}" + "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", + "bool hexpand" : true, + "items" : [ + { + "$ xns" : "Gtk", + "id" : "save_button", + "label" : "Save", + "listeners" : { + "clicked" : [ + " () => { ", + " _this.saveContents();", + "}", + " " + ] + }, + "xtype" : "Button" + }, + { + "$ xns" : "Gtk", + "bool hexpand" : true, + "xtype" : "Label" + }, + { + "$ xns" : "Gtk", + "* ctor" : "new Gtk.Scale.with_range (Gtk.Orientation.HORIZONTAL,6, 30, 1)", + "* init" : [ + "{", + "\t//this.el.set_range(6,30);", + " \tthis.el.set_value ( BuilderApplication.settings.editor_font_size);", + " \tBuilderApplication.settings.editor_font_size_updated.connect(", + " \t\t() => {", + " \t\t\tBuilderApplication.settings.editor_font_size_inchange = true;", + " \t\t//\tGLib.debug(\"update range\");", + " \t\t \tthis.el.set_value (BuilderApplication.settings.editor_font_size);", + " \t\t \tBuilderApplication.settings.editor_font_size_inchange = false;", + " \t\t}", + "\t);", + "\t", + " ", + "}", + "" + ], + "bool draw_value" : false, + "bool has_origin" : true, + "bool sensitive" : true, + "int digits" : 0, + "int width_request" : 200, + "listeners" : { + "change_value" : [ + "(st, val ) => {", + "\tif (BuilderApplication.settings.editor_font_size_inchange) {", + "\t\treturn false;", + "\t}", + " \tBuilderApplication.settings.editor_font_size = val;", + " \treturn false;", + "}" + ] + }, + "xtype" : "Scale" + }, + { + "$ xns" : "Gtk", + "id" : "close_btn", + "items" : [ + { + "$ xns" : "Gtk", + "* prop" : "child", + "Gtk.IconSize icon_size" : "Gtk.IconSize.NORMAL", + "string icon_name" : "window-close", + "xtype" : "Image" + } + ], + "listeners" : { + "clicked" : [ + " () => { ", + " _this.saveContents();", + " _this.window.windowstate.switchState(WindowState.State.PREVIEW);", + "}", + " " + ] + }, + "string icon_name" : "window-close", + "xtype" : "Button" + } ], - "| string toString" : [ - " () {", - " ", - " Gtk.TextIter s;", - " Gtk.TextIter e;", - " this.el.get_start_iter(out s);", - " this.el.get_end_iter(out e);", - " var ret = this.el.get_text(s,e,true);", - " //print(\"TO STRING? \" + ret);", - " return ret;", - "}", - " " - ] + "xtype" : "Box" }, { - "# bool is_control" : false, "$ xns" : "Gtk", - "id" : "keystate", - "listeners" : { - "key_pressed" : [ - "(keyval, keycode, state) => {", - "", - " \tif (keyval == Gdk.Key.Control_L || keyval == Gdk.Key.Control_R) {", - " \t\tthis.is_control = true;", - "\t}", - "\treturn false;", - "}", - "" - ], - "key_released" : [ - "(keyval, keycode, state) => {", - "", - " \t if (keyval == Gdk.Key.Control_L || keyval == Gdk.Key.Control_R) {", - " \t\tthis.is_control = false;", - "\t}", - " if (keyval == Gdk.Key.s && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", - " GLib.debug(\"SAVE: ctrl-S pressed\");", - " _this.saveContents();", - " return;", - " }", - " ", - " if (keyval == Gdk.Key.g && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", - "\t GLib.debug(\"SAVE: ctrl-g pressed\");", - "\t\t_this.forwardSearch(true);", - "\t return;", - "\t}", - "\tif (keyval == Gdk.Key.f && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", - "\t GLib.debug(\"SAVE: ctrl-f pressed\");", - "\t\t_this.search_entry.el.grab_focus();", - "\t\t_this.search_entry.el.select_region(0,-1);", - "\t return;", - "\t}", - "\tif (keyval == Gdk.Key.space && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", - "\t\t_this.view.el.show_completion();", - "\t}", - "\t", - "\tGtk.TextIter iter;", - "\t_this.buffer.el.get_iter_at_offset( out iter, _this.buffer.el.cursor_position); ", - "\tvar line = iter.get_line();", - "\tvar offset = iter.get_line_offset();", - "\tGLib.debug(\"line %d off %d\", line ,offset);", - "\tif (_this.prop != null) {", - "\t\tline += _this.prop.start_line + 1; // i think..", - "\t\toffset += 12; // should probably be 8 without namespaced ", - "\t\tGLib.debug(\"guess line %d off %d\", line ,offset);", - "\t} ", - " //_this.view.el.show_completion();", - " // print(event.key.keyval)", - " ", - " ", - " ", - " ", - " return;", - " ", - " ", - "}", - "" - ] - }, - "xtype" : "EventControllerKey" + "Gtk.PolicyType hscrollbar_policy" : "Gtk.PolicyType.AUTOMATIC", + "Gtk.PolicyType vscrollbar_policy" : "Gtk.PolicyType.AUTOMATIC", + "bool overlay_scrolling" : false, + "bool vexpand" : true, + "id" : "RightEditor", + "items" : [ + { + "# Gtk.CssProvider css" : "null", + "$ gboolean auto_indent" : true, + "$ xns" : "GtkSource", + "* init" : [ + "", + " ", + "\t", + " ", + " ", + "this.el.completion.add_provider(", + "\tnew Palete.CompletionProvider(_this)", + ");", + "", + "// hover seems pretty useless.. - ??", + "//var hover = this.el.get_hover();", + "//hover.add_provider(new Palete.HoverProvider(_this));", + "", + "//this.el.completion.unblock_interactive();", + "this.el.completion.select_on_show = true; // select", + "//this.el.completion.remember_info_visibility\t = true;", + "", + "", + "var attrs = new GtkSource.MarkAttributes();", + "", + "attrs.set_icon_name ( \"process-stop\"); ", + "attrs.query_tooltip_text.connect(( mark) => {", + " GLib.debug(\"tooltip query? %s\", mark.name);", + " return strdup( mark.name);", + "});", + " attrs.query_tooltip_markup.connect(( mark) => {", + " GLib.debug(\"tooltip query? %s\", mark.name);", + " return strdup( mark.name);", + "});", + "this.el.set_mark_attributes (\"ERR\", attrs, 1);", + "attrs.ref();", + "", + "", + "var wattrs = new GtkSource.MarkAttributes();", + "wattrs.set_icon_name ( \"process-stop\"); ", + "wattrs.query_tooltip_text.connect(( mark) => {", + " GLib.debug(\"tooltip query? %s\", mark.name);", + " return strdup(mark.name);", + "});", + "wattrs.query_tooltip_markup.connect(( mark) => {", + " GLib.debug(\"tooltip query? %s\", mark.name);", + " return strdup(mark.name);", + "});", + "this.el.set_mark_attributes (\"WARN\", wattrs, 1);", + "wattrs.ref();", + "", + " ", + "var dattrs = new GtkSource.MarkAttributes();", + " ", + "dattrs.set_icon_name ( \"process-stop\"); ", + "", + "dattrs.query_tooltip_text.connect(( mark) => {", + "\tGLib.debug(\"tooltip query? %s\", mark.name);", + " return strdup(mark.name);", + "});", + "//dattrs.query_tooltip_markup.connect(( mark) => {", + "//\tGLib.debug(\"tooltip query? %s\", mark.name);", + " // return strdup(mark.name);", + "//});", + "this.el.set_mark_attributes (\"DEPR\", dattrs, 1);", + "dattrs.ref(); ", + "", + " this.el.get_space_drawer().set_matrix(null);", + " this.el.get_space_drawer().set_types_for_locations( ", + "\tGtkSource.SpaceLocationFlags.ALL,", + "\tGtkSource.SpaceTypeFlags.ALL", + ");", + "this.el.get_space_drawer().set_enable_matrix(true);", + "" + ], + "* prop" : "child", + "bool has_tooltip" : true, + "bool hexpand" : true, + "bool insert_spaces_instead_of_tabs" : true, + "bool vexpand" : true, + "boolean show_line_marks" : true, + "boolean show_line_numbers" : true, + "css_classes" : "{ \"code-editor\" }", + "gboolean highlight_current_line" : true, + "id" : "view", + "indent_width" : 4, + "items" : [ + { + "$ Gee.HashMap? xmarks" : "null", + "$ xns" : "GtkSource", + "$ xtype" : "Buffer", + "* init" : [ + "", + "var buf = this.el;", + "buf.create_tag (\"bold\", \"weight\", Pango.Weight.BOLD);", + "buf.create_tag (\"type\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#204a87\");", + "buf.create_tag (\"keyword\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#a40000\");", + "buf.create_tag (\"text\", \"weight\", Pango.Weight.NORMAL, \"foreground\", \"#729fcf\");", + "buf.create_tag (\"number\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#ad7fa8\");", + "buf.create_tag (\"method\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#729fcf\");", + "buf.create_tag (\"property\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#BC1F51\");", + "buf.create_tag (\"variable\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#A518B5\");", + "", + "", + "buf.create_tag (\"ERR\", \"weight\", Pango.Weight.BOLD, \"background\", \"pink\");", + "buf.create_tag (\"WARN\", \"weight\", Pango.Weight.BOLD, \"background\", \"#ABF4EB\");", + "buf.create_tag (\"DEPR\", \"weight\", Pango.Weight.BOLD, \"background\", \"#EEA9FF\");", + "", + "", + "" + ], + "* prop" : "buffer", + "bool check_queued" : false, + "bool enable_undo" : true, + "bool highlight_matching_brackets" : true, + "bool highlight_syntax" : true, + "id" : "buffer", + "int error_line" : "-1", + "listeners" : { + "changed" : [ + " () => {", + " // check syntax??", + " // ??needed..??", + " _this.save_button.el.sensitive = true;", + " print(\"EDITOR CHANGED\");", + " this.checkSyntax();", + " ", + " _this.dirty = true;", + "", + " // this.get('/LeftPanel.model').changed( str , false);", + " return ;", + "}", + "" + ] + }, + "| bool OLDhighlightErrorsJson" : [ + "(string type, Json.Object obj) {", + "\tGtk.TextIter start;", + "\tGtk.TextIter end; ", + "\tthis.el.get_bounds (out start, out end);", + "", + "\tthis.el.remove_source_marks (start, end, type);", + "\tGLib.debug(\"highlight errors\");\t\t ", + "", + "\t // we should highlight other types of errors..", + "", + "\tif (!obj.has_member(type)) {", + "\t\tGLib.debug(\"Return has no errors\\n\");", + "\t\treturn true;", + "\t}", + "", + "\tif (_this.window.windowstate.state != WindowState.State.CODEONLY ", + "\t\t&&", + "\t\t_this.window.windowstate.state != WindowState.State.CODE", + "\t\t) {", + "\t\tGLib.debug(\"windowstate != CODEONLY?\");", + "\t\t", + "\t\treturn true;", + "\t} ", + "", + "\t//this.marks = new Gee.HashMap();", + "\tvar err = obj.get_object_member(type);", + " ", + "\tif (_this.file == null) {", + "\t\tGLib.debug(\"file is null?\");", + "\t\treturn true;", + "", + "\t}", + "\tvar valafn = _this.file.path;", + "", + "\tif (_this.file.xtype != \"PlainFile\") {", + "", + "\t\tvalafn = \"\";", + "\t\ttry { ", + "\t\t\tvar regex = new Regex(\"\\\\.bjs$\");", + "\t\t\t// should not happen", + "\t \t\tvalafn = regex.replace(_this.file.path,_this.file.path.length , 0 , \".vala\");", + "\t\t} catch (GLib.RegexError e) {", + "\t\t\treturn true;", + "\t\t} ", + "", + "", + "", + "\t}", + "\tif (!err.has_member(valafn)) {", + "\t\tGLib.debug(\"File path has no errors\");", + "\t\treturn true;", + "\t}", + "", + "\tvar lines = err.get_object_member(valafn);", + "\t", + "\tvar offset = 1;", + "\tif (obj.has_member(\"line_offset\")) { // ?? why??", + "\t\toffset = (int)obj.get_int_member(\"line_offset\") + 1;", + "\t}", + "", + "", + "\tvar tlines = this.el.get_line_count () +1;", + "\t", + "\tif (_this.prop != null) {", + "\t", + "\t\ttlines = _this.prop.end_line + 1;", + "\t\toffset = _this.prop.start_line + 1;", + "\t", + "\t}", + "\t", + "", + "", + "\tlines.foreach_member((obj, line, node) => {", + "\t\t", + "\t Gtk.TextIter iter;", + "// print(\"get inter\\n\");", + "\t var eline = int.parse(line) - offset;", + "\t GLib.debug(\"GOT ERROR on line %s -- converted to %d (offset = %d)\\n\", line,eline, offset);", + "\t ", + "\t ", + "\t if (eline > tlines || eline < 0) {", + "\t return;", + "\t }", + "\t ", + "\t ", + "\t this.el.get_iter_at_line( out iter, eline);", + "\t //print(\"mark line\\n\");", + "\t var msg = \"\";", + "\t var ar = lines.get_array_member(line);", + "\t for (var i = 0 ; i < ar.get_length(); i++) {", + "\t \tif (ar.get_string_element(i) == \"Success\") {", + "\t \t\tcontinue;", + " \t\t}", + "\t\t\tmsg += (msg.length > 0) ? \"\\n\" : \"\";", + "\t\t\tmsg += ar.get_string_element(i);", + "\t\t}", + "\t\tif (msg == \"\") {", + "\t\t\treturn;", + "\t\t}", + "\t\tmsg = \"Line: %d\".printf(eline+1) + \" \" + msg;", + "\t this.el.create_source_mark(msg, type, iter);", + "\t GLib.debug(\"set line %d to %m\", eline, msg);", + "\t // this.marks.set(eline, msg);", + "\t} );", + "\treturn false;", + "", + "", + "", + "", + "", + "\t}", + "" + ], + "| bool checkSyntax" : [ + " () {", + " ", + " ", + " var str = this.toString();", + " ", + " // needed???", + " if (this.error_line > 0) {", + " Gtk.TextIter start;", + " Gtk.TextIter end; ", + " this.el.get_bounds (out start, out end);", + "", + " this.el.remove_source_marks (start, end, null);", + " }", + " if (str.length < 1) {", + " print(\"checkSyntax - empty string?\\n\");", + " return true;", + " }", + " ", + " // bit presumptiona", + " if (_this.file.xtype == \"PlainFile\") {", + " ", + " // assume it's gtk...", + " var oldcode =_this.file.toSource();", + " _this.file.setSource(str);", + "\t BuilderApplication.showSpinner(\"appointment soon\",\"document change pending\");", + " \t_this.file.getLanguageServer().document_change(_this.file);", + "", + " _this.file.setSource(oldcode);", + " ", + "\t\t ", + " return true;", + " ", + " }", + " if (_this.file == null) {", + " return true;", + " }", + " ", + " ", + "", + " ", + " ", + " GLib.debug(\"calling validate\"); ", + " // clear the buttons.", + " \tif (_this.prop.name == \"xns\" || _this.prop.name == \"xtype\") {", + "\t\treturn true ;", + "\t}", + "\tvar oldcode = _this.prop.val;", + "\t", + "\t_this.prop.val = str;", + "\t_this.node.updated_count++;", + " _this.file.getLanguageServer().document_change(_this.file);", + " _this.node.updated_count++;", + " _this.prop.val = oldcode;", + " ", + " ", + " //print(\"done mark line\\n\");", + " ", + " return true; // at present allow saving - even if it's invalid..", + "}", + "" + ], + "| bool highlightErrors" : [ + "( Gee.HashMap validate_res) {", + " ", + "\tthis.error_line = validate_res.size;", + "", + "\tif (this.error_line < 1) {", + "\t\treturn true;", + "\t}", + "\tvar tlines = this.el.get_line_count ();", + "\tGtk.TextIter iter;", + "\tvar valiter = validate_res.map_iterator();", + "\twhile (valiter.next()) {", + "", + "\t// print(\"get inter\\n\");", + "\t\tvar eline = valiter.get_key();", + "\t\tif (eline > tlines) {", + "\t\t\tcontinue;", + "\t\t}", + "\t\tthis.el.get_iter_at_line( out iter, eline);", + "\t\t//print(\"mark line\\n\");", + "\t\tthis.el.create_source_mark(valiter.get_value(), \"ERR\", iter);", + "\t} ", + "\treturn false;", + "}" + ], + "| string toString" : [ + " () {", + " ", + " Gtk.TextIter s;", + " Gtk.TextIter e;", + " this.el.get_start_iter(out s);", + " this.el.get_end_iter(out e);", + " var ret = this.el.get_text(s,e,true);", + " //print(\"TO STRING? \" + ret);", + " return ret;", + "}", + " " + ] + }, + { + "# bool is_control" : false, + "$ xns" : "Gtk", + "id" : "keystate", + "listeners" : { + "key_pressed" : [ + "(keyval, keycode, state) => {", + "", + " \tif (keyval == Gdk.Key.Control_L || keyval == Gdk.Key.Control_R) {", + " \t\tthis.is_control = true;", + "\t}", + "\treturn false;", + "}", + "" + ], + "key_released" : [ + "(keyval, keycode, state) => {", + "", + " \t if (keyval == Gdk.Key.Control_L || keyval == Gdk.Key.Control_R) {", + " \t\tthis.is_control = false;", + "\t}", + " if (keyval == Gdk.Key.s && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", + " GLib.debug(\"SAVE: ctrl-S pressed\");", + " _this.saveContents();", + " return;", + " }", + " ", + " if (keyval == Gdk.Key.g && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", + "\t GLib.debug(\"SAVE: ctrl-g pressed\");", + "\t\t_this.forwardSearch(true);", + "\t return;", + "\t}", + "\tif (keyval == Gdk.Key.f && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", + "\t GLib.debug(\"SAVE: ctrl-f pressed\");", + "\t\t_this.search_entry.el.grab_focus();", + "\t\t_this.search_entry.el.select_region(0,-1);", + "\t return;", + "\t}", + "\tif (keyval == Gdk.Key.space && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", + "\t\t_this.view.el.show_completion();", + "\t}", + "\t", + "\tGtk.TextIter iter;", + "\t_this.buffer.el.get_iter_at_offset( out iter, _this.buffer.el.cursor_position); ", + "\tvar line = iter.get_line();", + "\tvar offset = iter.get_line_offset();", + "\tGLib.debug(\"line %d off %d\", line ,offset);", + "\tif (_this.prop != null) {", + "\t\tline += _this.prop.start_line + 1; // i think..", + "\t\toffset += 12; // should probably be 8 without namespaced ", + "\t\tGLib.debug(\"guess line %d off %d\", line ,offset);", + "\t} ", + " //_this.view.el.show_completion();", + " // print(event.key.keyval)", + " ", + " ", + " ", + " ", + " return;", + " ", + " ", + "}", + "" + ] + }, + "xtype" : "EventControllerKey" + }, + { + "# double distance" : "0.0f", + "$ xns" : "Gtk", + "Gtk.EventControllerScrollFlags flags" : "Gtk.EventControllerScrollFlags.VERTICAL", + "listeners" : { + "scroll" : [ + "(dx, dy) => {", + "\tif (!_this.keystate.is_control) {", + "\t\treturn false;", + "\t}", + "\t //GLib.debug(\"scroll %f\", dy);", + "\t", + "\tthis.distance += dy;", + "\t", + "\t//GLib.debug(\"scroll %f / %f\", dy, this.distance);", + " ", + "\t if (this.distance < -1) {", + " ", + "\t\tBuilderApplication.settings.editor_font_size ++;", + "\t\tthis.distance = 0;", + "\t}", + "\tif (this.distance > 1) {", + "\t\tBuilderApplication.settings.editor_font_size --;", + "\t\tthis.distance = 0;", + "\t}", + "\t ", + "\treturn true;", + "}", + "" + ] + }, + "xtype" : "EventControllerScroll" + }, + { + "$ xns" : "Gtk", + "xtype" : "GestureClick" + } + ], + "listeners" : { + "query_tooltip" : [ + "(x, y, keyboard_tooltip, tooltip) => {", + "\t", + "\t//GLib.debug(\"query tooltip\");", + "\tGtk.TextIter iter;", + "\tint trailing;", + "\t", + "\tvar yoff = (int) _this.RightEditor.el.vadjustment.value;", + "\t", + "\t// I think this is problematic - if it's compliing / updating at same time as query.", + "\t", + "\t//if (_this.window.statusbar_compile_spinner.el.spinning) {", + "\t//\treturn false;", + "\t//}", + "\t", + "\tthis.el.get_iter_at_position (out iter, out trailing, x, y + yoff);", + "\t ", + "\tvar l = iter.get_line();", + "", + "\t", + "\t ", + "\t// GLib.debug(\"query tooltip line %d\", (int) l);", + "\tif (l < 0) {", + "", + "\t\treturn false;", + "\t}", + "\t/*", + "\tif (_this.buffer.marks != null && _this.buffer.marks.has_key(l)) {", + "\t\tGLib.debug(\"line %d setting tip to %s\", l, _this.buffer.marks.get(l));", + "\t\ttooltip.set_text(_this.buffer.marks.get(l).dup());", + "\t\treturn true;", + "\t}", + " ", + "\treturn false;", + "\t*/", + "\t", + "\t ", + "\t// this crashes?? - not sure why.", + "\tvar marks = _this.buffer.el.get_source_marks_at_line(l, \"ERR\");", + "\tif (marks.is_empty()) {", + "\t\tmarks = _this.buffer.el.get_source_marks_at_line(l, \"WARN\");", + "\t}", + "\tif (marks.is_empty()) {", + "\t\tmarks = _this.buffer.el.get_source_marks_at_line(l, \"DEPR\");", + "\t}", + "\t", + "\t// GLib.debug(\"query tooltip line %d marks %d\", (int)l, (int) marks.length());", + "\tvar str = \"\";", + "\tmarks.@foreach((m) => { ", + "\t\t//GLib.debug(\"got mark %s\", m.name);", + "\t\tstr += (str.length > 0 ? \"\\n\" : \"\") + m.category + \": \" + m.name;", + "\t});", + "\t// true if there is a mark..", + "\tif (str.length > 0 ) {", + "\t\ttooltip.set_text( str );", + "\t}", + "\treturn str.length > 0 ? true : false;", + "\t ", + "}", + "" + ] + }, + "string name" : "editor-view", + "uint tab_width" : 4, + "xtype" : "View", + "| void load" : [ + " (string str) {", + "", + "// show the help page for the active node..", + " //this.get('/Help').show();", + " ", + " // this.get('/BottomPane').el.set_current_page(0);", + " \tGLib.debug(\"load called - Reset undo buffer\");", + " \t", + " var buf = (GtkSource.Buffer)this.el.get_buffer();", + " buf.begin_irreversible_action();", + " buf.set_text(str, str.length);", + " buf.end_irreversible_action();", + " ", + " var lm = GtkSource.LanguageManager.get_default();", + " var lang = \"vala\";", + " if (_this.file != null) {", + " lang = _this.file.language;", + " }", + " print(\"lang=%s, content_type = %s\\n\", lang, _this.file.content_type);", + " var lg = _this.file.content_type.length > 0 ?", + " lm.guess_language(_this.file.path, _this.file.content_type) :", + " lm.get_language(lang);", + " ", + " ", + " ((GtkSource.Buffer)(this.el.get_buffer())) .set_language(lg); ", + "", + " this.el.insert_spaces_instead_of_tabs = true;", + " if (lg != null) {", + "\t\tprint(\"sourcelanguage = %s\\n\", lg.name);", + "\t\tif (lg.name == \"Vala\") {", + "\t\t this.el.insert_spaces_instead_of_tabs = false;", + "\t\t}", + " }", + " _this.dirty = false;", + " this.el.grab_focus();", + " _this.save_button.el.sensitive = false;", + " _this.last_error_counter = -1;", + "}" + ] + } + ], + "xtype" : "ScrolledWindow" }, { - "# double distance" : "0.0f", "$ xns" : "Gtk", - "Gtk.EventControllerScrollFlags flags" : "Gtk.EventControllerScrollFlags.VERTICAL", - "listeners" : { - "scroll" : [ - "(dx, dy) => {", - "\tif (!_this.keystate.is_control) {", - "\t\treturn false;", - "\t}", - "\t //GLib.debug(\"scroll %f\", dy);", - "\t", - "\tthis.distance += dy;", - "\t", - "\t//GLib.debug(\"scroll %f / %f\", dy, this.distance);", - " ", - "\t if (this.distance < -1) {", - " ", - "\t\tBuilderApplication.settings.editor_font_size ++;", - "\t\tthis.distance = 0;", - "\t}", - "\tif (this.distance > 1) {", - "\t\tBuilderApplication.settings.editor_font_size --;", - "\t\tthis.distance = 0;", - "\t}", - "\t ", - "\treturn true;", - "}", - "" - ] - }, - "xtype" : "EventControllerScroll" - } - ], - "listeners" : { - "query_tooltip" : [ - "(x, y, keyboard_tooltip, tooltip) => {", - "\t", - "\t//GLib.debug(\"query tooltip\");", - "\tGtk.TextIter iter;", - "\tint trailing;", - "\t", - "\tvar yoff = (int) _this.RightEditor.el.vadjustment.value;", - "\t", - "\t// I think this is problematic - if it's compliing / updating at same time as query.", - "\t", - "\t//if (_this.window.statusbar_compile_spinner.el.spinning) {", - "\t//\treturn false;", - "\t//}", - "\t", - "\tthis.el.get_iter_at_position (out iter, out trailing, x, y + yoff);", - "\t ", - "\tvar l = iter.get_line();", - "", - "\t", - "\t ", - "\t// GLib.debug(\"query tooltip line %d\", (int) l);", - "\tif (l < 0) {", - "", - "\t\treturn false;", - "\t}", - "\t/*", - "\tif (_this.buffer.marks != null && _this.buffer.marks.has_key(l)) {", - "\t\tGLib.debug(\"line %d setting tip to %s\", l, _this.buffer.marks.get(l));", - "\t\ttooltip.set_text(_this.buffer.marks.get(l).dup());", - "\t\treturn true;", - "\t}", - " ", - "\treturn false;", - "\t*/", - "\t", - "\t ", - "\t// this crashes?? - not sure why.", - "\tvar marks = _this.buffer.el.get_source_marks_at_line(l, \"ERR\");", - "\tif (marks.is_empty()) {", - "\t\tmarks = _this.buffer.el.get_source_marks_at_line(l, \"WARN\");", - "\t}", - "\tif (marks.is_empty()) {", - "\t\tmarks = _this.buffer.el.get_source_marks_at_line(l, \"DEPR\");", - "\t}", - "\t", - "\t// GLib.debug(\"query tooltip line %d marks %d\", (int)l, (int) marks.length());", - "\tvar str = \"\";", - "\tmarks.@foreach((m) => { ", - "\t\t//GLib.debug(\"got mark %s\", m.name);", - "\t\tstr += (str.length > 0 ? \"\\n\" : \"\") + m.category + \": \" + m.name;", - "\t});", - "\t// true if there is a mark..", - "\tif (str.length > 0 ) {", - "\t\ttooltip.set_text( str );", - "\t}", - "\treturn str.length > 0 ? true : false;", - "\t ", - "}", - "" - ] - }, - "string name" : "editor-view", - "uint tab_width" : 4, - "xtype" : "View", - "| void load" : [ - " (string str) {", - "", - "// show the help page for the active node..", - " //this.get('/Help').show();", - " ", - " // this.get('/BottomPane').el.set_current_page(0);", - " \tGLib.debug(\"load called - Reset undo buffer\");", - " \t", - " var buf = (GtkSource.Buffer)this.el.get_buffer();", - " buf.begin_irreversible_action();", - " buf.set_text(str, str.length);", - " buf.end_irreversible_action();", - " ", - " var lm = GtkSource.LanguageManager.get_default();", - " var lang = \"vala\";", - " if (_this.file != null) {", - " lang = _this.file.language;", - " }", - " print(\"lang=%s, content_type = %s\\n\", lang, _this.file.content_type);", - " var lg = _this.file.content_type.length > 0 ?", - " lm.guess_language(_this.file.path, _this.file.content_type) :", - " lm.get_language(lang);", - " ", - " ", - " ((GtkSource.Buffer)(this.el.get_buffer())) .set_language(lg); ", - "", - " this.el.insert_spaces_instead_of_tabs = true;", - " if (lg != null) {", - "\t\tprint(\"sourcelanguage = %s\\n\", lg.name);", - "\t\tif (lg.name == \"Vala\") {", - "\t\t this.el.insert_spaces_instead_of_tabs = false;", - "\t\t}", - " }", - " _this.dirty = false;", - " this.el.grab_focus();", - " _this.save_button.el.sensitive = false;", - " _this.last_error_counter = -1;", - "}" - ] - } - ], - "xtype" : "ScrolledWindow" - }, - { - "$ xns" : "Gtk", - "* pack" : "append", - "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", - "bool homogeneous" : false, - "bool vexpand" : false, - "int spacing" : 0, - "items" : [ - { - "$ xns" : "Gtk", - "Gtk.CssProvider css" : "", - "bool hexpand" : true, - "id" : "search_entry", - "items" : [ - { - "$ xns" : "Gtk", - "listeners" : { - "key_pressed" : [ - "(keyval, keycode, state) => {", - "", - "\tif (keyval == Gdk.Key.g && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", - "\t GLib.debug(\"SAVE: ctrl-g pressed\");", - "\t\t_this.forwardSearch(true);", - "\t return true;", - "\t}", - " ", - " ", - " \tif (keyval == Gdk.Key.Return && _this.search_entry.el.text.length > 0) {", - "\t\t_this.forwardSearch(true);", - "\t\t", - "\t\t", - "\t return true;", - "", - "\t} ", - " // print(event.key.keyval)", - " ", - " return false;", - "}", - "" - ] - }, - "xtype" : "EventControllerKey" + "* pack" : "append", + "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", + "bool homogeneous" : false, + "bool vexpand" : false, + "int spacing" : 0, + "items" : [ + { + "$ xns" : "Gtk", + "Gtk.CssProvider css" : "", + "bool hexpand" : true, + "id" : "search_entry", + "items" : [ + { + "$ xns" : "Gtk", + "listeners" : { + "key_pressed" : [ + "(keyval, keycode, state) => {", + "", + "\tif (keyval == Gdk.Key.g && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", + "\t GLib.debug(\"SAVE: ctrl-g pressed\");", + "\t\t_this.forwardSearch(true);", + "\t return true;", + "\t}", + " ", + " ", + " \tif (keyval == Gdk.Key.Return && _this.search_entry.el.text.length > 0) {", + "\t\t_this.forwardSearch(true);", + "\t\t", + "\t\t", + "\t return true;", + "", + "\t} ", + " // print(event.key.keyval)", + " ", + " return false;", + "}", + "" + ] + }, + "xtype" : "EventControllerKey" + } + ], + "listeners" : { + "search_changed" : [ + "( ) => {", + "", + "_this.search(_this.search_entry.el.text);", + "\t _this.search_results.updateResults();", + "", + "\tGLib.Timeout.add_seconds(1,() => {", + "\t\t _this.search_results.updateResults();", + "\t\t return false;", + "\t });", + "}", + "" + ] + }, + "string name" : "editor-search-entry", + "string placeholder_text" : "Press enter to search", + "uint search_delay" : 3, + "xtype" : "SearchEntry", + "| void forwardSearch" : [ + "(bool change_focus) {", + "", + "", + "\t_this.forwardSearch(change_focus);", + "", + "/*", + "", + "\tswitch(_this.windowstate.state) {", + "\t\tcase WindowState.State.CODEONLY:", + "\t\t//case WindowState.State.CODE:", + "\t\t\t// search the code being edited..", + "\t\t\t_this.windowstate.code_editor_tab.forwardSearch(change_focus);", + "\t\t\t ", + "\t\t\tbreak;", + "\t\tcase WindowState.State.PREVIEW:", + "\t\t\tif (_this.windowstate.file.xtype == \"Gtk\") {", + "\t\t\t\t_this.windowstate.window_gladeview.forwardSearch(change_focus);", + "\t\t\t} else { ", + "\t\t\t\t _this.windowstate.window_rooview.forwardSearch(change_focus);", + "\t\t\t}", + "\t\t", + "\t\t\tbreak;", + "\t}", + "\t*/", + "\t", + "}", + "" + ] + }, + { + "$ xns" : "Gtk", + "id" : "search_results", + "int margin_end" : 4, + "int margin_start" : 4, + "string label" : "No Results", + "xtype" : "Label", + "| void updateResults" : [ + "() {", + "\tthis.el.visible = true;", + "\t", + "\tvar res = _this.searchcontext.get_occurrences_count();", + "\tif (res < 0) {", + "\t\t_this.search_results.el.label = \"??? Matches\";\t\t", + "\t\treturn;", + "\t}", + "", + "\t_this.nextBtn.el.sensitive = false;", + "\t_this.backBtn.el.sensitive = false;\t", + "", + "\tif (res > 0) {", + "\t\t_this.search_results.el.label = \"%d Matches\".printf(res);", + "\t\t_this.nextBtn.el.sensitive = true;", + "\t\t_this.backBtn.el.sensitive = true;", + "\t\treturn;", + "\t} ", + "\t_this.search_results.el.label = \"No Matches\";", + "\t", + "}" + ] + }, + { + "$ xns" : "Gtk", + "bool always_show_image" : true, + "bool sensitive" : false, + "id" : "nextBtn", + "listeners" : { + "clicked" : [ + "(event) => {", + "", + "\t_this.forwardSearch(true);", + "\t", + "\t ", + "}", + "" + ] + }, + "string icon_name" : "go-down", + "xtype" : "Button" + }, + { + "$ xns" : "Gtk", + "bool always_show_image" : true, + "bool sensitive" : false, + "id" : "backBtn", + "listeners" : { + "clicked" : [ + "(event) => {", + "", + "\t_this.backSearch(true);", + "\t ", + "}", + "" + ] + }, + "string icon_name" : "go-up", + "xtype" : "Button" + }, + { + "$ xns" : "Gtk", + "bool always_show_arrow" : true, + "bool always_show_image" : true, + "items" : [ + { + "$ xns" : "Gtk", + "* prop" : "popover", + "id" : "search_settings", + "items" : [ + { + "$ xns" : "Gtk", + "* prop" : "child", + "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", + "int spacing" : 0, + "items" : [ + { + "$ xns" : "Gtk", + "* init" : [ + "{", + "\tthis.el.show();", + "}", + "" + ], + "id" : "case_sensitive", + "string label" : "Case Sensitive", + "xtype" : "CheckButton" + }, + { + "$ xns" : "Gtk", + "* init" : [ + "{", + "\tthis.el.show();", + "}", + "" + ], + "id" : "regex", + "string label" : "Regex", + "xtype" : "CheckButton" + }, + { + "$ xns" : "Gtk", + "id" : "multiline", + "string label" : "Multi-line (add \\n)", + "xtype" : "CheckButton" + } + ], + "xtype" : "Box" + } + ], + "xtype" : "Popover" + } + ], + "string icon_name" : "emblem-system", + "xtype" : "MenuButton" + } + ], + "xtype" : "Box" } ], - "listeners" : { - "search_changed" : [ - "( ) => {", - "", - "_this.search(_this.search_entry.el.text);", - "\t _this.search_results.updateResults();", - "", - "\tGLib.Timeout.add_seconds(1,() => {", - "\t\t _this.search_results.updateResults();", - "\t\t return false;", - "\t });", - "}", - "" - ] - }, - "string name" : "editor-search-entry", - "string placeholder_text" : "Press enter to search", - "uint search_delay" : 3, - "xtype" : "SearchEntry", - "| void forwardSearch" : [ - "(bool change_focus) {", - "", - "", - "\t_this.forwardSearch(change_focus);", - "", - "/*", - "", - "\tswitch(_this.windowstate.state) {", - "\t\tcase WindowState.State.CODEONLY:", - "\t\t//case WindowState.State.CODE:", - "\t\t\t// search the code being edited..", - "\t\t\t_this.windowstate.code_editor_tab.forwardSearch(change_focus);", - "\t\t\t ", - "\t\t\tbreak;", - "\t\tcase WindowState.State.PREVIEW:", - "\t\t\tif (_this.windowstate.file.xtype == \"Gtk\") {", - "\t\t\t\t_this.windowstate.window_gladeview.forwardSearch(change_focus);", - "\t\t\t} else { ", - "\t\t\t\t _this.windowstate.window_rooview.forwardSearch(change_focus);", - "\t\t\t}", - "\t\t", - "\t\t\tbreak;", - "\t}", - "\t*/", - "\t", - "}", - "" - ] - }, - { - "$ xns" : "Gtk", - "id" : "search_results", - "int margin_end" : 4, - "int margin_start" : 4, - "string label" : "No Results", - "xtype" : "Label", - "| void updateResults" : [ - "() {", - "\tthis.el.visible = true;", - "\t", - "\tvar res = _this.searchcontext.get_occurrences_count();", - "\tif (res < 0) {", - "\t\t_this.search_results.el.label = \"??? Matches\";\t\t", - "\t\treturn;", - "\t}", - "", - "\t_this.nextBtn.el.sensitive = false;", - "\t_this.backBtn.el.sensitive = false;\t", - "", - "\tif (res > 0) {", - "\t\t_this.search_results.el.label = \"%d Matches\".printf(res);", - "\t\t_this.nextBtn.el.sensitive = true;", - "\t\t_this.backBtn.el.sensitive = true;", - "\t\treturn;", - "\t} ", - "\t_this.search_results.el.label = \"No Matches\";", - "\t", - "}" - ] - }, - { - "$ xns" : "Gtk", - "bool always_show_image" : true, - "bool sensitive" : false, - "id" : "nextBtn", - "listeners" : { - "clicked" : [ - "(event) => {", - "", - "\t_this.forwardSearch(true);", - "\t", - "\t ", - "}", - "" - ] - }, - "string icon_name" : "go-down", - "xtype" : "Button" - }, - { - "$ xns" : "Gtk", - "bool always_show_image" : true, - "bool sensitive" : false, - "id" : "backBtn", - "listeners" : { - "clicked" : [ - "(event) => {", - "", - "\t_this.backSearch(true);", - "\t ", - "}", - "" - ] - }, - "string icon_name" : "go-up", - "xtype" : "Button" + "xtype" : "Box" }, { "$ xns" : "Gtk", - "bool always_show_arrow" : true, - "bool always_show_image" : true, + "* prop" : "end_child", + "bool visible" : false, + "id" : "navigationwindow", "items" : [ { "$ xns" : "Gtk", - "* prop" : "popover", - "id" : "search_settings", + "* prop" : "child", + "id" : "navigation", "items" : [ { "$ xns" : "Gtk", - "* prop" : "child", - "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", - "int spacing" : 0, + "bool expand" : true, "items" : [ { "$ xns" : "Gtk", - "* init" : [ - "{", - "\tthis.el.show();", - "}", - "" - ], - "id" : "case_sensitive", - "string label" : "Case Sensitive", - "xtype" : "CheckButton" - }, + "* prop" : "factory", + "listeners" : { + "bind" : [ + "(listitem) => {", + "\t// GLib.debug(\"listitme is is %s\", ((Gtk.ListItem)listitem).get_type().name());", + "\t", + "\t//var expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child();", + "\tvar expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child();", + "\t ", + "\t ", + "\tvar hbox = (Gtk.Box) expand.child;", + " ", + "\t", + "\tvar img = (Gtk.Image) hbox.get_first_child();", + "\tvar lbl = (Gtk.Label) img.get_next_sibling();", + "\t", + "\tvar lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item();", + "\tvar sym = (Lsp.DocumentSymbol) lr.get_item();", + "\t", + "\tGLib.debug(\"got %d children for %s\" , (int)sym.children.get_n_items(), sym.name);", + " ", + " expand.set_hide_expander( sym.children.get_n_items() < 1);", + " \texpand.set_list_row(lr);", + " \t", + " \tsym.bind_property(\"symbol_icon\",", + " img, \"icon_name\",", + " GLib.BindingFlags.SYNC_CREATE);", + " \t", + " \thbox.add_css_class(sym.symbol_icon);", + " \t", + " \tsym.bind_property(\"name\",", + " lbl, \"label\",", + " GLib.BindingFlags.SYNC_CREATE);", + " \t// should be better?- --line no?", + " \tsym.bind_property(\"tooltip\",", + " lbl, \"tooltip_markup\",", + " GLib.BindingFlags.SYNC_CREATE);", + " \t// bind image...", + " \t", + "}", + "" + ], + "setup" : [ + "(listitem) => {", + "\t", + "\tvar expand = new Gtk.TreeExpander();", + "\t ", + "\texpand.set_indent_for_depth(true);", + "\texpand.set_indent_for_icon(true);", + "\tvar hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL,0);", + "\tvar icon = new Gtk.Image();", + "\tvar lbl = new Gtk.Label(\"\");", + "\tlbl.use_markup = true;", + "\tlbl.ellipsize = Pango.EllipsizeMode.END;", + "\t", + "\ticon.margin_end = 4;", + " \tlbl.justify = Gtk.Justification.LEFT;", + " \tlbl.xalign = 0;", + "", + "//\tlistitem.activatable = true; ??", + "\t", + "\thbox.append(icon);", + "\thbox.append(lbl);", + "\texpand.set_child(hbox);", + "\t((Gtk.ListItem)listitem).set_child(expand);", + "\t", + "}", + "" + ] + }, + "xtype" : "SignalListItemFactory" + } + ], + "string title" : "Code Navigation", + "xtype" : "ColumnViewColumn" + }, + { + "$ xns" : "Gtk", + "* prop" : "model", + "id" : "navigationselmodel", + "items" : [ { "$ xns" : "Gtk", - "* init" : [ - "{", - "\tthis.el.show();", - "}", - "" + "* prop" : "model", + "items" : [ + { + "$ Gtk.TreeListModelCreateModelFunc create_func" : [ + "(item) => {", + " ", + "\treturn ((Lsp.DocumentSymbol)item).children;", + "}", + "" + ], + "$ xns" : "Gtk", + "* prop" : "model", + "bool autoexpand" : true, + "bool passthrough" : false, + "items" : [ + { + "$ GLib.Type item_type" : "typeof(Lsp.DocumentSymbol)", + "$ xns" : "GLib", + "* prop" : "root", + "id" : "navliststore", + "xtype" : "ListStore" + } + ], + "xtype" : "TreeListModel" + }, + { + "$ xns" : "Gtk", + "* prop" : "sorter", + "items" : [ + { + "$ xns" : "Gtk", + "* prop" : "sorter", + "items" : [ + { + "$ GLib.Type this_type" : "typeof(Lsp.DocumentSymbol)", + "$ xns" : "Gtk", + "* prop" : "expression", + "string property_name" : "sort_key", + "xtype" : "PropertyExpression" + } + ], + "xtype" : "StringSorter" + } + ], + "xtype" : "TreeListRowSorter" + } ], - "id" : "regex", - "string label" : "Regex", - "xtype" : "CheckButton" - }, - { - "$ xns" : "Gtk", - "id" : "multiline", - "string label" : "Multi-line (add \\n)", - "xtype" : "CheckButton" + "xtype" : "SortListModel" } ], - "xtype" : "Box" + "xtype" : "NoSelection", + "| Lsp.DocumentSymbol? getSymoblAt" : [ + "(uint row) {", + "", + " var tr = (Gtk.TreeListRow)this.el.get_item(row);", + " ", + " var a = tr.get_item();; ", + " GLib.debug(\"get_item (2) = %s\", a.get_type().name());", + " \t", + " ", + " return (Lsp.DocumentSymbol)tr.get_item();", + "\t ", + "}" + ] + }, + { + "$ xns" : "Gtk", + "listeners" : { + "pressed" : [ + "(n_press, x, y) => {", + "\tstring pos;", + " \tvar row = _this.navigation.getRowAt(x,y, out pos );", + " if (row < 0) {", + "\t GLib.debug(\"no row selected items\");", + "\t return;", + " }", + " //Lsp.DocumentSymbol", + " var sym = _this.navigationselmodel.getSymoblAt(row);", + " if (sym == null) {", + " \treturn;", + "\t}", + "\t/*", + "\t \"range\" : {", + " \"start\" : {", + " \"line\" : 1410,", + " \"character\" : 8", + " },", + " \"end\" : {", + " \"line\" : 1410,", + " \"character\" : 39", + " }", + " },", + " */", + " _this.scroll_to_line((int)sym.range.start.line);", + "\t", + "}" + ] + }, + "xtype" : "GestureClick" } ], - "xtype" : "Popover" + "string name" : "editor-navigation", + "xtype" : "ColumnView", + "| int getRowAt" : [ + "(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 ", + "\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 show" : [ + "(Gee.ArrayList syms) {", + "\t_this.navigationwindow.el.show();", + "\t_this.navliststore.el.remove_all();", + "\tforeach(var sym in syms) {", + "\t\t_this.navliststore.el.append(sym);", + "\t}", + "\t", + "", + "}" + ] } ], - "string icon_name" : "emblem-system", - "xtype" : "MenuButton" + "xtype" : "ScrolledWindow" } ], - "xtype" : "Box" + "xtype" : "Paned" } ], "xtype" : "Box", @@ -1097,12 +1384,19 @@ " this.view.load( prop.val );", " this.updateErrorMarks();", " ", + " ", + " ", " this.close_btn.el.show(); ", " ", " } else {", " this.view.load( file.toSource() );", " this.updateErrorMarks();", " this.close_btn.el.hide();", + " var ls = file.getLanguageServer();", + " ls.documentSymbols.begin(file, (a,o) => {", + " \t_this.navigation.show(ls.documentSymbols.end(o)); ", + " });", + " //documentSymbols", " ", " }", " ", diff --git a/src/Builder4/Editor.vala b/src/Builder4/Editor.vala index 74af01c4a..94dd0ca1c 100644 --- a/src/Builder4/Editor.vala +++ b/src/Builder4/Editor.vala @@ -26,6 +26,10 @@ public class Editor : Object public Xcls_case_sensitive case_sensitive; public Xcls_regex regex; public Xcls_multiline multiline; + public Xcls_navigationwindow navigationwindow; + public Xcls_navigation navigation; + public Xcls_navigationselmodel navigationselmodel; + public Xcls_navliststore navliststore; // my vars (def) public int pos_root_x; @@ -58,20 +62,15 @@ public class Editor : Object this.file = null; this.node = null; this.prop = null; - this.activeEditor = ""; + this.activeEditor = "\"\""; // set gobject values this.el.homogeneous = false; this.el.hexpand = true; this.el.vexpand = true; - var child_1 = new Xcls_Box1( _this ); + var child_1 = new Xcls_Paned1( _this ); child_1.ref(); this.el.append( child_1.el ); - new Xcls_RightEditor( _this ); - this.el.append( _this.RightEditor.el ); - var child_3 = new Xcls_Box12( _this ); - child_3.ref(); - this.el.append ( child_3.el ); } // user defined functions @@ -148,12 +147,19 @@ public class Editor : Object this.view.load( prop.val ); this.updateErrorMarks(); + + this.close_btn.el.show(); } else { this.view.load( file.toSource() ); this.updateErrorMarks(); this.close_btn.el.hide(); + var ls = file.getLanguageServer(); + ls.documentSymbols.begin(file, (a,o) => { + _this.navigation.show(ls.documentSymbols.end(o)); + }); + //documentSymbols } @@ -385,7 +391,33 @@ public class Editor : Object return false; }); } - public class Xcls_Box1 : Object + public class Xcls_Paned1 : Object + { + public Gtk.Paned el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_Paned1(Editor _owner ) + { + _this = _owner; + this.el = new Gtk.Paned( Gtk.Orientation.HORIZONTAL ); + + // my vars (dec) + + // set gobject values + var child_1 = new Xcls_Box2( _this ); + child_1.ref(); + this.el.start_child = child_1.el; + new Xcls_navigationwindow( _this ); + this.el.end_child = _this.navigationwindow.el; + } + + // user defined functions + } + public class Xcls_Box2 : Object { public Gtk.Box el; private Editor _this; @@ -394,7 +426,36 @@ public class Editor : Object // my vars (def) // ctor - public Xcls_Box1(Editor _owner ) + public Xcls_Box2(Editor _owner ) + { + _this = _owner; + this.el = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 ); + + // my vars (dec) + + // set gobject values + var child_1 = new Xcls_Box3( _this ); + child_1.ref(); + this.el.append( child_1.el ); + new Xcls_RightEditor( _this ); + this.el.append( _this.RightEditor.el ); + var child_3 = new Xcls_Box15( _this ); + child_3.ref(); + this.el.append ( child_3.el ); + } + + // user defined functions + } + public class Xcls_Box3 : Object + { + public Gtk.Box el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_Box3(Editor _owner ) { _this = _owner; this.el = new Gtk.Box( Gtk.Orientation.HORIZONTAL, 0 ); @@ -406,10 +467,10 @@ public class Editor : Object this.el.hexpand = true; new Xcls_save_button( _this ); this.el.append( _this.save_button.el ); - var child_2 = new Xcls_Label3( _this ); + var child_2 = new Xcls_Label5( _this ); child_2.ref(); this.el.append( child_2.el ); - var child_3 = new Xcls_Scale4( _this ); + var child_3 = new Xcls_Scale6( _this ); child_3.ref(); this.el.append( child_3.el ); new Xcls_close_btn( _this ); @@ -447,7 +508,7 @@ public class Editor : Object // user defined functions } - public class Xcls_Label3 : Object + public class Xcls_Label5 : Object { public Gtk.Label el; private Editor _this; @@ -456,7 +517,7 @@ public class Editor : Object // my vars (def) // ctor - public Xcls_Label3(Editor _owner ) + public Xcls_Label5(Editor _owner ) { _this = _owner; this.el = new Gtk.Label( null ); @@ -470,7 +531,7 @@ public class Editor : Object // user defined functions } - public class Xcls_Scale4 : Object + public class Xcls_Scale6 : Object { public Gtk.Scale el; private Editor _this; @@ -479,7 +540,7 @@ public class Editor : Object // my vars (def) // ctor - public Xcls_Scale4(Editor _owner ) + public Xcls_Scale6(Editor _owner ) { _this = _owner; this.el = new Gtk.Scale.with_range (Gtk.Orientation.HORIZONTAL,6, 30, 1); @@ -542,7 +603,7 @@ public class Editor : Object // set gobject values this.el.icon_name = "window-close"; - var child_1 = new Xcls_Image6( _this ); + var child_1 = new Xcls_Image8( _this ); child_1.ref(); this.el.child = child_1.el; @@ -555,7 +616,7 @@ public class Editor : Object // user defined functions } - public class Xcls_Image6 : Object + public class Xcls_Image8 : Object { public Gtk.Image el; private Editor _this; @@ -564,7 +625,7 @@ public class Editor : Object // my vars (def) // ctor - public Xcls_Image6(Editor _owner ) + public Xcls_Image8(Editor _owner ) { _this = _owner; this.el = new Gtk.Image(); @@ -645,18 +706,22 @@ public class Editor : Object this.el.buffer = _this.buffer.el; new Xcls_keystate( _this ); this.el.add_controller( _this.keystate.el ); - var child_3 = new Xcls_EventControllerScroll11( _this ); + var child_3 = new Xcls_EventControllerScroll13( _this ); child_3.ref(); this.el.add_controller( child_3.el ); + var child_4 = new Xcls_GestureClick14( _this ); + child_4.ref(); + this.el.add_controller( child_4.el ); // init method this.el.completion.add_provider( new Palete.CompletionProvider(_this) ); - - var hover = this.el.get_hover(); - hover.add_provider(new Palete.HoverProvider(_this)); + + // hover seems pretty useless.. - ?? + //var hover = this.el.get_hover(); + //hover.add_provider(new Palete.HoverProvider(_this)); //this.el.completion.unblock_interactive(); this.el.completion.select_on_show = true; // select @@ -1161,7 +1226,7 @@ public class Editor : Object // user defined functions } - public class Xcls_EventControllerScroll11 : Object + public class Xcls_EventControllerScroll13 : Object { public Gtk.EventControllerScroll el; private Editor _this; @@ -1171,7 +1236,7 @@ public class Editor : Object public double distance; // ctor - public Xcls_EventControllerScroll11(Editor _owner ) + public Xcls_EventControllerScroll13(Editor _owner ) { _this = _owner; this.el = new Gtk.EventControllerScroll( Gtk.EventControllerScrollFlags.VERTICAL ); @@ -1209,9 +1274,31 @@ public class Editor : Object // user defined functions } + public class Xcls_GestureClick14 : Object + { + public Gtk.GestureClick el; + private Editor _this; + + // my vars (def) - public class Xcls_Box12 : Object + // ctor + public Xcls_GestureClick14(Editor _owner ) + { + _this = _owner; + this.el = new Gtk.GestureClick(); + + // my vars (dec) + + // set gobject values + } + + // user defined functions + } + + + + public class Xcls_Box15 : Object { public Gtk.Box el; private Editor _this; @@ -1220,7 +1307,7 @@ public class Editor : Object // my vars (def) // ctor - public Xcls_Box12(Editor _owner ) + public Xcls_Box15(Editor _owner ) { _this = _owner; this.el = new Gtk.Box( Gtk.Orientation.HORIZONTAL, 0 ); @@ -1238,7 +1325,7 @@ public class Editor : Object this.el.append( _this.nextBtn.el ); new Xcls_backBtn( _this ); this.el.append( _this.backBtn.el ); - var child_5 = new Xcls_MenuButton18( _this ); + var child_5 = new Xcls_MenuButton21( _this ); child_5.ref(); this.el.append( child_5.el ); } @@ -1268,7 +1355,7 @@ public class Editor : Object this.el.hexpand = true; this.el.placeholder_text = "Press enter to search"; this.el.search_delay = 3; - var child_1 = new Xcls_EventControllerKey14( _this ); + var child_1 = new Xcls_EventControllerKey17( _this ); child_1.ref(); this.el.add_controller( child_1.el ); @@ -1313,7 +1400,7 @@ public class Editor : Object } } - public class Xcls_EventControllerKey14 : Object + public class Xcls_EventControllerKey17 : Object { public Gtk.EventControllerKey el; private Editor _this; @@ -1322,7 +1409,7 @@ public class Editor : Object // my vars (def) // ctor - public Xcls_EventControllerKey14(Editor _owner ) + public Xcls_EventControllerKey17(Editor _owner ) { _this = _owner; this.el = new Gtk.EventControllerKey(); @@ -1473,7 +1560,7 @@ public class Editor : Object // user defined functions } - public class Xcls_MenuButton18 : Object + public class Xcls_MenuButton21 : Object { public Gtk.MenuButton el; private Editor _this; @@ -1483,7 +1570,7 @@ public class Editor : Object public bool always_show_image; // ctor - public Xcls_MenuButton18(Editor _owner ) + public Xcls_MenuButton21(Editor _owner ) { _this = _owner; this.el = new Gtk.MenuButton(); @@ -1518,14 +1605,14 @@ public class Editor : Object // my vars (dec) // set gobject values - var child_1 = new Xcls_Box20( _this ); + var child_1 = new Xcls_Box23( _this ); child_1.ref(); this.el.child = child_1.el; } // user defined functions } - public class Xcls_Box20 : Object + public class Xcls_Box23 : Object { public Gtk.Box el; private Editor _this; @@ -1534,7 +1621,7 @@ public class Editor : Object // my vars (def) // ctor - public Xcls_Box20(Editor _owner ) + public Xcls_Box23(Editor _owner ) { _this = _owner; this.el = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 ); @@ -1640,4 +1727,461 @@ public class Editor : Object + + public class Xcls_navigationwindow : Object + { + public Gtk.ScrolledWindow el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_navigationwindow(Editor _owner ) + { + _this = _owner; + _this.navigationwindow = this; + this.el = new Gtk.ScrolledWindow(); + + // my vars (dec) + + // set gobject values + this.el.visible = false; + new Xcls_navigation( _this ); + this.el.child = _this.navigation.el; + } + + // user defined functions + } + public class Xcls_navigation : Object + { + public Gtk.ColumnView el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_navigation(Editor _owner ) + { + _this = _owner; + _this.navigation = this; + new Xcls_navigationselmodel( _this ); + this.el = new Gtk.ColumnView( _this.navigationselmodel.el ); + + // my vars (dec) + + // set gobject values + this.el.name = "editor-navigation"; + var child_2 = new Xcls_ColumnViewColumn29( _this ); + child_2.ref(); + this.el.append_column( child_2.el ); + var child_3 = new Xcls_GestureClick34( _this ); + child_3.ref(); + this.el.add_controller( child_3.el ); + } + + // user defined functions + public void show (Gee.ArrayList syms) { + _this.navigationwindow.el.show(); + _this.navliststore.el.remove_all(); + foreach(var sym in syms) { + _this.navliststore.el.append(sym); + } + + + } + public int getRowAt (double x, double y, out string pos) { + + pos = ""; + var w = this.el.pick(x, y, Gtk.PickFlags.DEFAULT); + //GLib.debug("got widget %s", w == null ? "nothing" : w.get_type().name()); + if (w == null) { + return -1; + } + + var row= w.get_ancestor(GLib.Type.from_name("GtkColumnViewRowWidget")); + if (row == null) { + return -1; + } + + //GLib.debug("got colview %s", row == null ? "nothing" : row.get_type().name()); + + var rn = 0; + var cr = row; + + while (cr.get_prev_sibling() != null) { + rn++; + cr = cr.get_prev_sibling(); + } + + //GLib.debug("row number is %d", rn); + //GLib.debug("click %d, %d", (int)x, (int)y); + // above or belw + Graphene.Rect bounds; + row.compute_bounds(this.el, out bounds); + //GLib.debug("click x=%d, y=%d, w=%d, h=%d", + // (int)bounds.get_x(), (int)bounds.get_y(), + // (int)bounds.get_width(), (int)bounds.get_height() + // ); + var ypos = y - bounds.get_y(); + //GLib.debug("rel ypos = %d", (int)ypos); + var rpos = 100.0 * (ypos / bounds.get_height()); + //GLib.debug("rel pos = %d %%", (int)rpos); + pos = "over"; + + if (rpos > 80) { + pos = "below"; + } else if (rpos < 20) { + pos = "above"; + } + return rn; + } + } + public class Xcls_ColumnViewColumn29 : Object + { + public Gtk.ColumnViewColumn el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_ColumnViewColumn29(Editor _owner ) + { + _this = _owner; + var child_1 = new Xcls_SignalListItemFactory30( _this ); + child_1.ref(); + this.el = new Gtk.ColumnViewColumn( "Code Navigation", child_1.el ); + + // my vars (dec) + + // set gobject values + this.el.expand = true; + } + + // user defined functions + } + public class Xcls_SignalListItemFactory30 : Object + { + public Gtk.SignalListItemFactory el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_SignalListItemFactory30(Editor _owner ) + { + _this = _owner; + this.el = new Gtk.SignalListItemFactory(); + + // my vars (dec) + + // set gobject values + + //listeners + this.el.setup.connect( (listitem) => { + + var expand = new Gtk.TreeExpander(); + + expand.set_indent_for_depth(true); + expand.set_indent_for_icon(true); + var hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL,0); + var icon = new Gtk.Image(); + var lbl = new Gtk.Label(""); + lbl.use_markup = true; + lbl.ellipsize = Pango.EllipsizeMode.END; + + icon.margin_end = 4; + lbl.justify = Gtk.Justification.LEFT; + lbl.xalign = 0; + + // listitem.activatable = true; ?? + + hbox.append(icon); + hbox.append(lbl); + expand.set_child(hbox); + ((Gtk.ListItem)listitem).set_child(expand); + + }); + this.el.bind.connect( (listitem) => { + // GLib.debug("listitme is is %s", ((Gtk.ListItem)listitem).get_type().name()); + + //var expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child(); + var expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child(); + + + var hbox = (Gtk.Box) expand.child; + + + var img = (Gtk.Image) hbox.get_first_child(); + var lbl = (Gtk.Label) img.get_next_sibling(); + + var lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item(); + var sym = (Lsp.DocumentSymbol) lr.get_item(); + + GLib.debug("got %d children for %s" , (int)sym.children.get_n_items(), sym.name); + + expand.set_hide_expander( sym.children.get_n_items() < 1); + expand.set_list_row(lr); + + sym.bind_property("symbol_icon", + img, "icon_name", + GLib.BindingFlags.SYNC_CREATE); + + hbox.add_css_class(sym.symbol_icon); + + sym.bind_property("name", + lbl, "label", + GLib.BindingFlags.SYNC_CREATE); + // should be better?- --line no? + sym.bind_property("tooltip", + lbl, "tooltip_markup", + GLib.BindingFlags.SYNC_CREATE); + // bind image... + + }); + } + + // user defined functions + } + + + public class Xcls_navigationselmodel : Object + { + public Gtk.NoSelection el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_navigationselmodel(Editor _owner ) + { + _this = _owner; + _this.navigationselmodel = this; + var child_1 = new Xcls_SortListModel60( _this ); + child_1.ref(); + this.el = new Gtk.NoSelection( child_1.el ); + + // my vars (dec) + + // set gobject values + } + + // user defined functions + public Lsp.DocumentSymbol? getSymoblAt (uint row) { + + var tr = (Gtk.TreeListRow)this.el.get_item(row); + + var a = tr.get_item();; + GLib.debug("get_item (2) = %s", a.get_type().name()); + + + return (Lsp.DocumentSymbol)tr.get_item(); + + } + } + public class Xcls_SortListModel60 : Object + { + public Gtk.SortListModel el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_SortListModel60(Editor _owner ) + { + _this = _owner; + var child_1 = new Xcls_TreeListModel171( _this ); + child_1.ref(); + var child_2 = new Xcls_TreeListRowSorter209( _this ); + child_2.ref(); + this.el = new Gtk.SortListModel( child_1.el, child_2.el ); + + // my vars (dec) + + // set gobject values + } + + // user defined functions + } + public class Xcls_TreeListModel171 : Object + { + public Gtk.TreeListModel el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_TreeListModel171(Editor _owner ) + { + _this = _owner; + new Xcls_navliststore( _this ); + this.el = new Gtk.TreeListModel( _this.navliststore.el, false, true, (item) => { + + return ((Lsp.DocumentSymbol)item).children; +} + ); + + // my vars (dec) + + // set gobject values + } + + // user defined functions + } + public class Xcls_navliststore : Object + { + public GLib.ListStore el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_navliststore(Editor _owner ) + { + _this = _owner; + _this.navliststore = this; + this.el = new GLib.ListStore( typeof(Lsp.DocumentSymbol) ); + + // my vars (dec) + + // set gobject values + } + + // user defined functions + } + + + public class Xcls_TreeListRowSorter209 : Object + { + public Gtk.TreeListRowSorter el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_TreeListRowSorter209(Editor _owner ) + { + _this = _owner; + var child_1 = new Xcls_StringSorter217( _this ); + child_1.ref(); + this.el = new Gtk.TreeListRowSorter( child_1.el ); + + // my vars (dec) + + // set gobject values + } + + // user defined functions + } + public class Xcls_StringSorter217 : Object + { + public Gtk.StringSorter el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_StringSorter217(Editor _owner ) + { + _this = _owner; + var child_1 = new Xcls_PropertyExpression224( _this ); + child_1.ref(); + this.el = new Gtk.StringSorter( child_1.el ); + + // my vars (dec) + + // set gobject values + } + + // user defined functions + } + public class Xcls_PropertyExpression224 : Object + { + public Gtk.PropertyExpression el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_PropertyExpression224(Editor _owner ) + { + _this = _owner; + this.el = new Gtk.PropertyExpression( typeof(Lsp.DocumentSymbol), null, "sort_key" ); + + // my vars (dec) + + // set gobject values + } + + // user defined functions + } + + + + + + public class Xcls_GestureClick34 : Object + { + public Gtk.GestureClick el; + private Editor _this; + + + // my vars (def) + + // ctor + public Xcls_GestureClick34(Editor _owner ) + { + _this = _owner; + this.el = new Gtk.GestureClick(); + + // my vars (dec) + + // set gobject values + + //listeners + this.el.pressed.connect( (n_press, x, y) => { + string pos; + var row = _this.navigation.getRowAt(x,y, out pos ); + if (row < 0) { + GLib.debug("no row selected items"); + return; + } + //Lsp.DocumentSymbol + var sym = _this.navigationselmodel.getSymoblAt(row); + if (sym == null) { + return; + } + /* + "range" : { + "start" : { + "line" : 1410, + "character" : 8 + }, + "end" : { + "line" : 1410, + "character" : 39 + } + }, + */ + _this.scroll_to_line((int)sym.range.start.line); + + }); + } + + // user defined functions + } + + + + } diff --git a/src/Builder4/GtkView.bjs b/src/Builder4/GtkView.bjs index cb86d026a..ca6a3fb75 100644 --- a/src/Builder4/GtkView.bjs +++ b/src/Builder4/GtkView.bjs @@ -925,7 +925,17 @@ " \t\t}", " ", " \t\tvar xmlstr = JsRender.NodeToGlade.mungeFile( file);", - " \t\tvar builder = new Gtk.Builder.from_string (xmlstr, xmlstr.length);", + " \t\tvar builder = new Gtk.Builder();", + " \t\ttry {", + "\t \t\tif (!builder.add_from_string(xmlstr, xmlstr.length)) {", + "\t \t\t\treturn;", + "\t\t\t}", + "\t\t} catch(GLib.Error e) {", + "\t\t\tGLib.debug(e.message);", + "\t\t\treturn;", + "\t\t}", + " \t\t", + "", " \t\tvar obj = (Gtk.Widget) builder.get_object(\"w\"+ file.tree.oid.to_string());", " \t\t this.container.el.append(obj);", "\t obj.show();", diff --git a/src/Builder4/GtkView.vala b/src/Builder4/GtkView.vala index 6cc6fa6cf..1af733880 100644 --- a/src/Builder4/GtkView.vala +++ b/src/Builder4/GtkView.vala @@ -104,7 +104,17 @@ public class Xcls_GtkView : Object } var xmlstr = JsRender.NodeToGlade.mungeFile( file); - var builder = new Gtk.Builder.from_string (xmlstr, xmlstr.length); + var builder = new Gtk.Builder(); + try { + if (!builder.add_from_string(xmlstr, xmlstr.length)) { + return; + } + } catch(GLib.Error e) { + GLib.debug(e.message); + return; + } + + var obj = (Gtk.Widget) builder.get_object("w"+ file.tree.oid.to_string()); this.container.el.append(obj); obj.show(); @@ -630,7 +640,7 @@ public class Xcls_GtkView : Object // my vars (dec) this.loading = false; - this.prop_selected = ""; + this.prop_selected = "\"\""; // set gobject values this.el.name = "gtkview-view"; diff --git a/src/Builder4/WindowLeftTree.vala b/src/Builder4/WindowLeftTree.vala index 70b5349fb..8a08fdc24 100644 --- a/src/Builder4/WindowLeftTree.vala +++ b/src/Builder4/WindowLeftTree.vala @@ -874,7 +874,7 @@ public class Xcls_WindowLeftTree : Object // my vars (dec) this.highlightWidget = null; this.lastDragNode = null; - this.lastDragString = ""; + this.lastDragString = "\"\""; // set gobject values diff --git a/src/JsRender/NodeToGlade.vala b/src/JsRender/NodeToGlade.vala index 08672b9a4..bc8624863 100644 --- a/src/JsRender/NodeToGlade.vala +++ b/src/JsRender/NodeToGlade.vala @@ -106,6 +106,7 @@ public class JsRender.NodeToGlade : Object { break; default: + GLib.debug("Skip %s - is not buildable / no data", cls); return null; } } @@ -115,10 +116,11 @@ public class JsRender.NodeToGlade : Object { // what namespaces are supported switch(this.node.NS) { case "Gtk": - case "Webkit": //?? + case "WebKit": //?? case "Adw": // works if you call adw.init() in main! break; default: + GLib.debug("Skip %s - NS is not available", cls); return null; } diff --git a/src/JsRender/NodeToVala.vala b/src/JsRender/NodeToVala.vala index 5791c99ae..6490629e2 100644 --- a/src/JsRender/NodeToVala.vala +++ b/src/JsRender/NodeToVala.vala @@ -417,15 +417,15 @@ public abstract class JsRender.NodeToVala : NodeWriter { if (this.node.fqn() == "Gtk.NotebookPage") { switch (child.get_prop("* prop").val) { case "child": - nb_child = childname; + nb_child = childname + (this.this_el == "this.el." ? ".el" : ""); break; case "tab": - nb_tab = childname; + nb_tab = childname + (this.this_el == "this.el." ? ".el" : ""); break; case "menu": - nb_menu = childname; + nb_menu = childname + (this.this_el == "this.el." ? ".el" : ""); break; } continue; @@ -467,19 +467,21 @@ public abstract class JsRender.NodeToVala : NodeWriter { GLib.debug("got node %s with nb_child= %s", this.node.fqn() , nb_child); if (this.node.fqn() == "Gtk.NotebookPage" && nb_child != "") { + var nb = (this.this_el == "this.el." ? "notebook.el" : "notebook"); + if (nb_tab == "" && this.node.has("tab_label")) { nb_tab = "new Gtk.Label(this.tab_label)"; } if (nb_menu == "" && nb_tab == "") { - this.addLine(@"$(ipad)notebook.el.append_page( $(nb_child) );"); + this.addLine(@"$(ipad)$(nb).append_page( $(nb_child) );"); return; } if (nb_menu == "") { - this.addLine(@"$(ipad)notebook.el.append_page( $(nb_child) , $(nb_tab) );"); + this.addLine(@"$(ipad)$(nb).append_page( $(nb_child) , $(nb_tab) );"); return; } - this.addLine(@"$(ipad)notebook.el.append_page_menu( $(nb_child) , $(nb_tab), $(nb_menu) );"); + this.addLine(@"$(ipad)$(nb).append_page_menu( $(nb_child) , $(nb_tab), $(nb_menu) );"); } diff --git a/src/Lsp.vala b/src/Lsp.vala index fb2dae7bc..ec896ecea 100644 --- a/src/Lsp.vala +++ b/src/Lsp.vala @@ -335,25 +335,18 @@ namespace Lsp { } public class DocumentSymbol : Object, Json.Serializable { - private Vala.SourceReference? _source_reference; - public string name { get; set; } - public string? detail { get; set; } - public SymbolKind kind { get; set; } - public bool deprecated { get; set; } - private Range? _initial_range; - public Range range { - owned get { - if (_initial_range == null) - _initial_range = new Range.from_sourceref (children.first ()._source_reference); - - return children.fold ((child, current_range) => current_range.union (child.range), _initial_range); - } - } - public Range selectionRange { get; set; } - public Gee.List children { get; private set; default = new Gee.LinkedList (); } - public string? parent_name; + private Vala.SourceReference? _source_reference; + public string name { get; set; } + public string detail { get; set; default = ""; } + public SymbolKind kind { get; set; } + public bool deprecated { get; set; } + + public Range range { get; set; } + public Range selectionRange { get; set; } + public GLib.ListStore children { get; set; default = new GLib.ListStore(typeof(DocumentSymbol)); } + public string? parent_name; - private DocumentSymbol () {} + private DocumentSymbol () {} /** * @param type the data type containing this symbol, if there was one (not available for Namespaces, for example) @@ -395,34 +388,35 @@ namespace Lsp { } public Json.Node serialize_property (string property_name, Value value, ParamSpec pspec) { - if (property_name != "children") + // if (property_name != "children") return default_serialize_property (property_name, value, pspec); - var node = new Json.Node (Json.NodeType.ARRAY); + /*var node = new Json.Node (Json.NodeType.ARRAY); node.init_array (new Json.Array ()); var array = node.get_array (); foreach (var child in children) array.add_element (Json.gobject_serialize (child)); return node; + */ } public bool deserialize_property (string property_name, out Value value, ParamSpec pspec, Json.Node property_node) { - + GLib.debug("deserialise property %s" , property_name); if (property_name != "children") { return default_deserialize_property (property_name, out value, pspec, property_node); } - value = GLib.Value (typeof(Gee.ArrayList)); + value = GLib.Value (typeof(GLib.ListStore)); if (property_node.get_node_type () != Json.NodeType.ARRAY) { - warning ("unexpected property node type for 'arguments' %s", property_node.get_node_type ().to_string ()); + GLib.debug ("unexpected property node type for 'arguments' %s", property_node.get_node_type ().to_string ()); return false; } - - var arguments = new Gee.ArrayList(); + GLib.debug("got child length of %d", (int) property_node.get_array ().get_length()); + var arguments = new GLib.ListStore(typeof(DocumentSymbol)); property_node.get_array ().foreach_element ((array, index, element) => { var add= Json.gobject_deserialize ( typeof (DocumentSymbol), array.get_element(index)) as DocumentSymbol; - arguments.add( add); + arguments.append( add); }); @@ -430,6 +424,28 @@ namespace Lsp { value.set_object (arguments); return true; } + public string symbol_icon { + + owned get { + return this.kind.icon(); + } + } + + public string tooltip { + owned get { + GLib.debug("%s : %s", this.name, this.detail); + //var detail = this.detail == "" ? (this.kind.to_string() + ": " + this.name) : this.detail; + return GLib.Markup.escape_text(this.detail + "\nline: " + this.range.start.line.to_string()); + + } + } + public string sort_key { + owned get { + return this.kind.sort_key().to_string() + "=" + this.name; + } + } + + } public class SymbolInformation : Object { @@ -441,7 +457,7 @@ namespace Lsp { public SymbolInformation.from_document_symbol (DocumentSymbol dsym, string uri) { this.name = dsym.name; this.kind = dsym.kind; - this.location = new Location (uri, dsym.range); + // this.location = new Location (uri, dsym.range); this.containerName = dsym.parent_name; } } @@ -473,7 +489,63 @@ namespace Lsp { Struct = 23, Event = 24, Operator = 25, - TypeParameter = 26 + TypeParameter = 26; + + public string icon () { + + switch (this) { + + // case SymbolKind.Text: return "completion-snippet-symbolic"; + case SymbolKind.Method: return "lang-method-symbolic"; + case SymbolKind.Function: return "lang-function-symbolic"; + case SymbolKind.Constructor: return "lang-method-symbolic"; + case SymbolKind.Field: return "lang-struct-field-symbolic"; + case SymbolKind.Variable: return "lang-variable-symbolic"; + case SymbolKind.Class: return "lang-class-symbolic"; + case SymbolKind.Interface: return "lang-class-symbolic"; + case SymbolKind.Module: return "lang-namespace-symbolic"; + case SymbolKind.Property:return "lang-struct-field-symbolic"; + //case SymbolKind.Unit: return "lang-variable-symbolic"; + //case SymbolKind.Value: return "lang-variable-symbolic"; + case SymbolKind.Enum: return "lang-enum-symbolic"; + //case SymbolKind.Keyword: return "completion-word-symbolic"; + //case SymbolKind.Snippet: return "completion-snippet-symbolic"; + + //case SymbolKind.Color: return "lang-typedef-symbolic"; + case SymbolKind.File:return "lang-typedef-symbolic"; + //case SymbolKind.Reference: return "lang-typedef-symbolic"; + //case SymbolKind.Folder:return "lang-typedef-symbolic"; + case SymbolKind.EnumMember: return "lang-typedef-symbolic"; + case SymbolKind.Constant:return "lang-typedef-symbolic"; + case SymbolKind.Struct: return "lang-struct-symbolic"; + case SymbolKind.Event:return "lang-typedef-symbolic"; + case SymbolKind.Operator:return "lang-typedef-symbolic"; + case SymbolKind.TypeParameter:return "lang-typedef-symbolic"; + + default: + return "completion-snippet-symbolic"; + + } + } + public int sort_key() { + + switch (this) { + case Enum : return 1; + case Class: return 2; + + case Constructor : return 1; + case Method : return 2; + case Field : return 3; + case Property : return 3; + + default: + return 5; + } + + + + } + } public class CompletionList : Object, Json.Serializable { diff --git a/src/Palete/LanguageClient.vala b/src/Palete/LanguageClient.vala index 1fcb28c3f..6d4cfce0d 100644 --- a/src/Palete/LanguageClient.vala +++ b/src/Palete/LanguageClient.vala @@ -88,9 +88,8 @@ namespace Palete { public abstract void exit () throws GLib.Error; public abstract async void shutdown () throws GLib.Error; public abstract async Lsp.CompletionList? completion(JsRender.JsRender file, int line, int offset , int triggerType = 1) throws GLib.Error; - public abstract async Gee.ArrayList syntax (JsRender.JsRender file) throws GLib.Error; public abstract async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error; - + public abstract async Gee.ArrayList documentSymbols (JsRender.JsRender file) throws GLib.Error; } } diff --git a/src/Palete/LanguageClientDummy.vala b/src/Palete/LanguageClientDummy.vala index be78b2f8c..533458de7 100644 --- a/src/Palete/LanguageClientDummy.vala +++ b/src/Palete/LanguageClientDummy.vala @@ -25,13 +25,14 @@ namespace Palete { return ret; } - public override async Gee.ArrayList syntax (JsRender.JsRender file) throws GLib.Error { - var ret = new Gee.ArrayList(); - return ret; - } + public override async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error { return new Lsp.Hover(); } + public override async Gee.ArrayList documentSymbols (JsRender.JsRender file) throws GLib.Error { + var ret = new Gee.ArrayList(); + return ret; + } } } \ No newline at end of file diff --git a/src/Palete/LanguageClientJavascript.vala b/src/Palete/LanguageClientJavascript.vala index d5b34374a..b5bec50cd 100644 --- a/src/Palete/LanguageClientJavascript.vala +++ b/src/Palete/LanguageClientJavascript.vala @@ -278,22 +278,20 @@ namespace Palete { } - - - return ret; } - public override async Gee.ArrayList syntax (JsRender.JsRender file) throws GLib.Error { - var ret = new Gee.ArrayList(); - return ret; - } + public override async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error { return new Lsp.Hover(); } + public override async Gee.ArrayList documentSymbols (JsRender.JsRender file) throws GLib.Error { + var ret = new Gee.ArrayList(); + return ret; + } } diff --git a/src/Palete/LanguageClientVala.vala b/src/Palete/LanguageClientVala.vala index 9a508de9c..57a082b67 100644 --- a/src/Palete/LanguageClientVala.vala +++ b/src/Palete/LanguageClientVala.vala @@ -173,7 +173,14 @@ namespace Palete { this.buildDict ( processId: new Variant.int32 ((int32) Posix.getpid ()), rootPath: new Variant.string (this.project.path), - rootUri: new Variant.string (File.new_for_path (this.project.path).get_uri ()) + rootUri: new Variant.string (File.new_for_path (this.project.path).get_uri ()), + capabilities : this.buildDict ( + textDocument: this.buildDict ( + documentSymbol : this.buildDict ( + hierarchicalDocumentSymbolSupport : new Variant.boolean (true) + ) + ) + ) ), null, out return_value @@ -641,11 +648,10 @@ namespace Palete { - //CompletionListInfo.itmems.parse_varient or CompletionListInfo.parsevarient - public override async Gee.ArrayList syntax (JsRender.JsRender file) throws GLib.Error - { - /* partial_result_token , work_done_token context = null) */ - GLib.debug("get syntax %s", file.relpath); + + public override async Gee.ArrayList documentSymbols (JsRender.JsRender file) throws GLib.Error { + /* partial_result_token , work_done_token context = null) */ + GLib.debug("get documentSymbols %s", file.relpath); var ret = new Gee.ArrayList(); //ret = null; if (!this.isReady()) { @@ -673,17 +679,18 @@ namespace Palete { var ar = json.get_array(); + GLib.debug ("LS replied with %D items", ar.get_length()); for(var i = 0; i < ar.get_length(); i++ ) { var add= Json.gobject_deserialize ( typeof (Lsp.DocumentSymbol), ar.get_element(i)) as Lsp.DocumentSymbol; ret.add( add); } - return ret ; + return ret ; - } + } } \ No newline at end of file -- 2.39.2