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