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 54

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

powered by: WebSVN 2.1.0

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