{ "build_module" : "builder", "gen_extended" : false, "items" : [ { "# Gtk.Widget lastObj" : "null", "# JsRender.JsRender file" : "null", "# Xcls_MainWindow main_window" : "", "$ xns" : "Gtk", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "GtkSource.SearchContext searchcontext" : "", "bool hexpand" : true, "bool vexpand" : true, "id" : "WindowRooView", "int last_search_end" : 0, "items" : [ { "$ xns" : "Gtk", "bool vexpand" : true, "id" : "notebook", "items" : [ { "$ xns" : "Gtk", "* pack" : false, "id" : "label_preview", "utf8 label" : "Preview", "xtype" : "Label" }, { "$ xns" : "Gtk", "* pack" : false, "id" : "label_code", "utf8 label" : "Preview Generated Code", "xtype" : "Label" }, { "$ xns" : "Gtk", "* pack" : "append_page,_this.label_preview.el", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "bool vexpand" : true, "id" : "paned", "items" : [ { "$ homogeneous" : false, "$ xns" : "Gtk", "* pack" : "set_start_child", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "bool vexpand" : true, "id" : "viewbox", "items" : [ { "$ height_request" : 20, "$ homogeneous" : true, "$ vexpand" : false, "$ xns" : "Gtk", "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", "items" : [ { "$ xns" : "Gtk", "label" : "Redraw", "listeners" : { "clicked" : [ "( ) => {", " _this.view.renderJS( true);", "}" ] }, "xtype" : "Button" }, { "$ active" : true, "$ xns" : "Gtk", "id" : "AutoRedraw", "label" : "Auto Redraw On", "listeners" : { "toggled" : [ " (state) => {", " this.el.set_label(this.el.active ? \"Auto Redraw On\" : \"Auto Redraw Off\");", "}" ] }, "xtype" : "CheckButton" }, { "$ xns" : "Gtk", "label" : "Full Redraw", "listeners" : { "clicked" : [ " () => {", " _this.view.redraws = 99;", " // _this.view.el.web_context.clear_cache(); ", " //_this.view.renderJS(true);", " FakeServerCache.clear();", " _this.view.reInit();", " ", "}" ] }, "xtype" : "Button" } ], "xtype" : "Box" }, { "# GLib.DateTime lastRedraw" : "null", "# WebKit.WebInspector inspector" : "", "# bool pendingRedraw" : false, "# bool refreshRequired" : false, "# int redraws" : 0, "# string renderedData" : "\"\"", "# string runhtml" : "\"\"", "# string runjs" : "\"\"", "$ xns" : "WebKit", "* init" : [ " {", " // this may not work!?", " var settings = this.el.get_settings();", " settings.enable_developer_extras = true;", " ", " ", " var fs= new FakeServer(this.el);", " fs.ref();", " // this was an attempt to change the url perms.. did not work..", " // settings.enable_file_access_from_file_uris = true;", " // settings.enable_offline_web_application_cache - true;", " // settings.enable_universal_access_from_file_uris = true;", " ", " ", " ", " ", " ", "", " // FIXME - base url of script..", " // we need it so some of the database features work.", " this.el.load_html( \"Render not ready\" , ", " //fixme - should be a config option!", " // or should we catch stuff and fix it up..", " \"http://localhost/app.Builder/\"", " );", " ", " ", " //this.el.open('file:///' + __script_path__ + '/../builder.html');", " /*", " Gtk.drag_dest_set", " (", " this.el, //", " Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT,", " null, // list of targets", " Gdk.DragAction.COPY // what to do with data after dropped ", " );", " ", " // print(\"RB: TARGETS : \" + LeftTree.atoms[\"STRING\"]);", " Gtk.drag_dest_set_target_list(this.el, this.get('/Window').targetList);", " */", " GLib.Timeout.add_seconds(1, () =>{", " //print(\"run refresh?\");", " if (this.el == null) {", " return false;", " }", " this.runRefresh(); ", " return true;", " });", " ", " ", "}", "" ], "bool vexpand" : true, "id" : "view", "listeners" : { "load_changed" : [ "(le) => {", " if (le != WebKit.LoadEvent.FINISHED) {", " return;", " }", " if (this.runjs.length < 1) {", " return;", " }", " // this.el.run_javascript(this.runjs, null);", " FakeServerCache.remove( this.runjs);", " this.runjs = \"\";", "}" ], "ready_to_show" : [ "( ) => {", " this.initInspector();", "", "}", "" ], "script_dialog" : [ " (dialog) => {", " ", " ", " if (this.el == null) {", " return true;", " }", " ", " var msg = dialog.get_message();", " if (msg.length < 4) {", " return false;", " }", " ", " GLib.debug(\"script dialog got %s\", msg);", " ", " if (msg.substring(0,4) != \"IPC:\") {", " return false;", " }", " var ar = msg.split(\":\", 3);", " if (ar.length < 3) {", " return false;", " }", "", " switch(ar[1]) {", " case \"SAVEHTML\":", "\t GLib.debug(\"GOT saveHTML %d\", ar[2].length);", " _this.file.saveHTML(ar[2]);", " _this.createThumb();", " return true;", " default:", " return false;", " }", " ", "}" ] }, "xtype" : "WebView", "| void initInspector" : [ "() {", " ", " ", " ", " // this.inspector.open_window.connect(() => {", " this.inspector = this.el.get_inspector();", " ", " this.inspector.open_window.connect(() => {", " print(\"inspector attach\\n\");", " var wv = this.inspector.get_web_view();", " if (wv != null) {", " print(\"got inspector web view\\n\");", " ", " var cn = _this.inspectorcontainer.el.get_first_child();", " if (cn != null) {", " _this.inspectorcontainer.el.remove(cn);", " }", " ", " _this.inspectorcontainer.el.append(wv);", " wv.show();", " } else {", "\t print(\"got inspector web view FAILED\\n\");", " //this.inspector.close();", " ", " //this.inspector = null;", " ", " ", " }", " return true;", " ", " });", " this.inspector.show();", " ", " ", " ", "}", "" ], "| void reInit" : [ "() {", " print(\"reInit?\");", " // if this happens destroy the webkit..", " // recreate it..", " this.el.stop_loading();", " ", " if (_this.viewbox.el.get_parent() == null) {", " return;", " }", " ", " /*", " _this.viewbox.el.remove(_this.viewcontainer.el);", " //_this.paned.el.remove(_this.inspectorcontainer.el); ", " ", " // destory seems to cause problems.", " //this.el.destroy();", " //_this.viewcontainer.el.destroy();", " //_this.inspectorcontainer.el.destroy();", " var inv =new Xcls_inspectorcontainer(_this);", " ", " _this.paned.el.set_end_child(inv.el);", " _this.inspectorcontainer = inv;", " ", " this.el = null; ", " var nv =new Xcls_viewcontainer(_this);", " // nv.ref();", " _this.viewbox.el.append(nv.el);", " ", " _this.viewcontainer = nv;", " inv.el.show();", " nv.el.show();", " //while(Gtk.events_pending ()) Gtk.main_iteration ();", " //_this.view.renderJS(true); ", " _this.view.refreshRequired = true;", " ", " */", "}", "" ], "| void renderJS" : [ "(bool force) {", "", " // this is the public redraw call..", " // we refresh in a loop privately..", " var autodraw = _this.AutoRedraw.el.active;", " if (!autodraw && !force) {", " print(\"Skipping redraw - no force, and autodraw off\");", " return;", " }", " ", " this.refreshRequired = true;", "}", "" ], "| void runRefresh" : [ " () ", "{", " // this is run every 2 seconds from the init..", "", " ", " ", " if (!this.refreshRequired) {", " // print(\"no refresh required\");", " return;", " }", "", " if (this.lastRedraw != null) {", " // do not redraw if last redraw was less that 5 seconds ago.", " if ((int64)(new DateTime.now_local()).difference(this.lastRedraw) < 5000 ) {", " return;", " }", " }", " ", " if (_this.file == null) {", " return;", " }", " ", " ", " this.refreshRequired = false;", " // print(\"HTML RENDERING\");", " ", " ", " //this.get('/BottomPane').el.show();", " //this.get('/BottomPane').el.set_current_page(2);// webkit inspector", " _this.file.webkit_page_id = this.el.get_page_id();", " ", " var js = _this.file.toSourcePreview();", "", " if (js.length < 1) {", " print(\"no data\");", " return;", " }", "// var data = js[0];", " this.redraws++;", " ", " var project = (Project.Roo) _this.file.project; ", "", " //print (project.fn);", " // set it to non-empty.", " ", "// runhtml = runhtml.length ? runhtml : ''; ", "", "", "// this.runhtml = this.runhtml || '';", " ", " ", " // then we need to reload the browser using", " // load_html_string..", "", " // then trigger a redraw once it's loaded..", " this.pendingRedraw = true;", "", " var runhtml = \"\\n\" ;", "", " // fix to make sure they are the same..", " this.runhtml = project.runhtml;", " // need to modify paths", "", " string inhtml;", " var base_template = project.base_template;", " ", " if (base_template.length > 0 && !FileUtils.test(", " BuilderApplication.configDirectory() + \"/resources/\" + base_template, FileTest.EXISTS) ", " ) {", " print(\"invalid base_template name - using default: %s\\n\", base_template);", " base_template = \"\";", " ", " }", " try {", " GLib.FileUtils.get_contents(", " BuilderApplication.configDirectory() + \"/resources/\" + ", " (base_template.length > 0 ? base_template : \"roo.builder.html\")", " , out inhtml);", " ", " } catch (Error e) {", " inhtml = \"\";", " } ", " this.renderedData = js;", "", "", " string js_src = js + \"", "Roo.onReady(function() {", "if (\" + _this.file.name +\".show) {", "\t\t\" + _this.file.name +\".show({});", "\t\t(function() { ", "\t\t\tBuilder.saveHTML.defer(100, Builder);", "\t\t}).defer(100);", "}", "Roo.XComponent.build();", "});\\n\";", "\t", " // print(\"render js: \" + js);", " //if (!this.ready) {", " // console.log('not loaded yet');", " //}", " this.lastRedraw = new DateTime.now_local();", "", "", " //this.runjs = js_src;", " var fc = FakeServerCache.factory_with_data(js_src);", " this.runjs = fc.fname;", " ", " var html = inhtml.replace(\"\", runhtml + this.runhtml + ", " \"\" + ", " // \"\" + ", " ", " \"\");", " //print(\"LOAD HTML \" + html);", " ", " var rootURL = project.rootURL;", " ", " ", " ", " this.el.load_html( html , ", " //fixme - should be a config option!", " (rootURL.length > 0 ? rootURL : \"xhttp://localhost/roobuilder/\")", " );", " this.initInspector(); ", " // force the inspector... ", " // this.initInspector();", " ", " // - no need for this, the builder javascript will call it when build is complete", " //GLib.Timeout.add_seconds(1, () => {", " // this.el.run_javascript(\"Builder.saveHTML()\",null);", " // return false;", " //});", "// print( \"before render\" + this.lastRedraw);", "// print( \"after render\" + (new Date()));", " ", "}", " " ] } ], "xtype" : "Box" }, { "$ xns" : "Gtk", "* pack" : "set_end_child", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "bool vexpand" : true, "id" : "inspectorcontainer", "xtype" : "Box" } ], "xtype" : "Paned" }, { "$ xns" : "Gtk", "* pack" : "append_page,_this.label_code.el", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "bool vexpand" : true, "int spacing" : 0, "items" : [ { "$ xns" : "Gtk", "bool vexpand" : true, "id" : "sourceviewscroll", "items" : [ { "# JsRender.Node? node_selected" : "null", "# bool button_is_pressed" : false, "# bool key_is_pressed" : false, "# bool loading" : true, "# int editable_start_pos" : "-1", "# string prop_selected" : "\"\"", "$ xns" : "GtkSource", "* init" : [ "{", " ", " this.css = new Gtk.CssProvider();", "\t ", "\tthis.css.load_from_string(", "\t\t\"#roo-view { font: 10px monospace; }\"", "\t);", " ", "\tGtk.StyleContext.add_provider_for_display(", "\t\tthis.el.get_display(),", "\t\tthis.css,", "\t\tGtk.STYLE_PROVIDER_PRIORITY_APPLICATION", "\t);", "\t\t", "\t ", " ", " this.loading = true;", " //var buf = this.el.get_buffer();", " //buf.notify.connect(this.onCursorChanged);", " ", " ", " var attrs = new GtkSource.MarkAttributes();", " 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 GtkSource.MarkAttributes();", " 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 GtkSource.MarkAttributes();", " 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);", " ", " ", " var gattrs = new GtkSource.MarkAttributes();", " var grey = Gdk.RGBA();", " grey.parse ( \"#ccc\");", " gattrs.set_background ( grey);", " ", " ", " this.el.set_mark_attributes (\"grey\", gattrs, 1);", " ", " ", " ", " ", " ", " ", "}", " " ], "* pack" : "set_child", "Gtk.CssProvider css" : "", "gboolean editable" : false, "gboolean show_line_marks" : true, "gboolean show_line_numbers" : true, "id" : "sourceview", "items" : [ { "$ xns" : "GtkSource", "* pack" : "set_buffer", "bool dirty" : false, "bool in_cursor_change" : false, "id" : "buffer", "int error_line" : "-1", "int last_line" : "-1", "listeners" : { "changed" : [ " () => {", " ", " // check syntax??", " // ??needed..??", " // _this.save_button.el.sensitive = true;", " ///?? has changed occured during loading?", " ", " // only trigger this if ", " ", " ", " ", " ", " if (_this.sourceview.loading) {", "\t\treturn;", "\t}", "\t", "", "\t", " print(\"- PREVIEW EDITOR CHANGED--\");", "", " this.dirty = true; ", " // this.checkSyntax(); // this calls backs and highlights errors.. in theory... ", "", "", "", "\tif (!_this.sourceview.button_is_pressed && !_this.sourceview.key_is_pressed) {", "\t\tprint(\"button or key not pressed to generate change?!\\n\");", "\t\treturn;", "\t}", "\t\t", " ", "\t// what are we editing??", "\tif (null == _this.sourceview.node_selected || _this.sourceview.prop_selected.length < 1) {", "\t\treturn;", "\t}", "\t", "\t// find the colon on the first line...", "\t", "\tif (_this.sourceview.editable_start_pos > -1) {", "\t\t", "\t\tvar buf = (GtkSource.Buffer)_this.sourceview.el.get_buffer();", "\t\t", " //print(\"cursor changed : %d\\n\", buf.cursor_position);", " Gtk.TextIter spos,epos;", " buf.get_iter_at_offset(out spos, _this.sourceview.editable_start_pos);", " buf.get_iter_at_offset(out epos, _this.sourceview.editable_start_pos); // initialize epos..", " ", " var gotit= false;", " var line = spos.get_line();", " var endline = buf.get_line_count();", " while (line < endline) {", " \t\tline++;", "\t buf.get_iter_at_line(out epos, line);", "\t if (buf.get_source_marks_at_line(line, \"grey\").length() > 0) {", "\t\t buf.get_iter_at_line(out epos, line);\t \t\t", "\t \t\tgotit=true;", "\t \t\tbreak;", " \t\t}", "\t\t}", " ", " \t\tif (gotit) {", "\t \t\tprint(\"End Offset = %d/%d\\n\", epos.get_line(), epos.get_offset());", "\t\t\t// get the pos...", "\t\t\t// in theory the last char will be '}' or '},' .. or ','", "\t\t\t// we should chop the ',' of the end...", "\t\t\tvar str = buf.get_text(spos, epos, false);", "\t\t\tprint(\"got string\\n%s\\n\", str);", "\t\t", "\t\t}", "\t}", " return ;", "}", "", " ", "" ], "cursor_moved" : [ "( ) => {", "GLib.debug(\"cursor moved called\");", "", "", " \tif (this.in_cursor_change ) {", " GLib.debug(\"cursor changed : %d [ignoring nested call)\", this.el.cursor_position);", " return;", " }", " ", " GLib.debug(\"cursor changed : %d\", this.el.cursor_position);", " Gtk.TextIter cpos;", " this.el.get_iter_at_offset(out cpos, this.el.cursor_position);", " ", " var ln = cpos.get_line();", " if (this.last_line == ln ){", " \treturn;", "\t}", "\tthis.last_line = ln;", " var node = _this.file.lineToNode(ln);", "", " if (node == null) {", " print(\"can not find node\\n\");", " return;", " }", " this.in_cursor_change = true;", " var ltree = _this.main_window.windowstate.left_tree;", " ltree.model.selectNode(node);", " this.in_cursor_change = false;", "}", "" ] }, "xtype" : "Buffer", "| bool highlightErrors" : [ "( Gee.HashMap validate_res) {", " ", " this.error_line = validate_res.size;", "\t", " 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;", "}" ], "| 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;", "}", " " ] }, { "$ xns" : "Gtk", "* pack" : "add_controller", "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 false;", "\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 return false ;", "\t}", " ", "\t//this.button_is_pressed = true;", "\t//return false;", " // print(event.key.keyval)", " ", " return false;", " ", " ", "}", "" ] }, "xtype" : "EventControllerKey" } ], "listeners" : { "query_tooltip" : [ "(x, y, keyboard_tooltip, tooltip) => {", "\t", "\t//GLib.debug(\"query tooltip\");", "\tGtk.TextIter iter;", "\tint trailing;", "\t", "\tvar yoff = (int) _this.sourceviewscroll.el.vadjustment.value;", "\t", "\tthis.el.get_iter_at_position (out iter, out trailing, x, y + yoff);", "\t ", "\tvar l = iter.get_line();", "\t//GLib.debug(\"query tooltip line %d\", (int) l);", "\tvar marks = _this.buffer.el.get_source_marks_at_line(l, null);", "\t//GLib.debug(\"query tooltip line marks %d\", (int) marks.length());", "\tvar str = \"\";", "\tmarks.@foreach((m) => { ", "\t\t//GLib.debug(\"got mark %s\", m.name);", "\t\tstr += (str.length > 0 ? \"\\n\" : \"\") + m.name;", "\t});", "\t// true if there is a mark..", "\tif (str.length > 0 ) {", "\t\t\ttooltip.set_text( str);", "\t}", "\treturn str.length > 0 ? true : false;", "", "}" ] }, "string name" : "roo-view", "xtype" : "View", "| string toString" : [ "() {", " Gtk.TextIter s;", " Gtk.TextIter e;", " this.el.get_buffer().get_start_iter(out s);", " this.el.get_buffer().get_end_iter(out e);", " var ret = this.el.get_buffer().get_text(s,e,true);", " //print(\"TO STRING? \" + ret);", " return ret;", "}", "" ], "| void clearGreySelection" : [ "() {", " // clear all the marks..", " var sbuf = (GtkSource.Buffer)this.el.buffer;", " ", " Gtk.TextIter start;", " Gtk.TextIter end; ", " ", " sbuf.get_bounds (out start, out end);", " sbuf.remove_source_marks (start, end, \"grey\");", " ", " ", "}", "" ], "| void highlightErrorsJson" : [ " (string type, Json.Object obj) {", " // this is a hook for the vala code - it has no value in javascript ", " // as we only have one error ususally....", " return ;", " ", " ", "", "", "}" ], "| void loadFile" : [ "( ) {", " this.loading = true;", " ", " ", " // get the cursor and scroll position....", " var buf = this.el.get_buffer();", "\tvar cpos = buf.cursor_position;", " ", " print(\"BEFORE LOAD cursor = %d\\n\", cpos);", " ", " var vadj_pos = this.el.get_vadjustment().get_value();", " ", " ", " ", " buf.set_text(\"\",0);", " var sbuf = (GtkSource.Buffer) buf;", "", " ", "", " if (_this.file == null || _this.file.xtype != \"Roo\") {", " print(\"xtype != Roo\");", " this.loading = false;", " return;", " }", " ", " // get the string from the rendered tree...", " ", " var str = _this.file.toSource();", " ", "// print(\"setting str %d\\n\", str.length);", " buf.set_text(str, str.length);", " var lm = GtkSource.LanguageManager.get_default();", " ", " //?? is javascript going to work as js?", " ", " ((GtkSource.Buffer)(buf)) .set_language(lm.get_language(_this.file.language));", " ", " ", " _this.main_window.windowstate.updateErrorMarksAll();", " ", " // restore the cursor position?", " // after reloading the contents.", " GLib.Timeout.add(500, () => {", "\t\t_this.buffer.in_cursor_change = true;", " print(\"RESORTING cursor to = %d\\n\", cpos);", "\t\tGtk.TextIter cpos_iter;", "\t\tbuf.get_iter_at_offset(out cpos_iter, cpos);", "\t\tbuf.place_cursor(cpos_iter); ", "\t\t", "\t\tthis.el.get_vadjustment().set_value(vadj_pos);;", "\t\t_this.buffer.in_cursor_change = false;", " ", "\t\t", "\t\t", "\t\t//_this.buffer.checkSyntax();", "\t\treturn false;", "\t});", "\t\t", " this.loading = false; ", " _this.buffer.dirty = false;", "}", "" ], "| void nodeSelected" : [ "(JsRender.Node? sel, bool scroll) {", " ", " ", " if (this.loading) {", " \treturn;", "\t}", " // this is connected in widnowstate", " print(\"Roo-view - node selected\\n\");", " var buf = this.el.get_buffer();", " ", " var sbuf = (GtkSource.Buffer) buf;", "", " ", " ", " ", " // clear all the marks..", " Gtk.TextIter start;", " Gtk.TextIter end; ", " ", " sbuf.get_bounds (out start, out end);", " sbuf.remove_source_marks (start, end, \"grey\");", " ", " this.node_selected = sel;", " if (sel == null) {", " // no highlighting..", " return;", " }", " Gtk.TextIter iter; ", " sbuf.get_iter_at_line(out iter, sel.line_start);", " ", " ", " Gtk.TextIter cur_iter;", " sbuf.get_iter_at_offset(out cur_iter, sbuf.cursor_position);", " ", " //var cur_line = cur_iter.get_line();", " //if (cur_line > sel.line_start && cur_line < sel.line_end) {", " ", " //} else {", " if (! _this.buffer.in_cursor_change) {", " \tthis.el.scroll_to_iter(iter, 0.1f, true, 0.0f, 0.5f);", "\t}", " ", " ", " ", " for (var i = 0; i < buf.get_line_count();i++) {", " if (i < sel.line_start || i > sel.line_end) {", " ", " sbuf.get_iter_at_line(out iter, i);", " sbuf.create_source_mark(null, \"grey\", iter);", " ", " }", " ", " }", " ", "", "}", "" ], "| void updateGreySelection" : [ "(bool scroll) { ", "\tvar sel = this.node_selected;", "\tprint(\"node selected\\n\");", " var buf = this.el.get_buffer();", " var sbuf = (GtkSource.Buffer) buf;", "", " ", " this.clearGreySelection();", " ", " ", " ", " if (sel == null) {", "\t print(\"no selected node\\n\");", " // no highlighting..", " return;", " }", " ", " print(\"highlight region %d to %d\\n\", sel.line_start,sel.line_end);", " Gtk.TextIter iter; ", " sbuf.get_iter_at_line(out iter, sel.line_start);", " ", " ", " Gtk.TextIter cur_iter;", " sbuf.get_iter_at_offset(out cur_iter, sbuf.cursor_position);", " ", " var cursor_at_line = cur_iter.get_line();", " ", " ", " //var cur_line = cur_iter.get_line();", " //if (cur_line > sel.line_start && cur_line < sel.line_end) {", " ", " //} else {", " if (scroll) {", "\t\tprint(\"scrolling to node -- should occur on node picking.\\n\");", " \tthis.el.scroll_to_iter(iter, 0.1f, true, 0.0f, 0.5f);", "\t}", " ", " var start_line = sel.line_start;", " var end_line = sel.line_end;", " ", " ", " this.el.editable = false;", " ", " //var colon_pos = 0;", " ", " this.editable_start_pos = -1;", " ", " // now if we have selected a property...", " if (this.prop_selected.length> 0 ) {", "", "\t\tint nstart, nend;", "\t\tif (sel.getPropertyRange(this.prop_selected, out nstart, out nend) && nend > nstart) {", "\t\t\tstart_line = nstart;", "\t\t\tend_line = nend;", "\t\t\t// this.el.editable = true; << cant do this!!?", "\t\t\tprint(\"start line = %d, end line = %d\\n\", start_line, end_line);", "\t\t\t", "\t\t\t\t// see if we are 'right of ':'", "\t\t\t\t// get an iter for the start of the line.", "\t\t\tGtk.TextIter start_first_line_iter,end_first_line_iter;", "\t\t\tthis.el.buffer.get_iter_at_line(out start_first_line_iter, start_line -1);", "\t\t\tthis.el.buffer.get_iter_at_line(out end_first_line_iter, start_line -1);", "\t\t\t ", "\t\t\t", "\t\t\t", "\t\t\t", "\t\t\tif (end_first_line_iter.forward_to_line_end()) {", "\t\t\t\tvar first_line = this.el.buffer.get_text(start_first_line_iter, end_first_line_iter, false);", "\t\t\t\t", "\t\t\t\tprint(\"first line = %s\\n\", first_line);", "\t\t\t\tif (first_line.contains(\":\")) {", "\t\t\t\t\tthis.editable_start_pos = start_first_line_iter.get_offset() + first_line.index_of(\":\") + 1;", "\t\t\t\t\tprint(\"colon_pos = %d\\n\", this.editable_start_pos);", "\t\t\t\t}", "\t\t\t\t", "", "\t\t\t\t//Gtk.TextIter colon_iter;", "\t\t\t\t//sbuf.get_iter_at_offset (out colon_iter, colon_pos);", "\t\t\t\t//sbuf.create_source_mark(null, \"active_text\", colon_iter);", "\t\t\t}", "\t\t\t", "\t\t\t", "\t\t\t", "\t\t\t//print(\"is cursor at line? %d ?= %d\\n\", start_line -1 , cursor_at_line);", "\t\t\t//if (start_line - 1 == cursor_at_line) {", "\t\t\t// should be ok - current_posssion can not be less than '-1'...", "\t\t\tif (sbuf.cursor_position < this.editable_start_pos) {", "\t\t\t", "\t\t\t\tprint(\"cursor is before start pos.. - turn off editable...\\n\");", "\t\t\t\t//var before_cursor_string = this.el.buffer.get_text(start_line_iter, cur_iter, false);", "\t\t\t\t//print(\"before cursor string = %s\\n\", before_cursor_string);", "\t\t\t\t//if (!before_cursor_string.contains(\":\")) {", "\t\t\t\t\tthis.el.editable = false;", "\t\t\t\t//}", "\t\t\t\t", "\t\t\t}", "\t\t\t ", "\t\t\t ", "", "\t\t\t ", "\t\t}", "\t\tprint(\"propSelected = %s range %d -> %d\\n\", this.prop_selected, start_line, end_line);\t\t", "\t\t", "\t\t", " }", " ", "\tprint(\"checking selection\\n\");", " ", " ", " // check selection - if it's out of 'bounds'", " if (this.el.editable && sbuf.get_has_selection()) {", "\t\tGtk.TextIter sel_start_iter, sel_end_iter;", "\t\tsbuf.get_selection_bounds(out sel_start_iter, out sel_end_iter);", "\t\t", "\t\tif (sel_start_iter.get_line() < start_line || sel_end_iter.get_line() > end_line ||", "\t\t\tsel_start_iter.get_line() > end_line || sel_end_iter.get_line() < start_line\t\t\t) {", "\t\t\t// save?", "\t\t\tthis.el.editable = false;", "\t\t}", "\t\tif (this.editable_start_pos > 0 &&", "\t\t\t(sel_start_iter.get_offset() < this.editable_start_pos || sel_end_iter.get_offset() < this.editable_start_pos)", "\t\t\t", "\t\t) {", "\t\t\tthis.el.editable = false;", "\t\t}", "\t\t", "\t\t ", " ", " }", " ", " ", " ", " ", " for (var i = 0; i < buf.get_line_count();i++) {", " if (i < (start_line -1) || i > (end_line -1)) {", " ", " sbuf.get_iter_at_line(out iter, i);", " sbuf.create_source_mark(null, \"grey\", iter);", " ", " }", " ", " }", " if (scroll && (cursor_at_line > end_line || cursor_at_line < start_line)) {", "\t Gtk.TextIter cpos_iter;", "\t\tbuf.get_iter_at_line(out cpos_iter, start_line);", "\t\t", "\t\tbuf.place_cursor(cpos_iter); ", "\t}", "", "", "}" ] } ], "xtype" : "ScrolledWindow" }, { "$ xns" : "Gtk", "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", "bool homogeneous" : false, "bool vexpand" : false, "int spacing" : 0, "items" : [ { "$ xns" : "Gtk", "* init" : [ "this.css = new Gtk.CssProvider();", " ", "this.css.load_from_string(", "\t\"#roo-search-entry { background-color: #ccc; }\"", ");", " ", "Gtk.StyleContext.add_provider_for_display(", "\tthis.el.get_display(),", "\tthis.css,", "\tGtk.STYLE_PROVIDER_PRIORITY_APPLICATION", ");", "\t\t", "\t ", " ", "" ], "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) {", "\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" : "roo-search-entry", "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", "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 ", "}", "" ] }, "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", "\t ", "}", "" ] }, "string icon_name" : "go-up", "xtype" : "Button" }, { "$ xns" : "Gtk", "bool always_show_image" : true, "items" : [ { "$ xns" : "Gtk", "* pack" : false, "* 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", "* init" : [ "{", "\tthis.el.show();", "}", "" ], "id" : "multiline", "string label" : "Multi-line (add \\n)", "xtype" : "CheckButton" } ], "xtype" : "Box" } ], "xtype" : "Popover" } ], "string icon_name" : "emblem-system", "xtype" : "MenuButton" } ], "xtype" : "Box" } ], "xtype" : "Box" } ], "xtype" : "Notebook" } ], "xtype" : "Box", "| int search" : [ "(string in_txt) {", "\tthis.notebook.el.page = 1;", "\t", " ", " ", "\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 GtkSource.SearchContext(this.buffer.el,s);", "\tthis.searchcontext.set_highlight(true);", "\tvar txt = in_txt;", "\t", "\tif (_this.multiline.el.active) {", "\t\ttxt = in_txt.replace(\"\\\\n\", \"\\n\");", "\t}", "\t", "\ts.set_search_text(txt);", "\tGtk.TextIter beg, st,en;", "\tbool has_wrapped_around;", "\tthis.buffer.el.get_start_iter(out beg);", "\tthis.searchcontext.forward(beg, out st, out en, out has_wrapped_around);", "\tthis.last_search_end = 0;", "\t", "\treturn this.searchcontext.get_occurrences_count();", "", " ", " ", "", "}", "" ], "| void backSearch" : [ "(bool change_focus) {", "", "\tif (this.searchcontext == null) {", "\t\treturn;", "\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.backward(beg, out st, out en, out has_wrapped_around)) {", "\t", "\t\tthis.last_search_end = 0;", "\t\treturn;", "\t}", "\tthis.last_search_end = en.get_offset();", "\tif (change_focus) {", "\t\tthis.sourceview.el.grab_focus();", "\t}", "\tthis.buffer.el.place_cursor(st);", "\tthis.sourceview.el.scroll_to_iter(st, 0.1f, true, 0.0f, 0.5f);", "\tvar ln = st.get_line();", "\tthis.highlightNodeAtLine(ln);", "\t", " ", "}", "" ], "| void createThumb" : [ "() {", " ", " ", " if (this.file == null) {", " return;", " }", " ", "\tif (this.notebook.el.page > 0 ) {", " return;", " }", " ", " \tthis.file.widgetToIcon(this.view.el); ", "", " ", " ", " ", " ", "}", "" ], "| void forwardSearch" : [ "(bool change_focus) {", "", "\tif (this.searchcontext == null) {", "\t\treturn;", "\t}", "\tthis.notebook.el.page = 1;", "\tGtk.TextIter beg, st,en;", "\tbool has_wrapped_around;", "\tvar buf = this.sourceview.el.get_buffer();", "\tbuf.get_iter_at_offset(out beg, this.last_search_end);", "\tif (!this.searchcontext.forward(beg, out st, out en, out has_wrapped_around)) {", "\t\tthis.last_search_end = 0;", "\t\treturn;", "\t}", "\tthis.last_search_end = en.get_offset();", "\tif (change_focus) {", "\t\tthis.sourceview.el.grab_focus();", "\t}", "\tbuf.place_cursor(st);", "\t", " ", "\t ", "\tthis.sourceview.el.scroll_to_iter(st, 0.0f, true, 0.0f, 0.5f);", "\t", "\t", "\tvar ln = st.get_line();", "\t", "\tthis.highlightNodeAtLine(ln);", "}\t", " " ], "| void highlightNodeAtLine" : [ "(int ln) {", "", "", "\t ", "\t// highlight node...", "\t", "\t\t", " var node = _this.file.lineToNode(ln+1);", " ", " if (node == null) {", " //print(\"can not find node\\n\");", " return;", " }", " var prop = node.lineToProp(ln+1);", " print(\"prop : %s\", prop == null ? \"???\" : prop.name);", " ", " ", " // ---------- this selects the tree's node...", " ", " var ltree = _this.main_window.windowstate.left_tree;", " ltree.model.selectNode(node);", " ", " //_this.sourceview.allow_node_scroll = false; /// block node scrolling..", "\t ", " ", " //print(\"changing cursor on tree..\\n\");", " ", "", " ", " // let's try allowing editing on the methods.", " // a little klunky at present..", "\t_this.sourceview.prop_selected = \"\";", "\t/*", " if (prop != null) {", "\t\t//see if we can find it..", "\t\tvar kv = prop.split(\":\");", "\t\tif (kv[0] == \"p\") {", "\t\t", " \t\t//var k = prop.get_key(kv[1]);", " \t\t// fixme -- need to determine if it's an editable property...", " \t\t_this.sourceview.prop_selected = prop;", " \t\t", "\t\t} else if (kv[0] == \"l\") {", "\t\t\t _this.sourceview.prop_selected = prop;", "\t\t\t", "\t\t}", " }", " */", " // ltree.view.el.set_cursor(new Gtk.TreePath.from_string(tp), null, false); ", " _this.sourceview.nodeSelected(node,false);", " ", " // scrolling is disabled... as node selection calls scroll 10ms after it changes.", " // GLib.Timeout.add_full(GLib.Priority.DEFAULT,100 , () => {", "\t // this.allow_node_scroll = true;", "\t // return false;", " // });", " // }", "\t\t", "\t\t", "\t\t", "\t\t", "\t\t", "\t\t", "\t\t", "\t\t", "\t\t", "\t\t ", "", "}", " " ], "| void loadFile" : [ "", "(JsRender.JsRender file)", "{", " this.file = file;", " this.view.renderJS(true);", " this.notebook.el.page = 0;// gtk preview ", " this.sourceview.loadFile(); ", "}", " ", " " ], "| void requestRedraw" : [ "() {", " this.view.renderJS(false);", " this.sourceview.loadFile(); ", "}" ], "| void scroll_to_line" : [ "(int line) {", " // code preview...", " ", " GLib.Timeout.add(100, () => {", " ", "\t\tthis.notebook.el.set_current_page( 1 );", "\t ", "\t ", "\t\t var buf = this.sourceview.el.get_buffer();", "\t ", "\t\tvar sbuf = (GtkSource.Buffer) buf;", "", "", "\t\tGtk.TextIter iter; ", "\t\tsbuf.get_iter_at_line(out iter, line);", "\t\tthis.sourceview.el.scroll_to_iter(iter, 0.1f, true, 0.0f, 0.5f);", "\t\treturn false;", "\t}); ", "", " ", "}", "" ], "| void updateErrorMarks" : [ "(string category) {", "\t", " ", "", "\tvar buf = _this.buffer.el;", "\tGtk.TextIter start;", "\tGtk.TextIter end; ", "\tbuf.get_bounds (out start, out end);", "", "\tbuf.remove_source_marks (start, end, category);", " ", "\tGLib.debug(\"highlight errors\");\t\t ", "", "\t // we should highlight other types of errors..", "", " ", "", "\t ", "\tif (_this.file == null) {", "\t\tGLib.debug(\"file is null?\");", "\t\treturn;", "", "\t}", "\tvar ar = this.file.getErrors(category);", "\tif (ar == null || ar.get_n_items() < 1) {", "\t\tGLib.debug(\"higjlight %s has no errors\", category);", "\t\treturn;", "\t}", " ", "", " ", "\t", "\tvar offset = 0;", "\t ", "", "\tvar tlines = buf.get_line_count () +1;", "\t", " ", "\t ", "\tfor (var i = 0; i < ar.get_n_items();i++) {", "\t\tvar err = (Palete.CompileError) ar.get_item(i);", "\t\t", "\t Gtk.TextIter iter;", "// print(\"get inter\\n\");", "\t var eline = err.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 return;", "\t }", "\t ", "\t ", "\t buf.get_iter_at_line( out iter, eline);", "\t ", "\t ", "\t\tvar msg = \"Line: %d %s : %s\".printf(eline+1, err.category, err.msg);", "\t buf.create_source_mark( msg, err.category, iter);", "\t GLib.debug(\"set line %d to %s\", eline, msg);", "\t //this.marks.set(eline, msg);", "\t}", "\treturn ;", "", "", "", " ", "", "}" ] } ], "name" : "WindowRooView" }