OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [perl_gui/] [lib/] [perl/] [software_editor.pl] - Blame information for rev 48

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
#!/usr/bin/perl -w
2 34 alirezamon
 
3
use strict;
4
use warnings;
5
 
6 48 alirezamon
use FindBin;
7
use lib $FindBin::Bin;
8
use Consts;
9
 
10
use constant::boolean;
11
 
12
 
13 34 alirezamon
use Data::Dumper;
14 48 alirezamon
use File::Basename;
15
use Cwd 'abs_path';
16 34 alirezamon
 
17 48 alirezamon
use base 'Class::Accessor::Fast';
18 34 alirezamon
 
19 48 alirezamon
use Consts;
20
BEGIN {
21
    my $module = (Consts::GTK_VERSION==2) ? 'Gtk2' : 'Gtk3';
22
    my $file = $module;
23
    $file =~ s[::][/]g;
24
    $file .= '.pm';
25
    require $file;
26
    $module->import;
27
}
28
 
29
 
30 34 alirezamon
require "widget.pl";
31
 
32
 
33
__PACKAGE__->mk_accessors(qw{
34
        window
35
        sourceview
36
        buffer
37
        filename
38
        search_regexp
39
        search_case
40
        search_entry
41
        regexp
42
        highlighted
43 48 alirezamon
        open_list_ref
44
        source_view_notebook
45
        menue
46
        modified
47
        label
48
        ask_to_save
49
        close_b
50 34 alirezamon
});
51
 
52
 
53
 
54
 
55
 
56 48 alirezamon
my $NAME = 'ProNoC';
57
my      $path = "";
58
our $FONT_SIZE='default';
59
our $ICON_SIZE='default';
60
 
61
exit gtk_gui_run(\&software_main_stand_alone) unless caller;
62
 
63
 
64
sub software_main_stand_alone(){
65
        $path = "../../";
66
 
67
        set_path_env();
68
        my $project_dir   = get_project_dir(); #mpsoc dir addr
69
        my $paths_file= "$project_dir/mpsoc/perl_gui/lib/Paths";
70
        if (-f  $paths_file){#} && defined $ENV{PRONOC_WORK} ) {
71
                my $paths= do $paths_file;
72
                my %p=%{$paths};
73
                $FONT_SIZE= $p{'GUI_SETTING'}{'FONT_SIZE'} if (defined $p{'GUI_SETTING'}{'FONT_SIZE'});
74
                $ICON_SIZE= $p{'GUI_SETTING'}{'ICON_SIZE'} if (defined $p{'GUI_SETTING'}{'ICON_SIZE'});
75
        }
76
 
77
        set_defualt_font_size();
78
        my ($app,$table,$tview,$window) = software_main("../../../../../back/tmp",undef,) ;
79
        $window->signal_connect (destroy => sub { gui_quite();});
80
}
81
 
82
 
83
 
84
 
85
 
86 34 alirezamon
sub software_main {
87 48 alirezamon
        my ($sw,$file,$pages_ref,$label_ref) = @_;
88 34 alirezamon
 
89
 
90
 
91
        my $app = __PACKAGE__->new();
92 48 alirezamon
        my ($table,$tview,$widget)=$app->build_gui($sw,$pages_ref,$label_ref);
93 34 alirezamon
        my $main_c=(defined $file)? "$sw/$file" : "$sw/main.c";
94 48 alirezamon
        my @tmp;
95
        $app->open_list_ref(\@tmp);
96
        $app->ask_to_save(def_button());
97 34 alirezamon
        $app->load_source($main_c) if (-f $main_c );
98 48 alirezamon
        return ($app,$table,$tview,$widget);
99
}
100 34 alirezamon
 
101
 
102
 
103
 
104
sub build_gui {
105 48 alirezamon
        my ($app,$sw,$pages_ref,$label_ref) = @_;
106 34 alirezamon
 
107
 
108 48 alirezamon
        my $table= def_table(2,10,FALSE);
109
 
110
        my $vbox = def_vbox(FALSE, 0);
111
        my $scwin_text = add_widget_to_scrolled_win($vbox);
112 34 alirezamon
 
113 48 alirezamon
        my ($scwin_info,$tview)= create_txview();
114
        my ($tree_view,$tree_store) =$app->build_tree_view($sw);
115
        my $scwin_dirs = add_widget_to_scrolled_win($tree_view);
116 34 alirezamon
 
117
 
118 48 alirezamon
        my $hpaned = gen_hpaned($scwin_dirs,0.15,$scwin_text);
119
        my $vpaned = gen_vpaned($hpaned,0.6,$scwin_info);
120
 
121 34 alirezamon
        $table->attach_defaults ($vpaned,0, 10, 0,1);
122
 
123 48 alirezamon
        my $window = def_popwin_size (84,84,'Source Editor','percent');
124
 
125
        my @menue_item=("$sw/",$window,$tree_view,$tree_store,$scwin_dirs);
126
        $app->menue(\@menue_item);
127
        if (defined $pages_ref){
128
                #first page is software editor
129
                my $notebook = gen_notebook();
130
 
131
                my $label1=def_image_label($path."icons/binary.png","Software Editor",1);
132
                $notebook->append_page ($table,$label1);
133
                $label1->show_all;
134
 
135
 
136
                my @pages=@{$pages_ref};
137
                my @labels=@{$label_ref};
138
                my $i=0;
139
                foreach my $page (@pages){
140
                        my $label=$labels[$i];
141
                        $notebook->append_page ($page,$label);
142
                        $label->show_all;
143
                        $i++;
144
                }
145
                $notebook->show_all;
146
                $notebook->set_current_page(0);
147
                $window -> add ( $notebook);
148
        }else {
149
                $window -> add ( $table);
150
        }
151 34 alirezamon
 
152 48 alirezamon
        $app->window($window);
153 34 alirezamon
 
154
 
155 48 alirezamon
        my $hbox = def_table(FALSE, 0);
156
        my $source_view_notebook = gen_notebook();
157
        $vbox->pack_start($hbox, FALSE, FALSE, 0);
158
        $vbox->pack_start($source_view_notebook, TRUE, TRUE, 0);
159 43 alirezamon
 
160 48 alirezamon
 
161
 
162
 
163
        $app->source_view_notebook($source_view_notebook);
164
    $window->show_all();
165
 
166
        $window->signal_connect ('delete_event'=> sub {
167
                $app->ask_to_save_changes();
168
                return 0;
169
 
170
        });
171
 
172
 
173
 
174
 
175
 
176
        return ($table,$tview,$window);
177
}
178 34 alirezamon
 
179 48 alirezamon
sub ask_to_save_changes{
180
        my $app=shift;
181
        my $save = $app->ask_to_save();
182
        $save->clicked;
183
}
184 34 alirezamon
 
185 48 alirezamon
sub update_modified {
186
        my $self=shift;
187
        if($self->modified() ==2 ){
188
                $self->set_source_label_modified(FALSE);
189
                return;
190
        }
191
        elsif($self->modified() ==FALSE ){
192
                #if ($buffer->get_modified()){
193
                        $self->set_source_label_modified(TRUE);
194
                #}
195
        }
196
}
197 34 alirezamon
 
198 48 alirezamon
sub new_source_view{
199
        my ($app,$filename)=@_;
200
 
201
    my $self = __PACKAGE__->new();
202
    my ($name,$p,$suffix) = fileparse("$filename",qr"\..[^.]*$");
203
        my $label = gen_label_in_left ("${name}${suffix}");
204
    $self->modified(2);#initial 
205
        $self->label($label);
206
        $self->filename($filename);
207
 
208
        my $hbox = def_table(FALSE, 0);
209
        my $vbox = def_vbox(FALSE, 0);
210
        my $ref =$app->menue();
211
        my ($sw,$window,$tree_view,$tree_store,$scwin_dirs) =@{$ref};
212
    $hbox->attach($self->build_menu($sw,$window,$tree_view,$tree_store,$scwin_dirs,$app), 0, 1, 0,1,'shrink','shrink',2,2);
213
 
214
        $hbox->attach_defaults($self->build_search_box, 1,2,0,1);
215
    $vbox->pack_start($hbox, FALSE, FALSE, 0);
216
 
217
        my $buffer = $self->create_SourceView_buffer();
218
        my $sourceview = gen_SourceView_with_buffer($buffer);
219
        $sourceview->signal_connect('key-press-event' => sub { handle_key( @_,$self ) } );
220 34 alirezamon
        $sourceview->set_show_line_numbers(TRUE);
221
        $sourceview->set_tab_width(2);
222
        $sourceview->set_indent_on_tab(TRUE);
223
        $sourceview->set_highlight_current_line(TRUE);
224 48 alirezamon
 
225
 
226
    #   $sourceview->set_draw_spaces(['tab', 'newline']);
227 34 alirezamon
        #
228 48 alirezamon
        # Fix TextView's annoying paste behaviour when pasting with the mouse
229 34 alirezamon
        # (middle button click). By default gtk will scroll the text view to the
230
        # original place where the cursor is.
231
        #
232
        $sourceview->signal_connect(button_press_event => sub {
233
                my ($view, $event) = @_;
234
 
235
                # We're only interested on middle mouse clicks (mouse-paste)
236
                return FALSE unless $event->button == 2;
237
 
238
                # Remember the position of the paste
239
                my (@coords) = $sourceview->window_to_buffer_coords('text', $event->x, $event->y);
240
                my ($iter) = $sourceview->get_iter_at_position(@coords);
241
                $self->{paste_mark} = $buffer->create_mark('paste', $iter, FALSE);
242
 
243
                return FALSE;
244
        });
245
 
246
 
247
        #
248
        # If a paste is done through the middle click then place the cursor at the end
249
        # of the pasted text.
250
        #
251
        $buffer->signal_connect('paste-done' => sub {
252
                my $mark = delete $self->{paste_mark} or return;
253
 
254
                my $iter = $buffer->get_iter_at_mark($mark);
255
                $buffer->place_cursor($iter);
256
 
257
                $self->sourceview->scroll_to_mark(
258
                        $mark,
259
                        0.0,
260
                        FALSE,
261
                        0.0, 0.5
262
                );
263
                $buffer->delete_mark($mark);
264
        });
265
 
266 48 alirezamon
        $buffer->signal_connect('insert-text' => sub {
267
                update_modified($self);
268
        });
269
        $buffer->signal_connect('delete-range' => sub {
270
                update_modified($self);
271
        });
272
 
273 34 alirezamon
 
274 48 alirezamon
 
275
        my $scroll = add_widget_to_scrolled_win($sourceview);
276
        $vbox->pack_start($scroll, TRUE, TRUE, 0);
277 34 alirezamon
        $self->sourceview($sourceview);
278
        $self->buffer($sourceview->get_buffer);
279
 
280 48 alirezamon
 
281
        my $notebook = $app->source_view_notebook();
282
        my $close = def_button('x');
283
 
284
        my $box = def_hbox(FALSE,0);
285
        $box->pack_start($label, TRUE, FALSE, 0);
286
        $box->pack_start($close, TRUE, FALSE, 0);
287
        $notebook->append_page ($vbox,$box);
288
        set_tip($box,"$filename");
289
        $box->show_all;
290
        $notebook->show_all();
291
        my $n= $notebook->get_n_pages();
292
        $notebook->set_current_page($n-1);
293
        #save $sourceview ref in $app
294
        my %srcviews;
295
        my $ref2 = $app->sourceview();
296
        if(defined $ref2){
297
                %srcviews =%{$ref2};
298
        }
299
        $srcviews{$n-1}=$self;
300
        $app->sourceview(\%srcviews);
301
 
302
 
303
        $close->signal_connect("clicked" => sub {
304
                #check if the file has been modified or not
305
                if($self->modified()==TRUE){
306
                        my $r=create_dialog ("Save changes to documnet ${name}${suffix}?","If you do'nt save, changes will be permanently lost.",$path."icons/help.png","Save","Close without saving","Cancel");
307
                        return if ($r eq "Cancel");
308
                        if ($r eq "Save"){
309
                                $self->do_save();
310
                        }
311
 
312
                }
313
                $vbox->destroy;
314
                $box->destroy;
315
                $self = undef;
316
                my $ref =$app->open_list_ref();
317
                my @new =remove_scolar_from_array($ref,$filename);
318
                $app->open_list_ref(\@new);
319
 
320 34 alirezamon
        });
321 48 alirezamon
 
322
        my $save = $app->ask_to_save();
323
 
324
    $save->signal_connect("clicked" => sub {
325
                #check if the file has been modified or not
326
                return if(!defined $self);
327
                if($self->modified()==TRUE){
328
                        my $r=create_dialog ("Save changes to documnet ${name}${suffix}?"," ",$path."icons/help.png","Save","Continue without saving");
329
                        return if ($r eq "Continue without saving");
330
                        if ($r eq "Save"){
331
                                $self->do_save();
332
                        }
333
 
334
                }
335
        });
336
 
337
        $self->close_b($close);
338
        return $self;
339 34 alirezamon
}
340
 
341
 
342 42 alirezamon
 
343
sub build_tree_view{
344 48 alirezamon
        my ($app,$sw)=@_;
345 42 alirezamon
 
346
        # Directory name, full path
347 48 alirezamon
        my ($tree_store,$tree_view) =file_edit_tree();
348
 
349
#       $tree_view->signal_connect (button_release_event => sub{
350
        $tree_view->signal_connect (row_activated  => sub{
351
                my $tree_model = $tree_view->get_model();
352
                my $selection = $tree_view->get_selection();
353
                my $iter = $selection->get_selected();
354
 
355
                if(defined $iter){
356
                        my $path = $tree_model->get($iter, 1) ;
357
                        $path= substr $path, 0, -1;
358
                        #$self->do_save();
359
                        #print "open $path\n";
360
                         $app->load_source($path) if(-f $path);
361
                }
362
                 return;
363
        });
364 42 alirezamon
 
365
 
366 48 alirezamon
        $tree_view->signal_connect ('row-expanded' => sub {
367
                my ($tree_view, $iter, $tree_path) = @_;
368
                my $tree_model = $tree_view->get_model();
369
                my ($dir, $path) = $tree_model->get($iter);
370
 
371
                # for each of $iter's children add any subdirectories
372
                my $child = $tree_model->iter_children ($iter);
373
 
374
 
375
                my $r;
376
                $r=$tree_model->iter_is_valid($child);
377
                while ($child && $r ==1) {
378
 
379
                        my ($dir, $path) = $tree_model->get($child, 0, 1);
380
                        add_to_tree($tree_view,$tree_store, $child, $dir, $path);
381
                        $child=treemodel_next_iter($child , $tree_model);
382
                        $r=$tree_model->iter_is_valid($child) if (defined $child);
383
 
384
                }
385
                 return;
386 42 alirezamon
});
387
 
388
my $child = $tree_store->append(undef);
389 48 alirezamon
 
390 42 alirezamon
$tree_store->set($child, 0, $sw, 1, '/');
391
add_to_tree($tree_view,$tree_store, $child, '/', "$sw/");
392
return ($tree_view,$tree_store);
393
 
394
}
395
 
396
 
397
 
398 34 alirezamon
sub build_search_box {
399
        my $self = shift;
400
 
401
        # Elements of the search box
402 48 alirezamon
        my $hbox = def_hbox(FALSE, 0);
403 34 alirezamon
 
404 48 alirezamon
        my $search_entry = gen_entry();
405 34 alirezamon
        $search_entry->signal_connect(activate => sub {$self->do_search()});
406
        $search_entry->signal_connect(icon_release => sub {$self->do_search()});
407
        $self->search_entry($search_entry);
408
 
409 48 alirezamon
        my $search_regexp = gen_checkbutton('RegExp');
410 34 alirezamon
        $search_regexp->signal_connect(toggled => sub {
411
                $self->search_regexp($search_regexp->get_active);
412
        });
413
 
414 48 alirezamon
        my $search_case = gen_checkbutton('Case');
415 34 alirezamon
        $search_case->signal_connect(toggled => sub {
416
                $self->search_case($search_case->get_active);
417
        });
418
 
419 48 alirezamon
 
420
 
421
        my $search_icon = def_image_button($path."icons/browse.png");
422 34 alirezamon
        $search_entry->set_icon_from_stock(primary => 'gtk-find');
423
 
424 48 alirezamon
 
425 34 alirezamon
        $hbox->pack_start($search_entry, TRUE, TRUE , 0);
426
        $hbox->pack_start($search_regexp, FALSE, FALSE, 0);
427
        $hbox->pack_start($search_case, FALSE, FALSE, 0);
428
 
429
        return $hbox;
430
}
431
 
432 48 alirezamon
sub refresh_source {
433
        my $app = shift;
434
        my ($filename) = abs_path(@_);
435
 
436
 
437
        my $ref =$app->open_list_ref();
438
        my @open_list;
439
        @open_list = @{$ref} if(defined $ref);
440
        #check if the file is opend before activate its notebook win, remove its content
441
        my $pos=get_scolar_pos ($filename,@open_list);
442
        my $self;
443
        if (defined $pos){
444
                my $notebook = $app->source_view_notebook();
445
                $notebook->set_current_page($pos);
446
 
447
                my $ref = $app->sourceview();
448
                if(defined $ref){
449
                        my %srcviews =%{$ref};
450
                        my $n = $notebook->get_current_page;
451
                        $self=$srcviews{$n};
452
                }else {
453
                        return;
454
                }
455
        }
456
        else {
457
                $self=new_source_view($app,"$filename");
458
                push(@open_list,$filename);
459
                $app->open_list_ref(\@open_list);
460
 
461
        }
462
        my $buffer = $self->buffer;
463 34 alirezamon
 
464 48 alirezamon
        # Guess the programming language of the file
465
        $self->detect_language($filename);
466 34 alirezamon
 
467 48 alirezamon
        # Loading a file should not be undoable.
468
        my $content;
469
        do {
470
                open my $handle, $filename or die "Can't read file $filename because $!";
471
                local $/;
472
                $content = <$handle>;
473
                close $handle;
474
        };
475
        $buffer->begin_not_undoable_action();
476
        $buffer->set_text($content);
477
        $buffer->end_not_undoable_action();
478 34 alirezamon
 
479 48 alirezamon
        #$buffer->set_modified(FALSE);
480
        $buffer->place_cursor($buffer->get_start_iter);
481 34 alirezamon
 
482 48 alirezamon
 
483
 
484
        my $notebook = $app->source_view_notebook();
485
        $notebook->show_all();
486
 
487
 
488
        #$self->window->set_title("$filename - $NAME");
489 34 alirezamon
}
490 48 alirezamon
 
491
 
492
 
493
 
494
 
495
 
496
 
497 34 alirezamon
 
498
 
499
 
500
 
501
sub load_source {
502 48 alirezamon
        my $app = shift;
503
        my ($filename) = abs_path(@_);
504
 
505
 
506
        my $ref =$app->open_list_ref();
507
        my @open_list;
508
        @open_list = @{$ref} if(defined $ref);
509
        #check if the file is opend before activate its notebook win
510
        my $pos=get_scolar_pos ($filename,@open_list);
511
 
512
        if (defined $pos){
513
                my $notebook = $app->source_view_notebook();
514
                $notebook->set_current_page($pos);
515
                return;
516
        }
517
 
518
 
519
        #create a new source view and load the file there
520
 
521
        my $self=new_source_view($app,"$filename");
522
 
523
        push(@open_list,$filename);
524
        $app->open_list_ref(\@open_list);
525
 
526
 
527
 
528 34 alirezamon
        my $buffer = $self->buffer;
529
 
530
        # Guess the programming language of the file
531
        $self->detect_language($filename);
532
 
533
        # Loading a file should not be undoable.
534
        my $content;
535
        do {
536
                open my $handle, $filename or die "Can't read file $filename because $!";
537
                local $/;
538
                $content = <$handle>;
539
                close $handle;
540
        };
541
        $buffer->begin_not_undoable_action();
542
        $buffer->set_text($content);
543
        $buffer->end_not_undoable_action();
544
 
545 48 alirezamon
        #$buffer->set_modified(FALSE);
546 34 alirezamon
        $buffer->place_cursor($buffer->get_start_iter);
547
 
548 48 alirezamon
 
549
 
550
        my $notebook = $app->source_view_notebook();
551
        $notebook->show_all();
552
 
553
 
554
        #$self->window->set_title("$filename - $NAME");
555 34 alirezamon
}
556
 
557
 
558
sub clear_highlighted {
559
        my $self = shift;
560
 
561
        my $highlighted = delete $self->{highlighted} or return;
562
 
563
        my $buffer = $self->buffer;
564
 
565
        my @iters;
566
        foreach my $mark (@{ $highlighted->{marks} }) {
567
                my $iter = $buffer->get_iter_at_mark($mark);
568
                push @iters, $iter;
569
                $buffer->delete_mark($mark);
570
        }
571
 
572
        $buffer->remove_tag_by_name($highlighted->{name}, @iters);
573
}
574
 
575
 
576
sub get_text {
577
        my $self = shift;
578
        my $buffer = $self->buffer;
579
        return $buffer->get_text($buffer->get_start_iter, $buffer->get_end_iter, FALSE);
580
}
581
 
582
 
583
sub do_search {
584
        my $self = shift;
585
        my $criteria = $self->search_entry->get_text;
586
        if ($criteria eq '') {return;}
587
 
588
        my $case = $self->search_case;
589
        my $buffer = $self->buffer;
590
 
591
 
592
        # Start the search at the last search result or from the current cursor's
593
        # position. As a fall back we also add the beginning of the document. Once we
594
        # have the start position we can erase the previous search results.
595
        my @start;
596
        if (my $highlighted = $self->highlighted) {
597
                # Search from the last match
598
                push @start, $buffer->get_iter_at_mark($highlighted->{marks}[1]);
599
                $self->clear_highlighted();
600
        }
601
        else {
602
                # Search from the cursor
603
                push @start, $buffer->get_iter_at_offset(
604
                        $buffer->get_property('cursor-position')
605
                );
606
        }
607
        push @start, $buffer->get_start_iter;
608
 
609
        my @iters;
610 48 alirezamon
        #if ($self->search_regexp) {
611
        if(1){
612
                # SourceView does not support regular expressions so we
613 34 alirezamon
                # have to do the search by hand!
614
 
615
                my $text = $self->get_text;
616 48 alirezamon
                my $regexp;
617
                if ($self->search_regexp){
618
                        $regexp = $case ? qr/$criteria/m : qr/$criteria/im;
619
                }else {
620
                        $regexp = $case ? qr/\Q${criteria}\E/m : qr/\Q${criteria}\E/im;
621
 
622
                }
623 34 alirezamon
 
624
                foreach my $iter (@start) {
625
                        # Tell Perl where to start the regexp lookup
626
                        pos($text) = $iter->get_offset;
627
 
628
                        if ($text =~ /($regexp)/g) {
629
                                my $word = $1;
630
                                my $pos = pos($text);
631
                                @iters = (
632
                                        $buffer->get_iter_at_offset($pos - length($word)),
633
                                        $buffer->get_iter_at_offset($pos),
634
                                );
635
                                last;
636
                        }
637
                }
638
        }
639
        else {
640
                # Use the builtin search mechanism
641
                my $flags = $case ? [ ] : [ 'case-insensitive' ];
642
                foreach my $iter (@start) {
643 48 alirezamon
                        #@iters = Gtk3::SourceView::Iter->forward_search($iter, $criteria, $flags);
644 34 alirezamon
                        last if @iters;
645
                }
646
        }
647
 
648
        $self->show_highlighted(search => @iters) if @iters;
649
}
650
 
651
 
652
sub show_highlighted {
653
        my $self = shift;
654
        my ($tag_name, $start, $end) = @_;
655
        my $buffer = $self->buffer;
656
 
657
        # Highlight the region, remember it and scroll to it
658
        my $match_start = $buffer->create_mark('match-start', $start, TRUE);
659
        my $match_end = $buffer->create_mark('match-end', $end, FALSE);
660
 
661
        $buffer->apply_tag_by_name($tag_name, $start, $end);
662
 
663
        # We have a callback that listens to when the cursor is placed and we don't
664
        # want it to undo our work! So let's unhighlight the previous entry.
665
        delete $self->{highlighted};
666
        $buffer->place_cursor($end);
667
 
668
        $self->sourceview->scroll_to_mark(
669
                $match_start,
670
                0.2,
671
                FALSE,
672
                0.0, 0.5
673
        );
674
 
675
        # Keep a reference to the markers once they have been added to the buffer.
676
        # Using them before can be catastrophic (segmenation fault).
677
        #
678
        $self->highlighted({
679
                name  => $tag_name,
680
                marks => [$match_start, $match_end],
681
        });
682
}
683
 
684
 
685
sub do_file_new {
686 48 alirezamon
        my ($self,$sw,$window,$tree_view,$tree_store,$scwin_dirs,$app) = @_;
687 42 alirezamon
 
688 48 alirezamon
        my $dialog = save_file_dialog('New file');
689
        if(defined  $sw){
690
                $dialog->set_current_folder ($sw);
691
                #print "open_in:$sw\n";
692
 
693
        }
694 34 alirezamon
 
695 48 alirezamon
        my $response = $dialog->run();
696
        if ($response eq 'ok') {
697
                my $file=$dialog->get_filename;
698
                save_file($file,'');
699
                $tree_view->destroy;
700
                ($tree_view,$tree_store) =$app->build_tree_view($sw);
701
                add_widget_to_scrolled_win($tree_view,$scwin_dirs);
702
                $scwin_dirs->show_all;
703
                $app->load_source($file);
704
        }
705
        $dialog->destroy();
706
}
707 34 alirezamon
 
708 48 alirezamon
sub do_remove{
709
        my ($self,$sw,$window,$tree_view,$tree_store,$scwin_dirs,$app) = @_;
710
        my $fname  = $self->filename;
711
        my $r = yes_no_dialog ("Are you sure you want to permanently delete $fname file?");
712
        return if $r eq 'no';
713
        $self->close_b()->clicked;
714
        unlink $fname;
715
        $tree_view->destroy;
716
        ($tree_view,$tree_store) =$app->build_tree_view($sw);
717
        add_widget_to_scrolled_win($tree_view,$scwin_dirs);
718
        $scwin_dirs->show_all;
719
 
720
 
721 34 alirezamon
}
722
 
723
 
724
sub do_file_open {
725 48 alirezamon
        my ($self,$sw,$window,$tree_view,$tree_store,$scwin_dirs,$app) = @_;
726 34 alirezamon
 
727 48 alirezamon
        my $dialog = gen_file_dialog("Open file...");
728 34 alirezamon
        $dialog->signal_connect(response => sub {
729
                my ($dialog, $response) = @_;
730
 
731
                if ($response eq 'ok') {
732
                        my $file = $dialog->get_filename;
733
                        return if -d $file;
734 48 alirezamon
                        $app->load_source($file);
735 34 alirezamon
                }
736
 
737
                $dialog->destroy();
738
        });
739
        $dialog->show();
740
}
741
 
742
 
743
sub do_show_about_dialog {
744 48 alirezamon
         about(Consts::VERSION);
745 34 alirezamon
}
746
 
747
 
748
sub do_ask_goto_line {
749
        my $self = shift;
750 48 alirezamon
 
751
        my $dialog=new_dialog_with_buttons($self);
752
 
753
        my $hbox =def_hbox(FALSE, 0);
754 34 alirezamon
        $hbox->pack_start(
755 48 alirezamon
                gen_label_in_left("Line number: "),
756 34 alirezamon
                FALSE, FALSE, 0
757
        );
758 48 alirezamon
        my $entry = gen_entry();
759 34 alirezamon
        $hbox->pack_start($entry, TRUE, TRUE, 0);
760
 
761
        $dialog->get_content_area->add($hbox);
762
        $dialog->show_all();
763
 
764
 
765
        # Signal handlers
766
        $entry->signal_connect(activate => sub {
767
                if ($entry->get_text =~ /(\d+)/) {
768
                        $dialog->response('ok');
769
                }
770
        });
771
 
772
        # Run the dialog
773
        my $response = $dialog->run();
774 48 alirezamon
 
775 34 alirezamon
        return unless $response eq 'ok';
776
 
777
        return unless my ($line) = ($entry->get_text =~ /(\d+)/);
778
        my $buffer = $self->buffer;
779
        my $start = $buffer->get_iter_at_line($line - 1);
780
        my $end = $start->copy;
781
        $end->forward_to_line_end;
782
 
783
        $self->clear_highlighted();
784
        $self->show_highlighted(goto_line => $start, $end);
785 48 alirezamon
        $dialog->destroy();
786 34 alirezamon
}
787
 
788
 
789
sub do_quit {
790 42 alirezamon
        my ($self,$window) = @_;
791
        $window->destroy;
792 34 alirezamon
}
793
 
794
 
795
sub do_save_as {
796 48 alirezamon
        my ($self,$sw,$window,$tree_view,$tree_store,$scwin_dirs,$app) = @_;
797 34 alirezamon
 
798
        # If no file is associated with the editor then ask the user for a file where
799
        # to save the contents of the buffer.
800 48 alirezamon
        my $dialog = save_file_dialog('Save file');
801 42 alirezamon
        if(defined  $sw){
802
                $dialog->set_current_folder ($sw);
803
                #print "open_in:$sw\n";
804
 
805
        }
806 34 alirezamon
 
807
        my $response = $dialog->run();
808
        if ($response eq 'ok') {
809 42 alirezamon
                my $file=$dialog->get_filename;
810 48 alirezamon
 
811
                my $buffer = $self->buffer;
812
                open my $handle, '>:encoding(UTF-8)', $file or die "Can't write to $file: $!";
813
                print $handle $self->get_text;
814
                close $handle;
815
 
816 42 alirezamon
                $tree_view->destroy;
817 48 alirezamon
                ($tree_view,$tree_store) =$app->build_tree_view($sw);
818
                add_widget_to_scrolled_win($tree_view,$scwin_dirs);
819 42 alirezamon
                $scwin_dirs->show_all;
820 48 alirezamon
                $app->load_source($file);
821 42 alirezamon
 
822
 
823 34 alirezamon
        }
824
        $dialog->destroy();
825 42 alirezamon
 
826
 
827 34 alirezamon
}
828
 
829
 
830
sub do_save {
831
        my $self = shift;
832
 
833
        my $filename = $self->filename;
834
 
835
        # If there's no file then do a save as...
836
        if (! $filename) {
837 42 alirezamon
                #$self->do_save_as();
838 34 alirezamon
                return;
839
        }
840
 
841
        my $buffer = $self->buffer;
842
        open my $handle, '>:encoding(UTF-8)', $filename or die "Can't write to $filename: $!";
843
        print $handle $self->get_text;
844
        close $handle;
845 48 alirezamon
        $self->set_source_label_modified(FALSE);
846 34 alirezamon
        if (! $buffer->get_language) {
847
                $self->detect_language($filename);
848
        }
849
}
850
 
851
 
852 48 alirezamon
sub set_source_label_modified{
853
        my ($self,$is_modified)=@_;
854
        $self->modified($is_modified);
855
        my $buffer = $self->buffer;
856
        $buffer->set_modified($is_modified);
857
        my $label=$self->label();
858
    my $fname = $self->filename;
859
    my ($name,$p,$suffix) = fileparse("$fname",qr"\..[^.]*$");
860
 
861
    if ($is_modified ==TRUE){
862
        $label->set_markup("<span  foreground= 'black' ><b>*${name}${suffix}</b></span>");
863
    }else{
864
        $label->set_markup("<span  foreground= 'black' >${name}${suffix}</span>");
865
 
866
    }
867
        $label->show_all;
868
}
869 42 alirezamon
 
870 48 alirezamon
sub build_menu {
871
        my ($self,$sw,$window,$tree_view,$tree_store,$scwin_dirs,$app) = @_;
872 42 alirezamon
 
873
 
874 34 alirezamon
 
875 48 alirezamon
 my @menu_items = (
876
  [ "/_File",            undef,        undef,          0, "<Branch>" ],
877
  [ "/File/_New",       "<control>N", sub { $self->do_file_new($sw,$window,$tree_view,$tree_store,$scwin_dirs,$app); },  0,  undef ],
878
  [ "/File/_Open",      "<control>O", sub { $self->do_file_open($sw,$window,$tree_view,$tree_store,$scwin_dirs,$app) },  0, undef  ],
879
  [ "/File/_Save",      "<control>S", sub { $self->do_save($sw,$window,$tree_view,$tree_store,$scwin_dirs,$app)      },  0, undef  ],
880
  [ "/File/_SaveAs",    "<control><shift>S", sub { $self->do_save_as($sw,$window,$tree_view,$tree_store,$scwin_dirs,$app)} , 0, undef],
881
  [ "/File/_Delete",    "<control>D", sub { $self->do_remove($sw,$window,$tree_view,$tree_store,$scwin_dirs,$app)} , 0, undef],
882
  [ "/File/_Quit",              "<control>Q", sub { $self->do_quit($window) },  0, undef  ],
883
 
884
  [ "/_Search",           undef,        undef,          0, "<Branch>" ],
885
  [ "/Search/_Goto a Line",  "<control>L",      sub { $self->do_ask_goto_line($sw,$window,$tree_view,$tree_store,$scwin_dirs,$app)},  0, undef  ],
886 34 alirezamon
 
887 48 alirezamon
  [ "/_Help",           undef,          undef,          0,       "<Branch>" ],
888
  [ "/_Help/_About",    "F1",           sub { $self->do_show_about_dialog($sw,$window,$tree_view,$tree_store,$scwin_dirs,$app) } ,      0,       undef ],
889
 
890 34 alirezamon
 
891
 
892 48 alirezamon
);
893
 
894 34 alirezamon
 
895 48 alirezamon
        return gen_MenuBar($window,@menu_items);
896
 
897 34 alirezamon
}
898
 
899
 
900
 
901
sub add_to_tree {
902
 my ($tree_view,$tree_store, $parent, $dir, $path) = @_;
903
my $tree_model = $tree_view->get_model();
904
 
905
# If $parent already has children, then remove them first
906 48 alirezamon
 
907 34 alirezamon
 my $child = $tree_model->iter_children ($parent);
908
 while ($child) {
909 48 alirezamon
 
910 34 alirezamon
  $tree_store->remove ($child);
911
  $child = $tree_model->iter_children ($parent);
912
 }
913
 
914
# Add children from directory listing
915
 opendir(DIRHANDLE, $path) || return ; #die "Cannot open directory:$path $!\n";
916
 foreach my $subdir (sort readdir(DIRHANDLE)) {
917
  if ($subdir ne '.' and $subdir ne '..'
918
                                   # and -d $path.$subdir and -r $path.$subdir
919
) {
920
   my $child = $tree_store->append($parent);
921 48 alirezamon
 
922
 
923
   $tree_store->set($child, 0, $subdir, 1, "$path$subdir/") ;
924
 
925 34 alirezamon
  }
926
 }
927
 closedir(DIRHANDLE);
928
}
929
 
930
 
931
# Directory expanded. Populate subdirectories in readiness.
932
 
933 48 alirezamon
sub populate_treeo {
934 34 alirezamon
 
935
# $iter has been expanded
936
 my ($tree_view,$tree_store, $iter, $tree_path) = @_;
937
 my $tree_model = $tree_view->get_model();
938
 my ($dir, $path) = $tree_model->get($iter);
939
 
940
# for each of $iter's children add any subdirectories
941
 my $child = $tree_model->iter_children ($iter);
942
 while ($child) {
943
  my ($dir, $path) = $tree_model->get($child, 0, 1);
944
  add_to_tree($tree_view,$tree_store, $child, $dir, $path);
945
  $child = $tree_model->iter_next ($child);
946
 }
947
 return;
948
}
949
 
950
 
951
sub run_make_file {
952 38 alirezamon
        my ($dir,$outtext, $args)=@_;
953
        my $cmd =       (defined $args) ? "cd \"$dir/\" \n  make $args" :  "cd \"$dir/\" \n  make ";
954 34 alirezamon
        my $error=0;
955 48 alirezamon
        add_info($outtext,"$cmd\n");
956 34 alirezamon
 
957
        my ($stdout,$exit,$stderr)=run_cmd_in_back_ground_get_stdout( $cmd);
958 38 alirezamon
        #($stdout,$exit,$stderr)=run_cmd_in_back_ground_get_stdout( $cmd);
959 34 alirezamon
 
960
 
961 38 alirezamon
        if($exit){
962
                if($stderr){
963
                        $stderr=~ s/[‘,’]//g;
964 48 alirezamon
                        add_info($outtext,"$stdout\n");
965
                        add_colored_info($outtext,"$stderr\n","red");
966 38 alirezamon
                }
967 48 alirezamon
                add_colored_info($outtext,"Compilation failed.\n",'red');
968
                print " failed!\n";
969 38 alirezamon
                return 0;
970 34 alirezamon
 
971
        }else{
972 48 alirezamon
                add_info($outtext,"$stdout\n");
973 38 alirezamon
                if($stderr){ #probebly had warning
974
                        $stderr=~ s/[‘,’]//g;
975 48 alirezamon
                        #add_info($outtext,"$stdout\n"); 
976
                        add_colored_info($outtext,"$stderr\n","green");
977 38 alirezamon
                }
978
 
979 48 alirezamon
                add_colored_info($outtext,"Compilation finished successfully.\n",'blue');
980
                print " successful!\n";
981 38 alirezamon
                return 1;
982 34 alirezamon
        }
983
 
984 48 alirezamon
        #add_info($outtext,"**********Quartus compilation is done successfully in $target_dir!*************\n") if($error==0);
985 34 alirezamon
 
986
 
987
 
988
}
989
 
990 48 alirezamon
sub handle_key {
991
    my ($widget, $event, $self) = @_;
992
    my $key = get_pressed_key ($event);
993
    my $buffer = $widget->get_buffer();
994
    if ( ($key eq 'f') && control_pressed( $event ) ) {
995
 
996
 
997
        my ($start, $end) = $buffer->get_selection_bounds;
998
        if (defined $start && defined $end){
999
                my $string = $buffer->get_text ($start, $end, 0);
1000
                #print "CTRL+F copy $string to serach box\n";
1001
                $self->search_entry->set_text($string);
1002
        }
1003
    }
1004
 
1005
    return FALSE; # FALSE -> means propagate key further
1006
}
1007 34 alirezamon
 
1008 48 alirezamon
sub control_pressed {
1009
    my ( $event ) = @_;
1010 34 alirezamon
 
1011 48 alirezamon
    return $event->state & 'control-mask';
1012
}
1013 34 alirezamon
 
1014 48 alirezamon
 
1015
 
1016 34 alirezamon
1;
1017
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.