{
"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"
}