Fix #8033 - text size zoom
[roobuilder] / src / Builder4 / WindowRooView.bjs
1 {
2  "build_module" : "builder",
3  "gen_extended" : false,
4  "items" : [
5   {
6    "# Gtk.Widget lastObj" : "null",
7    "# JsRender.JsRender file" : "null",
8    "# Xcls_MainWindow main_window" : "",
9    "$ xns" : "Gtk",
10    "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
11    "GtkSource.SearchContext searchcontext" : "",
12    "bool hexpand" : true,
13    "bool vexpand" : true,
14    "id" : "WindowRooView",
15    "int last_error_counter" : 0,
16    "int last_search_end" : 0,
17    "items" : [
18     {
19      "$ xns" : "Gtk",
20      "bool vexpand" : true,
21      "id" : "notebook",
22      "items" : [
23       {
24        "$ xns" : "Gtk",
25        "* pack" : false,
26        "id" : "label_preview",
27        "utf8 label" : "Preview",
28        "xtype" : "Label"
29       },
30       {
31        "$ xns" : "Gtk",
32        "* pack" : false,
33        "id" : "label_code",
34        "utf8 label" : "Preview Generated Code",
35        "xtype" : "Label"
36       },
37       {
38        "$ xns" : "Gtk",
39        "* pack" : "append_page,_this.label_preview.el",
40        "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
41        "bool vexpand" : true,
42        "id" : "paned",
43        "items" : [
44         {
45          "$ homogeneous" : false,
46          "$ xns" : "Gtk",
47          "* pack" : "set_start_child",
48          "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
49          "bool vexpand" : true,
50          "id" : "viewbox",
51          "items" : [
52           {
53            "$ height_request" : 20,
54            "$ homogeneous" : true,
55            "$ vexpand" : false,
56            "$ xns" : "Gtk",
57            "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL",
58            "items" : [
59             {
60              "$ xns" : "Gtk",
61              "label" : "Redraw",
62              "listeners" : {
63               "clicked" : [
64                "( ) => {",
65                "    _this.view.renderJS(  true);",
66                "}"
67               ]
68              },
69              "xtype" : "Button"
70             },
71             {
72              "$ active" : true,
73              "$ xns" : "Gtk",
74              "id" : "AutoRedraw",
75              "label" : "Auto Redraw On",
76              "listeners" : {
77               "toggled" : [
78                " (state) => {",
79                "    this.el.set_label(this.el.active  ? \"Auto Redraw On\" : \"Auto Redraw Off\");",
80                "}"
81               ]
82              },
83              "xtype" : "CheckButton"
84             },
85             {
86              "$ xns" : "Gtk",
87              "label" : "Full Redraw",
88              "listeners" : {
89               "clicked" : [
90                " () => {",
91                "  _this.view.redraws = 99;",
92                " //   _this.view.el.web_context.clear_cache();  ",
93                "  //_this.view.renderJS(true);",
94                "  FakeServerCache.clear();",
95                "  _this.view.reInit();",
96                " ",
97                "}"
98               ]
99              },
100              "xtype" : "Button"
101             }
102            ],
103            "xtype" : "Box"
104           },
105           {
106            "# GLib.DateTime lastRedraw" : "null",
107            "# WebKit.WebInspector inspector" : "",
108            "# bool pendingRedraw" : false,
109            "# bool refreshRequired" : false,
110            "# int redraws" : 0,
111            "# string renderedData" : "\"\"",
112            "# string runhtml" : "\"\"",
113            "# string runjs" : "\"\"",
114            "$ xns" : "WebKit",
115            "* init" : [
116             " {",
117             "    // this may not work!?",
118             "    var settings =  this.el.get_settings();",
119             "    settings.enable_developer_extras = true;",
120             "    ",
121             "    ",
122             "    var fs= new FakeServer(this.el);",
123             "    fs.ref();",
124             "    // this was an attempt to change the url perms.. did not work..",
125             "    // settings.enable_file_access_from_file_uris = true;",
126             "    // settings.enable_offline_web_application_cache - true;",
127             "    // settings.enable_universal_access_from_file_uris = true;",
128             "   ",
129             "     ",
130             "    ",
131             "    ",
132             "    ",
133             "",
134             "     // FIXME - base url of script..",
135             "     // we need it so some of the database features work.",
136             "    this.el.load_html( \"Render not ready\" , ",
137             "            //fixme - should be a config option!",
138             "            // or should we catch stuff and fix it up..",
139             "            \"http://localhost/app.Builder/\"",
140             "    );",
141             "   ",
142             "        ",
143             "   //this.el.open('file:///' + __script_path__ + '/../builder.html');",
144             "    /*",
145             "    Gtk.drag_dest_set",
146             "    (",
147             "            this.el,              //",
148             "            Gtk.DestDefaults.MOTION  | Gtk.DestDefaults.HIGHLIGHT,",
149             "            null,            // list of targets",
150             "            Gdk.DragAction.COPY         // what to do with data after dropped ",
151             "    );",
152             "                            ",
153             "   // print(\"RB: TARGETS : \" + LeftTree.atoms[\"STRING\"]);",
154             "    Gtk.drag_dest_set_target_list(this.el, this.get('/Window').targetList);",
155             "    */",
156             "    GLib.Timeout.add_seconds(1,  ()  =>{",
157             "         //print(\"run refresh?\");",
158             "         if (this.el == null) {",
159             "            return false;",
160             "         }",
161             "         this.runRefresh(); ",
162             "         return true;",
163             "     });",
164             "    ",
165             "    ",
166             "}",
167             ""
168            ],
169            "bool vexpand" : true,
170            "id" : "view",
171            "listeners" : {
172             "load_changed" : [
173              "(le) => {",
174              "    if (le != WebKit.LoadEvent.FINISHED) {",
175              "        return;",
176              "    }",
177              "    if (this.runjs.length < 1) {",
178              "        return;",
179              "    }",
180              "  //  this.el.run_javascript(this.runjs, null);",
181              "     FakeServerCache.remove(    this.runjs);",
182              "    this.runjs = \"\";",
183              "}"
184             ],
185             "ready_to_show" : [
186              "( ) => {",
187              "  this.initInspector();",
188              "",
189              "}",
190              ""
191             ],
192             "script_dialog" : [
193              "(dialog) => {",
194              "",
195              "\tif (this.el == null) {",
196              "\t\treturn true;",
197              "\t}",
198              "",
199              "\tvar msg = dialog.get_message();",
200              "\tif (msg.length < 4) {",
201              "\t\treturn false;",
202              "\t}",
203              "\t ",
204              "\t //GLib.debug(\"script dialog got %s\", msg);",
205              "\t ",
206              "\tif (msg.substring(0,4) != \"IPC:\") {",
207              "\t\treturn false;",
208              "\t}",
209              "\tvar ar = msg.split(\":\", 3);",
210              "\tif (ar.length < 3) {",
211              "\t\treturn false;",
212              "\t}",
213              "",
214              "\tswitch(ar[1]) {",
215              "\t",
216              "\t\tcase \"SAVEHTML\":",
217              "\t\t //   GLib.debug(\"GOT saveHTML %d\", ar[2].length);",
218              "\t\t    _this.file.saveHTML(ar[2]);",
219              "\t\t    _this.createThumb();",
220              "\t\t    return true;",
221              "\t\t    ",
222              "\t\tdefault:",
223              "\t\t    return false;",
224              "\t}",
225              "    ",
226              "}"
227             ]
228            },
229            "xtype" : "WebView",
230            "| void initInspector" : [
231             "() {",
232             "    ",
233             " ",
234             "          ",
235             "   // this.inspector.open_window.connect(() => {",
236             "         this.inspector = this.el.get_inspector();",
237             "         ",
238             "         this.inspector.open_window.connect(() => {",
239             "        print(\"inspector attach\\n\");",
240             "        var wv = this.inspector.get_web_view();",
241             "        if (wv != null) {",
242             "            print(\"got inspector web view\\n\");",
243             "            ",
244             "            var cn = _this.inspectorcontainer.el.get_first_child();",
245             "            if (cn != null) {",
246             "                 _this.inspectorcontainer.el.remove(cn);",
247             "             }",
248             "            ",
249             "            _this.inspectorcontainer.el.append(wv);",
250             "            wv.show();",
251             "        } else {",
252             "\t         print(\"got inspector web view FAILED\\n\");",
253             "            //this.inspector.close();",
254             "            ",
255             "            //this.inspector = null;",
256             "           ",
257             " ",
258             "        }",
259             "      return true;",
260             "       ",
261             "   });",
262             "     this.inspector.show();",
263             "         ",
264             "    ",
265             "  ",
266             "}",
267             ""
268            ],
269            "| void reInit" : [
270             "() {",
271             "   print(\"reInit?\");",
272             "         // if this happens destroy the webkit..",
273             "         // recreate it..",
274             "     this.el.stop_loading();",
275             "         ",
276             "     if (_this.viewbox.el.get_parent() == null) {",
277             "        return;",
278             "     }",
279             "         ",
280             "         /*",
281             "    _this.viewbox.el.remove(_this.viewcontainer.el);",
282             "    //_this.paned.el.remove(_this.inspectorcontainer.el);        ",
283             "         ",
284             "         // destory seems to cause problems.",
285             "         //this.el.destroy();",
286             "        //_this.viewcontainer.el.destroy();",
287             "         //_this.inspectorcontainer.el.destroy();",
288             "     var  inv =new Xcls_inspectorcontainer(_this);",
289             "      ",
290             "      _this.paned.el.set_end_child(inv.el);",
291             "      _this.inspectorcontainer = inv;",
292             "      ",
293             "     this.el = null;         ",
294             "     var nv =new Xcls_viewcontainer(_this);",
295             "    // nv.ref();",
296             "     _this.viewbox.el.append(nv.el);",
297             "         ",
298             "         _this.viewcontainer = nv;",
299             "     inv.el.show();",
300             "     nv.el.show();",
301             "         //while(Gtk.events_pending ()) Gtk.main_iteration ();",
302             "         //_this.view.renderJS(true); ",
303             "     _this.view.refreshRequired  = true;",
304             "     ",
305             "     */",
306             "}",
307             ""
308            ],
309            "| void renderJS" : [
310             "(bool force) {",
311             "",
312             "    // this is the public redraw call..",
313             "    // we refresh in a loop privately..",
314             "    var autodraw = _this.AutoRedraw.el.active;",
315             "    if (!autodraw && !force) {",
316             "        print(\"Skipping redraw - no force, and autodraw off\");",
317             "        return;",
318             "    }",
319             "     ",
320             "    this.refreshRequired  = true;",
321             "    ",
322             "}",
323             ""
324            ],
325            "| void runRefresh" : [
326             "() ",
327             "{",
328             "    // this is run every 2 seconds from the init..",
329             "",
330             "   ",
331             "    if (!this.refreshRequired) {",
332             "       // print(\"no refresh required\");",
333             "        return;",
334             "    }",
335             "",
336             "    if (this.lastRedraw != null) {",
337             "       // do not redraw if last redraw was less that 5 seconds ago.",
338             "       if ((int64)(new DateTime.now_local()).difference(this.lastRedraw) < 5000 ) {",
339             "            return;",
340             "        }",
341             "    }",
342             "    ",
343             "    if (_this.file == null) {",
344             "        return;",
345             "    }",
346             "    ",
347             "    ",
348             "     this.refreshRequired = false;",
349             "   //  print(\"HTML RENDERING\");",
350             "     ",
351             "     ",
352             "     //this.get('/BottomPane').el.show();",
353             "     //this.get('/BottomPane').el.set_current_page(2);// webkit inspector",
354             "    _this.file.webkit_page_id  = this.el.get_page_id();",
355             "    ",
356             "    var js = _this.file.toSourcePreview();",
357             "",
358             "    if (js.length < 1) {",
359             "        print(\"no data\");",
360             "        return;",
361             "    }",
362             "//    var  data = js[0];",
363             "    this.redraws++;",
364             "  ",
365             "    var project = (Project.Roo) _this.file.project;  ",
366             "",
367             "     //print (project.fn);",
368             "     // set it to non-empty.",
369             "     ",
370             "//     runhtml = runhtml.length ?  runhtml : '<script type=\"text/javascript\"></script>'; ",
371             "",
372             "",
373             "//   this.runhtml  = this.runhtml || '';",
374             " ",
375             " ",
376             "    // then we need to reload the browser using",
377             "    // load_html_string..",
378             "",
379             "    // then trigger a redraw once it's loaded..",
380             "    this.pendingRedraw = true;",
381             "",
382             "    var runhtml = \"<script type=\\\"text/javascript\\\">\\n\" ;",
383             "    uint8[] builderhtml;",
384             "    ",
385             "    try {",
386             "        GLib. File.new_for_uri(\"resource:///html/roo.builder.js\").load_contents(null,  out   builderhtml, null);",
387             "    } catch (Error e) {",
388             "        builderhtml = {};",
389             "    }",
390             "",
391             "    runhtml += (string) builderhtml + \"\\n\";",
392             "    runhtml += \"</script>\\n\" ;",
393             "",
394             "    // fix to make sure they are the same..",
395             "    this.runhtml = project.runhtml;",
396             "    // need to modify paths",
397             "",
398             "    uint8[] inhtml;",
399             "    var base_template = project.base_template;",
400             "    var f = GLib. File.new_for_uri(\"resource:///html/\" + base_template);",
401             "    ",
402             "    if (base_template.length > 0 && !f.query_exists(null)) {",
403             "       ",
404             "           GLib.debug(\"invalid base_template name - using default:  %s\", base_template);",
405             "           f = GLib. File.new_for_uri(\"resource:///html/roo.builder.html\");",
406             "    ",
407             "    }",
408             "    try {",
409             "\t    f.load_contents(null,  out inhtml, null);",
410             "         ",
411             "    ",
412             "    } catch (Error e) {",
413             "        inhtml = {};",
414             "    }    ",
415             "    this.renderedData = js;",
416             "",
417             "",
418             "    string js_src = js + \"",
419             "Roo.onReady(function() {",
420             "if (\" + _this.file.name +\".show) {",
421             "\t\t\" + _this.file.name +\".show({});",
422             "\t\t(function() {  ",
423             "\t\t\tBuilder.saveHTML.defer(100, Builder);",
424             "\t\t}).defer(100);",
425             "}",
426             "Roo.XComponent.build();",
427             "});\\n\";",
428             "\t",
429             "   // print(\"render js: \" + js);",
430             "    //if (!this.ready) {",
431             "  //      console.log('not loaded yet');",
432             "    //}",
433             "    this.lastRedraw = new DateTime.now_local();",
434             "",
435             "",
436             "    //this.runjs = js_src;",
437             "    var fc =    FakeServerCache.factory_with_data(js_src);",
438             "    this.runjs = fc.fname;",
439             "    var html  = (string) inhtml;",
440             "\thtml = html.replace(\"</head>\", runhtml + this.runhtml + ",
441             "        \"<script type=\\\"text/javascript\\\" src=\\\"xhttp://localhost\" + fc.fname + \"\\\"></script>\" +   ",
442             "          //  \"<script type=\\\"text/javascript\\\">\\n\" +",
443             "          //  js_src + \"\\n\" + ",
444             "          //  \"</script>\" + ",
445             "                    ",
446             "    \"</head>\");",
447             "    //print(\"LOAD HTML \" + html);",
448             "    ",
449             "     var rootURL = project.rootURL;",
450             "",
451             "    ",
452             "    ",
453             "    this.el.load_html( html , ",
454             "        //fixme - should be a config option!",
455             "        (rootURL.length > 0 ? rootURL : \"xhttp://localhost/roobuilder/\")",
456             "    );",
457             "      this.initInspector();   ",
458             "    // force the inspector...        ",
459             "       //   this.initInspector();",
460             "        ",
461             "        // - no need for this, the builder javascript will call it when build is complete",
462             "        //GLib.Timeout.add_seconds(1, () => {",
463             "        //    this.el.run_javascript(\"Builder.saveHTML()\",null);",
464             "        //    return false;",
465             "        //});",
466             "//     print( \"before render\" +    this.lastRedraw);",
467             "//    print( \"after render\" +    (new Date()));",
468             "    ",
469             "}",
470             "                                                                                                                                                                                                                        "
471            ]
472           }
473          ],
474          "xtype" : "Box"
475         },
476         {
477          "$ xns" : "Gtk",
478          "* pack" : "set_end_child",
479          "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
480          "bool vexpand" : true,
481          "id" : "inspectorcontainer",
482          "xtype" : "Box"
483         }
484        ],
485        "xtype" : "Paned"
486       },
487       {
488        "$ xns" : "Gtk",
489        "* pack" : "append_page,_this.label_code.el",
490        "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
491        "bool vexpand" : true,
492        "int spacing" : 0,
493        "items" : [
494         {
495          "$ xns" : "Gtk",
496          "bool vexpand" : true,
497          "id" : "sourceviewscroll",
498          "items" : [
499           {
500            "# Gtk.CssProvider? css" : "null",
501            "# JsRender.Node? node_selected" : "null",
502            "# bool button_is_pressed" : false,
503            "# bool key_is_pressed" : false,
504            "# bool loading" : true,
505            "# id" : "sourceview",
506            "# int editable_start_pos" : "-1",
507            "# string prop_selected" : "\"\"",
508            "$ xns" : "GtkSource",
509            "* init" : [
510             "\t{",
511             "",
512             "\t ",
513             "",
514             "\tthis.loading = true;",
515             "\t//var buf = this.el.get_buffer();",
516             "\t//buf.notify.connect(this.onCursorChanged);",
517             "",
518             "",
519             "\tvar attrs = new GtkSource.MarkAttributes();",
520             "\tattrs.set_icon_name ( \"process-stop\");    ",
521             "\tattrs.query_tooltip_text.connect(( mark) => {",
522             "\t\t//print(\"tooltip query? %s\\n\", mark.name);",
523             "\t\treturn mark.name;",
524             "\t});",
525             "",
526             "\tthis.el.set_mark_attributes (\"ERR\", attrs, 1);",
527             "",
528             "\t var wattrs = new GtkSource.MarkAttributes();",
529             "\twattrs.set_icon_name ( \"process-stop\");    ",
530             "\twattrs.query_tooltip_text.connect(( mark) => {",
531             "\t\t//print(\"tooltip query? %s\\n\", mark.name);",
532             "\t\treturn mark.name;",
533             "\t});",
534             "",
535             "\tthis.el.set_mark_attributes (\"WARN\", wattrs, 1);",
536             "",
537             "",
538             "",
539             "\t var dattrs = new GtkSource.MarkAttributes();",
540             "\tdattrs.set_icon_name ( \"process-stop\");    ",
541             "\tdattrs.query_tooltip_text.connect(( mark) => {",
542             "\t\t//print(\"tooltip query? %s\\n\", mark.name);",
543             "\t\treturn mark.name;",
544             "\t});",
545             "",
546             "\tthis.el.set_mark_attributes (\"DEPR\", dattrs, 1);",
547             "",
548             "",
549             "\tvar gattrs = new GtkSource.MarkAttributes();",
550             "\tvar  grey =   Gdk.RGBA();",
551             "\tgrey.parse ( \"#ccc\");",
552             "\tgattrs.set_background ( grey);",
553             "",
554             "",
555             "\tthis.el.set_mark_attributes (\"grey\", gattrs, 1);",
556             "",
557             "",
558             " ",
559             "",
560             "",
561             "\t}",
562             ""
563            ],
564            "* pack" : "set_child",
565            "bool editable" : false,
566            "bool show_line_marks" : true,
567            "bool show_line_numbers" : true,
568            "css_classes" : "{ \"code-editor\" }",
569            "items" : [
570             {
571              "$ xns" : "GtkSource",
572              "* init" : [
573               "{",
574               "\tvar buf = this.el;",
575               "\tbuf.create_tag (\"bold\", \"weight\", Pango.Weight.BOLD);",
576               "\tbuf.create_tag (\"type\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#204a87\");",
577               "\tbuf.create_tag (\"keyword\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#a40000\");",
578               "\tbuf.create_tag (\"text\", \"weight\", Pango.Weight.NORMAL, \"foreground\", \"#729fcf\");",
579               "\tbuf.create_tag (\"number\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#ad7fa8\");",
580               "\tbuf.create_tag (\"method\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#729fcf\");",
581               "\tbuf.create_tag (\"property\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#BC1F51\");",
582               "\tbuf.create_tag (\"variable\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#A518B5\");",
583               "",
584               "",
585               "\tbuf.create_tag (\"ERR\", \"weight\", Pango.Weight.BOLD, \"background\", \"pink\");",
586               "\tbuf.create_tag (\"WARN\", \"weight\", Pango.Weight.BOLD, \"background\", \"#ABF4EB\");",
587               "\tbuf.create_tag (\"DEPR\", \"weight\", Pango.Weight.BOLD, \"background\", \"#EEA9FF\");",
588               "}",
589               "",
590               ""
591              ],
592              "* pack" : "set_buffer",
593              "bool dirty" : false,
594              "bool in_cursor_change" : false,
595              "id" : "buffer",
596              "int error_line" : "-1",
597              "int last_line" : "-1",
598              "listeners" : {
599               "changed" : [
600                " () => {",
601                "  ",
602                "    // check syntax??",
603                "    // ??needed..??",
604                "   // _this.save_button.el.sensitive = true;",
605                "    ///?? has changed occured during loading?",
606                "    ",
607                "    // only trigger this if ",
608                "    ",
609                "    ",
610                "    ",
611                "    ",
612                "    if (_this.sourceview.loading) {",
613                "\t\treturn;",
614                "\t}",
615                "\t",
616                "",
617                "\t",
618                "    print(\"- PREVIEW EDITOR CHANGED--\");",
619                "",
620                "    this.dirty = true;  ",
621                "   // this.checkSyntax(); // this calls backs and highlights errors.. in theory...  ",
622                "",
623                "",
624                "",
625                "\tif (!_this.sourceview.button_is_pressed && !_this.sourceview.key_is_pressed) {",
626                "\t\tprint(\"button or key not pressed to generate change?!\\n\");",
627                "\t\treturn;",
628                "\t}",
629                "\t\t",
630                "    ",
631                "\t// what are we editing??",
632                "\tif (null == _this.sourceview.node_selected || _this.sourceview.prop_selected.length  < 1) {",
633                "\t\treturn;",
634                "\t}",
635                "\t",
636                "\t// find the colon on the first line...",
637                "\t",
638                "\tif (_this.sourceview.editable_start_pos > -1) {",
639                "\t\t",
640                "\t\tvar buf = (GtkSource.Buffer)_this.sourceview.el.get_buffer();",
641                "\t\t",
642                "        //print(\"cursor changed : %d\\n\", buf.cursor_position);",
643                "        Gtk.TextIter spos,epos;",
644                "        buf.get_iter_at_offset(out spos, _this.sourceview.editable_start_pos);",
645                "        buf.get_iter_at_offset(out epos, _this.sourceview.editable_start_pos); // initialize epos..",
646                "        ",
647                "        var gotit= false;",
648                "        var line = spos.get_line();",
649                "        var endline = buf.get_line_count();",
650                "        while (line < endline) {",
651                "    \t\tline++;",
652                "\t        buf.get_iter_at_line(out epos, line);",
653                "\t        if (buf.get_source_marks_at_line(line, \"grey\").length() > 0) {",
654                "\t\t        buf.get_iter_at_line(out epos, line);\t    \t\t",
655                "\t    \t\tgotit=true;",
656                "\t    \t\tbreak;",
657                "    \t\t}",
658                "\t\t}",
659                "        ",
660                " \t\tif (gotit) {",
661                "\t \t\tprint(\"End Offset = %d/%d\\n\", epos.get_line(), epos.get_offset());",
662                "\t\t\t// get the pos...",
663                "\t\t\t// in theory the last char will be '}' or '},' .. or ','",
664                "\t\t\t// we should chop the ',' of the end...",
665                "\t\t\tvar str = buf.get_text(spos, epos, false);",
666                "\t\t\tprint(\"got string\\n%s\\n\", str);",
667                "\t\t",
668                "\t\t}",
669                "\t}",
670                "    return ;",
671                "}",
672                "",
673                " ",
674                ""
675               ],
676               "cursor_moved" : [
677                "( ) => {",
678                "GLib.debug(\"cursor moved called\");",
679                "",
680                "",
681                " \tif (this.in_cursor_change ) {",
682                "        GLib.debug(\"cursor changed : %d [ignoring nested call)\", this.el.cursor_position);",
683                "        return;",
684                "    }",
685                "   ",
686                "    GLib.debug(\"cursor changed : %d\", this.el.cursor_position);",
687                "    Gtk.TextIter cpos;",
688                "    this.el.get_iter_at_offset(out cpos, this.el.cursor_position);",
689                "    ",
690                "    var ln = cpos.get_line();",
691                "    if (this.last_line == ln ){",
692                "    \treturn;",
693                "\t}",
694                "\tthis.last_line = ln;",
695                "    var node = _this.file.lineToNode(ln);",
696                "",
697                "    if (node == null) {",
698                "        print(\"can not find node\\n\");",
699                "        return;",
700                "    }",
701                "    this.in_cursor_change  = true;",
702                "    var ltree = _this.main_window.windowstate.left_tree;",
703                "    ltree.model.selectNode(node);",
704                "    this.in_cursor_change  = false;",
705                "}",
706                ""
707               ]
708              },
709              "xtype" : "Buffer",
710              "| string toString" : [
711               "  () {",
712               "    ",
713               "    Gtk.TextIter s;",
714               "    Gtk.TextIter e;",
715               "    this.el.get_start_iter(out s);",
716               "    this.el.get_end_iter(out e);",
717               "    var ret = this.el.get_text(s,e,true);",
718               "    //print(\"TO STRING? \" + ret);",
719               "    return ret;",
720               "}",
721               " "
722              ]
723             },
724             {
725              "# bool is_control" : false,
726              "$ xns" : "Gtk",
727              "* pack" : "add_controller",
728              "id" : "keystate",
729              "listeners" : {
730               "key_pressed" : [
731                "(keyval, keycode, state) => {",
732                "",
733                " \tif (keyval == Gdk.Key.Control_L || keyval == Gdk.Key.Control_R) {",
734                " \t\tthis.is_control = true;",
735                "\t}",
736                "    ",
737                "  \tif (keyval == Gdk.Key.g && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {",
738                "\t    GLib.debug(\"SAVE: ctrl-g  pressed\");",
739                "\t\t_this.forwardSearch(true);",
740                "\t    return false;",
741                "\t}",
742                "\tif (keyval == Gdk.Key.f && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {",
743                "\t    GLib.debug(\"SAVE: ctrl-f  pressed\");",
744                "\t\t_this.search_entry.el.grab_focus();",
745                "\t    return false ;",
746                "\t}",
747                "    ",
748                "\t//this.button_is_pressed = true;",
749                "\t//return false;",
750                "   // print(event.key.keyval)",
751                "    ",
752                "    return false;",
753                " ",
754                " ",
755                "}",
756                ""
757               ],
758               "key_released" : [
759                "(keyval, keycode, state) => {",
760                "",
761                "",
762                " \t if (keyval == Gdk.Key.Control_L || keyval == Gdk.Key.Control_R) {",
763                " \t\tthis.is_control = false;",
764                "\t}",
765                "}",
766                ""
767               ]
768              },
769              "xtype" : "EventControllerKey"
770             },
771             {
772              "# double distance" : "0.0f",
773              "$ xns" : "Gtk",
774              "Gtk.EventControllerScrollFlags flags" : "Gtk.EventControllerScrollFlags.VERTICAL",
775              "listeners" : {
776               "scroll" : [
777                "(dx, dy) => {",
778                "\tif (!_this.keystate.is_control) {",
779                "\t\treturn false;",
780                "\t}",
781                "\t//GLib.debug(\"scroll %f\",  dy);",
782                "\t",
783                "\tthis.distance += dy;",
784                "\tif (this.distance < 1) {",
785                "\t\tBuilderApplication.settings.editor_font_size ++;",
786                "\t\tthis.distance = 0;",
787                "\t}",
788                "\tif (this.distance > -1) {",
789                "\t\tBuilderApplication.settings.editor_font_size --;",
790                "\t\tthis.distance = 0;",
791                "\t}",
792                "",
793                "\treturn true;",
794                "}",
795                ""
796               ]
797              },
798              "xtype" : "EventControllerScroll"
799             }
800            ],
801            "listeners" : {
802             "query_tooltip" : [
803              "(x, y, keyboard_tooltip, tooltip) => {",
804              "\t",
805              "\t//GLib.debug(\"query tooltip\");",
806              "\tGtk.TextIter iter;",
807              "\tint trailing;",
808              "\t",
809              "\tvar yoff = (int) _this.sourceviewscroll.el.vadjustment.value;",
810              "\t",
811              "\tthis.el.get_iter_at_position (out iter, out trailing,  x,  y + yoff);",
812              "\t ",
813              "\tvar l = iter.get_line();",
814              "\t//GLib.debug(\"query tooltip line %d\", (int) l);",
815              "\tvar marks = _this.buffer.el.get_source_marks_at_line(l, null);",
816              "\t//GLib.debug(\"query tooltip line marks %d\", (int) marks.length());",
817              "\tvar str = \"\";",
818              "\tmarks.@foreach((m) => { ",
819              "\t\t//GLib.debug(\"got mark %s\", m.name);",
820              "\t\tstr += (str.length > 0 ? \"\\n\" : \"\") + m.name;",
821              "\t});",
822              "\t// true if there is a mark..",
823              "\tif (str.length > 0 ) {",
824              "\t\t\ttooltip.set_text( str);",
825              "\t}",
826              "\treturn str.length > 0 ? true : false;",
827              "",
828              "}"
829             ]
830            },
831            "string name" : "roo-view",
832            "xtype" : "View",
833            "| string toString" : [
834             "() {",
835             "   Gtk.TextIter s;",
836             "    Gtk.TextIter e;",
837             "    this.el.get_buffer().get_start_iter(out s);",
838             "    this.el.get_buffer().get_end_iter(out e);",
839             "    var ret = this.el.get_buffer().get_text(s,e,true);",
840             "    //print(\"TO STRING? \" + ret);",
841             "    return ret;",
842             "}",
843             ""
844            ],
845            "| void clearGreySelection" : [
846             "() {",
847             " // clear all the marks..",
848             "    var sbuf = (GtkSource.Buffer)this.el.buffer;",
849             "    ",
850             "    Gtk.TextIter start;",
851             "    Gtk.TextIter end;     ",
852             "        ",
853             "    sbuf.get_bounds (out start, out end);",
854             "    sbuf.remove_source_marks (start, end, \"grey\");",
855             "    ",
856             "    ",
857             "}",
858             ""
859            ],
860            "| void loadFile" : [
861             "( ) {",
862             "    this.loading = true;",
863             "    ",
864             "    ",
865             "    // get the cursor and scroll position....",
866             "    var buf = this.el.get_buffer();",
867             "\tvar cpos = buf.cursor_position;",
868             "    ",
869             "   print(\"BEFORE LOAD cursor = %d\\n\", cpos);",
870             "   ",
871             "    var vadj_pos = this.el.get_vadjustment().get_value();",
872             "   ",
873             "    ",
874             " ",
875             "    buf.set_text(\"\",0);",
876             " ",
877             "",
878             "    ",
879             "",
880             "    if (_this.file == null || _this.file.xtype != \"Roo\") {",
881             "        print(\"xtype != Roo\");",
882             "        this.loading = false;",
883             "        return;",
884             "    }",
885             "    ",
886             "    // get the string from the rendered tree...",
887             "     ",
888             "     var str = _this.file.toSource();",
889             "     ",
890             "//    print(\"setting str %d\\n\", str.length);",
891             "    buf.set_text(str, str.length);",
892             "    var lm = GtkSource.LanguageManager.get_default();",
893             "     ",
894             "    //?? is javascript going to work as js?",
895             "    ",
896             "    ((GtkSource.Buffer)(buf)) .set_language(lm.get_language(_this.file.language));",
897             "  ",
898             "    ",
899             "    _this.main_window.windowstate.updateErrorMarksAll();",
900             "    ",
901             "    //  restore the cursor position?",
902             "    // after reloading the contents.",
903             "     GLib.Timeout.add(500, () => {",
904             "\t\t_this.buffer.in_cursor_change = true;",
905             "        print(\"RESORTING cursor to = %d\\n\", cpos);",
906             "\t\tGtk.TextIter cpos_iter;",
907             "\t\tbuf.get_iter_at_offset(out cpos_iter, cpos);",
908             "\t\tbuf.place_cursor(cpos_iter); ",
909             "\t\t",
910             "\t\tthis.el.get_vadjustment().set_value(vadj_pos);;",
911             "\t\t_this.buffer.in_cursor_change = false;",
912             " ",
913             "\t\t",
914             "\t\t",
915             "\t\t//_this.buffer.checkSyntax();",
916             "\t\treturn false;",
917             "\t});",
918             "\t\t",
919             "    this.loading = false; ",
920             "    _this.buffer.dirty = false;",
921             "}",
922             ""
923            ],
924            "| void nodeSelected" : [
925             "(JsRender.Node? sel, bool scroll) {",
926             "  ",
927             "    ",
928             "    if (this.loading) {",
929             "    \treturn;",
930             "\t}",
931             "    // this is connected in widnowstate",
932             "    print(\"Roo-view - node selected\\n\");",
933             "    var buf = this.el.get_buffer();",
934             " ",
935             "    var sbuf = (GtkSource.Buffer) buf;",
936             "",
937             "    ",
938             "    ",
939             "   ",
940             "    // clear all the marks..",
941             "     Gtk.TextIter start;",
942             "    Gtk.TextIter end;     ",
943             "        ",
944             "    sbuf.get_bounds (out start, out end);",
945             "    sbuf.remove_source_marks (start, end, \"grey\");",
946             "    ",
947             "        this.node_selected = sel;",
948             "     if (sel == null) {",
949             "        // no highlighting..",
950             "        return;",
951             "    }",
952             "    Gtk.TextIter iter;   ",
953             "    sbuf.get_iter_at_line(out iter,  sel.line_start);",
954             "    ",
955             "    ",
956             "    Gtk.TextIter cur_iter;",
957             "    sbuf.get_iter_at_offset(out cur_iter, sbuf.cursor_position);",
958             "    ",
959             "    //var cur_line = cur_iter.get_line();",
960             "    //if (cur_line > sel.line_start && cur_line < sel.line_end) {",
961             "    ",
962             "    //} else {",
963             "    if (! _this.buffer.in_cursor_change) {",
964             "    \tthis.el.scroll_to_iter(iter,  0.1f, true, 0.0f, 0.5f);",
965             "\t}",
966             "    ",
967             "     ",
968             "    ",
969             "    for (var i = 0; i < buf.get_line_count();i++) {",
970             "        if (i < sel.line_start || i > sel.line_end) {",
971             "           ",
972             "            sbuf.get_iter_at_line(out iter, i);",
973             "            sbuf.create_source_mark(null, \"grey\", iter);",
974             "            ",
975             "        }",
976             "    ",
977             "    }",
978             "    ",
979             "",
980             "}",
981             ""
982            ],
983            "| void updateGreySelection" : [
984             "(bool scroll) { ",
985             "\tvar sel = this.node_selected;",
986             "\tprint(\"node selected\\n\");",
987             "    var buf = this.el.get_buffer();",
988             "    var sbuf = (GtkSource.Buffer) buf;",
989             "",
990             "   ",
991             "   this.clearGreySelection();",
992             "   ",
993             "   ",
994             "   ",
995             "     if (sel == null) {",
996             "\t     print(\"no selected node\\n\");",
997             "        // no highlighting..",
998             "        return;",
999             "    }",
1000             "    ",
1001             "    print(\"highlight region %d to %d\\n\", sel.line_start,sel.line_end);",
1002             "    Gtk.TextIter iter;   ",
1003             "    sbuf.get_iter_at_line(out iter,  sel.line_start);",
1004             "    ",
1005             "    ",
1006             "    Gtk.TextIter cur_iter;",
1007             "    sbuf.get_iter_at_offset(out cur_iter, sbuf.cursor_position);",
1008             "   ",
1009             "    var cursor_at_line = cur_iter.get_line();",
1010             "    ",
1011             "    ",
1012             "    //var cur_line = cur_iter.get_line();",
1013             "    //if (cur_line > sel.line_start && cur_line < sel.line_end) {",
1014             "    ",
1015             "    //} else {",
1016             "    if (scroll) {",
1017             "\t\tprint(\"scrolling to node -- should occur on node picking.\\n\");",
1018             "    \tthis.el.scroll_to_iter(iter,  0.1f, true, 0.0f, 0.5f);",
1019             "\t}",
1020             "    ",
1021             "    var start_line = sel.line_start;",
1022             "    var end_line = sel.line_end;",
1023             "    ",
1024             "    ",
1025             "    this.el.editable = false;",
1026             "    ",
1027             "    //var colon_pos = 0;",
1028             "    ",
1029             "    this.editable_start_pos = -1;",
1030             "    ",
1031             "    // now if we have selected a property...",
1032             "    if (this.prop_selected.length> 0 ) {",
1033             "",
1034             "\t\tint nstart, nend;",
1035             "\t\tif (sel.getPropertyRange(this.prop_selected, out nstart, out nend) && nend > nstart) {",
1036             "\t\t\tstart_line = nstart;",
1037             "\t\t\tend_line = nend;",
1038             "\t\t\t// this.el.editable = true; << cant do this!!?",
1039             "\t\t\tprint(\"start line = %d, end line = %d\\n\", start_line, end_line);",
1040             "\t\t\t",
1041             "\t\t\t\t// see if we are 'right of ':'",
1042             "\t\t\t\t// get an iter for the start of the line.",
1043             "\t\t\tGtk.TextIter start_first_line_iter,end_first_line_iter;",
1044             "\t\t\tthis.el.buffer.get_iter_at_line(out start_first_line_iter, start_line -1);",
1045             "\t\t\tthis.el.buffer.get_iter_at_line(out end_first_line_iter, start_line -1);",
1046             "\t\t\t ",
1047             "\t\t\t",
1048             "\t\t\t",
1049             "\t\t\t",
1050             "\t\t\tif (end_first_line_iter.forward_to_line_end()) {",
1051             "\t\t\t\tvar first_line  = this.el.buffer.get_text(start_first_line_iter, end_first_line_iter, false);",
1052             "\t\t\t\t",
1053             "\t\t\t\tprint(\"first line = %s\\n\", first_line);",
1054             "\t\t\t\tif (first_line.contains(\":\")) {",
1055             "\t\t\t\t\tthis.editable_start_pos = start_first_line_iter.get_offset() + first_line.index_of(\":\") + 1;",
1056             "\t\t\t\t\tprint(\"colon_pos  = %d\\n\", this.editable_start_pos);",
1057             "\t\t\t\t}",
1058             "\t\t\t\t",
1059             "",
1060             "\t\t\t\t//Gtk.TextIter colon_iter;",
1061             "\t\t\t\t//sbuf.get_iter_at_offset (out colon_iter, colon_pos);",
1062             "\t\t\t\t//sbuf.create_source_mark(null, \"active_text\", colon_iter);",
1063             "\t\t\t}",
1064             "\t\t\t",
1065             "\t\t\t",
1066             "\t\t\t",
1067             "\t\t\t//print(\"is cursor at line? %d ?= %d\\n\", start_line -1 , cursor_at_line);",
1068             "\t\t\t//if (start_line - 1 == cursor_at_line) {",
1069             "\t\t\t// should be ok - current_posssion can not be less than '-1'...",
1070             "\t\t\tif (sbuf.cursor_position < this.editable_start_pos) {",
1071             "\t\t\t",
1072             "\t\t\t\tprint(\"cursor is before start pos.. - turn off editable...\\n\");",
1073             "\t\t\t\t//var before_cursor_string = this.el.buffer.get_text(start_line_iter, cur_iter, false);",
1074             "\t\t\t\t//print(\"before cursor string =  %s\\n\", before_cursor_string);",
1075             "\t\t\t\t//if (!before_cursor_string.contains(\":\")) {",
1076             "\t\t\t\t\tthis.el.editable = false;",
1077             "\t\t\t\t//}",
1078             "\t\t\t\t",
1079             "\t\t\t}",
1080             "\t\t\t ",
1081             "\t\t\t ",
1082             "",
1083             "\t\t\t ",
1084             "\t\t}",
1085             "\t\tprint(\"propSelected = %s range  %d -> %d\\n\", this.prop_selected, start_line, end_line);\t\t",
1086             "\t\t",
1087             "\t\t",
1088             "    }",
1089             "    ",
1090             "\tprint(\"checking selection\\n\");",
1091             "    ",
1092             "    ",
1093             "    // check selection - if it's out of 'bounds'",
1094             "    if (this.el.editable && sbuf.get_has_selection()) {",
1095             "\t\tGtk.TextIter sel_start_iter, sel_end_iter;",
1096             "\t\tsbuf.get_selection_bounds(out sel_start_iter, out sel_end_iter);",
1097             "\t\t",
1098             "\t\tif (sel_start_iter.get_line() < start_line || sel_end_iter.get_line() > end_line ||",
1099             "\t\t\tsel_start_iter.get_line() > end_line   || sel_end_iter.get_line() < start_line\t\t\t) {",
1100             "\t\t\t// save?",
1101             "\t\t\tthis.el.editable = false;",
1102             "\t\t}",
1103             "\t\tif (this.editable_start_pos > 0 &&",
1104             "\t\t\t(sel_start_iter.get_offset() < this.editable_start_pos || sel_end_iter.get_offset() < this.editable_start_pos)",
1105             "\t\t\t",
1106             "\t\t) {",
1107             "\t\t\tthis.el.editable = false;",
1108             "\t\t}",
1109             "\t\t",
1110             "\t\t ",
1111             "    ",
1112             "    }",
1113             "    ",
1114             "    ",
1115             "    ",
1116             "    ",
1117             "    for (var i = 0; i < buf.get_line_count();i++) {",
1118             "        if (i < (start_line -1) || i > (end_line -1)) {",
1119             "           ",
1120             "            sbuf.get_iter_at_line(out iter, i);",
1121             "            sbuf.create_source_mark(null, \"grey\", iter);",
1122             "            ",
1123             "        }",
1124             "    ",
1125             "    }",
1126             "    if (scroll && (cursor_at_line > end_line || cursor_at_line < start_line)) {",
1127             "\t    Gtk.TextIter cpos_iter;",
1128             "\t\tbuf.get_iter_at_line(out cpos_iter, start_line);",
1129             "\t\t",
1130             "\t\tbuf.place_cursor(cpos_iter); ",
1131             "\t}",
1132             "",
1133             "",
1134             "}"
1135            ]
1136           }
1137          ],
1138          "xtype" : "ScrolledWindow"
1139         },
1140         {
1141          "$ xns" : "Gtk",
1142          "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL",
1143          "bool homogeneous" : false,
1144          "bool vexpand" : false,
1145          "int spacing" : 0,
1146          "items" : [
1147           {
1148            "$ xns" : "Gtk",
1149            "bool hexpand" : true,
1150            "id" : "search_entry",
1151            "items" : [
1152             {
1153              "$ xns" : "Gtk",
1154              "listeners" : {
1155               "key_pressed" : [
1156                "(keyval, keycode, state) => {",
1157                "",
1158                "\tif (keyval == Gdk.Key.g && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {",
1159                "\t    GLib.debug(\"SAVE: ctrl-g  pressed\");",
1160                "\t\t_this.forwardSearch(true);",
1161                "\t    return true;",
1162                "\t}",
1163                "    ",
1164                "  ",
1165                " \tif (keyval == Gdk.Key.Return) {",
1166                "\t\t_this.forwardSearch(true);",
1167                "\t\t",
1168                "\t\t",
1169                "\t    return true;",
1170                "",
1171                "\t}    ",
1172                "   // print(event.key.keyval)",
1173                "   ",
1174                "    return false;",
1175                "}",
1176                ""
1177               ]
1178              },
1179              "xtype" : "EventControllerKey"
1180             }
1181            ],
1182            "listeners" : {
1183             "search_changed" : [
1184              "( ) => {",
1185              "",
1186              "_this.search(_this.search_entry.el.text);",
1187              "\t _this.search_results.updateResults();",
1188              "",
1189              "\tGLib.Timeout.add_seconds(1,() => {",
1190              "\t\t _this.search_results.updateResults();",
1191              "\t\t return false;",
1192              "\t });",
1193              "}",
1194              ""
1195             ]
1196            },
1197            "string name" : "roo-search-entry",
1198            "string placeholder_text" : "Press enter to search",
1199            "xtype" : "SearchEntry",
1200            "| void forwardSearch" : [
1201             "(bool change_focus) {",
1202             "",
1203             "",
1204             "\t_this.forwardSearch(change_focus);",
1205             "",
1206             "/*",
1207             "",
1208             "\tswitch(_this.windowstate.state) {",
1209             "\t\tcase WindowState.State.CODEONLY:",
1210             "\t\t//case WindowState.State.CODE:",
1211             "\t\t\t// search the code being edited..",
1212             "\t\t\t_this.windowstate.code_editor_tab.forwardSearch(change_focus);",
1213             "\t\t\t ",
1214             "\t\t\tbreak;",
1215             "\t\tcase WindowState.State.PREVIEW:",
1216             "\t\t\tif (_this.windowstate.file.xtype == \"Gtk\") {",
1217             "\t\t\t\t_this.windowstate.window_gladeview.forwardSearch(change_focus);",
1218             "\t\t\t} else { ",
1219             "\t\t\t\t _this.windowstate.window_rooview.forwardSearch(change_focus);",
1220             "\t\t\t}",
1221             "\t\t",
1222             "\t\t\tbreak;",
1223             "\t}",
1224             "\t*/",
1225             "\t",
1226             "}",
1227             ""
1228            ]
1229           },
1230           {
1231            "$ xns" : "Gtk",
1232            "id" : "search_results",
1233            "int margin_end" : 4,
1234            "int margin_start" : 4,
1235            "string label" : "No Results",
1236            "xtype" : "Label",
1237            "| void updateResults" : [
1238             "() {",
1239             "\tthis.el.visible = true;",
1240             "\t",
1241             "\tvar res = _this.searchcontext.get_occurrences_count();",
1242             "\tif (res < 0) {",
1243             "\t\t_this.search_results.el.label = \"??? Matches\";\t\t",
1244             "\t\treturn;",
1245             "\t}",
1246             "",
1247             "\t_this.nextBtn.el.sensitive = false;",
1248             "\t_this.backBtn.el.sensitive = false;\t",
1249             "",
1250             "\tif (res > 0) {",
1251             "\t\t_this.search_results.el.label = \"%d Matches\".printf(res);",
1252             "\t\t_this.nextBtn.el.sensitive = true;",
1253             "\t\t_this.backBtn.el.sensitive = true;",
1254             "\t\treturn;",
1255             "\t} ",
1256             "\t_this.search_results.el.label = \"No Matches\";",
1257             "\t",
1258             "}"
1259            ]
1260           },
1261           {
1262            "$ xns" : "Gtk",
1263            "bool always_show_image" : true,
1264            "bool sensitive" : false,
1265            "id" : "nextBtn",
1266            "listeners" : {
1267             "clicked" : [
1268              "(event) => {",
1269              "",
1270              "\t_this.forwardSearch(true);",
1271              "\t ",
1272              "}",
1273              ""
1274             ]
1275            },
1276            "string icon_name" : "go-down",
1277            "xtype" : "Button"
1278           },
1279           {
1280            "$ xns" : "Gtk",
1281            "bool always_show_image" : true,
1282            "bool sensitive" : false,
1283            "id" : "backBtn",
1284            "listeners" : {
1285             "clicked" : [
1286              "(event) => {",
1287              "",
1288              "\t_this.backSearch(true);",
1289              "\t",
1290              "\t ",
1291              "}",
1292              ""
1293             ]
1294            },
1295            "string icon_name" : "go-up",
1296            "xtype" : "Button"
1297           },
1298           {
1299            "$ xns" : "Gtk",
1300            "bool always_show_image" : true,
1301            "items" : [
1302             {
1303              "$ xns" : "Gtk",
1304              "* pack" : false,
1305              "* prop" : "popover",
1306              "id" : "search_settings",
1307              "items" : [
1308               {
1309                "$ xns" : "Gtk",
1310                "* prop" : "child",
1311                "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
1312                "int spacing" : 0,
1313                "items" : [
1314                 {
1315                  "$ xns" : "Gtk",
1316                  "* init" : [
1317                   "{",
1318                   "\tthis.el.show();",
1319                   "}",
1320                   ""
1321                  ],
1322                  "id" : "case_sensitive",
1323                  "string label" : "Case Sensitive",
1324                  "xtype" : "CheckButton"
1325                 },
1326                 {
1327                  "$ xns" : "Gtk",
1328                  "* init" : [
1329                   "{",
1330                   "\tthis.el.show();",
1331                   "}",
1332                   ""
1333                  ],
1334                  "id" : "regex",
1335                  "string label" : "Regex",
1336                  "xtype" : "CheckButton"
1337                 },
1338                 {
1339                  "$ xns" : "Gtk",
1340                  "* init" : [
1341                   "{",
1342                   "\tthis.el.show();",
1343                   "}",
1344                   ""
1345                  ],
1346                  "id" : "multiline",
1347                  "string label" : "Multi-line (add \\n)",
1348                  "xtype" : "CheckButton"
1349                 }
1350                ],
1351                "xtype" : "Box"
1352               }
1353              ],
1354              "xtype" : "Popover"
1355             }
1356            ],
1357            "string icon_name" : "emblem-system",
1358            "xtype" : "MenuButton"
1359           }
1360          ],
1361          "xtype" : "Box"
1362         }
1363        ],
1364        "xtype" : "Box"
1365       }
1366      ],
1367      "xtype" : "Notebook"
1368     }
1369    ],
1370    "xtype" : "Box",
1371    "| int search" : [
1372     "(string in_txt) {",
1373     "\tthis.notebook.el.page = 1;",
1374     "\t",
1375     " ",
1376     "   ",
1377     "\tvar s = new GtkSource.SearchSettings();",
1378     "\ts.case_sensitive = _this.case_sensitive.el.active;",
1379     "\ts.regex_enabled = _this.regex.el.active;\t",
1380     "\ts.wrap_around = false;",
1381     "\t",
1382     "\tthis.searchcontext = new GtkSource.SearchContext(this.buffer.el,s);",
1383     "\tthis.searchcontext.set_highlight(true);",
1384     "\tvar txt = in_txt;",
1385     "\t",
1386     "\tif (_this.multiline.el.active) {",
1387     "\t\ttxt = in_txt.replace(\"\\\\n\", \"\\n\");",
1388     "\t}",
1389     "\t",
1390     "\ts.set_search_text(txt);",
1391     "\tGtk.TextIter beg, st,en;",
1392     "\tbool has_wrapped_around;",
1393     "\tthis.buffer.el.get_start_iter(out beg);",
1394     "\tthis.searchcontext.forward(beg, out st, out en, out has_wrapped_around);",
1395     "\tthis.last_search_end = 0;",
1396     "\t",
1397     "\treturn this.searchcontext.get_occurrences_count();",
1398     "",
1399     " ",
1400     "    ",
1401     "",
1402     "}",
1403     ""
1404    ],
1405    "| void backSearch" : [
1406     "(bool change_focus) {",
1407     "",
1408     "\tif (this.searchcontext == null) {",
1409     "\t\treturn;",
1410     "\t} ",
1411     "\t",
1412     "\tGtk.TextIter beg, st,en;",
1413     "\tbool has_wrapped_around;",
1414     "\tthis.buffer.el.get_iter_at_offset(out beg, this.last_search_end -1 );",
1415     "\t",
1416     "\tif (!this.searchcontext.backward(beg, out st, out en, out has_wrapped_around)) {",
1417     "\t",
1418     "\t\tthis.last_search_end = 0;",
1419     "\t\treturn;",
1420     "\t}",
1421     "\tthis.last_search_end = en.get_offset();",
1422     "\tif (change_focus) {",
1423     "\t\tthis.sourceview.el.grab_focus();",
1424     "\t}",
1425     "\tthis.buffer.el.place_cursor(st);",
1426     "\tthis.sourceview.el.scroll_to_iter(st,  0.1f, true, 0.0f, 0.5f);",
1427     "\tvar ln = st.get_line();",
1428     "\tthis.highlightNodeAtLine(ln);",
1429     "\t",
1430     " ",
1431     "}",
1432     ""
1433    ],
1434    "| void createThumb" : [
1435     "() {",
1436     "    ",
1437     "    ",
1438     "    if (this.file == null) {",
1439     "        return;",
1440     "    }",
1441     "    ",
1442     "\tif (this.notebook.el.page > 0 ) {",
1443     "        return;",
1444     "    }",
1445     "    ",
1446     " \tthis.file.widgetToIcon(this.view.el); ",
1447     "",
1448     "    ",
1449     "     ",
1450     "    ",
1451     "     ",
1452     "}",
1453     ""
1454    ],
1455    "| void forwardSearch" : [
1456     "(bool change_focus) {",
1457     "",
1458     "\tif (this.searchcontext == null) {",
1459     "\t\treturn;",
1460     "\t}",
1461     "\tthis.notebook.el.page = 1;",
1462     "\tGtk.TextIter beg, st,en;",
1463     "\tbool has_wrapped_around;",
1464     "\tvar buf = this.sourceview.el.get_buffer();",
1465     "\tbuf.get_iter_at_offset(out beg, this.last_search_end);",
1466     "\tif (!this.searchcontext.forward(beg, out st, out en, out has_wrapped_around)) {",
1467     "\t\tthis.last_search_end = 0;",
1468     "\t\treturn;",
1469     "\t}",
1470     "\tthis.last_search_end = en.get_offset();",
1471     "\tif (change_focus) {",
1472     "\t\tthis.sourceview.el.grab_focus();",
1473     "\t}",
1474     "\tbuf.place_cursor(st);",
1475     "\t",
1476     " ",
1477     "\t ",
1478     "\tthis.sourceview.el.scroll_to_iter(st,  0.0f, true, 0.0f, 0.5f);",
1479     "\t",
1480     "\t",
1481     "\tvar ln = st.get_line();",
1482     "\t",
1483     "\tthis.highlightNodeAtLine(ln);",
1484     "}\t",
1485     "  "
1486    ],
1487    "| void highlightNodeAtLine" : [
1488     "(int ln) {",
1489     "",
1490     "",
1491     "\t ",
1492     "\t// highlight node...",
1493     "\t",
1494     "\t\t",
1495     "    var node = _this.file.lineToNode(ln+1);",
1496     " ",
1497     "    if (node == null) {",
1498     "        //print(\"can not find node\\n\");",
1499     "        return;",
1500     "    }",
1501     "    var prop = node.lineToProp(ln+1);",
1502     "    print(\"prop : %s\", prop == null ? \"???\" : prop.name);",
1503     "        ",
1504     "        ",
1505     "    // ---------- this selects the tree's node...",
1506     "    ",
1507     "    var ltree = _this.main_window.windowstate.left_tree;",
1508     "   ltree.model.selectNode(node);",
1509     "        ",
1510     "    //_this.sourceview.allow_node_scroll = false; /// block node scrolling..",
1511     "\t       ",
1512     "   ",
1513     "    //print(\"changing cursor on tree..\\n\");",
1514     "   ",
1515     "",
1516     "    ",
1517     "    // let's try allowing editing on the methods.",
1518     "    // a little klunky at present..",
1519     "\t_this.sourceview.prop_selected = \"\";",
1520     "\t/*",
1521     "    if (prop != null) {",
1522     "\t\t//see if we can find it..",
1523     "\t\tvar kv = prop.split(\":\");",
1524     "\t\tif (kv[0] == \"p\") {",
1525     "\t\t",
1526     "    \t\t//var k = prop.get_key(kv[1]);",
1527     "    \t\t// fixme -- need to determine if it's an editable property...",
1528     "    \t\t_this.sourceview.prop_selected = prop;",
1529     "    \t\t",
1530     "\t\t} else if (kv[0] == \"l\") {",
1531     "\t\t\t _this.sourceview.prop_selected = prop;",
1532     "\t\t\t",
1533     "\t\t}",
1534     "    }",
1535     "    */",
1536     "   // ltree.view.el.set_cursor(new Gtk.TreePath.from_string(tp), null, false); ",
1537     "   _this.sourceview.nodeSelected(node,false);",
1538     "    ",
1539     "            // scrolling is disabled... as node selection calls scroll 10ms after it changes.",
1540     "      //      GLib.Timeout.add_full(GLib.Priority.DEFAULT,100 , () => {",
1541     "\t  //          this.allow_node_scroll = true;",
1542     "\t  //          return false;",
1543     "      //      });",
1544     "      //  }",
1545     "\t\t",
1546     "\t\t",
1547     "\t\t",
1548     "\t\t",
1549     "\t\t",
1550     "\t\t",
1551     "\t\t",
1552     "\t\t",
1553     "\t\t",
1554     "\t\t ",
1555     "",
1556     "}",
1557     " "
1558    ],
1559    "| void loadFile" : [
1560     "",
1561     "(JsRender.JsRender file)",
1562     "{",
1563     "    this.file = file;",
1564     "    this.view.renderJS(true);",
1565     "    this.notebook.el.page = 0;// gtk preview ",
1566     "    this.sourceview.loadFile();   ",
1567     "    this.last_error_counter = -1;",
1568     "    this.updateErrorMarks();",
1569     "}",
1570     " ",
1571     " "
1572    ],
1573    "| void requestRedraw" : [
1574     "() {",
1575     "    this.view.renderJS(false);",
1576     "    this.sourceview.loadFile();   ",
1577     "}"
1578    ],
1579    "| void scroll_to_line" : [
1580     "(int line) {",
1581     "   // code preview...",
1582     "   ",
1583     "   GLib.Timeout.add(100, () => {",
1584     "   ",
1585     "\t\tthis.notebook.el.set_current_page( 1 );",
1586     "\t   ",
1587     "\t   ",
1588     "\t\t  var buf = this.sourceview.el.get_buffer();",
1589     "\t ",
1590     "\t\tvar sbuf = (GtkSource.Buffer) buf;",
1591     "",
1592     "",
1593     "\t\tGtk.TextIter iter;   ",
1594     "\t\tsbuf.get_iter_at_line(out iter,  line);",
1595     "\t\tthis.sourceview.el.scroll_to_iter(iter,  0.1f, true, 0.0f, 0.5f);",
1596     "\t\treturn false;",
1597     "\t});   ",
1598     "",
1599     "   ",
1600     "}",
1601     ""
1602    ],
1603    "| void updateErrorMarks" : [
1604     "() {",
1605     "\t",
1606     " ",
1607     "",
1608     "\tvar buf = _this.buffer.el;",
1609     "\tGtk.TextIter start;",
1610     "\tGtk.TextIter end;     ",
1611     "\tbuf.get_bounds (out start, out end);",
1612     "",
1613     "",
1614     " ",
1615     "\tGLib.debug(\"highlight errors\");\t\t ",
1616     "",
1617     "\t // we should highlight other types of errors..",
1618     "",
1619     " ",
1620     "",
1621     "\t ",
1622     "\tif (_this.file == null) {",
1623     "\t\tGLib.debug(\"file is null?\");",
1624     "\t\treturn;",
1625     "",
1626     "\t}",
1627     "\tvar ar = this.file.getErrors();",
1628     "\tif (ar.size < 1) {",
1629     "\t\tbuf.remove_tag_by_name (\"ERR\", start, end);",
1630     "\t\tbuf.remove_tag_by_name (\"WARN\", start, end);",
1631     "\t\tbuf.remove_tag_by_name (\"DEPR\", start, end);",
1632     "\t\tbuf.remove_source_marks (start, end, \"ERR\");",
1633     "\t\tbuf.remove_source_marks (start, end, \"WARN\");",
1634     "\t\tbuf.remove_source_marks (start, end, \"DEPR\");",
1635     "\t\tthis.last_error_counter = file.error_counter ;",
1636     "\t\tGLib.debug(\"higjlight has no errors\");",
1637     "\t\treturn;",
1638     "\t}",
1639     " \tif (this.last_error_counter == file.error_counter) {",
1640     "\t\treturn;",
1641     "\t}",
1642     "",
1643     "\tvar tlines = buf.get_line_count () +1;",
1644     "\t",
1645     " ",
1646     "\t ",
1647     "\tbuf.remove_source_marks (start, end, \"ERR\");",
1648     "\tbuf.remove_source_marks (start, end, \"WARN\");",
1649     "\tbuf.remove_source_marks (start, end, \"DEPR\");",
1650     "\tbuf.remove_tag_by_name (\"ERR\", start, end);",
1651     "\tbuf.remove_tag_by_name (\"WARN\", start, end);",
1652     "\tbuf.remove_tag_by_name (\"DEPR\", start, end);",
1653     "\tforeach(var diag in ar) { ",
1654     "\t",
1655     "\t\t",
1656     "\t     Gtk.TextIter iter;",
1657     "//        print(\"get inter\\n\");",
1658     "\t    var eline = (int)diag.range.start.line ;",
1659     "\t    var eline_to = (int)diag.range.end.line;",
1660     "\t    if (eline > tlines || eline < 0) {",
1661     "\t        return;",
1662     "\t    }",
1663     "\t   ",
1664     "\t    ",
1665     "\t    buf.get_iter_at_line( out iter, eline);",
1666     "\t   ",
1667     "\t  \t buf.get_iter_at_line_offset( out start, ",
1668     " \t    \teline, (int)diag.range.start.character); ",
1669     " \t    buf.get_iter_at_line_offset( out end, ",
1670     " \t    \teline_to, (int)diag.range.end.character); ",
1671     " \t    \t",
1672     "\t    buf.apply_tag_by_name(diag.category, start, end);",
1673     "\t   ",
1674     "\t   ",
1675     "\t\tvar msg = \"Line: %d %s : %s\".printf(eline+1, diag.category, diag.message);",
1676     "\t    buf.create_source_mark( msg, diag.category, iter);",
1677     "\t    GLib.debug(\"set line %d to %s\", eline, msg);",
1678     "\t    //this.marks.set(eline, msg);",
1679     "\t}",
1680     "\tthis.last_error_counter = file.error_counter ;",
1681     "",
1682     "",
1683     "",
1684     " ",
1685     "",
1686     "}"
1687    ]
1688   }
1689  ],
1690  "name" : "WindowRooView"
1691 }