X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=src%2FBuilder4%2FEditor.bjs;h=ed341c276a4e2c0985a430ba948e831dc4fa2298;hb=HEAD;hp=07cc131b0a9638655b0cc7410646fdcb50cd5569;hpb=cc074bf6b4ec2282edc0a5fc46117b43564b95e4;p=roobuilder diff --git a/src/Builder4/Editor.bjs b/src/Builder4/Editor.bjs index 07cc131b0..ed341c276 100644 --- a/src/Builder4/Editor.bjs +++ b/src/Builder4/Editor.bjs @@ -1,822 +1,1584 @@ { "build_module" : "builder", + "gen_extended" : false, "items" : [ { + "# GtkSource.SearchContext searchcontext" : "null", "# JsRender.JsRender? file" : "null", "# JsRender.Node node" : "null", "# JsRender.NodeProp? prop" : "null", "# Xcls_MainWindow window" : "null", "# bool dirty" : false, "# bool pos" : false, + "# int last_error_counter" : 0, "# int pos_root_x" : "", "# int pos_root_y" : "", "# string activeEditor" : "\"\"", "$ homogeneous" : false, "$ xns" : "Gtk", - "* pack" : "add", "@ void save" : "()", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", - "Gtk.SourceSearchContext searchcontext" : "null", "bool hexpand" : true, "bool vexpand" : true, "int last_search_end" : 0, "items" : [ { - "$ homogeneous" : false, "$ xns" : "Gtk", - "* pack" : "pack_start,false,true", "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", + "bool resize_end_child" : false, + "bool resize_start_child" : false, + "bool shrink_end_child" : false, + "bool shrink_start_child" : false, + "id" : "paned", "items" : [ { "$ xns" : "Gtk", - "* pack" : "add", - "bool always_show_image" : true, - "id" : "save_button", - "items" : [ - { - "$ xns" : "Gtk", - "* prop" : "image", - "string icon_name" : "document-save", - "xtype" : "Image" - } - ], - "label" : "Save", - "listeners" : { - "clicked" : [ - " () => { ", - " _this.saveContents();", - "}", - " " - ] - }, - "xtype" : "Button" - }, - { - "$ xns" : "Gtk", - "* pack" : "add", + "* prop" : "start_child", + "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "bool hexpand" : true, - "xtype" : "Label" - }, - { - "$ xns" : "Gtk", - "* ctor" : "new Gtk.HScale.with_range (6, 30, 1)", - "* init" : [ - "{", - "\tthis.el.set_range(6,30);", - "\tthis.el.set_value(8);", - "}", - "" - ], - "* pack" : "add", - "bool draw_value" : true, - "bool has_origin" : true, - "bool sensitive" : true, - "int digits" : 0, - "int width_request" : 200, - "listeners" : { - "change_value" : [ - "(st, val ) => {", - "\t ", - "\t var description = Pango.FontDescription.from_string(\"monospace\");", - "\t print(\"resize to %d\", (int)val*1000);", - " description.set_size((int)val*1000);", - " _this.view.el.override_font(description);", - " return false;", - "}" - ] - }, - "xtype" : "HScale" - }, - { - "$ xns" : "Gtk", - "* pack" : "add", - "bool always_show_image" : true, - "id" : "close_btn", + "int spacing" : 0, "items" : [ { + "$ homogeneous" : false, "$ xns" : "Gtk", - "* prop" : "image", - "string icon_name" : "window-close", - "xtype" : "Image" - } - ], - "listeners" : { - "clicked" : [ - " () => { ", - " _this.saveContents();", - " _this.window.windowstate.switchState(WindowState.State.PREVIEW);", - "}", - " " - ] - }, - "xtype" : "Button" - } - ], - "xtype" : "Box" - }, - { - "$ xns" : "Gtk", - "* init" : [ - "this.el.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);", - "" - ], - "bool vexpand" : true, - "id" : "RightEditor", - "items" : [ - { - "$ Gtk.SourceDrawSpacesFlags draw_spaces" : "Gtk.SourceDrawSpacesFlags.LEADING + Gtk.SourceDrawSpacesFlags.TRAILING + Gtk.SourceDrawSpacesFlags.TAB + Gtk.SourceDrawSpacesFlags.SPACE", - "$ gboolean auto_indent" : true, - "$ show_line_numbers" : true, - "$ xns" : "Gtk", - "* init" : [ - " ", - "", - "\t\tvar description = Pango.FontDescription.from_string(\"monospace\");", - "\t\tdescription.set_size(8000);", - "", - "\t\t this.el.override_font(description);", - "", - "\ttry { ", - "\t\tthis.el.completion.add_provider(new Palete.CompletionProvider(_this));", - " } catch (GLib.Error e) {}", - " ", - "\tthis.el.completion.unblock_interactive();", - "\tthis.el.completion.select_on_show\t\t\t= true; // select", - "\tthis.el.completion.show_headers\t\t\t= false;", - "\tthis.el.completion.remember_info_visibility\t\t= true;", - " ", - " ", - " var attrs = new Gtk.SourceMarkAttributes();", - " var pink = Gdk.RGBA();", - " pink.parse ( \"pink\");", - " attrs.set_background ( pink);", - " attrs.set_icon_name ( \"process-stop\"); ", - " attrs.query_tooltip_text.connect(( mark) => {", - " //print(\"tooltip query? %s\\n\", mark.name);", - " return mark.name;", - " });", - " ", - " this.el.set_mark_attributes (\"ERR\", attrs, 1);", - " ", - " var wattrs = new Gtk.SourceMarkAttributes();", - " var blue = Gdk.RGBA();", - " blue.parse ( \"#ABF4EB\");", - " wattrs.set_background ( blue);", - " wattrs.set_icon_name ( \"process-stop\"); ", - " wattrs.query_tooltip_text.connect(( mark) => {", - " //print(\"tooltip query? %s\\n\", mark.name);", - " return mark.name;", - " });", - " ", - " this.el.set_mark_attributes (\"WARN\", wattrs, 1);", - " ", - " ", - " ", - " var dattrs = new Gtk.SourceMarkAttributes();", - " var purple = Gdk.RGBA();", - " purple.parse ( \"#EEA9FF\");", - " dattrs.set_background ( purple);", - " dattrs.set_icon_name ( \"process-stop\"); ", - " dattrs.query_tooltip_text.connect(( mark) => {", - " //print(\"tooltip query? %s\\n\", mark.name);", - " return mark.name;", - " });", - " ", - " this.el.set_mark_attributes (\"DEPR\", dattrs, 1);", - " ", - " " - ], - "* pack" : "add", - "bool insert_spaces_instead_of_tabs" : true, - "gboolean highlight_current_line" : true, - "gboolean show_line_marks" : true, - "id" : "view", - "indent_width" : 4, - "items" : [ - { - "$ xns" : "Gtk", - "* pack" : "set_buffer", - "bool check_queued" : false, - "bool check_running" : false, - "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 ;", - "}", - "", - " ", - "" - ] - }, - "xtype" : "SourceBuffer", - "| bool checkSyntax" : [ - " () {", - " ", - " if (this.check_running) {", - " print(\"Check is running\\n\");", - " if (this.check_queued) { ", - " print(\"Check is already queued\");", - " return true;", - " }", - " this.check_queued = true;", - " print(\"Adding queued Check \");", - " GLib.Timeout.add_seconds(1, () => {", - " this.check_queued = false;", - " ", - " this.checkSyntax();", - " return false;", - " });", - " ", - "", - " return true;", - " }", - " 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;", - " }", - " ", - " if (_this.file.xtype == \"PlainFile\") {", - " ", - " // assume it's gtk...", - " this.check_running = true;", - " ", - " if (!BuilderApplication.valasource.checkPlainFileSpawn(", - "\t _this.file,", - "\t str", - "\t )) {", - " this.check_running = false;", - " }", - "\t", - " return true;", - " ", - " }", - " if (_this.file == null) {", - " return true;", - " }", - " var p = _this.file.project.palete;", - " ", - "", - " ", - " this.check_running = true;", - " ", - " ", - " if (_this.file.language == \"js\") {", - " this.check_running = false;", - " print(\"calling validate javascript\\n\"); ", - " Gee.HashMap errors;", - " p.javascriptHasErrors(", - " \t\t_this.window.windowstate,", - " str, ", - " _this.prop,", - " _this.file, // no reference not node?", - " out errors", - " );", - " return this.highlightErrors(errors); ", - " ", - " }", - " ", - " ", - " print(\"calling validate vala\\n\"); ", - " // clear the buttons.", - " ", - " ", - " if (! BuilderApplication.valasource.checkFileWithNodePropChange(", - " _this.file,", - " _this.node,", - " _this.prop, ", - " str", - " )) {", - " this.check_running = false;", - " } ", - " ", - " ", - " ", - " //print(\"done mark line\\n\");", - " ", - " return true; // at present allow saving - even if it's invalid..", - "}", - "" - ], - "| bool highlightErrors" : [ - "( Gee.HashMap validate_res) {", - " ", - " this.error_line = validate_res.size;", - "", - " if (this.error_line < 1) {", - " return true;", - " }", - " var tlines = this.el.get_line_count ();", - " Gtk.TextIter iter;", - " var valiter = validate_res.map_iterator();", - " while (valiter.next()) {", - " ", - " // print(\"get inter\\n\");", - " var eline = valiter.get_key();", - " if (eline > tlines) {", - " continue;", - " }", - " this.el.get_iter_at_line( out iter, eline);", - " //print(\"mark line\\n\");", - " this.el.create_source_mark(valiter.get_value(), \"ERR\", iter);", - " } ", - " return false;", - " }" - ], - "| bool highlightErrorsJson" : [ - "(string type, Json.Object obj) {", - " Gtk.TextIter start;", - " Gtk.TextIter end; ", - " this.el.get_bounds (out start, out end);", - " ", - " this.el.remove_source_marks (start, end, type);", - " ", - " ", - " // we should highlight other types of errors..", - " ", - " if (!obj.has_member(type)) {", - " print(\"Return has no errors\\n\");", - " return true;", - " }", - " ", - " if (_this.window.windowstate.state != WindowState.State.CODEONLY ", - " ", - " ) {", - " return true;", - " } ", - " ", - " ", - " var err = obj.get_object_member(type);", - " ", - " ", - " if (_this.file == null) {", - " return true;", - " ", - " }", - " var valafn = _this.file.path;", - " ", - " if (_this.file.xtype != \"PlainFile\") {", - "", - "", - " ", - " ", - " valafn = \"\";", - " try { ", - " var regex = new Regex(\"\\\\.bjs$\");", - " // should not happen", - " ", - " ", - " valafn = regex.replace(_this.file.path,_this.file.path.length , 0 , \".vala\");", - " } catch (GLib.RegexError e) {", - " return true;", - " } ", - "", - "", - "", - " }", - " if (!err.has_member(valafn)) {", - " print(\"File path has no errors\\n\");", - " return true;", - " }", - "", - " var lines = err.get_object_member(valafn);", - " ", - " var offset = 1;", - " if (obj.has_member(\"line_offset\")) {", - " offset = (int)obj.get_int_member(\"line_offset\") + 1;", - " }", - " ", - "", - " ", - " ", - " var tlines = this.el.get_line_count () +1;", - " ", - " lines.foreach_member((obj, line, node) => {", - " ", - " Gtk.TextIter iter;", - " // print(\"get inter\\n\");", - " var eline = int.parse(line) - offset;", - " print(\"GOT ERROR on line %s -- converted to %d\\n\", line,eline);", - " ", - " ", - " if (eline > tlines || eline < 0) {", - " return;", - " }", - " this.el.get_iter_at_line( out iter, eline);", - " //print(\"mark line\\n\");", - " var msg = \"Line: %d\".printf(eline+1);", - " var ar = lines.get_array_member(line);", - " for (var i = 0 ; i < ar.get_length(); i++) {", - "\t\t msg += (msg.length > 0) ? \"\\n\" : \"\";", - "\t\t msg += ar.get_string_element(i);", - "\t }", - " ", - " ", - " this.el.create_source_mark(msg, type, iter);", - " } );", - " return false;", - " ", - "", - "", - "", - "", - "}", - "" + "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", + "bool hexpand" : false, + "bool vexpand" : false, + "items" : [ + { + "$ xns" : "Gtk", + "bool vexpand" : true, + "id" : "save_button", + "label" : "Save", + "listeners" : { + "clicked" : [ + " () => { ", + " _this.saveContents();", + "}", + " " + ] + }, + "xtype" : "Button" + }, + { + "$ xns" : "Gtk", + "Gtk.Justification justify" : "Gtk.Justification.LEFT", + "bool hexpand" : true, + "float xalign" : 0, + "id" : "helper", + "int margin_end" : 4, + "int margin_start" : 4, + "listeners" : { + "activate_link" : [ + "(uri) => {", + "\tGLib.debug(\"got uri %s\", uri);", + "\tvar ls = _this.file.getLanguageServer();", + "\tls.symbol.begin(uri, (a,b) => {", + "\t\tls.symbol.end(b);", + "\t});", + "\t", + "\treturn true;", + "}", + "" + ], + "query_tooltip" : [ + "(x, y, keyboard_tooltip, tooltip) => {", + "\tGLib.debug(\"using quiery tooltip?\");", + "\tvar lbl = new Gtk.Label(this.el.tooltip_markup);", + "\tlbl.width_request = 500;", + "\ttooltip.set_custom(lbl);", + "", + "\treturn true;", + "}", + "" + ] + }, + "xtype" : "Label", + "| void setHelp" : [ + "(Lsp.Hover? help) {", + "\tif (help == null || help.contents == null", + "\t\t|| help.contents.size < 1) {", + "\t\tthis.el.set_text(\"\");", + "\t\treturn;", + "\t}", + "\tvar sig = help.contents.get(0).value.split(\" \");", + "\tstring[] str = {};", + "\tfor(var i =0; i < sig.length; i++) {", + "\t", + "\t\tswitch(sig[i]) {", + "\t\t\tcase \"public\":", + "\t\t\tcase \"private\":", + "\t\t\tcase \"protected\":", + "\t\t\tcase \"async\":", + "\t\t\tcase \"class\":", + "\t\t\tcase \"{\":", + "\t\t\tcase \"}\":", + "\t\t\tcase \"(\":", + "\t\t\tcase \")\":", + "\t\t\t", + "\t\t\t\tstr += sig[i];", + "\t\t\t\tcontinue;", + "\t\t\t\t", + "\t\t\t\t", + "\t\t\tdefault:", + "\t", + "\t\t\t\tstr += (\"\" + ", + "\t\t\t\t\tGLib.Markup.escape_text(sig[i])", + "\t\t\t\t\t+\"\");", + "\t\t\tcontinue;", + "\t\t}", + "\t}", + "\tif (help.contents.size > 1) {", + "\t\tthis.el.tooltip_markup = GLib.Markup.escape_text(help.contents.get(1).value);", + "\t} else {", + "\t\tthis.el.tooltip_markup = GLib.Markup.escape_text(help.contents.get(0).value);", + "\t}", + "\tthis.el.set_markup(string.joinv(\" \",str));", + "\t", + "}" + ] + }, + { + "$ 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", + " ", + "}", + "" + ], + "Gtk.Align halign" : "Gtk.Align.END", + "bool draw_value" : false, + "bool has_origin" : true, + "bool sensitive" : true, + "int digits" : 0, + "int width_request" : 150, + "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", + "Gtk.Align halign" : "Gtk.Align.END", + "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;", - "}", - " " - ] - } - ], - "listeners" : { - "key_release_event" : [ - " (event) => {", - " ", - " if (event.keyval == Gdk.Key.s && (event.state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", - " GLib.debug(\"SAVE: ctrl-S pressed\");", - " _this.saveContents();", - " return false;", - " }", - " ", - " if (event.keyval == Gdk.Key.g && (event.state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", - "\t GLib.debug(\"SAVE: ctrl-g pressed\");", - "\t\t_this.forwardSearch(true);", - "\t return true;", - "\t}", - "\tif (event.keyval == Gdk.Key.f && (event.state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", - "\t GLib.debug(\"SAVE: ctrl-f pressed\");", - "\t\t_this.search_entry.el.grab_focus();", - "\t return true;", - "\t}", - " ", - " // print(event.key.keyval)", - " ", - " return false;", - "", - "} ", - "", - " " - ] - }, - "uint tab_width" : 4, - "xtype" : "SourceView", - "| void load" : [ - " (string str) {", - "", - "// show the help page for the active node..", - " //this.get('/Help').show();", - "", - "", - " // this.get('/BottomPane').el.set_current_page(0);", - " var buf = (Gtk.SourceBuffer)this.el.get_buffer();", - " buf.set_text(str, str.length);", - " buf.set_undo_manager(null);", - " ", - " var lm = Gtk.SourceLanguageManager.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);", - " ", - " ", - " ((Gtk.SourceBuffer)(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;", - "}" - ] - } - ], - "xtype" : "ScrolledWindow" - }, - { - "$ xns" : "Gtk", - "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", - "bool homogeneous" : false, - "bool vexpand" : false, - "int spacing" : 0, - "items" : [ - { - "$ xns" : "Gtk", - "* init" : [ - "var description = Pango.FontDescription.from_string(\"monospace\");", - "\tdescription.set_size(8000);", - "\t this.el.override_font(description);", - "", - "" - ], - "bool hexpand" : true, - "id" : "search_entry", - "int width_request" : 300, - "listeners" : { - "changed" : [ - "() => {", - "\t/*", - "\tif (this.el.text == \"\") {", - "\t\t_this.search_results.el.hide();", - "\t\treturn;", - "\t}", - "\tvar res = 0;", - "\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\tres = _this.windowstate.code_editor_tab.search(this.el.text);", - "\t\t\t", - "\t\t\tbreak;", - "\t\tcase WindowState.State.PREVIEW:", - "\t\t\tif (_this.windowstate.file.xtype == \"Gtk\") {", - "\t\t\t\t res = _this.windowstate.window_gladeview.search(this.el.text);", - "\t\t\t} else { ", - "\t\t\t\t res = _this.windowstate.window_rooview.search(this.el.text);\t\t\t", - "\t\t\t}", - "\t\t", - "\t\t", - "\t\t\tbreak;", - "\t}", - "\t_this.search_results.el.show();", - "\tif (res > 0) {", - "\t\t_this.search_results.el.label = \"%d Matches\".printf(res);", - "\t} else {", - "\t\t_this.search_results.el.label = \"No Matches\";", - "\t}", - "\t\t", - "\t*/", - "\t", - "}", - "" - ], - "key_press_event" : [ - "(event) => {", - " if (event.keyval == Gdk.Key.g && (event.state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {", - "\t GLib.debug(\"SAVE: ctrl-g pressed\");", - "\t\t_this.forwardSearch(true);", - "\t return true;", - "\t}", - " ", - " ", - " \tif (event.keyval == Gdk.Key.Return && this.el.text.length > 0) {", - "\t\tvar res = _this.search(this.el.text);", - "\t\t _this.search_results.updateResults();", - "", - "\t\tGLib.Timeout.add_seconds(2,() => {", - "\t\t\t _this.search_results.updateResults();", - "\t\t\t return false;", - "\t\t });", - "\t ", - "\t\t", - "\t return true;", - "", - "\t} ", - " // print(event.key.keyval)", - " ", - " return false;", - "", - "} " - ] - }, - "string placeholder_text" : "Press enter to search", - "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", - "* pack" : "add", - "items" : [ - { - "$ xns" : "Gtk", - "* pack" : "add", - "bool always_show_image" : true, - "bool visible" : false, - "id" : "search_results", - "listeners" : { - "button_press_event" : [ - "() => {", - "/*", - " if (this.popup == null) {", - " this.popup = new Xcls_ValaCompileErrors();", - " this.popup.window = _this;", - " }", - " ", - " ", - " this.popup.show(this.notices, this.el);", - " */", - " return true;", - "}" - ] - }, - "xtype" : "ImageMenuItem", - "| 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", - "}" - ] - } - ], - "xtype" : "MenuBar" - }, - { - "$ xns" : "Gtk", - "bool always_show_image" : true, - "bool sensitive" : false, - "id" : "nextBtn", - "items" : [ + "xtype" : "Box" + }, { "$ xns" : "Gtk", - "* prop" : "image", - "string icon_name" : "go-down", - "xtype" : "Image" - } - ], - "listeners" : { - "button_press_event" : [ - "(event) => {", - "", - "\t_this.forwardSearch(true);", - "\t", - "\treturn true;", - "}", - "" - ] - }, - "string label" : "Next", - "xtype" : "Button" - }, - { - "$ xns" : "Gtk", - "bool always_show_image" : true, - "bool sensitive" : false, - "id" : "backBtn", - "items" : [ + "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 ;", + "}", + "" + ], + "cursor_moved" : [ + "( ) => {", + "", + "\tGtk.TextIter iter;", + "\tthis.el.get_iter_at_offset (", + "\t\t\tout iter, this.el.cursor_position);", + "", + "\t_this.navigation.updateSelectedLine(", + "\t\t\t(uint)iter.get_line(),", + "\t\t\t(uint)iter.get_line_offset()", + "\t\t);", + "\tthis.showHelp(iter);", + "", + "}", + "" + ] + }, + "| 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);", + "\t\t_this.file.getLanguageServer().queueDocumentSymbols(_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;", + "}", + " " + ], + "| void showHelp" : [ + "(Gtk.TextIter iter) {", + "\tvar back = iter.copy();", + "\tback.backward_char();", + "\t", + "\tvar forward = iter.copy();", + "\tforward.forward_char();", + "\t", + "\t// what's the character at the iter?", + "\tvar str = back.get_text(iter);", + "\tstr += iter.get_text(forward);", + "\tif (str.strip().length < 1) {", + "\t\treturn;", + "\t}", + "\tvar offset = iter.get_line_offset();", + "\tvar line = iter.get_line();", + "\tif (_this.prop != null) {", + "\t\t\t\t// ", + "\t\tline += _this.prop.start_line ; ", + "\t\t\t\t\t// this is based on Gtk using tabs (hence 1/2 chars);", + "\t\toffset += _this.node.node_pad.length;", + "\t\t\t\t\t// javascript listeners are indented 2 more spaces.", + "\t\tif (_this.prop.ptype == JsRender.NodePropType.LISTENER) {", + "\t\t\toffset += 2;", + "\t\t}", + "\t} ", + "\t", + "\tvar ls = _this.file.getLanguageServer();", + "\tls.hover.begin(", + "\t\t_this.file, line, offset,", + "\t\t( a, o) => {", + "\t\t\ttry {", + "\t\t\t\tvar res = ls.hover.end(o );", + "\t\t\t", + "\t\t\t\t_this.helper.setHelp(res);", + "\t\t\t} catch (GLib.Error e) {", + "\t\t\t\t// noop..", + "\t\t\t}", + "\t\t});", + "}\t", + "\t\t ", + "" + ] + }, + { + "# 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", + "listeners" : { + "pressed" : [ + "(n_press, x, y) => {", + "\tGtk.TextIter iter;", + "\tint buffer_x, buffer_y;", + "\tvar gut = _this.view.el.get_gutter(Gtk.TextWindowType.LEFT);", + "\t", + "\t _this.view.el.window_to_buffer_coords (Gtk.TextWindowType.TEXT,", + "\t\t(int)x - gut.get_width(), (int)y,", + " \t\tout buffer_x, out buffer_y);", + "\t_this.view.el.get_iter_at_location (out iter, ", + "\t\t\tbuffer_x, buffer_y);;", + "\t", + "\t", + "\tif (_this.buffer.el.iter_has_context_class(iter, \"comment\") ||", + "\t\t_this.buffer.el.iter_has_context_class(iter, \"string\")", + "\t) { ", + "\t\treturn ;", + "\t}", + "\t_this.buffer.showHelp(iter);", + "\t ", + "\t\t ", + " ", + "}", + "" + ] + }, + "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" + }, { "$ xns" : "Gtk", - "* prop" : "image", - "string icon_name" : "go-up", - "xtype" : "Image" + "* 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" : { - "button_press_event" : [ - "(event) => {", - "", - "\t_this.backSearch(true);", - "\t", - "\treturn true;", - "}", - "" - ] - }, - "string label" : "Previous", - "xtype" : "Button" + "xtype" : "Box" }, { "$ xns" : "Gtk", - "bool always_show_image" : true, + "* prop" : "end_child", + "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", + "bool hexpand" : true, + "bool vexpand" : true, + "bool visible" : false, + "id" : "navigation_holder", + "int spacing" : 0, + "int width_request" : 120, "items" : [ { "$ xns" : "Gtk", - "* prop" : "image", - "string icon_name" : "emblem-system", - "xtype" : "Image" + "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", + "int spacing" : 0, + "xtype" : "Box" }, { "$ xns" : "Gtk", - "* prop" : "popup", - "id" : "search_settings", + "bool hexpand" : true, + "bool vexpand" : true, + "bool visible" : true, + "id" : "navigationwindow", "items" : [ { + "# int last_selected_line" : "-1", + "$ Gtk.Widget? selected_row" : "null", "$ xns" : "Gtk", - "* init" : [ - "{", - "\tthis.el.show();", - "}", - "" + "* prop" : "child", + "id" : "navigation", + "items" : [ + { + "$ xns" : "Gtk", + "bool expand" : true, + "items" : [ + { + "$ xns" : "Gtk", + "* prop" : "factory", + "listeners" : { + "bind" : [ + "(listitem) => {", + "\t ", + "\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", + "\tsym.set_data(\"widget\", expand.get_parent());", + "\texpand.get_parent().get_parent().set_data(\"symbol\", sym);", + "\t", + "\t//GLib.debug(\"save sym on %s\", expand.get_parent().get_parent().get_type().name());", + "\t", + "\t//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);", + " \texpand.set_list_row(lr);", + " \t//this.in_bind = true;", + " \t// default is to expand", + " ", + " \t//this.in_bind = false;", + " \t", + " \tsym.bind_property(\"symbol_icon\",", + " img, \"icon_name\",", + " GLib.BindingFlags.SYNC_CREATE);", + " \t", + " \thbox.css_classes = { 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", + "* prop" : "model", + "id" : "navigationsort", + "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", + "| Lsp.DocumentSymbol? symbolAtLine" : [ + "(uint line, uint chr) {", + " ", + "\t", + "\tfor(var i = 0; i < this.el.get_n_items();i++) {", + "\t\tvar el = (Lsp.DocumentSymbol)this.el.get_item(i);", + "\t\t//GLib.debug(\"Check sym %s : %d-%d\",", + "\t\t//\tel.name , (int)el.range.start.line,", + "\t\t//\t(int)el.range.end.line", + "\t\t//);", + "\t\tvar ret = el.containsLine(line,chr);", + "\t\tif (ret != null) {", + "\t\t\treturn ret;", + "\t\t}", + "\t\t", + "\t}", + "\t", + "\treturn null;", + "}" + ] + } + ], + "listeners" : { + "items_changed" : [ + "(position, removed, added) => {", + "\tGLib.debug(\"tree item changed %d , %d , %d\",(int) position, (int)removed, (int) added);", + "\t if (added < 1) { ", + "\t \treturn;", + " \t}", + "\t//var sym = (Lsp.DocumentSymbol) this.el.get_item(position);", + "\tvar row = this.el.get_row(position);", + "\t", + "\tGLib.debug(\"got %s\", row.get_item().get_type().name());", + "\t", + "", + "}", + "" + ] + }, + "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" + } + ], + "xtype" : "SortListModel", + "| Lsp.DocumentSymbol? getSymbolAt" : [ + "(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 ", + "}" + ], + "| int getRowFromSymbol" : [ + "(Lsp.DocumentSymbol sym) {", + "", + "\tfor (var i=0;i < this.el.get_n_items(); i++) {", + "\t\tvar tr = (Gtk.TreeListRow)this.el.get_item(i);", + "\t ", + "\t\tif (sym.equals( (Lsp.DocumentSymbol)tr.get_item())) {", + "\t\t\treturn i;", + "\t\t}", + "\t}", + " \treturn -1;", + "}" + ], + "| void collapseOnLoad" : [ + "() {", + "\tfor (var i=0;i < this.el.get_n_items(); i++) {", + "\t\tvar tr = (Gtk.TreeListRow)this.el.get_item(i);", + "\t\tvar sym = (Lsp.DocumentSymbol)tr.get_item();", + "\t\tswitch (sym.kind) {", + "\t \t\tcase Lsp.SymbolKind.Enum: ", + "\t \t\t\ttr.expanded = false;", + "\t \t\t\tbreak;", + "\t\t\tdefault:", + "\t\t\t\t//tr.expanded = true;", + "\t\t\t\tbreak;", + "\t\t}", + "\t}", + " ", + "\t", + "", + "", + "}" + ] + } + ], + "xtype" : "NoSelection" + }, + { + "$ xns" : "Gtk", + "listeners" : { + "pressed" : [ + "(n_press, x, y) => {", + "\tstring pos;", + " \tvar row = _this.navigation.getRowWidgetAt(x,y, out pos );", + "", + " if (row == null) {", + "\t GLib.debug(\"no row selected items\");", + "\t return;", + " }", + "\tGLib.debug(\"got click on %s\", row.get_type().name()); ", + " //Lsp.DocumentSymbol", + " var sym = row.get_data(\"symbol\");", + " if (sym == null) {", + " \treturn;", + "\t}", + "\t/*", + "\t \"range\" : {", + " \"start\" : {", + " \"line\" : 1410,", + " \"character\" : 8", + " },", + " \"end\" : {", + " \"line\" : 1410,", + " \"character\" : 39", + " }", + " },", + " */", + " GLib.debug(\"goto line %d\", (int)sym.range.start.line); ", + " _this.scroll_to_line((int)sym.range.start.line);", + " Gtk.TextIter iter;", + " _this.buffer.el.get_iter_at_line_offset(out iter, ", + " \t(int)sym.range.start.line,", + " \t(int)sym.range.start.character", + "\t);", + " _this.buffer.el.place_cursor(iter);", + "\t", + "}" + ] + }, + "xtype" : "GestureClick" + } ], - "id" : "case_sensitive", - "string label" : "Case Sensitive", - "xtype" : "CheckMenuItem" - }, - { - "$ xns" : "Gtk", - "* init" : [ - "{", - "\tthis.el.show();", - "}", - "" + "string name" : "editor-navigation", + "xtype" : "ColumnView", + "| Gtk.Widget? getRowWidgetAt" : [ + "(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 null;", + "\t}", + "\t", + "\tvar row= w.get_ancestor(GLib.Type.from_name(\"GtkColumnViewRowWidget\"));", + "\tif (row == null) {", + "\t\treturn null;", + "\t}", + "\t", + "\t//GLib.debug(\"got colview %s\", row == null ? \"nothing\" : row.get_type().name());", + "\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 row;", + " }" ], - "id" : "regex", - "string label" : "Regex", - "xtype" : "CheckMenuItem" - }, - { - "$ xns" : "Gtk", - "* init" : [ - "{", - "\tthis.el.show();", - "}", - "" + "| 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;", + " }" ], - "id" : "multiline", - "string label" : "Multi-line (add \\n)", - "xtype" : "CheckMenuItem" + "| void show" : [ + "(Gee.ArrayList syms) {", + "\t", + "\tif (!_this.navigation_holder.el.visible && syms.size > 0) {", + "\t\t_this.navigation_holder.el.show();", + "\t\t_this.paned.el.position = ", + "\t\t\t_this.paned.el.get_width() - 200;", + "\t} ", + "\t//_this.navliststore.el.remove_all();", + "\t", + "\t", + "\tvar ls = new GLib.ListStore(typeof(Lsp.DocumentSymbol));", + "\t", + "\tforeach(var sym in syms) {", + "\t\tls.append(sym);", + "\t}", + "\t// if syms updated is empty, but we already have one..", + "\tif (_this.navliststore.el.get_n_items() > 0 && ls.get_n_items() < 1) {", + "\t\treturn;", + "\t}", + "\tLsp.DocumentSymbol.copyList(ls, _this.navliststore.el);", + "\t//_this.navliststore.el.append(sym);", + "\tthis.last_selected_line = -1;", + "\tGLib.Idle.add(() => {", + "\t\t_this.navigationsort.collapseOnLoad();", + "\t\tGtk.TextIter iter;", + "\t\t_this.buffer.el.get_iter_at_offset (", + "\t\t\t\tout iter, _this.buffer.el.cursor_position);", + "\t\t", + "\t\tGLib.debug(\"idle update scroll %d, %d\", iter.get_line(),", + "\t\t\t\titer.get_line_offset());", + "\t\tthis.updateSelectedLine(", + "\t\t\t\t(uint)iter.get_line(),", + "\t\t\t\t(uint)iter.get_line_offset()", + "\t\t);", + "\t\treturn false;", + "\t});", + "", + "}" + ], + "| void updateSelectedLine" : [ + "(uint line, uint chr) {", + "\tif (line == this.last_selected_line) {", + "\t\treturn;", + "\t}", + "\tGLib.debug(\"select line %d\", (int)line);", + "\tthis.last_selected_line = (int)line;", + "\t", + "\t", + "\tvar new_row = -1;", + "\tvar sym = _this.navliststore.symbolAtLine(line, chr);", + "\tif (sym != null) {", + "\t \tnew_row = _this.navigationsort.getRowFromSymbol(sym);", + " \t\tGLib.debug(\"select line %d - row found %d\", (int)line, new_row);", + " \t} else {", + " \t\tGLib.debug(\" no symbol found at line %d\", (int)line);", + " \t}", + " \t", + "\tif (this.selected_row != null) { ", + "\t\tGLib.debug(\" remove selected row\");", + "\t\tthis.selected_row.remove_css_class(\"selected-row\");", + "\t}", + "\tthis.selected_row = null;", + "\tif (new_row > -1) {", + "\t\tthis.el.scroll_to(new_row,null,Gtk.ListScrollFlags.NONE, null);", + "\t\tvar row = sym.get_data(\"widget\");", + "\t\tif (row != null) {", + "\t\t\tGLib.debug(\" Add selected row\");", + " \t\t\t", + "\t\t\trow.add_css_class(\"selected-row\");", + "\t\t\tthis.selected_row = row;", + "", + "\t\t\t", + "\t\t} else {", + "\t\t\tGLib.debug(\"could not find widget on row %d\", new_row);", + "\t\t}", + "", + "\t}", + "", + "", + "}" + ] } ], - "xtype" : "Menu" + "xtype" : "ScrolledWindow" } ], - "string label" : "Settings", - "xtype" : "MenuButton" + "xtype" : "Box" } ], - "xtype" : "Box" + "xtype" : "Paned" } ], "xtype" : "Box", @@ -844,7 +1606,7 @@ " if (_this.file.xtype != \"PlainFile\") {", " // in theory these properties have to exist!?!", " \tthis.prop.val = str;", - " this.window.windowstate.left_props.reload();", + " //this.window.windowstate.left_props.reload();", " } else {", " _this.file.setSource( str );", " }", @@ -859,12 +1621,12 @@ "| int search" : [ "(string in_txt) {", "", - "\tvar s = new Gtk.SourceSearchSettings();", + "\tvar s = new GtkSource.SearchSettings();", "\ts.case_sensitive = _this.case_sensitive.el.active;", "\ts.regex_enabled = _this.regex.el.active;\t", "\ts.wrap_around = false;", "\t", - "\tthis.searchcontext = new Gtk.SourceSearchContext(this.buffer.el,s);", + "\tthis.searchcontext = new GtkSource.SearchContext(this.buffer.el,s);", "\tthis.searchcontext.set_highlight(true);", "\tvar txt = in_txt;", "\t", @@ -876,7 +1638,8 @@ "\tGtk.TextIter beg, st,en;", "\t ", "\tthis.buffer.el.get_start_iter(out beg);", - "\tthis.searchcontext.forward(beg, out st, out en);", + "\tbool has_wrapped_around;", + "\tthis.searchcontext.forward(beg, out st, out en, out has_wrapped_around);", "\tthis.last_search_end = 0;", "\t", "\treturn this.searchcontext.get_occurrences_count();", @@ -887,19 +1650,48 @@ "}", "" ], + "| string tempFileContents" : [ + "() {", + " ", + " ", + " if (_this.file == null) {", + " return \"\";", + " }", + "\tvar str= this.buffer.toString();", + "\tif (_this.file.xtype == \"PlainFile\") {", + " ", + " \treturn str;", + " ", + " }", + " ", + " ", + " ", + " GLib.debug(\"calling validate\"); ", + " // clear the buttons.", + " \tif (_this.prop.name == \"xns\" || _this.prop.name == \"xtype\") {", + "\t\treturn this.file.toSource(); ;", + "\t}", + "\t", + "\tvar oldcode = _this.prop.val;", + "\t_this.prop.val = str;", + " var ret = _this.file.toSource();", + " _this.prop.val = oldcode;", + " return ret;", + " ", + "}" + ], "| void backSearch" : [ "(bool change_focus) {", "", "\tif (this.searchcontext == null) {", "\t\treturn;", - "\t} ", + "\t}", "\t", "\tGtk.TextIter beg, st,en;", "\tbool has_wrapped_around;", "\tthis.buffer.el.get_iter_at_offset(out beg, this.last_search_end -1 );", "\t", - "\tif (!this.searchcontext.backward2(beg, out st, out en, out has_wrapped_around)) {", - "\t", + "\tif (!this.searchcontext.backward(beg, out st, out en, out has_wrapped_around)) {", "\t\tthis.last_search_end = 0;", "\t} else {", "\t\tthis.last_search_end = en.get_offset();", @@ -909,7 +1701,7 @@ "\t\tthis.buffer.el.place_cursor(st);", "\t\tthis.view.el.scroll_to_iter(st, 0.1f, true, 0.0f, 0.5f);", "\t}", - " ", + "", "}", "" ], @@ -919,11 +1711,11 @@ "\tif (this.searchcontext == null) {", "\t\treturn;", "\t} ", - "\t", + "", "\tGtk.TextIter beg, st,en;", "\t bool has_wrapped_around;", "\tthis.buffer.el.get_iter_at_offset(out beg, this.last_search_end);", - "\tif (!this.searchcontext.forward2(beg, out st, out en, out has_wrapped_around)) {", + "\tif (!this.searchcontext.forward(beg, out st, out en, out has_wrapped_around)) {", "\t", "\t\tthis.last_search_end = 0; // not sure if this should happen", "\t} else {", @@ -960,7 +1752,7 @@ " ", "\t\tvar buf = this.view.el.get_buffer();", "", - "\t\tvar sbuf = (Gtk.SourceBuffer) buf;", + "\t\tvar sbuf = (GtkSource.Buffer) buf;", "", "", "\t\tGtk.TextIter iter; ", @@ -975,29 +1767,170 @@ "(JsRender.JsRender file, JsRender.Node? node, JsRender.NodeProp? prop)", "{", " this.reset();", + " if (this.file != null) {", + " \tthis.file.navigation_tree_updated.disconnect(", + " \t\t_this.navigation.show", + " \t);", + " }", " this.file = file; ", - " ", + " this.file.navigation_tree_updated.connect(", + "\t\t_this.navigation.show", + "\t);", " if (file.xtype != \"PlainFile\") {", " \tthis.prop = prop;", " this.node = node;", "", " // find the text for the node..", " 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.queueDocumentSymbols(file);", + " ////ls.documentSymbols.begin(file, (a,o) => {", + " //\t_this.navigation.show(ls.documentSymbols.end(o)); ", + " //});", + " //documentSymbols", + " ", " }", " ", "}" + ], + "| void updateErrorMarks" : [ + "() {", + "\t", + " ", + "", + "\tvar buf = _this.buffer.el;", + "\tGtk.TextIter start;", + "\tGtk.TextIter end; ", + "\tbuf.get_bounds (out start, out end);", + "", + "\t", + "", + " ", + "\t//GLib.debug(\"highlight errors\");\t\t ", + "", + "\t // we should highlight other types of errors..", + "", + "\tif (_this.window.windowstate.state != WindowState.State.CODEONLY ", + "\t\t&&", + "\t\t_this.window.windowstate.state != WindowState.State.CODE", + "\t\t) {", + "\t\t//GLib.debug(\"windowstate != CODEONLY?\");", + "\t\t", + "\t\treturn;", + "\t} ", + "", + "\t ", + "\tif (_this.file == null) {", + "\t\tGLib.debug(\"file is null?\");", + "\t\treturn;", + "", + "\t}", + "\tvar ar = this.file.getErrors();", + "\tif (ar.size < 1) {", + "\t\tbuf.remove_source_marks (start, end, \"ERR\");", + "\t\tbuf.remove_source_marks (start, end, \"WARN\");", + "\t\tbuf.remove_source_marks (start, end, \"DEPR\");", + "\t\tbuf.remove_tag_by_name (\"ERR\", start, end);", + "\t\tbuf.remove_tag_by_name (\"WARN\", start, end);", + "\t\tbuf.remove_tag_by_name (\"DEPR\", start, end);", + "\t\tthis.last_error_counter = file.error_counter ;", + "\t\t//GLib.debug(\"highlight %s : %s has no errors\", this.file.relpath, category);", + "\t\treturn;", + "\t}", + "\t", + "", + " // basicaly check if there is no change, then we do not do any update..", + " // we can do this by just using an error counter?", + " // if that's changed then we will do an update, otherwise dont bother.", + "\t ", + "\t", + "\tvar offset = 0;", + "\tvar hoffset = 0;", + "", + "\tvar tlines = buf.get_line_count () +1;", + "\t", + "\tif (_this.prop != null) {", + "\t\t// this still seems flaky...", + "", + "\t\ttlines = _this.prop.end_line;", + "\t\toffset = _this.prop.start_line;", + "\t\thoffset = _this.node.node_pad.length + 2; //shift it left by 2 ? ..", + "\t\t", + "\t\t ", + "\t} else {", + "\t\t// no update...", + "\t\tif (this.last_error_counter == file.error_counter) {", + "\t\t", + "\t\t\treturn;", + "\t\t}", + "\t", + "\t}", + "\tbuf.remove_source_marks (start, end, \"ERR\");", + "\tbuf.remove_source_marks (start, end, \"WARN\");", + "\tbuf.remove_source_marks (start, end, \"DEPR\");", + "\tbuf.remove_tag_by_name (\"ERR\", start, end);", + "\tbuf.remove_tag_by_name (\"WARN\", start, end);", + "\tbuf.remove_tag_by_name (\"DEPR\", start, end);", + "\t", + "\tforeach(var diag in ar) { ", + "\t Gtk.TextIter iter;", + "// print(\"get inter\\n\");", + "\t var eline = (int)diag.range.start.line - offset;", + "\t var eline_to = (int)diag.range.end.line - offset;", + "\t //var eline = diag.range.end_line - offset;", + "\t //GLib.debug(\"GOT ERROR on line %d -- converted to %d (offset = %d)\",", + "\t //\terr.line ,eline, offset);", + "\t ", + "\t ", + "\t if (eline > tlines || eline < 0) {", + "\t continue;", + "\t }", + "\t ", + "\t buf.get_iter_at_line( out iter, eline);", + "\t \tvar msg = \"Line: %d %s : %s\".printf(eline+1, diag.category, diag.message);", + "\t buf.create_source_mark( msg, diag.category, iter);", + "\t ", + " \t var spos = (int)diag.range.start.character - hoffset;", + " \t if (spos < 0) { spos =0 ; }", + " \t if (spos > iter.get_chars_in_line()) {", + " \t \tspos = iter.get_chars_in_line();", + " \t}", + "\t\tbuf.get_iter_at_line( out iter, eline_to);", + "\t\tvar epos = (int)diag.range.end.character - hoffset;", + " \t if (epos < 0) { epos =0 ; }", + " \t if (epos > iter.get_chars_in_line()) {", + " \t \tepos = iter.get_chars_in_line();", + " \t}", + " \t ", + " \t ", + " \t buf.get_iter_at_line_offset( out start, eline, spos); ", + " \t ", + " \t buf.get_iter_at_line_offset( out end, eline_to,epos); ", + " \t \t", + "\t buf.apply_tag_by_name(diag.category, start, end);", + "\t ", + "\t // GLib.debug(\"set line %d to %s\", eline, msg);", + "\t //this.marks.set(eline, msg);", + "\t}", + "\tthis.last_error_counter = file.error_counter ;", + "", + "", + "", + " ", + "", + "}" ] } ], - "modOrder" : "", - "name" : "Editor", - "parent" : "", - "path" : "/home/alan/gitlive/roobuilder/src/Builder4/Editor.bjs", - "permname" : "", - "title" : "" + "name" : "Editor" } \ No newline at end of file