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