Fix #7353 - context on next/back on searching
[roobuilder] / src / Builder4 / Editor.vala
1 static Editor  _Editor;
2
3 public class Editor : Object
4 {
5     public Gtk.Box el;
6     private Editor  _this;
7
8     public static Editor singleton()
9     {
10         if (_Editor == null) {
11             _Editor= new Editor();
12         }
13         return _Editor;
14     }
15     public Xcls_save_button save_button;
16     public Xcls_close_btn close_btn;
17     public Xcls_RightEditor RightEditor;
18     public Xcls_view view;
19     public Xcls_buffer buffer;
20     public Xcls_search_entry search_entry;
21     public Xcls_search_results search_results;
22     public Xcls_nextBtn nextBtn;
23     public Xcls_backBtn backBtn;
24     public Xcls_search_settings search_settings;
25     public Xcls_case_sensitive case_sensitive;
26     public Xcls_regex regex;
27     public Xcls_multiline multiline;
28
29         // my vars (def)
30     public Xcls_MainWindow window;
31     public int pos_root_x;
32     public bool dirty;
33     public int pos_root_y;
34     public bool pos;
35     public Gtk.SourceSearchContext searchcontext;
36     public int last_search_end;
37     public JsRender.NodeProp? prop;
38     public JsRender.JsRender? file;
39     public JsRender.Node node;
40     public signal void save ();
41     public string activeEditor;
42
43     // ctor
44     public Editor()
45     {
46         _this = this;
47         this.el = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 );
48
49         // my vars (dec)
50         this.window = null;
51         this.dirty = false;
52         this.pos = false;
53         this.searchcontext = null;
54         this.last_search_end = 0;
55         this.prop = null;
56         this.file = null;
57         this.node = null;
58         this.activeEditor = "";
59
60         // set gobject values
61         this.el.homogeneous = false;
62         this.el.hexpand = true;
63         this.el.vexpand = true;
64         var child_0 = new Xcls_Box2( _this );
65         child_0.ref();
66         this.el.pack_start (  child_0.el , false,true );
67         var child_1 = new Xcls_RightEditor( _this );
68         child_1.ref();
69         this.el.add(  child_1.el );
70         var child_2 = new Xcls_Box12( _this );
71         child_2.ref();
72         this.el.add(  child_2.el );
73     }
74
75     // user defined functions
76     public bool saveContents ()  {
77         
78         
79         if (_this.file == null) {
80             return true;
81         }
82         
83          
84          
85          var str = _this.buffer.toString();
86          
87          _this.buffer.checkSyntax();
88          
89          
90          
91          // LeftPanel.model.changed(  str , false);
92          _this.dirty = false;
93          _this.save_button.el.sensitive = false;
94          
95         // find the text for the node..
96         if (_this.file.xtype != "PlainFile") {
97            // in theory these properties have to exist!?!
98                 this.prop.val = str;
99             this.window.windowstate.left_props.reload();
100         } else {
101             _this.file.setSource(  str );
102          }
103         
104         // call the signal..
105         this.save();
106         
107         return true;
108     
109     }
110     public void forwardSearch (bool change_focus) {
111     
112         if (this.searchcontext == null) {
113                 return;
114         } 
115         
116         Gtk.TextIter beg, st,en;
117          bool has_wrapped_around;
118         this.buffer.el.get_iter_at_offset(out beg, this.last_search_end);
119         if (!this.searchcontext.forward2(beg, out st, out en, out has_wrapped_around)) {
120         
121                 this.last_search_end = 0; // not sure if this should happen
122         } else {
123                 if (has_wrapped_around) {
124                         return;
125                 }
126         
127                 this.last_search_end = en.get_offset();
128                 if (change_focus) {
129                         this.view.el.grab_focus();
130                 }
131                 this.buffer.el.place_cursor(st);
132                 this.view.el.scroll_to_iter(st,  0.1f, true, 0.0f, 0.5f);
133         }
134      
135     }
136     public void show (JsRender.JsRender file, JsRender.Node? node, JsRender.NodeProp? prop)
137     {
138         this.reset();
139         this.file = file;    
140         
141         if (file.xtype != "PlainFile") {
142                 this.prop = prop;
143             this.node = node;
144     
145             // find the text for the node..
146             this.view.load( prop.val );
147             this.close_btn.el.show();       
148         
149         } else {
150             this.view.load(        file.toSource() );
151             this.close_btn.el.hide();
152         }
153      
154     }
155     public void backSearch (bool change_focus) {
156     
157         if (this.searchcontext == null) {
158                 return;
159         } 
160         
161         Gtk.TextIter beg, st,en;
162         bool has_wrapped_around;
163         this.buffer.el.get_iter_at_offset(out beg, this.last_search_end -1 );
164         
165         if (!this.searchcontext.backward2(beg, out st, out en, out has_wrapped_around)) {
166         
167                 this.last_search_end = 0;
168         } else {
169                 this.last_search_end = en.get_offset();
170                 if (change_focus) {
171                         this.view.el.grab_focus();
172                 }
173                 this.buffer.el.place_cursor(st);
174                 this.view.el.scroll_to_iter(st,  0.1f, true, 0.0f, 0.5f);
175         }
176      
177     }
178     public int search (string in_txt) {
179     
180         var s = new Gtk.SourceSearchSettings();
181         s.case_sensitive = _this.case_sensitive.el.active;
182         s.regex_enabled = _this.regex.el.active;        
183         s.wrap_around = false;
184         
185         this.searchcontext = new Gtk.SourceSearchContext(this.buffer.el,s);
186         this.searchcontext.set_highlight(true);
187         var txt = in_txt;
188         
189         if (_this.multiline.el.active) {
190                 txt = in_txt.replace("\\n", "\n");
191         }
192         
193         s.set_search_text(txt);
194         Gtk.TextIter beg, st,en;
195          
196         this.buffer.el.get_start_iter(out beg);
197         this.searchcontext.forward(beg, out st, out en);
198         this.last_search_end = 0;
199         
200         return this.searchcontext.get_occurrences_count();
201     
202      
203        
204     
205     }
206     public void reset () {
207          this.file = null;    
208          
209         this.node = null;
210         this.prop = null;
211         this.searchcontext = null;
212       
213     }
214     public void scroll_to_line (int line) {
215     
216         GLib.Timeout.add(500, () => {
217        
218                 var buf = this.view.el.get_buffer();
219     
220                 var sbuf = (Gtk.SourceBuffer) buf;
221     
222     
223                 Gtk.TextIter iter;   
224                 sbuf.get_iter_at_line(out iter,  line);
225                 this.view.el.scroll_to_iter(iter,  0.1f, true, 0.0f, 0.5f);
226                 return false;
227         });   
228     }
229     public class Xcls_Box2 : Object
230     {
231         public Gtk.Box el;
232         private Editor  _this;
233
234
235             // my vars (def)
236
237         // ctor
238         public Xcls_Box2(Editor _owner )
239         {
240             _this = _owner;
241             this.el = new Gtk.Box( Gtk.Orientation.HORIZONTAL, 0 );
242
243             // my vars (dec)
244
245             // set gobject values
246             this.el.homogeneous = false;
247             var child_0 = new Xcls_save_button( _this );
248             child_0.ref();
249             this.el.add (  child_0.el  );
250             var child_1 = new Xcls_Label5( _this );
251             child_1.ref();
252             this.el.add (  child_1.el  );
253             var child_2 = new Xcls_HScale6( _this );
254             child_2.ref();
255             this.el.add (  child_2.el  );
256             var child_3 = new Xcls_close_btn( _this );
257             child_3.ref();
258             this.el.add (  child_3.el  );
259         }
260
261         // user defined functions
262     }
263     public class Xcls_save_button : Object
264     {
265         public Gtk.Button el;
266         private Editor  _this;
267
268
269             // my vars (def)
270
271         // ctor
272         public Xcls_save_button(Editor _owner )
273         {
274             _this = _owner;
275             _this.save_button = this;
276             this.el = new Gtk.Button();
277
278             // my vars (dec)
279
280             // set gobject values
281             this.el.always_show_image = true;
282             this.el.label = "Save";
283             var child_0 = new Xcls_Image4( _this );
284             child_0.ref();
285             this.el.image = child_0.el;
286
287             //listeners
288             this.el.clicked.connect( () => { 
289                 _this.saveContents();
290             });
291         }
292
293         // user defined functions
294     }
295     public class Xcls_Image4 : Object
296     {
297         public Gtk.Image el;
298         private Editor  _this;
299
300
301             // my vars (def)
302
303         // ctor
304         public Xcls_Image4(Editor _owner )
305         {
306             _this = _owner;
307             this.el = new Gtk.Image();
308
309             // my vars (dec)
310
311             // set gobject values
312             this.el.icon_name = "document-save";
313         }
314
315         // user defined functions
316     }
317
318
319     public class Xcls_Label5 : Object
320     {
321         public Gtk.Label el;
322         private Editor  _this;
323
324
325             // my vars (def)
326
327         // ctor
328         public Xcls_Label5(Editor _owner )
329         {
330             _this = _owner;
331             this.el = new Gtk.Label( null );
332
333             // my vars (dec)
334
335             // set gobject values
336             this.el.hexpand = true;
337         }
338
339         // user defined functions
340     }
341
342     public class Xcls_HScale6 : Object
343     {
344         public Gtk.HScale el;
345         private Editor  _this;
346
347
348             // my vars (def)
349
350         // ctor
351         public Xcls_HScale6(Editor _owner )
352         {
353             _this = _owner;
354             this.el = new Gtk.HScale.with_range (6, 30, 1);
355
356             // my vars (dec)
357
358             // set gobject values
359             this.el.width_request = 200;
360             this.el.has_origin = true;
361             this.el.draw_value = true;
362             this.el.digits = 0;
363             this.el.sensitive = true;
364
365             // init method
366
367             {
368                 this.el.set_range(6,30);
369                 this.el.set_value(8);
370             }
371
372             //listeners
373             this.el.change_value.connect( (st, val ) => {
374                  
375                   var description =   Pango.FontDescription.from_string("monospace");
376                   print("resize to %d", (int)val*1000);
377                   description.set_size((int)val*1000);
378                   _this.view.el.override_font(description);
379                   return false;
380             });
381         }
382
383         // user defined functions
384     }
385
386     public class Xcls_close_btn : Object
387     {
388         public Gtk.Button el;
389         private Editor  _this;
390
391
392             // my vars (def)
393
394         // ctor
395         public Xcls_close_btn(Editor _owner )
396         {
397             _this = _owner;
398             _this.close_btn = this;
399             this.el = new Gtk.Button();
400
401             // my vars (dec)
402
403             // set gobject values
404             this.el.always_show_image = true;
405             var child_0 = new Xcls_Image8( _this );
406             child_0.ref();
407             this.el.image = child_0.el;
408
409             //listeners
410             this.el.clicked.connect( () => { 
411                 _this.saveContents();
412                 _this.window.windowstate.switchState(WindowState.State.PREVIEW);
413             });
414         }
415
416         // user defined functions
417     }
418     public class Xcls_Image8 : Object
419     {
420         public Gtk.Image el;
421         private Editor  _this;
422
423
424             // my vars (def)
425
426         // ctor
427         public Xcls_Image8(Editor _owner )
428         {
429             _this = _owner;
430             this.el = new Gtk.Image();
431
432             // my vars (dec)
433
434             // set gobject values
435             this.el.icon_name = "window-close";
436         }
437
438         // user defined functions
439     }
440
441
442
443     public class Xcls_RightEditor : Object
444     {
445         public Gtk.ScrolledWindow el;
446         private Editor  _this;
447
448
449             // my vars (def)
450
451         // ctor
452         public Xcls_RightEditor(Editor _owner )
453         {
454             _this = _owner;
455             _this.RightEditor = this;
456             this.el = new Gtk.ScrolledWindow( null, null );
457
458             // my vars (dec)
459
460             // set gobject values
461             this.el.vexpand = true;
462             var child_0 = new Xcls_view( _this );
463             child_0.ref();
464             this.el.add (  child_0.el  );
465
466             // init method
467
468             this.el.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
469         }
470
471         // user defined functions
472     }
473     public class Xcls_view : Object
474     {
475         public Gtk.SourceView el;
476         private Editor  _this;
477
478
479             // my vars (def)
480
481         // ctor
482         public Xcls_view(Editor _owner )
483         {
484             _this = _owner;
485             _this.view = this;
486             this.el = new Gtk.SourceView();
487
488             // my vars (dec)
489
490             // set gobject values
491             this.el.auto_indent = true;
492             this.el.indent_width = 4;
493             this.el.show_line_marks = true;
494             this.el.insert_spaces_instead_of_tabs = true;
495             this.el.show_line_numbers = true;
496             this.el.draw_spaces = Gtk.SourceDrawSpacesFlags.LEADING + Gtk.SourceDrawSpacesFlags.TRAILING + Gtk.SourceDrawSpacesFlags.TAB + Gtk.SourceDrawSpacesFlags.SPACE;
497             this.el.tab_width = 4;
498             this.el.highlight_current_line = true;
499             var child_0 = new Xcls_buffer( _this );
500             child_0.ref();
501             this.el.set_buffer (  child_0.el  );
502
503             // init method
504
505             var description =   Pango.FontDescription.from_string("monospace");
506                         description.set_size(8000);
507             
508                          this.el.override_font(description);
509             
510                 try {        
511                         this.el.completion.add_provider(new Palete.CompletionProvider(_this));
512                 } catch (GLib.Error  e) {}
513                 
514                 this.el.completion.unblock_interactive();
515                 this.el.completion.select_on_show                       = true; // select
516                 this.el.completion.show_headers                 = false;
517                 this.el.completion.remember_info_visibility             = true;
518                 
519               
520                 var attrs = new Gtk.SourceMarkAttributes();
521                 var  pink =   Gdk.RGBA();
522                 pink.parse ( "pink");
523                 attrs.set_background ( pink);
524                 attrs.set_icon_name ( "process-stop");    
525                 attrs.query_tooltip_text.connect(( mark) => {
526                     //print("tooltip query? %s\n", mark.name);
527                     return mark.name;
528                 });
529                 
530                 this.el.set_mark_attributes ("ERR", attrs, 1);
531                 
532                  var wattrs = new Gtk.SourceMarkAttributes();
533                 var  blue =   Gdk.RGBA();
534                 blue.parse ( "#ABF4EB");
535                 wattrs.set_background ( blue);
536                 wattrs.set_icon_name ( "process-stop");    
537                 wattrs.query_tooltip_text.connect(( mark) => {
538                     //print("tooltip query? %s\n", mark.name);
539                     return mark.name;
540                 });
541                 
542                 this.el.set_mark_attributes ("WARN", wattrs, 1);
543                 
544              
545                 
546                  var dattrs = new Gtk.SourceMarkAttributes();
547                 var  purple =   Gdk.RGBA();
548                 purple.parse ( "#EEA9FF");
549                 dattrs.set_background ( purple);
550                 dattrs.set_icon_name ( "process-stop");    
551                 dattrs.query_tooltip_text.connect(( mark) => {
552                     //print("tooltip query? %s\n", mark.name);
553                     return mark.name;
554                 });
555                 
556                 this.el.set_mark_attributes ("DEPR", dattrs, 1);
557
558             //listeners
559             this.el.key_release_event.connect( (event) => {
560                 
561                 if (event.keyval == Gdk.Key.s && (event.state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {
562                     GLib.debug("SAVE: ctrl-S  pressed");
563                     _this.saveContents();
564                     return false;
565                 }
566                 
567                 if (event.keyval == Gdk.Key.g && (event.state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {
568                     GLib.debug("SAVE: ctrl-g  pressed");
569                         _this.forwardSearch(true);
570                     return true;
571                 }
572                 
573                // print(event.key.keyval)
574                 
575                 return false;
576             
577             });
578         }
579
580         // user defined functions
581         public void load (string str) {
582         
583         // show the help page for the active node..
584            //this.get('/Help').show();
585         
586         
587           // this.get('/BottomPane').el.set_current_page(0);
588             var buf = (Gtk.SourceBuffer)this.el.get_buffer();
589             buf.set_text(str, str.length);
590             buf.set_undo_manager(null);
591             
592             var lm = Gtk.SourceLanguageManager.get_default();
593             var lang = "vala";
594             if (_this.file != null) {
595                  lang = _this.file.language;
596             }
597             print("lang=%s, content_type = %s\n", lang, _this.file.content_type);
598             var lg = _this.file.content_type.length > 0  ?
599                     lm.guess_language(_this.file.path, _this.file.content_type) :
600                     lm.get_language(lang);
601              
602            
603             ((Gtk.SourceBuffer)(this.el.get_buffer())) .set_language(lg); 
604         
605             this.el.insert_spaces_instead_of_tabs = true;
606             if (lg != null) {
607                         print("sourcelanguage  = %s\n", lg.name);
608                         if (lg.name == "Vala") {
609                             this.el.insert_spaces_instead_of_tabs = false;
610                         }
611              }
612             _this.dirty = false;
613             this.el.grab_focus();
614             _this.save_button.el.sensitive = false;
615         }
616     }
617     public class Xcls_buffer : Object
618     {
619         public Gtk.SourceBuffer el;
620         private Editor  _this;
621
622
623             // my vars (def)
624         public int error_line;
625         public bool check_queued;
626         public bool check_running;
627
628         // ctor
629         public Xcls_buffer(Editor _owner )
630         {
631             _this = _owner;
632             _this.buffer = this;
633             this.el = new Gtk.SourceBuffer( null );
634
635             // my vars (dec)
636             this.error_line = -1;
637             this.check_queued = false;
638             this.check_running = false;
639
640             // set gobject values
641
642             //listeners
643             this.el.changed.connect( () => {
644                 // check syntax??
645                 // ??needed..??
646                 _this.save_button.el.sensitive = true;
647                 print("EDITOR CHANGED");
648                 this.checkSyntax();
649                
650                 _this.dirty = true;
651             
652                 // this.get('/LeftPanel.model').changed(  str , false);
653                 return ;
654             });
655         }
656
657         // user defined functions
658         public bool checkSyntax () {
659          
660             if (this.check_running) {
661                 print("Check is running\n");
662                 if (this.check_queued) { 
663                     print("Check is already queued");
664                     return true;
665                 }
666                 this.check_queued = true;
667                 print("Adding queued Check ");
668                 GLib.Timeout.add_seconds(1, () => {
669                     this.check_queued = false;
670                     
671                     this.checkSyntax();
672                     return false;
673                 });
674             
675         
676                 return true;
677             }
678             var str = this.toString();
679             
680             // needed???
681             if (this.error_line > 0) {
682                  Gtk.TextIter start;
683                  Gtk.TextIter end;     
684                 this.el.get_bounds (out start, out end);
685         
686                 this.el.remove_source_marks (start, end, null);
687             }
688             if (str.length < 1) {
689                 print("checkSyntax - empty string?\n");
690                 return true;
691             }
692             
693             if (_this.file.xtype == "PlainFile") {
694             
695                 // assume it's gtk...
696                    this.check_running = true;
697          
698                  if (!BuilderApplication.valasource.checkPlainFileSpawn(
699                    _this.file,
700                     str
701                  )) {
702                     this.check_running = false;
703                 }
704                 
705                 return true;
706             
707             }
708            if (_this.file == null) {
709                return true;
710            }
711             var p = _this.file.project.palete;
712             
713         
714              
715             this.check_running = true;
716             
717             
718             if (_this.file.language == "js") {
719                 this.check_running = false;
720                 print("calling validate javascript\n"); 
721                 Gee.HashMap<int,string> errors;
722                 p.javascriptHasErrors(
723                         _this.window.windowstate,
724                     str, 
725                      _this.prop,
726                     _this.file,   // no reference not node?
727                     out errors
728                 );
729                 return this.highlightErrors(errors);    
730                 
731             }
732                 
733                 
734             print("calling validate vala\n");    
735             // clear the buttons.
736          
737             
738            if (! BuilderApplication.valasource.checkFileWithNodePropChange(
739                 _this.file,
740                 _this.node,
741                  _this.prop,        
742                     str
743                 )) {
744                 this.check_running = false;
745             } 
746              
747             
748             
749             //print("done mark line\n");
750              
751             return true; // at present allow saving - even if it's invalid..
752         }
753         public bool highlightErrorsJson (string type, Json.Object obj) {
754               Gtk.TextIter start;
755              Gtk.TextIter end;     
756                 this.el.get_bounds (out start, out end);
757                 
758                 this.el.remove_source_marks (start, end, type);
759                          
760              
761              // we should highlight other types of errors..
762             
763             if (!obj.has_member(type)) {
764                 print("Return has no errors\n");
765                 return true;
766             }
767             
768             if (_this.window.windowstate.state != WindowState.State.CODEONLY 
769               
770                 ) {
771                 return true;
772             } 
773             
774             
775             var err = obj.get_object_member(type);
776             
777             
778             if (_this.file == null) {
779                 return true;
780             
781             }
782             var valafn = _this.file.path;
783          
784             if (_this.file.xtype != "PlainFile") {
785         
786         
787                 
788                 
789                  valafn = "";
790                   try {             
791                        var  regex = new Regex("\\.bjs$");
792                        // should not happen
793                       
794                      
795                         valafn = regex.replace(_this.file.path,_this.file.path.length , 0 , ".vala");
796                      } catch (GLib.RegexError e) {
797                         return true;
798                     }   
799         
800         
801         
802               }
803                if (!err.has_member(valafn)) {
804                     print("File path has no errors\n");
805                     return  true;
806                 }
807         
808                 var lines = err.get_object_member(valafn);
809                 
810                 var offset = 1;
811                 if (obj.has_member("line_offset")) {
812                     offset = (int)obj.get_int_member("line_offset") + 1;
813                 }
814             
815         
816              
817             
818             var tlines = this.el.get_line_count () +1;
819             
820             lines.foreach_member((obj, line, node) => {
821                 
822                      Gtk.TextIter iter;
823             //        print("get inter\n");
824                     var eline = int.parse(line) - offset;
825                     print("GOT ERROR on line %s -- converted to %d\n", line,eline);
826                     
827                     
828                     if (eline > tlines || eline < 0) {
829                         return;
830                     }
831                     this.el.get_iter_at_line( out iter, eline);
832                     //print("mark line\n");
833                     var msg  = "Line: %d".printf(eline+1);
834                     var ar = lines.get_array_member(line);
835                     for (var i = 0 ; i < ar.get_length(); i++) {
836                             msg += (msg.length > 0) ? "\n" : "";
837                             msg += ar.get_string_element(i);
838                     }
839                     
840                     
841                     this.el.create_source_mark(msg, type, iter);
842                 } );
843                 return false;
844             
845         
846         
847         
848         
849         }
850         public bool highlightErrors ( Gee.HashMap<int,string> validate_res) {
851                  
852                 this.error_line = validate_res.size;
853         
854                 if (this.error_line < 1) {
855                       return true;
856                 }
857                 var tlines = this.el.get_line_count ();
858                 Gtk.TextIter iter;
859                 var valiter = validate_res.map_iterator();
860                 while (valiter.next()) {
861                 
862             //        print("get inter\n");
863                     var eline = valiter.get_key();
864                     if (eline > tlines) {
865                         continue;
866                     }
867                     this.el.get_iter_at_line( out iter, eline);
868                     //print("mark line\n");
869                     this.el.create_source_mark(valiter.get_value(), "ERR", iter);
870                 }   
871                 return false;
872             }
873         public string toString () {
874             
875             Gtk.TextIter s;
876             Gtk.TextIter e;
877             this.el.get_start_iter(out s);
878             this.el.get_end_iter(out e);
879             var ret = this.el.get_text(s,e,true);
880             //print("TO STRING? " + ret);
881             return ret;
882         }
883     }
884
885
886
887     public class Xcls_Box12 : Object
888     {
889         public Gtk.Box el;
890         private Editor  _this;
891
892
893             // my vars (def)
894
895         // ctor
896         public Xcls_Box12(Editor _owner )
897         {
898             _this = _owner;
899             this.el = new Gtk.Box( Gtk.Orientation.HORIZONTAL, 0 );
900
901             // my vars (dec)
902
903             // set gobject values
904             this.el.homogeneous = false;
905             this.el.vexpand = false;
906             var child_0 = new Xcls_search_entry( _this );
907             child_0.ref();
908             this.el.add(  child_0.el );
909             var child_1 = new Xcls_MenuBar14( _this );
910             child_1.ref();
911             this.el.add (  child_1.el  );
912             var child_2 = new Xcls_nextBtn( _this );
913             child_2.ref();
914             this.el.add(  child_2.el );
915             var child_3 = new Xcls_backBtn( _this );
916             child_3.ref();
917             this.el.add(  child_3.el );
918             var child_4 = new Xcls_MenuButton20( _this );
919             child_4.ref();
920             this.el.add(  child_4.el );
921         }
922
923         // user defined functions
924     }
925     public class Xcls_search_entry : Object
926     {
927         public Gtk.SearchEntry el;
928         private Editor  _this;
929
930
931             // my vars (def)
932
933         // ctor
934         public Xcls_search_entry(Editor _owner )
935         {
936             _this = _owner;
937             _this.search_entry = this;
938             this.el = new Gtk.SearchEntry();
939
940             // my vars (dec)
941
942             // set gobject values
943             this.el.width_request = 300;
944             this.el.hexpand = true;
945             this.el.placeholder_text = "Press enter to search";
946
947             // init method
948
949             var description =   Pango.FontDescription.from_string("monospace");
950                 description.set_size(8000);
951                  this.el.override_font(description);
952
953             //listeners
954             this.el.key_press_event.connect( (event) => {
955                  if (event.keyval == Gdk.Key.g && (event.state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {
956                     GLib.debug("SAVE: ctrl-g  pressed");
957                         _this.forwardSearch(true);
958                     return true;
959                 }
960                 
961               
962                 if (event.keyval == Gdk.Key.Return && this.el.text.length > 0) {
963                         var res = _this.search(this.el.text);
964                          _this.search_results.updateResults();
965             
966                         GLib.Timeout.add_seconds(2,() => {
967                                  _this.search_results.updateResults();
968                                  return false;
969                          });
970                  
971                         
972                     return true;
973             
974                 }    
975                // print(event.key.keyval)
976                
977                 return false;
978             
979             });
980             this.el.changed.connect( () => {
981                 /*
982                 if (this.el.text == "") {
983                         _this.search_results.el.hide();
984                         return;
985                 }
986                 var res = 0;
987                 switch(_this.windowstate.state) {
988                         case WindowState.State.CODEONLY:
989                         ///case WindowState.State.CODE:
990                                 // search the code being edited..
991                                 res = _this.windowstate.code_editor_tab.search(this.el.text);
992                                 
993                                 break;
994                         case WindowState.State.PREVIEW:
995                                 if (_this.windowstate.file.xtype == "Gtk") {
996                                          res = _this.windowstate.window_gladeview.search(this.el.text);
997                                 } else { 
998                                          res = _this.windowstate.window_rooview.search(this.el.text);                   
999                                 }
1000                         
1001                         
1002                                 break;
1003                 }
1004                 _this.search_results.el.show();
1005                 if (res > 0) {
1006                         _this.search_results.el.label = "%d Matches".printf(res);
1007                 } else {
1008                         _this.search_results.el.label = "No Matches";
1009                 }
1010                         
1011                 */
1012                 
1013             });
1014         }
1015
1016         // user defined functions
1017         public void forwardSearch (bool change_focus) {
1018         
1019         
1020                 _this.forwardSearch(change_focus);
1021         
1022         /*
1023         
1024                 switch(_this.windowstate.state) {
1025                         case WindowState.State.CODEONLY:
1026                         //case WindowState.State.CODE:
1027                                 // search the code being edited..
1028                                 _this.windowstate.code_editor_tab.forwardSearch(change_focus);
1029                                  
1030                                 break;
1031                         case WindowState.State.PREVIEW:
1032                                 if (_this.windowstate.file.xtype == "Gtk") {
1033                                         _this.windowstate.window_gladeview.forwardSearch(change_focus);
1034                                 } else { 
1035                                          _this.windowstate.window_rooview.forwardSearch(change_focus);
1036                                 }
1037                         
1038                                 break;
1039                 }
1040                 */
1041                 
1042         }
1043     }
1044
1045     public class Xcls_MenuBar14 : Object
1046     {
1047         public Gtk.MenuBar el;
1048         private Editor  _this;
1049
1050
1051             // my vars (def)
1052
1053         // ctor
1054         public Xcls_MenuBar14(Editor _owner )
1055         {
1056             _this = _owner;
1057             this.el = new Gtk.MenuBar();
1058
1059             // my vars (dec)
1060
1061             // set gobject values
1062             var child_0 = new Xcls_search_results( _this );
1063             child_0.ref();
1064             this.el.add (  child_0.el  );
1065         }
1066
1067         // user defined functions
1068     }
1069     public class Xcls_search_results : Object
1070     {
1071         public Gtk.ImageMenuItem el;
1072         private Editor  _this;
1073
1074
1075             // my vars (def)
1076
1077         // ctor
1078         public Xcls_search_results(Editor _owner )
1079         {
1080             _this = _owner;
1081             _this.search_results = this;
1082             this.el = new Gtk.ImageMenuItem();
1083
1084             // my vars (dec)
1085
1086             // set gobject values
1087             this.el.always_show_image = true;
1088             this.el.visible = false;
1089
1090             //listeners
1091             this.el.button_press_event.connect( () => {
1092             /*
1093                 if (this.popup == null) {
1094                     this.popup = new Xcls_ValaCompileErrors();
1095                     this.popup.window = _this;
1096                 }
1097                
1098                 
1099                 this.popup.show(this.notices, this.el);
1100                 */
1101                 return true;
1102             });
1103         }
1104
1105         // user defined functions
1106         public void updateResults () {
1107                 this.el.visible = true;
1108                 
1109                 var res = _this.searchcontext.get_occurrences_count();
1110                 if (res < 0) {
1111                         _this.search_results.el.label = "??? Matches";          
1112                         return;
1113                 }
1114         
1115                 _this.nextBtn.el.sensitive = false;
1116                 _this.backBtn.el.sensitive = false;     
1117         
1118                 if (res > 0) {
1119                         _this.search_results.el.label = "%d Matches".printf(res);
1120                         _this.nextBtn.el.sensitive = true;
1121                         _this.backBtn.el.sensitive = true;
1122                         return;
1123                 } 
1124                 _this.search_results.el.label = "No Matches";
1125                 
1126         }
1127     }
1128
1129
1130     public class Xcls_nextBtn : Object
1131     {
1132         public Gtk.Button el;
1133         private Editor  _this;
1134
1135
1136             // my vars (def)
1137
1138         // ctor
1139         public Xcls_nextBtn(Editor _owner )
1140         {
1141             _this = _owner;
1142             _this.nextBtn = this;
1143             this.el = new Gtk.Button();
1144
1145             // my vars (dec)
1146
1147             // set gobject values
1148             this.el.always_show_image = true;
1149             this.el.label = "Next";
1150             this.el.sensitive = false;
1151             var child_0 = new Xcls_Image17( _this );
1152             child_0.ref();
1153             this.el.image = child_0.el;
1154
1155             //listeners
1156             this.el.button_press_event.connect( (event) => {
1157             
1158                 _this.forwardSearch(true);
1159                 
1160                 return true;
1161             });
1162         }
1163
1164         // user defined functions
1165     }
1166     public class Xcls_Image17 : Object
1167     {
1168         public Gtk.Image el;
1169         private Editor  _this;
1170
1171
1172             // my vars (def)
1173
1174         // ctor
1175         public Xcls_Image17(Editor _owner )
1176         {
1177             _this = _owner;
1178             this.el = new Gtk.Image();
1179
1180             // my vars (dec)
1181
1182             // set gobject values
1183             this.el.icon_name = "go-down";
1184         }
1185
1186         // user defined functions
1187     }
1188
1189
1190     public class Xcls_backBtn : Object
1191     {
1192         public Gtk.Button el;
1193         private Editor  _this;
1194
1195
1196             // my vars (def)
1197
1198         // ctor
1199         public Xcls_backBtn(Editor _owner )
1200         {
1201             _this = _owner;
1202             _this.backBtn = this;
1203             this.el = new Gtk.Button();
1204
1205             // my vars (dec)
1206
1207             // set gobject values
1208             this.el.always_show_image = true;
1209             this.el.label = "Previous";
1210             this.el.sensitive = false;
1211             var child_0 = new Xcls_Image19( _this );
1212             child_0.ref();
1213             this.el.image = child_0.el;
1214
1215             //listeners
1216             this.el.button_press_event.connect( (event) => {
1217             
1218                 _this.backSearch(true);
1219                 
1220                 return true;
1221             });
1222         }
1223
1224         // user defined functions
1225     }
1226     public class Xcls_Image19 : Object
1227     {
1228         public Gtk.Image el;
1229         private Editor  _this;
1230
1231
1232             // my vars (def)
1233
1234         // ctor
1235         public Xcls_Image19(Editor _owner )
1236         {
1237             _this = _owner;
1238             this.el = new Gtk.Image();
1239
1240             // my vars (dec)
1241
1242             // set gobject values
1243             this.el.icon_name = "go-up";
1244         }
1245
1246         // user defined functions
1247     }
1248
1249
1250     public class Xcls_MenuButton20 : Object
1251     {
1252         public Gtk.MenuButton el;
1253         private Editor  _this;
1254
1255
1256             // my vars (def)
1257
1258         // ctor
1259         public Xcls_MenuButton20(Editor _owner )
1260         {
1261             _this = _owner;
1262             this.el = new Gtk.MenuButton();
1263
1264             // my vars (dec)
1265
1266             // set gobject values
1267             this.el.always_show_image = true;
1268             this.el.label = "Settings";
1269             var child_0 = new Xcls_Image21( _this );
1270             child_0.ref();
1271             this.el.image = child_0.el;
1272             var child_1 = new Xcls_search_settings( _this );
1273             child_1.ref();
1274             this.el.popup = child_1.el;
1275         }
1276
1277         // user defined functions
1278     }
1279     public class Xcls_Image21 : Object
1280     {
1281         public Gtk.Image el;
1282         private Editor  _this;
1283
1284
1285             // my vars (def)
1286
1287         // ctor
1288         public Xcls_Image21(Editor _owner )
1289         {
1290             _this = _owner;
1291             this.el = new Gtk.Image();
1292
1293             // my vars (dec)
1294
1295             // set gobject values
1296             this.el.icon_name = "emblem-system";
1297         }
1298
1299         // user defined functions
1300     }
1301
1302     public class Xcls_search_settings : Object
1303     {
1304         public Gtk.Menu el;
1305         private Editor  _this;
1306
1307
1308             // my vars (def)
1309
1310         // ctor
1311         public Xcls_search_settings(Editor _owner )
1312         {
1313             _this = _owner;
1314             _this.search_settings = this;
1315             this.el = new Gtk.Menu();
1316
1317             // my vars (dec)
1318
1319             // set gobject values
1320             var child_0 = new Xcls_case_sensitive( _this );
1321             child_0.ref();
1322             this.el.append(  child_0.el );
1323             var child_1 = new Xcls_regex( _this );
1324             child_1.ref();
1325             this.el.append(  child_1.el );
1326             var child_2 = new Xcls_multiline( _this );
1327             child_2.ref();
1328             this.el.append(  child_2.el );
1329         }
1330
1331         // user defined functions
1332     }
1333     public class Xcls_case_sensitive : Object
1334     {
1335         public Gtk.CheckMenuItem el;
1336         private Editor  _this;
1337
1338
1339             // my vars (def)
1340
1341         // ctor
1342         public Xcls_case_sensitive(Editor _owner )
1343         {
1344             _this = _owner;
1345             _this.case_sensitive = this;
1346             this.el = new Gtk.CheckMenuItem();
1347
1348             // my vars (dec)
1349
1350             // set gobject values
1351             this.el.label = "Case Sensitive";
1352
1353             // init method
1354
1355             {
1356                 this.el.show();
1357             }
1358         }
1359
1360         // user defined functions
1361     }
1362
1363     public class Xcls_regex : Object
1364     {
1365         public Gtk.CheckMenuItem el;
1366         private Editor  _this;
1367
1368
1369             // my vars (def)
1370
1371         // ctor
1372         public Xcls_regex(Editor _owner )
1373         {
1374             _this = _owner;
1375             _this.regex = this;
1376             this.el = new Gtk.CheckMenuItem();
1377
1378             // my vars (dec)
1379
1380             // set gobject values
1381             this.el.label = "Regex";
1382
1383             // init method
1384
1385             {
1386                 this.el.show();
1387             }
1388         }
1389
1390         // user defined functions
1391     }
1392
1393     public class Xcls_multiline : Object
1394     {
1395         public Gtk.CheckMenuItem el;
1396         private Editor  _this;
1397
1398
1399             // my vars (def)
1400
1401         // ctor
1402         public Xcls_multiline(Editor _owner )
1403         {
1404             _this = _owner;
1405             _this.multiline = this;
1406             this.el = new Gtk.CheckMenuItem();
1407
1408             // my vars (dec)
1409
1410             // set gobject values
1411             this.el.label = "Multi-line (add \\n)";
1412
1413             // init method
1414
1415             {
1416                 this.el.show();
1417             }
1418         }
1419
1420         // user defined functions
1421     }
1422
1423
1424
1425
1426 }