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/] [widget3.pl] - Blame information for rev 56

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
use constant::boolean;
2
use Gtk3;
3
use strict;
4
use warnings;
5
 
6 54 alirezamon
use FindBin;
7
use lib $FindBin::Bin;
8
 
9 48 alirezamon
use Data::Dumper;
10
use Gtk3::SourceView;
11
use Consts;
12
 
13
require "common.pl";
14
 
15 54 alirezamon
 
16 48 alirezamon
use IO::CaptureOutput qw(capture qxx qxy);
17
 
18
#use ColorButton;
19
use HexSpin3;
20
 
21
#use Tk::Animation;
22
 
23 54 alirezamon
our %glob_setting;
24 48 alirezamon
 
25
##############
26
# combo box
27
#############
28
sub gen_combo{
29
        my ($combo_list, $combo_active_pos)= @_;
30
        my $combo = Gtk3::ComboBoxText->new();
31
 
32
        combo_set_names($combo,$combo_list);
33
        $combo->set_active($combo_active_pos) if(defined $combo_active_pos);
34
 
35
        #my $font = Gtk3::Pango::FontDescription->from_string('Tahoma 5');
36
        #$combo->modify_font($font);
37
 
38
 
39
        return $combo;
40
}
41
 
42
 
43
sub combo_set_names {
44
        my ( $combo, $list_ref ) = @_;
45
        my @list=@{$list_ref};
46
        #print "$list[0]\n";
47
        for my $item (@list){$combo->append_text($item);}
48
}
49
 
50
 
51
sub gen_combo_help {
52
        my ($help, @combo_list, $pos)= @_;
53
        my $box = def_hbox(FALSE, 0);
54
        my $combo= gen_combo(@combo_list, $pos);
55
        my $button=def_image_button("icons/help.png");
56
 
57
        $button->signal_connect("clicked" => sub {message_dialog($help);});
58
 
59
        $box->pack_start( $combo, FALSE, FALSE, 3);
60
        $box->pack_start( $button, FALSE, FALSE, 3);
61
        $box->show_all;
62
 
63
        return ($box,$combo);
64
}
65
 
66
 
67
sub def_h_labeled_combo{
68
                my ($label_name,$combo_list,$combo_active_pos)=@_;
69
                my $box = def_hbox(TRUE,0);
70
                my $label= gen_label_in_left($label_name);
71
                my $combo= gen_combo($combo_list, $combo_active_pos);
72
                $box->pack_start( $label, FALSE, FALSE, 3);
73
                $box->pack_start( $combo, FALSE, TRUE, 3);
74
                return ($box,$combo);
75
}
76
 
77
sub def_h_labeled_combo_scaled{
78
                my ($label_name,$combo_list,$combo_active_pos,$label_w,$comb_w)=@_;
79
                my $table= def_table(1,3,TRUE);
80
                my $label= gen_label_in_left($label_name);
81
                my $combo= gen_combo($combo_list, $combo_active_pos);
82
                $table->attach_defaults ($label, 0, $label_w, 0, 1);
83
                $table->attach_defaults ($combo, 1, $label_w+$comb_w, 0, 1);
84
                return ($table,$combo);
85
}
86
 
87
 
88
sub gen_combo_model{
89
        my $ref=shift;
90
        my %inputs=%{$ref};
91
        my $store = Gtk3::TreeStore->new('Glib::String');
92
         for my $i (sort { $a cmp $b} keys %inputs ) {
93
                my $iter = $store->append(undef);
94
 
95
                $store->set($iter, 0, $i);
96
                for my $capital (sort { $a cmp $b} keys %{$inputs{$i}}) {
97
                        my $iter2 = $store->append($iter);
98
                        $store->set($iter2, 0, $capital);
99
                }
100
        }
101
        return $store;
102
 
103
}
104
 
105
sub gen_tree_combo{
106
        my $model=shift;
107
        my $combo = Gtk3::ComboBox->new_with_model($model);
108
        my $renderer = Gtk3::CellRendererText->new();
109
        $combo->pack_start($renderer, TRUE);
110
        $combo->set_attributes($renderer, "text", 0);
111
        $combo->set_cell_data_func($renderer, \&is_capital_sensitive);
112
        return $combo;
113
 
114
}
115
 
116
 
117
sub TreePath_new_from_indices {
118
         my @indices =@_;
119
         my $path = Gtk3::TreePath->new_from_indices(@indices);
120
         return $path;
121
 
122
}
123
 
124
 
125
##############
126
# spin button
127
#############
128
sub gen_spin{
129
        my ($min,$max,$step,$digit)= @_;
130
 
131
        return Gtk3::SpinButton->new_with_range ($min, $max, $step);
132
         if(!defined $digit){
133
                my $d1 = get_float_precision($min);
134
                my $d2 = get_float_precision($max);
135
                my $d3 = get_float_precision($step);
136
                $digit = ($d1 >$d2)? $d1 : $d2;
137
                $digit = $d3 if($d3>$digit);
138
        }
139
        print "($min,$max,$step,$digit)\n";
140
        return Gtk3::SpinButton->new_with_range ($min, $max, $step) if($digit ==0);
141
    return gen_spin_float($min,$max,$step,$digit);
142
}
143
 
144
sub get_float_precision{
145
        my $num=shift;
146
        my $digit = length(($num =~ /\.(.*)/)[0]);
147
        $digit=0 if(!defined $digit);
148
        return $digit;
149
}
150
 
151
sub gen_spin_float{
152
        my ($min,$max,$step,$digit)= @_;
153
        #$page_inc = ($max - $min)/ 
154
        my $adj = Gtk3::Adjustment->new (0, $min, $max, $step,3.1, 0);
155
        my $spinner = Gtk3::SpinButton->new ($adj, 1.0,$digit);
156
        return $spinner;
157
}
158
 
159
 
160
sub gen_spin_help {
161
        my ($help, $min,$max,$step,$digit)= @_;
162
        my $box = def_hbox(FALSE, 0);
163
        my $spin= gen_spin($min,$max,$step,$digit);
164
        my $button=def_image_button("icons/help.png");
165
 
166
        $button->signal_connect("clicked" => sub {message_dialog($help);});
167
 
168
        $box->pack_start( $spin, FALSE, FALSE, 3);
169
        $box->pack_start( $button, FALSE, FALSE, 3);
170
        $box->show_all;
171
 
172
        return ($box,$spin);
173
}
174
 
175
 
176
#############
177
#  entry
178
#############
179
sub gen_entry{
180
        my ($initial) = @_;
181
        my $entry = Gtk3::Entry->new;
182
        if(defined $initial){ $entry->set_text($initial)};
183
        return $entry;
184
}
185
 
186
 
187
sub gen_entry_new_with_max_length{
188
        my ($n,$initial) = @_;
189
        my $entry = Gtk3::Entry->new ();
190
        $entry->set_max_length($n);
191
        if(defined $initial){ $entry->set_text($initial)};
192
        return $entry;
193
}
194
 
195
 
196
 
197
sub gen_entry_help{
198
        my ($help, $init)= @_;
199
        my $box = def_hbox(FALSE, 0);
200
        my $entry= gen_entry ($init);
201
        my $button=def_image_button("icons/help.png");
202
 
203
        $button->signal_connect("clicked" => sub {message_dialog($help);});
204
 
205
        $box->pack_start( $entry, FALSE, FALSE, 3);
206
        $box->pack_start( $button, FALSE, FALSE, 3);
207
        $box->show_all;
208
 
209
        return ($box,$entry);
210
}
211
 
212
sub def_h_labeled_entry{
213
        my ($label_name,$initial)=@_;
214
        my $box = def_hbox(TRUE,0);
215
        my $label= gen_label_in_left($label_name);
216
        my $entry =gen_entry($initial);
217
        $box->pack_start( $label, FALSE, FALSE, 3);
218
        $box->pack_start( $entry, FALSE, FALSE, 3);
219
        return ($box,$entry);
220
 
221
}
222
 
223
sub def_h_labeled_entry_help{
224
        my ($help,$label_name,$initial)=@_;
225
        my $box = def_hbox(TRUE,0);
226
        my $label= gen_label_in_left($label_name);
227
        my ($b,$entry) =gen_entry_help($help,$initial);
228
        $box->pack_start( $label, FALSE, FALSE, 3);
229
        $box->pack_start( $b, FALSE, FALSE, 3);
230
        return ($box,$entry);
231
 
232
}
233
 
234
 
235
##############
236
# ComboBoxEntry
237
##############
238
 
239
sub gen_combo_entry{
240
        my ($list_ref,$pos)=@_;
241
        my @list=@{$list_ref};
242
 
243
        #my $combo_box_entry = Gtk3::ComboBoxEntry->new_text;
244
 
245
    my $lstore =
246
    Gtk3::ListStore->new('Glib::String');
247
 
248
    foreach my $p (@list){
249
        my $iter = $lstore->append();
250
        $lstore->set( $iter,  0, $p );
251
    }
252
 
253
 
254
 
255
        $pos=0 if(! defined $pos || scalar @list < $pos );
256
        my $combo_box_entry = Gtk3::ComboBox->new_with_model_and_entry($lstore);
257
        $combo_box_entry->set_entry_text_column(0);
258
        $combo_box_entry->set_active($pos);
259
 
260
        return $combo_box_entry;
261
 
262
}
263
 
264
sub combo_entry_get_chiled{
265
        my $combentry =shift;
266
    return      Gtk3::Bin::get_child($combentry);
267
}
268
 
269
 
270
 
271
 
272
sub update_combo_entry_content {
273
        my ($self,$content,$pos)=@_;
274
        my @combo_list=split(/\s*,\s*/,$content) if(defined $content);
275
        foreach my $p (@combo_list){
276
                $self->append_text($p);
277
        }
278
        $pos=0 if(! defined $pos );
279
        $self->set_active($pos);
280
}
281
 
282
###########
283
# checkbutton
284
###########
285
 
286
sub def_h_labeled_checkbutton{
287
        my ($label_name)=@_;
288
        my $box = def_hbox(TRUE,0);
289
        my $label= gen_label_in_left($label_name) if (defined $label_name);
290
        my $check= Gtk3::CheckButton->new;
291
        #if($status==1) $check->
292
        $box->pack_start( $label, FALSE, FALSE, 3) if (defined $label_name);
293
        $box->pack_start( $check, FALSE, FALSE, 3);
294
        return ($box,$check);
295
 
296
}
297
 
298
sub gen_checkbutton{
299
        my $label=shift;
300
        return Gtk3::CheckButton->new_with_label($label) if (defined $label);
301
        return Gtk3::CheckButton->new;
302
}
303
 
304
 
305
#############
306
#  label
307
############
308
 
309
sub gen_label_in_left{
310
        my ($data)=@_;
311
        my $label   = Gtk3::Label->new($data);
312
        $label->set_alignment( 0, 0.5 );
313
        #my $font = Gtk3::Pango::FontDescription->from_string('Tahoma 5');
314
        #$label->modify_font($font);
315
        return $label;
316
}
317
 
318
 
319
sub gen_label_in_center{
320
        my ($data)=@_;
321
        my $label   = Gtk3::Label->new($data);
322
        return $label;
323
}
324
 
325
sub def_label{
326
        my @data=@_;
327
        my $label   = Gtk3::Label->new(@data);
328
        $label->set_alignment( 0, 0.5 );
329
        return $label;
330
 
331
}
332
 
333
 
334
sub box_label{
335
        my( $homogeneous, $spacing, $name)=@_;
336
        my $box=def_hbox($homogeneous, $spacing);
337
        my $label= def_label($name);
338
        $box->pack_start( $label, FALSE, FALSE, 3);
339
        return $box;
340
}
341
 
342
 
343
sub def_title_box{
344
        my( $homogeneous, $spacing, @labels)=@_;
345
        my $box=def_hbox($homogeneous, $spacing);
346
        foreach my $label (@labels){
347
                my $labelbox=box_label($homogeneous, $spacing, $label);
348
                $box->pack_start( $labelbox, FALSE, FALSE, 3);
349
        }
350
        return $box;
351
}
352
 
353
 
354
sub gen_label_help {
355
        my ($help, $label_name)= @_;
356
        my $box = def_hbox(FALSE, 0);
357
        my $label= gen_label_in_left($label_name);
358
        my $button=def_image_button("icons/help.png");
359
        $button->signal_connect("clicked" => sub {message_dialog($help);});
360
        $box->pack_start( $label, FALSE, FALSE, 0);
361
        $box->pack_start( $button, FALSE, FALSE, 0);
362
        $box->set_spacing (0);
363
        $box->show_all;
364
        return $box;
365
}
366
 
367
sub gen_label_with_mnemonic {
368
        my $name=shift;
369
        Gtk3::Label->new_with_mnemonic($name);
370
 
371
}
372
 
373
##############
374
# button
375
#############
376
 
377
sub button_box{
378
# create a new button
379
        my $label=@_;
380
        my $button = Gtk3::Button->new_from_stock($label);
381
        my $box=def_hbox(TRUE,5);
382
        $box->pack_start($button,   FALSE, FALSE,0);
383
 
384
        return ($box,$button);
385
 
386
}
387
 
388
 
389
sub get_icon_pixbuff{
390
    my $icon_file=shift;
391
    my $size;
392 54 alirezamon
    if ($glob_setting{'ICON_SIZE'} eq 'default'){
393 48 alirezamon
                my $font_size=get_defualt_font_size();
394
                $size=($font_size *2.5);
395
    }else{
396 54 alirezamon
        $size = int ($glob_setting{'ICON_SIZE'});
397 48 alirezamon
    }
398
        my $pixbuf = Gtk3::Gdk::Pixbuf->new_from_file_at_scale($icon_file,$size,$size,FALSE);
399
        return $pixbuf;
400
}
401
 
402
 
403
sub def_icon{
404
        my $icon_file=shift;
405
        return Gtk3::Image->new_from_pixbuf(get_icon_pixbuff($icon_file));
406
}
407
 
408
sub call_gtk_drag_finish{
409
        Gtk3::drag_finish(@_);
410
}
411
 
412
 
413
 
414
sub add_drag_dest_set{
415
        my ($widget,$a,$b,$c) = @_;
416
        $widget->drag_dest_set(['all'],[def_gtk_target_entry($a,$b,$c)], ['copy']);
417
}
418
 
419
sub def_gtk_target_entry{
420
        return Gtk3::TargetEntry->new(@_);
421
}
422
 
423
 
424
sub add_drag_source {
425
        my ($widget,$a,$b,$c) = @_;
426
        $widget->drag_source_set (
427
                                ['button1_mask', 'button3_mask'],
428
                                                                [def_gtk_target_entry($a,$b,$c)],
429
                                ['copy']
430
                        );
431
}
432
 
433
sub drag_set_icon_pixbuf {
434
        my ($icon_view,$icon_pixbuf)=@_;
435
        #$icon_view->drag_source_set_icon_pixbuf ($icon_pixbuf);
436
}
437
 
438
sub gen_iconview {
439
        my ($tree_model,$marc_col,$pix_con)=@_;
440
        my $icon_view = Gtk3::IconView->new_with_model($tree_model);
441
    $icon_view->set_markup_column($marc_col);
442
    $icon_view->set_pixbuf_column($pix_con);
443
        return $icon_view;
444
}
445
 
446
 
447
sub add_frame_to_image{
448
        my $image=shift;
449
        my $align = Gtk3::Alignment->new (0.5, 0.5, 0, 0);
450
        my $frame = Gtk3::Frame->new;
451
        $frame->set_shadow_type ('in');
452
        # Animation
453
        $frame->add ($image);
454
        $align->add ($frame);
455
        return $align;
456
}
457
 
458
sub gen_frame {
459
        return  Gtk3::Frame->new;
460
}
461
 
462
 
463
 
464
sub new_image_from_file{
465
        return  Gtk3::Image->new_from_file (@_);
466
}
467
 
468
 
469
sub gen_pixbuf{
470
        my $file=shift;
471
        return Gtk3::Gdk::Pixbuf->new_from_file($file);
472
}
473
 
474
sub open_image{
475
        my ($image_file,$x,$y,$unit)=@_;
476
        if(defined $unit){
477
                my($width,$hight)=max_win_size();
478
                if($unit eq 'percent'){
479
                        $x= ($x * $width)/100;
480
                        $y= ($y * $hight)/100;
481
                } # else its pixels
482
 
483
        }
484
        $image_file ="icons/blank.png"  unless(-f $image_file);
485
        my $pixbuf = Gtk3::Gdk::Pixbuf->new_from_file_at_scale($image_file,$x,$y,TRUE);
486
        my $image = Gtk3::Image->new_from_pixbuf($pixbuf);
487
        return $image;
488
}
489
 
490
sub open_inline_image{
491
        my ($image_string,$x,$y,$unit)=@_;
492
        if(defined $unit){
493
                my($width,$hight)=max_win_size();
494
                if($unit eq 'percent'){
495
                        $x= ($x * $width)/100;
496
                        $y= ($y * $hight)/100;
497
                } # else its pixels
498
 
499
        }
500
        my $pixbuf = do {
501
        my $loader = Gtk3::Gdk::PixbufLoader->new();
502
        $loader->set_size(  $x,$y ) if (defined $y);
503
        $loader->write( [unpack 'C*', $image_string] );
504
        $loader->close();
505
        $loader->get_pixbuf();
506
    };
507
 
508
 
509
        my $image = Gtk3::Image->new_from_pixbuf($pixbuf);
510
 
511
        return $image;
512
}
513
 
514
sub find_icon{
515
        my $file =shift;
516
        return $file if(-f $file); #called from perl_gui
517
        return "../../$file"; #called from lib/perl             
518
}
519
 
520
sub def_image_button{
521
        my ($image_file, $label_text, $homogeneous, $mnemonic)=@_;
522
        # create box for image and label 
523
        $homogeneous = FALSE if(!defined $homogeneous);
524
        my $box = def_hbox($homogeneous,0);
525
        my $image;
526
        $image_file = find_icon( $image_file);
527
        $image = def_icon($image_file) if(-f $image_file);
528
 
529
        # now on to the image stuff
530
        #my $image = Gtk3::Image->new_from_file($image_file);
531
        $box->pack_start($image, FALSE, FALSE, 0) if(defined  $image);
532
        $box->set_border_width(0);
533
        $box->set_spacing (0);
534
        # Create a label for the button
535
        if(defined $label_text ) {
536
                my $label;
537
                $label = Gtk3::Label->new("  $label_text") unless (defined $mnemonic);
538
                $label = Gtk3::Label->new_with_mnemonic (" $label_text") if (defined $mnemonic);
539
                $box->pack_start($label, FALSE, FALSE, 0);
540
        }
541
 
542
        my $button = Gtk3::Button->new();
543
        $button->add($box);
544
        $button->set_border_width(0);
545
        $button->show_all;
546
        return $button;
547
}
548
 
549
sub def_button{
550
        my ($label_text)=@_;
551
        my $label = Gtk3::Label->new("$label_text") if(defined $label_text);
552
        my $button= Gtk3::Button->new();
553
        $button->add($label) if(defined $label_text);
554
        return $button;
555
}
556
 
557
 
558
sub def_image_label{
559
        my ($image_file, $label_text,$mnemonic)=@_;
560
        # create box for image and label 
561
        my $box = def_hbox(FALSE,1);
562
        # now on to the image stuff
563
        my $image = def_icon($image_file);
564
        $box->pack_start($image, TRUE, FALSE, 0);
565
        # Create a label for the button
566
        if(defined $label_text ) {
567
                my $label;
568
                $label = Gtk3::Label->new("  $label_text") unless (defined $mnemonic);
569
                $label = Gtk3::Label->new_with_mnemonic (" $label_text") if (defined $mnemonic);
570
                $box->pack_start($label, TRUE, FALSE, 0);
571
        }
572
 
573
        return $box;
574
 
575
}
576
 
577
 
578
sub gen_button_message {
579
        my ($help, $image_file,$label_name)= @_;
580
        my $box = def_hbox(FALSE, 0);
581
        my $label= gen_label_in_center($label_name) if(defined $label_name);
582
        my $button=def_image_button($image_file);
583
 
584
        if(defined $help ){$button->signal_connect("clicked" => sub {message_dialog($help);});}
585
 
586
        $box->pack_start( $label, FALSE, FALSE, 0) if(defined $label_name);
587
        $box->pack_start( $button, FALSE, FALSE, 0);
588
        $box->set_border_width(0);
589
        $box->set_spacing (0);
590
        $box->show_all;
591
 
592
        return $box;
593
 
594
 
595
}
596
 
597
 
598
sub def_colored_button{
599
        my ($label_text,$color_num)=@_;
600
        # create box for image and label 
601
        my $box = def_hbox(FALSE,0);
602
        my $font_size=get_defualt_font_size();
603
 
604
 
605
        my $button= Gtk3::Button->new();
606
        my $label = gen_label_in_center($label_text) if(defined $label_text);
607
 
608
 
609
        # do custom css #####################################################
610
        my $css_provider = Gtk3::CssProvider->new;
611
 
612
        my ($red,$green,$blue) = get_color($color_num);
613
        my $r =int ($red*100/65535);
614
        my $g =int ($green*100/65535);
615
        my $b =int ($blue*100/65535);
616
 
617
 
618
        #select lable color based on backgorund 
619
        my $lc = (($r*0.299 + $g*0.587 + $b*0.114) > 50)? 0 : 1; # use #000000 else use #ffffff
620
 
621
        $label->set_markup("<span  foreground= 'white' >$label_text</span>")  if(defined $label_text && $lc==1);
622
 
623
 
624
 
625
        $css_provider->load_from_data ([map ord, split //, "
626
 
627
button {
628
        background-image: none;
629
        background-color: rgba($r%,$g%,$b%,100);
630
}"
631
]);
632
 
633
 
634
        my $style_context = $button->get_style_context;
635
        $style_context->add_provider ( $css_provider, Gtk3::STYLE_PROVIDER_PRIORITY_USER);
636
 
637
        $button->add($label)  if(defined $label_text);
638
 
639
        $button->show_all;
640
        return $button;
641
}
642
 
643
 
644
 
645
 
646
 
647
sub entry_set_text_color {
648
        my ($entry,$color_num)=@_;
649
        my $color_hex = get_color_hex_string($color_num);
650
 
651
        my $css_provider = Gtk3::CssProvider->new;
652
        $css_provider->load_from_data ([map ord, split //, "
653
entry {
654
  color: #$color_hex;
655
}"
656
        ]);
657
 
658
        my $style_context = $entry->get_style_context;
659
        $style_context->add_provider ( $css_provider, Gtk3::STYLE_PROVIDER_PRIORITY_USER);
660
 
661
}
662
 
663
 
664
 
665
 
666
 
667
 
668
 
669
 
670
sub show_gif{
671
        my $gif = shift;
672
        $gif=find_icon( $gif);
673
        my $vbox = Gtk3::HBox->new (TRUE, 8);
674
    my $filename;
675
      eval {
676
          $filename = main::demo_find_file ($gif);
677
      };
678
    my $image = Gtk3::Image->new_from_file ($gif);
679
    $vbox->set_border_width (4);
680
    my   $align = Gtk3::Alignment->new (0.5, 0.5, 0, 0);
681
        my $frame = Gtk3::Frame->new;
682
        $frame->set_shadow_type ('in');
683
    # Animation
684
    $frame->add ($image);
685
    $align->add ($frame);
686
        $vbox->pack_start ($align, FALSE, FALSE, 0);
687
        return $vbox;
688
}
689
 
690
sub gen_radiobutton {
691
        my ($from,$label,$icon,$tip) =@_;
692
        my $rbtn = (defined $from )? Gtk3::RadioToolButton->new_from_widget($from) : Gtk3::RadioToolButton->new (undef);
693
        $rbtn->set_label ($label) if(defined $label);
694
        $rbtn->set_icon_widget (def_icon($icon)) if(defined $icon);
695
        set_tip($rbtn, $tip) if(defined $tip);
696
        return $rbtn;
697
}
698
 
699
sub gen_colored_label{
700
        my ($label_text, $color_num)=@_;
701
 
702
        my $color_hex = get_color_hex_string($color_num);
703
    my $label   = Gtk3::Label->new($label_text);
704
        $label->set_markup("<span
705
 background= '#$color_hex'
706
 foreground= 'black' ><b>$label_text</b></span>");
707
 
708
        return $label;
709
}
710
 
711
 
712
############
713
#       message_dialog
714
############
715
 
716
sub message_dialog {
717
  my ($message,$type)=@_;
718
  $type = 'info' if (!defined $type);
719
  my $window;
720
  my $dialog = Gtk3::MessageDialog->new ($window,
721
                                   [qw( modal destroy-with-parent )],
722
                                   $type,
723
                                   'ok',
724
                                    $message);
725
 
726
  $dialog->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning
727
  $dialog->run;
728
  $dialog->destroy;
729
 
730
}
731
 
732
 
733
 
734
sub set_tip{
735
        my ($widget,$tip)=@_;
736
        #my $tooltips = Gtk3::Tooltips->new;
737
        #$tooltips->set_tip($widget,$tip);
738
        $widget->set_tooltip_text($tip);
739
 
740
 
741
}
742
 
743
 
744
sub yes_no_dialog {
745
        my ($message)=@_;
746
        my $dialog = Gtk3::MessageDialog->new (my $window,
747
                        'destroy-with-parent',
748
                        'question', # message type
749
                        'yes-no', # which set of buttons?
750
                        "$message");
751
 
752
        $dialog->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning                
753
        my $response = $dialog->run;
754
 
755
        $dialog->destroy;
756
        return $response;
757
}
758
 
759
sub create_dialog {
760
        my ($message_head,$message_body,$icon,@buttons)=@_;
761
        # create a new dialog with some buttons 
762
        my %hash1;
763
        my %hash2;
764
        my $i=0;
765
        foreach my $b (@buttons){
766
                $hash1{$b}=$i;
767
                $hash2{$i}=$b;
768
                $i++;
769
        }
770
 
771
        my $dialog = Gtk3::Dialog->new (
772
                " ",
773
                Gtk3::Window->new('toplevel'),
774
                [qw/modal destroy-with-parent/],
775
        %hash1
776
    );
777
        my $content = $dialog->get_content_area ();
778
 
779
        my $table = def_table(1,3,TRUE);
780
        $table->attach  (def_icon($icon) , 0, 1,  0, 2,'expand','expand',2,2) if(defined $icon);
781
        if(defined $message_head){
782
                my $hd=gen_label_in_left($message_head);
783
                $hd->set_markup("<span  foreground= 'black' ><b>$message_head</b></span>");
784
                $table->attach  ($hd , 1, 10,  0, 1,'fill','shrink',2,2);
785
        }
786
        if(defined $message_head){
787
                $table->attach  (gen_label_in_left($message_body) , 2, 10,  1, 2,'fill','shrink',2,2);
788
        }
789
 
790
        $content->add ($table);
791
        $content->show_all;
792
 
793
        $dialog->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning                
794
        my $response = $dialog->run;
795
 
796
        $dialog->destroy;
797
        return $hash2{$response};
798
}
799
 
800
############
801
# window
802
###########
803
 
804
sub def_win {
805
        my @titel=shift;
806
        my $window = Gtk3::Window->new('toplevel');
807
        $window->set_title(@titel);
808
        $window->set_position("center");
809
        $window->set_default_size(100, 100);
810
        $window->set_border_width(20);
811
        $window->signal_connect (delete_event => sub { Gtk3->main_quit });
812
        return $window;
813
 
814
}
815
 
816
 
817
sub def_win_size {
818
        my $x=shift;
819
        my $y=shift;
820
        my @titel=shift;
821
        my $window = Gtk3::Window->new('toplevel');
822
        $window->set_title(@titel);
823
        $window->set_position("center");
824
        $window->set_default_size($x, $y);
825
        $window->set_border_width(20);
826
        $window->signal_connect (delete_event => sub { Gtk3->main_quit });
827
        return $window;
828
 
829
}
830
 
831
 
832
sub def_popwin_size {
833
        my ($x,$y,$titel,$unit)=@_;
834
        if(defined $unit){
835
                my($width,$hight)=max_win_size();
836
                if($unit eq 'percent'){
837
                        $x= ($x * $width)/100;
838
                        $y= ($y * $hight)/100;
839
                } # else its pixels
840
 
841
        }
842
        #my $window = Gtk3::Window->new('popup');
843
        my $window = Gtk3::Window->new('toplevel');
844
        $window->set_title($titel);
845
        $window->set_position("center");
846
        $window->set_default_size($x, $y);
847
        $window->set_border_width(20);
848
        #$window->signal_connect (delete_event => sub { $window->destroy });
849
        return $window;
850
 
851
}
852
 
853
 
854
 
855
 
856
 
857
sub def_scrolled_window_box{
858
 
859
        my $window =  def_popwin_size(@_);
860
        my $box=def_vbox(TRUE,5);
861
        my $scrolled_window = new Gtk3::ScrolledWindow (undef, undef);
862
        $scrolled_window->set_policy( "automatic", "automatic" );
863
        $scrolled_window->add($box);
864
        $window->add($scrolled_window);
865
        $window->show_all;
866
        $box->show_all;
867
        return ($box,$window);
868
 
869
}
870
 
871
 
872 54 alirezamon
sub get_default_screen {
873
  return Gtk3::Gdk::Screen::get_default;
874 48 alirezamon
}
875
 
876
sub get_defualt_font_size{
877 54 alirezamon
        return int($glob_setting{'FONT_SIZE'}) if ($glob_setting{'FONT_SIZE'} ne 'default');
878 48 alirezamon
 
879
        my($width,$hight)=max_win_size();
880
        #print "($width,$hight)\n";
881
        my $font_size=($width>=1600)? 10:
882
                              ($width>=1400)? 9:
883
                                  ($width>=1200)? 9:
884
                                  ($width>=1000)? 7:6;
885
        #print "$font_size\n";  
886
        return $font_size;
887
}
888
 
889
 
890
sub set_defualt_font_size{
891
        my $font_size=get_defualt_font_size();
892
        $font_size= int (1.35*$font_size);
893
# do custom css #####################################################
894
        my $css_provider = Gtk3::CssProvider->new;
895
        $css_provider->load_from_data ([map ord, split //, "
896
        *{
897
 
898
                            font-family:Verdana;
899
                            font-size:${font_size}px;
900
                                  }"
901
 
902
]);
903
 
904
#font_name = Verdana $font_size"
905
 
906
 
907
        #print  $css_provider->to_string,"\n";
908
 
909
        my $d = Gtk3::Gdk::Display::get_default ();
910
        my $s = $d->get_default_screen;
911
 
912
        Gtk3::StyleContext::add_provider_for_screen ( $s, $css_provider, Gtk3::STYLE_PROVIDER_PRIORITY_USER);
913
 
914
 
915
 
916
                #Gtk3::Rc->parse_string(<<__);
917
                #       style "normal" { 
918
                #               font_name ="Verdana $font_size" 
919
                #       }
920
                #       widget "*" style "normal"
921
#__
922
 
923
}
924
 
925
sub add_widget_to_scrolled_win{
926
        my ($widget,$scrolled_win) =@_;
927
        if(! defined $scrolled_win){
928
                $scrolled_win = new Gtk3::ScrolledWindow (undef, undef);
929
                $scrolled_win->set_policy( "automatic", "automatic" );
930
                $scrolled_win->set_shadow_type('in');
931
        }else {
932
                my @list = $scrolled_win->get_children ();
933
                foreach my $c( @list){ $scrolled_win->remove($c);}
934
        }
935
        #$scrolled_win->add_with_viewport($widget) if(defined $widget);
936
        $scrolled_win->add($widget) if(defined $widget);
937
        $scrolled_win->show_all;
938
        return $scrolled_win ;
939
}
940
 
941
sub gen_scr_win_with_adjst {
942
        my ($self,$name)=@_;
943
        my $scrolled_win = new Gtk3::ScrolledWindow (undef, undef);
944
        $scrolled_win->set_policy( "automatic", "automatic" );
945
        $scrolled_win->signal_connect("destroy"=> sub{
946
                save_scrolled_win_adj($self,$scrolled_win, $name);
947
 
948
         });
949
         my $adjast=0;
950
         $scrolled_win->signal_connect("size-allocate"=> sub{
951
                if($adjast==0){
952
                        load_scrolled_win_adj($self,$scrolled_win, $name);
953
                        $adjast=1;
954
                }
955
 
956
         });
957
        return $scrolled_win;
958
}
959
 
960
 
961
sub save_scrolled_win_adj {
962
        my ($self,$scrolled_win,$name)=@_;
963
        return if (!defined $scrolled_win);
964
        my $ha= $scrolled_win->get_hadjustment();
965
    my $va =$scrolled_win->get_vadjustment();
966
    return if(!defined $ha);
967
    return if(!defined $va);
968
    save_adj ($self,$ha,$name,"ha");
969
        save_adj ($self,$va,$name,"va");
970
}
971
 
972
 
973
sub load_scrolled_win_adj {
974
        my ($self,$scrolled_win,$name)=@_;
975
        my $ha= $scrolled_win->get_hadjustment();
976
    my $va =$scrolled_win->get_vadjustment();
977
        my $h=load_adj ($self,$ha,$name,"ha");
978
        my $v=load_adj ($self,$va,$name,"va");
979
        #$ha->set_value($h) if(defined $h);
980
    #$va->set_value($v) if(defined $v);    
981
}
982
 
983
 
984
 
985
 
986
sub save_adj {
987
        my ($self,$adjustment,$at1,$at2)=@_;
988
        my $value = $adjustment->get_value;
989 54 alirezamon
        $self->object_add_attribute($at1,$at2,$value) if (defined $self);
990 48 alirezamon
}
991
 
992
 
993
sub load_adj {
994
        my ($self,$adjustment,$at1,$at2)=@_;
995
        return if(!defined $at1);
996
    my $value=  $self->object_get_attribute($at1,$at2);
997
    return if(!defined $value);
998
    my $lower =  $adjustment->get_lower;
999
    my $upper = $adjustment->get_upper - $adjustment->get_page_size;
1000
    $value=  ($value < $lower || $value > $upper ) ? 0 : $value;
1001
 
1002
    $adjustment->set_value($value);
1003
}
1004
 
1005
sub set_pronoc_icon{
1006
        my $window=shift;
1007
    my $navIco = gen_pixbuf("./icons/ProNoC.png");
1008
        $window->set_icon($navIco);
1009
}
1010
 
1011
##############
1012
#       box
1013
#############
1014
 
1015
sub def_hbox {
1016
        my( $homogeneous, $spacing)=@_;
1017
        my $box = Gtk3::HBox->new($homogeneous, $spacing);
1018
        $box->set_border_width(2);
1019
        return $box;
1020
}
1021
 
1022
sub def_vbox {
1023
        my $box = Gtk3::VBox->new(FALSE, 0);
1024
        $box->set_border_width(2);
1025
        return $box;
1026
}
1027
 
1028
sub def_pack_hbox{
1029
        my( $homogeneous, $spacing , @box_list)=@_;
1030
        my $box=def_hbox($homogeneous, $spacing);
1031
        foreach my $subbox (@box_list){
1032
                $box->pack_start( $subbox, FALSE, FALSE, 3);
1033
        }
1034
        return $box;
1035
 
1036
 
1037
}
1038
 
1039
sub def_pack_vbox{
1040
        my( $homogeneous, $spacing , @box_list)=@_;
1041
        my $box=def_vbox($homogeneous, $spacing);
1042
        foreach my $subbox (@box_list){
1043
                $box->pack_start( $subbox, FALSE, FALSE, 3);
1044
        }
1045
        return $box;
1046
 
1047
}
1048
 
1049
 
1050
##########
1051
# Paned
1052
#########
1053
 
1054
 
1055
sub gen_vpaned {
1056
        my ($w1,$loc,$w2) = @_;
1057
        my $vpaned = Gtk3::VPaned -> new;
1058
        my($width,$hight)=max_win_size();
1059
 
1060
 
1061
        $vpaned -> pack1($w1, TRUE, TRUE);
1062
        $vpaned -> set_position ($hight*$loc);
1063
        $vpaned -> pack2($w2, TRUE, TRUE);
1064
 
1065
        return $vpaned;
1066
}
1067
 
1068
 
1069
sub gen_hpaned {
1070
        my ($w1,$loc,$w2) = @_;
1071
        my $hpaned = Gtk3::HPaned -> new;
1072
        my($width,$hight)=max_win_size();
1073
 
1074
        $hpaned -> pack1($w1, TRUE, TRUE);
1075
        $hpaned -> set_position ($width*$loc);
1076
        $hpaned -> pack2($w2, TRUE, TRUE);
1077
 
1078
        return $hpaned;
1079
}
1080
 
1081
 
1082
sub gen_hpaned_adj {
1083
        my ($self,$w1,$loc,$w2,$name) = @_;
1084
        my $hpaned = Gtk3::HPaned -> new;
1085
        $hpaned -> pack1($w1, TRUE, TRUE);
1086
        $hpaned -> pack2($w2, TRUE, TRUE);
1087
 
1088
        $hpaned->signal_connect("destroy"=> sub{
1089
                my $adj = $hpaned->get_position ();
1090
                $self->object_add_attribute("adj",$name,$adj);
1091
         });
1092
 
1093
        my $val =$self->object_get_attribute("adj",$name);
1094
        if(defined $val){
1095
                $hpaned -> set_position ($val);
1096
        } else{
1097
                my($width,$hight)=max_win_size();
1098
                $hpaned -> set_position ($width*$loc);
1099
        }
1100
 
1101
        return $hpaned;
1102
}
1103
 
1104
 
1105
#############
1106
# text_view 
1107
############
1108
 
1109
sub create_txview {
1110
  my $scrolled_window = Gtk3::ScrolledWindow->new;
1111
  $scrolled_window->set_policy ('automatic', 'automatic');
1112
  $scrolled_window->set_shadow_type ('in');
1113
  my $tview = Gtk3::TextView->new();
1114
  $scrolled_window->add ($tview);
1115
 
1116
  # Make it a bit nicer for text.
1117
  $tview->set_wrap_mode ('word');
1118
  $tview->set_pixels_above_lines (2);
1119
  $tview->set_pixels_below_lines (2);
1120
  # $scrolled_window->set_placement('bottom_left' );
1121
  add_colors_to_textview($tview);
1122
 
1123
 
1124
  $scrolled_window->show_all;
1125
 
1126
  return ($scrolled_window,$tview);
1127
}
1128
 
1129
 
1130
sub txview_scrol_to_end {
1131
  my $tview =shift;
1132
  my $buffer =  $tview->get_buffer;
1133
  my $end_mark = $buffer->create_mark( 'end', $buffer->get_end_iter, 0 );
1134
  $tview->scroll_to_mark( $end_mark, 0.0,0, 0.0, 1.0 );
1135
}
1136
 
1137
 
1138
#################
1139
#       table
1140
################
1141
 
1142
sub def_table{
1143
        my ($row,$col,$homogeneous)=@_;
1144
        my $table = Gtk3::Table->new ($row, $col, $homogeneous);
1145
        $table->set_row_spacings (0);
1146
        $table->set_col_spacings (0);
1147
        return $table;
1148
 
1149
}
1150
 
1151
sub attach_widget_to_table {
1152
        my ($table,$row,$label,$inf_bt,$widget,$column)=@_;
1153
        $column = 0 if(!defined $column);
1154
        #$column *=4;
1155
        #my $tmp=gen_label_in_left(" "); 
1156
        if(defined $label)  {$table->attach  ($label , $column, $column+1,  $row,$row+1,'fill','shrink',2,2);$column++;}
1157
        if(defined $inf_bt) {$table->attach  ($inf_bt , $column, $column+1, $row,$row+1,'fill','shrink',2,2);$column++;}
1158
        if(defined $widget) {$table->attach  ($widget , $column, $column+1, $row,$row+1,'fill','shrink',2,2);$column++;}
1159
        #$table->attach  ($tmp , $column+3, $column+4, $row,$row+1,'fill','shrink',2,2);
1160
}
1161
 
1162
sub gen_Hsep {
1163
        return Gtk3::HSeparator->new;
1164
}
1165
 
1166
sub gen_Vsep {
1167
        return Gtk3::VSeparator->new;
1168
}
1169
 
1170
 
1171
sub add_Hsep_to_table {
1172
        my($table,$col0,$col1,$row)=@_;
1173
        my $separator = gen_Hsep();
1174
        $table->attach ($separator ,$col0,$col1 , $row, $row+1,'fill','fill',2,2);
1175
}
1176
 
1177
sub add_Vsep_to_table {
1178
        my($table,$col,$row1,$row2)=@_;
1179
        my $separator = gen_Vsep();
1180
        $table->attach ($separator ,$col,$col+1 , $row1, $row2,'fill','fill',2,2);
1181
}
1182
 
1183
 
1184
##################
1185
#       show_info
1186
##################
1187
sub show_info{
1188
        my ($textview,$info)=@_;
1189
        #return;# if(!defined $textview_ref);
1190
        #print "$textview_ref\n";
1191
        my $buffer = $textview->get_buffer();
1192
        $buffer->set_text($info);
1193
        txview_scrol_to_end($textview);
1194
}
1195
 
1196
sub add_info{
1197
        my ($textview,$info)=@_;
1198
        my $buffer = $textview->get_buffer();
1199
        my $textiter = $buffer->get_end_iter();
1200
        #Insert some text into the buffer
1201
        $buffer->insert($textiter,$info);
1202
        txview_scrol_to_end($textview);
1203
 
1204
}
1205
 
1206
 
1207
 
1208
 
1209
sub show_colored_info{
1210
        my ($textview,$info,$color)=@_;
1211
        my $buffer = $textview->get_buffer();
1212
        #$buffer->set_text($info);
1213
        my $textiter = $buffer->get_start_iter();
1214
        $buffer->insert_with_tags_by_name ($textiter, "$info", "${color}_tag");
1215
        txview_scrol_to_end($textview);
1216
}
1217
 
1218
sub add_colored_info{
1219
        my ($textview,$info,$color)=@_;
1220
        my $buffer = $textview->get_buffer();
1221
        my $textiter = $buffer->get_end_iter();
1222
        #Insert some text into the buffer
1223
        #$buffer->insert($textiter,$info);
1224
        $buffer->insert_with_tags_by_name ($textiter, "$info", "${color}_tag");
1225
        txview_scrol_to_end($textview);
1226
}
1227
 
1228
sub add_colors_to_textview{
1229
        my $tview= shift;
1230
        add_colored_tag($tview,'red');
1231
        add_colored_tag($tview,'blue');
1232
        add_colored_tag($tview,'brown');
1233
        add_colored_tag($tview,'green');
1234
}
1235
 
1236
 
1237
sub add_colored_tag{
1238
        my ($textview_ref,$color)=@_;
1239
        my $buffer = $textview_ref->get_buffer();
1240
        $buffer->create_tag ("${color}_tag", foreground => $color);
1241
}
1242
 
1243
sub add_color_to_gd{
1244
        foreach (my $i=0;$i<32;$i++ ) {
1245
                my ($red,$green,$blue)=get_color($i);
1246
                add_colour("my_color$i"=>[$red>>8,$green>>8,$blue>>8]);
1247
 
1248
        }
1249
}
1250
 
1251
 
1252
 
1253
############
1254
#       get file folder list
1255
###########
1256
 
1257
sub get_directory_name_widget {
1258
        my ($object,$title,$entry,$attribute1,$attribute2,$status,$timeout)= @_;
1259
        my $browse= def_image_button("icons/browse.png");
1260
 
1261
        $browse->signal_connect("clicked"=> sub{
1262
                my $entry_ref=$_[1];
1263
                my $file;
1264
                $title ='select directory' if(!defined $title);
1265
                my $dialog = Gtk3::FileChooserDialog->new(
1266
                        $title, undef,
1267
                        #               'open',
1268
                        'select-folder',
1269
                        'gtk-cancel' => 'cancel',
1270
                        'gtk-ok'     => 'ok',
1271
                        );
1272
 
1273
 
1274
                        if ( "ok" eq $dialog->run ) {
1275
                        $file = $dialog->get_filename;
1276
                                $$entry_ref->set_text($file);
1277
                                $object->object_add_attribute($attribute1,$attribute2,$file);
1278
                                set_gui_status($object,$status,$timeout) if(defined $status);
1279
                                #check_input_file($file,$socgen,$soc_state,$info);
1280
                                #print "file = $file\n";
1281
                         }
1282
                                $dialog->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning
1283
                        $dialog->destroy;
1284
 
1285
 
1286
 
1287
                } , \$entry);
1288
 
1289
        return $browse;
1290
 
1291
}
1292
 
1293
 
1294
sub get_dir_name {
1295
        my ($object,$title,$attribute1,$attribute2,$open_in,$status,$timeout)= @_;
1296
        my $dir;
1297
        $title ='select directory' if(!defined $title);
1298
        my $dialog = Gtk3::FileChooserDialog->new(
1299
                $title, undef,
1300
                #               'open',
1301
                'select-folder',
1302
                'gtk-cancel' => 'cancel',
1303
                'gtk-ok'     => 'ok',
1304
        );
1305
 
1306
        $dialog->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning
1307
 
1308
        if(defined  $open_in){
1309
                $dialog->set_current_folder ($open_in);
1310
        }
1311
 
1312
        if ( "ok" eq $dialog->run ) {
1313
                        $dir = $dialog->get_filename;
1314
                                $object->object_add_attribute($attribute1,$attribute2,$dir);
1315
                                set_gui_status($object,$status,$timeout) if(defined $status);
1316
                                $dialog->destroy;
1317
        }
1318
}
1319
 
1320
 
1321
 
1322
sub get_file_name {
1323
        my ($object,$title,$entry,$attribute1,$attribute2,$extension,$label,$open_in,$new_status,$ref_delay)= @_;
1324
        my $browse= def_image_button("icons/browse.png");
1325
 
1326
        $browse->signal_connect("clicked"=> sub{
1327
                my $entry_ref=$_[1];
1328
                my $file;
1329
                $title ='select a file' if(!defined $title);
1330
                my $dialog = Gtk3::FileChooserDialog->new(
1331
                'Select a File', undef,
1332
                'open',
1333
                'gtk-cancel' => 'cancel',
1334
                'gtk-ok'     => 'ok',
1335
                );
1336
 
1337
        $dialog->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning
1338
 
1339
         if(defined $extension){
1340
                my $filter = Gtk3::FileFilter->new();
1341
                $filter->set_name($extension);
1342
                $filter->add_pattern("*.$extension");
1343
                $dialog->add_filter ($filter);
1344
         }
1345
          if(defined  $open_in){
1346
                $dialog->set_current_folder ($open_in);
1347
                # print "$open_in\n";
1348
 
1349
        }
1350
 
1351
                        if ( "ok" eq $dialog->run ) {
1352
                        $file = $dialog->get_filename;
1353
                                #remove $project_dir form beginig of each file
1354
                $file =remove_project_dir_from_addr($file);
1355
                                $$entry_ref->set_text($file);
1356
                                $object->object_add_attribute($attribute1,$attribute2,$file) if(defined $object);
1357
                                set_gui_status($object,$new_status,$ref_delay) if(defined $ref_delay);
1358
                                my ($name,$path,$suffix) = fileparse("$file",qr"\..[^.]*$");
1359
                                if(defined $label){
1360
                                        $label->set_markup("<span  foreground= 'black' ><b>$name$suffix</b></span>");
1361
                                        $label->show;
1362
                                }
1363
 
1364
                                #check_input_file($file,$socgen,$soc_state,$info);
1365
                                #print "file = $file\n";
1366
                         }
1367
                        $dialog->destroy;
1368
 
1369
 
1370
 
1371
                } , \$entry);
1372
 
1373
        return $browse;
1374
 
1375
}
1376
 
1377
sub gen_file_dialog  {
1378
        my ($title, @extension)=@_;
1379
        $title = 'Select a File' if (!defined $title);
1380
 
1381
        my $dialog = Gtk3::FileChooserDialog->new(
1382
                $title,
1383
                                undef,
1384
                'open',
1385
                'gtk-cancel' => 'cancel',
1386
                'gtk-ok'     => 'ok',
1387
     );
1388
 
1389
        $dialog->set_modal(TRUE);
1390
        $dialog->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning
1391
 
1392
        foreach my $ext (@extension){
1393
                my $filter = Gtk3::FileFilter->new();
1394
                $filter->set_name("$ext");
1395
                $filter->add_pattern("*.$ext");
1396
                $dialog->add_filter ($filter);
1397
        }
1398
 
1399
        return $dialog;
1400
 
1401
}
1402
 
1403
 
1404
sub save_file_dialog  {
1405
        my ($title, @extension)=@_;
1406
        $title = 'Select a File' if (!defined $title);
1407
 
1408
        my $dialog = Gtk3::FileChooserDialog->new(
1409
                $title,
1410
                                undef,
1411
                'save',
1412
                'gtk-cancel' => 'cancel',
1413
                'gtk-ok'     => 'ok',
1414
     );
1415
 
1416
        $dialog->set_modal(TRUE);
1417
        $dialog->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning
1418
 
1419
        foreach my $ext (@extension){
1420
                my $filter = Gtk3::FileFilter->new();
1421
                $filter->set_name("$ext");
1422
                $filter->add_pattern("*.$ext");
1423
                $dialog->add_filter ($filter);
1424
        }
1425
 
1426
        return $dialog;
1427
 
1428
}
1429
 
1430
 
1431
 
1432
 
1433
sub gen_folder_dialog  {
1434
        my ($title)=@_;
1435
        $title = 'Select Folder' if (!defined $title);
1436
 
1437
 
1438
 
1439
        my $dialog = Gtk3::FileChooserDialog->new(
1440
                $title,
1441
                undef,
1442
                'select-folder',
1443
                'gtk-cancel' => 'cancel',
1444
                'gtk-ok'     => 'ok',
1445
     );
1446
        $dialog->set_modal(TRUE);
1447
        $dialog->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning
1448
 
1449
        return $dialog;
1450
 
1451
}
1452
 
1453
 
1454
sub get_filenames_from_dialog{
1455
        my $dialog=shift;
1456
        my $ref = $dialog->get_filenames;
1457
        my @files;
1458
        @files = @{$ref} if (defined $ref);
1459
        return @files;
1460
}
1461
 
1462
 
1463
sub new_dialog_with_buttons {
1464
        my $self =shift;
1465
        return Gtk3::Dialog->new_with_buttons(
1466
                "Goto to line",
1467
                $self->window,
1468
                [ 'modal' ],
1469
                'gtk-cancel' => 'cancel',
1470
                'gtk-ok'     => 'ok',
1471
        );
1472
 
1473
}
1474
 
1475
 
1476
#################
1477
#       widget update object
1478
#################
1479
 
1480
sub gen_entry_object {
1481
        my ($object,$attribute1,$attribute2,$default,$status,$timeout)=@_;
1482
        my $old=$object->object_get_attribute($attribute1,$attribute2);
1483
        my $widget;
1484
        if(defined $old ){
1485
                $widget=gen_entry($old);
1486
        }
1487
        else
1488
        {
1489
                $widget=gen_entry($default);
1490
                $object->object_add_attribute($attribute1,$attribute2,$default);
1491
        }
1492
        $widget-> signal_connect("changed" => sub{
1493
                my $new_param_value=$widget->get_text();
1494
                $object->object_add_attribute($attribute1,$attribute2,$new_param_value);
1495
                set_gui_status($object,$status,$timeout) if (defined $status);
1496
        });
1497
        return $widget;
1498
}
1499
 
1500
 
1501
sub gen_combobox_object {
1502
        my ($object,$attribute1,$attribute2,$content,$default,$status,$timeout)=@_;
1503
        my @combo_list=split(/\s*,\s*/,$content);
1504
        my $value=$object->object_get_attribute($attribute1,$attribute2);
1505
        my $pos;
1506
        $pos=get_pos($value, @combo_list) if (defined $value);
1507
        if(!defined $pos && defined $default){
1508
                $object->object_add_attribute($attribute1,$attribute2,$default);
1509
                $pos=get_item_pos($default, @combo_list);
1510
        }
1511
        #print " my $pos=get_item_pos($value, @combo_list);\n";
1512
        my $widget=gen_combo(\@combo_list, $pos);
1513
        $widget-> signal_connect("changed" => sub{
1514
                my $new_param_value=$widget->get_active_text();
1515
                $object->object_add_attribute($attribute1,$attribute2,$new_param_value);
1516
                set_gui_status($object,$status,$timeout) if (defined $status);
1517
         });
1518 54 alirezamon
        return $widget;
1519 48 alirezamon
}
1520
 
1521
 
1522
sub gen_comboentry_object {
1523
        my ($object,$attribute1,$attribute2,$content,$default,$status,$timeout)=@_;
1524
        my @combo_list;
1525
        @combo_list=split(/\s*,\s*/,$content) if(defined $content );
1526
        my $value=$object->object_get_attribute($attribute1,$attribute2);
1527
        my $pos;
1528
        $pos=get_pos($value, @combo_list) if (defined $value);
1529
        if(!defined $pos && defined $default){
1530
                $object->object_add_attribute($attribute1,$attribute2,$default);
1531
                $pos=get_item_pos($default, @combo_list);
1532
        }
1533
        #print " my $pos=get_item_pos($value, @combo_list);\n";
1534
 
1535
        my $widget=gen_combo_entry(\@combo_list, $pos);
1536
        my $child = combo_entry_get_chiled($widget);
1537
        $child->signal_connect('changed' => sub {
1538
                my ($entry) = @_;
1539
                my $new_param_value=$entry->get_text();
1540
                $object->object_add_attribute($attribute1,$attribute2,$new_param_value);
1541
                set_gui_status($object,$status,$timeout) if (defined $status);
1542
         });
1543
        return $widget;
1544
 
1545
}
1546
 
1547
 
1548
 
1549
sub gen_spin_object {
1550
        my ($object,$attribute1,$attribute2,$content, $default,$status,$timeout)=@_;
1551
        my $value=$object->object_get_attribute($attribute1,$attribute2);
1552
        my ($min,$max,$step,$digit)=split(/\s*,\s*/,$content);
1553
        if(!defined $value){
1554
                $value=$default;
1555
                $object->object_add_attribute($attribute1,$attribute2,$value);
1556
        }
1557
 
1558
        $value=~ s/[^0-9.\-]//g;
1559
        $min=~   s/[^0-9.\-]//g;
1560
        $max=~   s/[^0-9.\-]//g;
1561
        $step=~  s/[^0-9.\-]//g;
1562
        $digit=~ s/[^0-9.\-]//g if (defined $digit);
1563
 
1564
        my $widget=gen_spin($min,$max,$step,$digit);
1565
        $widget->set_value($value);
1566
        $widget-> signal_connect("value_changed" => sub{
1567
                my $new_param_value=$widget->get_value();
1568
                $object->object_add_attribute($attribute1,$attribute2,$new_param_value);
1569
                set_gui_status($object,$status,$timeout) if (defined $status);
1570
        });
1571
        return $widget;
1572
}
1573
 
1574
 
1575
sub gen_check_box_object_array {
1576
                my ($object,$attribute1,$attribute2,$content,$default,$status,$timeout)=@_;
1577
                my $value=$object->object_get_attribute($attribute1,$attribute2);
1578
                $value = $default if (!defined $value);
1579
                my $widget = def_hbox(FALSE,0);
1580
                my @check;
1581
                for (my $i=0;$i<$content;$i++){
1582
                        $check[$i]= gen_checkbutton();
1583
                }
1584
                for (my $i=0;$i<$content;$i++){
1585
                        $widget->pack_end(  $check[$i], FALSE, FALSE, 0);
1586
 
1587
                        my @chars = split("",$value);
1588
                        #check if saved value match the size of check box
1589
                        if($chars[0] ne $content ) {
1590
                                $object->object_add_attribute($attribute1,$attribute2,$default);
1591
                                $value=$default;
1592
                                @chars = split("",$value);
1593
                        }
1594
                        #set initial value
1595
 
1596
                        #print "\@chars=@chars\n";
1597
                        for (my $i=0;$i<$content;$i++){
1598
                                my $loc= (scalar @chars) -($i+1);
1599
                                        if( $chars[$loc] eq '1') {$check[$i]->set_active(TRUE);}
1600
                                        else {$check[$i]->set_active(FALSE);}
1601
                        }
1602
 
1603
 
1604
                        #get new value
1605
                        $check[$i]-> signal_connect("toggled" => sub{
1606
                                my $new_val="$content\'b";
1607
 
1608
                                for (my $i=$content-1; $i >= 0; $i--){
1609
                                        if($check[$i]->get_active()) {$new_val="${new_val}1" ;}
1610
                                        else {$new_val="${new_val}0" ;}
1611
                                }
1612
                                $object->object_add_attribute($attribute1,$attribute2,$new_val);
1613
                                #print "\$new_val=$new_val\n";
1614
                                set_gui_status($object,$status,$timeout) if (defined $status);
1615
                        });
1616
        }
1617
        return $widget;
1618
 
1619
}
1620
 
1621
 
1622
 
1623
 
1624
 
1625
sub gen_check_box_object {
1626
                my ($object,$attribute1,$attribute2,$default,$status,$timeout)=@_;
1627
                my $value=$object->object_get_attribute($attribute1,$attribute2);
1628
                if (!defined $value){
1629
                        #set initial value
1630
                        $object->object_add_attribute($attribute1,$attribute2,$default);
1631
                        $value = $default
1632
                }
1633
                my $widget = Gtk3::CheckButton->new;
1634
                if($value == 1) {$widget->set_active(TRUE);}
1635
                else {$widget->set_active(FALSE);}
1636
 
1637
                #get new value
1638
                $widget-> signal_connect("toggled" => sub{
1639
                        my $new_val;
1640
                        if($widget->get_active()) {$new_val=1;}
1641
                        else {$new_val=0;}
1642
                        $object->object_add_attribute($attribute1,$attribute2,$new_val);
1643
                        #print "\$new_val=$new_val\n";
1644
                        set_gui_status($object,$status,$timeout) if (defined $status);
1645
                });
1646
 
1647
        return $widget;
1648
 
1649
}
1650
 
1651
 
1652
 
1653
 
1654
 
1655
 
1656
sub get_dir_in_object {
1657
        my ($object,$attribute1,$attribute2,$content,$status,$timeout,$default)=@_;
1658
        my $widget = def_hbox(FALSE,0);
1659
        my $value=$object->object_get_attribute($attribute1,$attribute2);
1660
        $object->object_add_attribute($attribute1,$attribute2,  $default) if (!defined $value );
1661
        $value = $default if (!defined $value );
1662
        if (defined $default){
1663
                $object->object_add_attribute($attribute1,$attribute2,  $default) if  !(-d $value );
1664
                $value = $default  if !(-d $value );
1665
        };
1666
 
1667
        my $warning;
1668
 
1669
        my $entry=gen_entry($value);
1670
        $entry-> signal_connect("changed" => sub{
1671
                my $new_param_value=$entry->get_text();
1672
                $object->object_add_attribute($attribute1,$attribute2,$new_param_value);
1673
                set_gui_status($object,$status,$timeout) if (defined $status);
1674
                unless (-d $new_param_value ){
1675
                        if (!defined $warning){
1676
                                $warning = def_icon("icons/warning.png");
1677
                                $widget->pack_start( $warning, FALSE, FALSE, 0);
1678
                                set_tip($warning,"$new_param_value is not a valid directory");
1679
                                $widget->show_all;
1680
                        }
1681
 
1682
                }else{
1683
                        $warning->destroy if (defined $warning);
1684
                        undef $warning;
1685
 
1686
                }
1687
 
1688
        });
1689
        my $browse= get_directory_name_widget($object,undef,$entry,$attribute1,$attribute2,$status,$timeout);
1690
 
1691
        $widget->pack_start( $entry, FALSE, FALSE, 0);
1692
        $widget->pack_start( $browse, FALSE, FALSE, 0);
1693
 
1694
         if(defined $value){
1695
                unless (-d $value ){
1696
                        $warning= def_icon("icons/warning.png");
1697
                        $widget->pack_start( $warning, FALSE, FALSE, 0);
1698
                        set_tip($warning,"$value is not a valid directory path");
1699
                }
1700
        }
1701
        return $widget;
1702
}
1703
 
1704
 
1705
 
1706
 
1707
sub get_file_name_object {
1708
        my ($object,$attribute1,$attribute2,$extension,$open_in,$new_status,$ref_delay)=@_;
1709
        my $widget = def_hbox(FALSE,0);
1710
        my $value=$object->object_get_attribute($attribute1,$attribute2);
1711
        my $label;
1712
        if(defined $value){
1713
                my ($name,$path,$suffix) = fileparse("$value",qr"\..[^.]*$");
1714
                $label=gen_label_in_center($name.$suffix);
1715
 
1716
        } else {
1717
                        $label=gen_label_in_center("Selecet a file");
1718
                        $label->set_markup("<span  foreground= 'red' ><b>No file has been selected yet</b></span>");
1719
        }
1720
        my $entry=gen_entry();
1721
        my $browse= get_file_name($object,undef,$entry,$attribute1,$attribute2,$extension,$label,$open_in,$new_status,$ref_delay);
1722
        $widget->pack_start( $label, FALSE, FALSE, 0);
1723
        $widget->pack_start( $browse, FALSE, FALSE, 0);
1724
        return $widget;
1725
}
1726
 
1727
 
1728
 
1729
 
1730
 
1731
sub gen_notebook {
1732
        my $notebook = Gtk3::Notebook->new;
1733
        return $notebook;
1734
}
1735
################
1736
# ADD info and label to widget
1737
################
1738
 
1739
 
1740
sub gen_label_info{
1741
        my ($label_name,$widget,$info)=@_;
1742
        my $box = def_hbox(FALSE,0);
1743
        #label
1744
        if(defined $label_name){
1745
                my $label= gen_label_in_left($label_name);
1746
                $box->pack_start( $label, FALSE, FALSE, 3);
1747
        }
1748
        $box->pack_start( $widget, FALSE, FALSE, 3);
1749
        #info   
1750
        if(defined $info){
1751
                my $button=def_image_button("icons/help.png");
1752
                $button->signal_connect("clicked" => sub {message_dialog($info);});
1753
                $box->pack_start( $button, FALSE, FALSE, 3);
1754
        }
1755
        $box->show_all;
1756
        return $box;
1757
}
1758
 
1759
 
1760
############
1761
#
1762
###########
1763
 
1764
sub gen_MenuBar{
1765
        my ($window,@menu_items)=@_;
1766
 
1767
        my $accel_group = Gtk3::AccelGroup->new;
1768
        $window->add_accel_group ($accel_group);
1769
        my $menubar = Gtk3::MenuBar->new;
1770
        my $menu  = Gtk3::Menu->new;
1771
    $menu->set_accel_group ($accel_group);
1772
 
1773
        my %all_menus;
1774
        foreach my $p (@menu_items){
1775
                my ($name,$key,$func,$u,$type)=@{$p};
1776
                $name =~ s/_//;
1777
                my @l =split ('/',$name);
1778
 
1779
                my $m= pop @l;
1780
                $m =~ s/_//;
1781
                my $parent = join('/',@l);
1782
                $parent =~ s/_//;
1783
 
1784
 
1785
        #       print "\$parent= $parent **   \$m=$m\n";
1786
        #    print "   all_menus{$parent}  = $all_menus{$parent}\n";
1787
                my $menuitem = Gtk3::MenuItem->new_with_label($m);
1788
 
1789
                if(!defined $all_menus{$parent}){
1790
                        my $menu  = Gtk3::Menu->new;
1791
                    $menu->set_accel_group ($accel_group);
1792
                        $menuitem->set_submenu($menu);
1793
                        $all_menus{$name}{'menu'}=$menu;
1794
                        $all_menus{$name}{'num'}=0;
1795
                        $menubar->append($menuitem)
1796
                }else {
1797
                        my $menu = $all_menus{$parent}{'menu'};
1798
                        my $pos = $all_menus{$parent}{'num'};
1799
                        $menu->insert($menuitem,$pos);
1800
                        $all_menus{$parent}{'num'}= $pos+1;
1801
                        if(defined $type){
1802
                        if($type eq "<Branch>"){
1803
                                $all_menus{$name}{'menu'}=$menu;
1804
                                $all_menus{$name}{'num'}=0;
1805
                        }}
1806
 
1807
                }
1808
                if(defined $key){
1809
                        $menuitem->add_accelerator('activate',$accel_group,Gtk3::accelerator_parse($key),'visible');
1810
                }
1811
                if(defined $func){
1812
                        $menuitem->signal_connect('activate' => \&$func);
1813
                }
1814
                #print "$name,$key,$func,$u,$type\n";
1815
                $menuitem->show();
1816
        }
1817
 
1818
        my $box = Gtk3::Box->new( 'vertical', 0 );
1819
        $box->pack_start( $menubar, FALSE, TRUE, 0 );
1820
        $menubar->show();
1821
 
1822
        return $box;
1823
}
1824
 
1825
 
1826
 
1827
sub creating_detachable_toolbar{
1828
        my @attachments=@_;
1829
        return def_pack_hbox('FALSE', 0, @_);
1830
        #The handle box helps in creating a detachable toolbar 
1831
        my $hb = Gtk3::HandleBox->new;
1832
        #create a toolbar, and do some initial settings
1833
        my $toolbar = Gtk3::Toolbar->new;
1834
        $toolbar->set_icon_size ('small-toolbar');
1835
        $toolbar->set_show_arrow (FALSE);
1836
        foreach my $p (@attachments){
1837
                $toolbar->insert($p,-1);
1838
 
1839
        }
1840
        $hb->add($toolbar);
1841
        return $hb;
1842
}
1843
 
1844
sub gui_quite{
1845
        Gtk3->main_quit;
1846
}
1847
 
1848
sub gtk_gui_run{
1849
        my ($main)=@_;
1850
        Gtk3->init;
1851
        &$main;
1852
        Gtk3->main();
1853
        return 1;
1854
}
1855
 
1856
 
1857
 
1858
 
1859
sub refresh_gui{
1860
        while (Gtk3::events_pending) {
1861
     Gtk3::main_iteration;
1862
    }
1863
    Gtk3::Gdk::flush;
1864
}
1865
 
1866
 
1867
sub about {
1868
    my $version=shift;
1869
    my $about = Gtk3::AboutDialog->new;
1870
        my @authors=("Alireza Monemi", "Email: alirezamonemi\@opencores.org");
1871
    $about->set_authors(\@authors);
1872
    $about->set_version( $version );
1873
    $about->set_website('http://opencores.org/project,an-fpga-implementation-of-low-latency-noc-based-mpsoc');
1874
    $about->set_comments('NoC based MPSoC generator.');
1875
    $about->set_program_name('ProNoC');
1876
    my $pixbuf = Gtk3::Gdk::Pixbuf->new_from_file_at_scale("icons/ProNoC.png",50,50,FALSE);
1877
    $about->set_logo($pixbuf);
1878
 
1879
    $about->set_license(
1880
                 "This program is free software; you can redistribute it\n"
1881
                . "and/or modify it under the terms of the GNU General \n"
1882
                . "Public License as published by the Free Software \n"
1883
                . "Foundation; either version 1, or (at your option)\n"
1884
                . "any later version.\n\n"
1885
 
1886
        );
1887
        # Add the Hide action to the 'Close' button in the AboutDialog():
1888
    $about->signal_connect('response' => sub { $about->hide; });
1889
 
1890
        $about->set_transient_for (Gtk3::Window->new('toplevel'));#just to get rid of transient warning
1891
 
1892
    $about->run;
1893
    $about->destroy;
1894
    return;
1895
}
1896
 
1897
 
1898
 
1899
############
1900
#  list_store
1901
###########
1902
 
1903
sub gen_list_store {
1904
        my ($dref,$clmn_type_ref, $clmn_lables_ref)=@_;
1905
 
1906
 
1907
#               my @data = (
1908
#  {0 => "Average distance",  1 =>"$avg"}, 
1909
#  {0 => "Max distance",  1 =>"$max" },  
1910
#  {0 => "Min distance",1 => "$min"},    
1911
#  {0 => "Normlized data per hop", 1 =>"$norm" }
1912
#  );
1913
 
1914
# my @clmn_type = (#'Glib::Boolean', # => G_TYPE_BOOLEAN
1915
#                                    #'Glib::Uint',    # => G_TYPE_UINT
1916
#                                    'Glib::String',  # => G_TYPE_STRING
1917
#                                  'Glib::String'); # you get the idea
1918
 
1919
 
1920
        my @data = @{$dref};
1921
        my @clmn_type = @{$clmn_type_ref};
1922
        my @clmn_lables= @{$clmn_lables_ref};
1923
 
1924
 
1925
    # create list store
1926
    my $store = Gtk3::ListStore->new ( @clmn_type);
1927
 
1928
 
1929
        # add data to the list store
1930
        foreach my $d (@data) {
1931
                my $iter = $store->append;
1932
                my @clmns = sort keys %{$d};
1933
                my @a=($iter);
1934
                foreach my $c (@clmns){
1935
                        push (@a,($c,$d->{$c}));
1936
 
1937
                }
1938
        $store->set (@a);
1939
 
1940
        }
1941
 
1942
 
1943
    my $treeview = Gtk3::TreeView->new ($store);
1944
    $treeview->set_rules_hint (TRUE);
1945
        $treeview->set_search_column (1);
1946
    #my $renderer = Gtk3::CellRendererToggle->new;
1947
    #$renderer->signal_connect (toggled => \&fixed_toggled, $store);
1948
 
1949
 
1950
        # column for severities
1951
        my $c=0;
1952
        foreach my $l (@clmn_lables){
1953
                my $renderer = Gtk3::CellRendererText->new;
1954
                my $column = Gtk3::TreeViewColumn->new_with_attributes ("$l",
1955
                                                               $renderer,
1956 54 alirezamon
                                                               text => $c
1957
                                                               );
1958 48 alirezamon
                $column->set_sort_column_id ($c );
1959
                $treeview->append_column ($column);
1960
                $c++;
1961
        }
1962
 
1963
 
1964
        return $treeview;
1965
}
1966
 
1967
 
1968
 
1969
 
1970
 
1971
##############
1972
#       create tree
1973
##############
1974
 
1975
 
1976
sub create_tree_model_network_maker{
1977
        my $model = Gtk3::TreeStore->new ('Glib::String', 'Glib::String', 'Glib::Scalar', 'Glib::Boolean');
1978
        my $tree_view = Gtk3::TreeView->new;
1979
        $tree_view->set_model ($model);
1980
        my $selection = $tree_view->get_selection;
1981
        $selection->set_mode ("single");
1982
        my $cell = Gtk3::CellRendererText->new;
1983
        $cell->set ('style' => 'italic');
1984
        my $column = Gtk3::TreeViewColumn->new_with_attributes ("select", $cell, 'text' => 0, 'style_set' => 3);
1985
        return ($model,$tree_view,$column);
1986
}
1987
 
1988
 
1989
sub treemodel_next_iter{
1990
        my      ($child , $tree_model)=@_;
1991
        $tree_model->iter_next ($child);
1992
        return $child;
1993
}
1994
 
1995
 
1996
 
1997
 
1998
 
1999
 
2000
 
2001
 
2002
 
2003
 
2004
 
2005
 
2006
 
2007
# clean names for column numbers.
2008
use constant DISPLAY_COLUMN    => 0;
2009
use constant CATRGORY_COLUMN    => 1;
2010
use constant MODULE_COLUMN     => 2;
2011
use constant ITALIC_COLUMN   => 3;
2012
use constant NUM_COLUMNS     => 4;
2013
 
2014
sub create_tree {
2015
   my ($self,$label,$info,$tree_ref,$row_selected_func,$row_activated_func)=@_;
2016
   my %tree_in = %{$tree_ref};
2017
   my $model = Gtk3::TreeStore->new ('Glib::String', 'Glib::String', 'Glib::Scalar', 'Glib::Boolean');
2018
   my $tree_view = Gtk3::TreeView->new;
2019
   $tree_view->set_model ($model);
2020
   my $selection = $tree_view->get_selection;
2021
   $selection->set_mode ('browse');
2022
 
2023
 
2024
 
2025
   foreach my $p (sort keys %tree_in)
2026
   {
2027
 
2028
        my @modules= @{$tree_in{$p}};
2029
        #my @dev_entry=  @{$tree_entry{$p}};    
2030
        my $iter = $model->append (undef);
2031
        $model->set ($iter,
2032
                   DISPLAY_COLUMN,    $p,
2033
                   CATRGORY_COLUMN, $p || '',
2034
                   MODULE_COLUMN,     0     || '',
2035
                   ITALIC_COLUMN,   FALSE);
2036
 
2037
        next unless  @modules;
2038
 
2039
        foreach my $v ( @modules){
2040
                 my $child_iter = $model->append ($iter);
2041
                 my $entry= '';
2042
 
2043
                $model->set ($child_iter,
2044
                        DISPLAY_COLUMN,    $v,
2045
                        CATRGORY_COLUMN, $p|| '',
2046
                        MODULE_COLUMN,     $v     || '',
2047
                        ITALIC_COLUMN,   FALSE);
2048
        }
2049
 
2050
 
2051
 
2052
   }
2053
 
2054
   my $cell = Gtk3::CellRendererText->new;
2055
   $cell->set ('style' => 'italic');
2056
   my $column = Gtk3::TreeViewColumn->new_with_attributes
2057
                                        ("$label",
2058
                                        $cell,
2059
                                        'text' => DISPLAY_COLUMN,
2060
                                        'style_set' => ITALIC_COLUMN);
2061
 
2062
        $tree_view->append_column ($column);
2063
        my @ll=($model,$info);
2064
   #row selected
2065
        $selection->signal_connect (changed =>sub {
2066
        my ($selection, $ref) = @_;
2067
        my ($model,$info)=@{$ref};
2068
        my $iter = $selection->get_selected;
2069
        return unless defined $iter;
2070
 
2071
        my ($category) = $model->get ($iter, CATRGORY_COLUMN);
2072
        my ($module) = $model->get ($iter,MODULE_COLUMN );
2073
        $row_selected_func->($self,$category,$module,$info) if(defined $row_selected_func);
2074
 
2075
 
2076
 
2077
}, \@ll);
2078
 
2079
#  row_activated 
2080
  $tree_view->signal_connect (row_activated => sub{
2081
 
2082
        my ($tree_view, $path, $column) = @_;
2083
        my $model = $tree_view->get_model;
2084
        my $iter = $model->get_iter ($path);
2085
        my ($category) = $model->get ($iter, CATRGORY_COLUMN);
2086
        my ($module) = $model->get ($iter,MODULE_COLUMN );
2087
 
2088
 
2089
        if($module){
2090
                #print "$module  is selected via row activaton!\n";
2091
                $row_activated_func->($self,$category,$module,$info) if(defined $row_activated_func);
2092
                #add_module_to_soc($soc,$ip,$category,$module,$info);
2093
 
2094
        }
2095
 
2096
}, \@ll);
2097
 
2098
  #$tree_view->expand_all;
2099
 
2100
  my $scrolled_window = Gtk3::ScrolledWindow->new;
2101
  $scrolled_window->set_policy ('automatic', 'automatic');
2102
  $scrolled_window->set_shadow_type ('in');
2103
  $scrolled_window->add($tree_view);
2104
 
2105
  my $hbox = Gtk3::HBox->new (FALSE, 0);
2106
  $hbox->pack_start ( $scrolled_window, TRUE, TRUE, 0);
2107
 
2108
  return $hbox;
2109
}
2110
 
2111
 
2112
sub row_activated_cb{
2113
         my ($tree_view, $path, $column) = @_;
2114
         my $model = $tree_view->get_model;
2115
         my $iter = $model->get_iter ($path);
2116
         my ($category) = $model->get ($iter, DISPLAY_COLUMN);
2117
         my ($module) = $model->get ($iter, CATRGORY_COLUMN);
2118
 
2119
}
2120
 
2121
 
2122
 
2123
sub file_edit_tree {
2124
        my $model = Gtk3::TreeStore->new('Glib::String', 'Glib::String');
2125
        my $tree_view = Gtk3::TreeView->new;
2126
        $tree_view->set_model ($model);
2127
        my $selection = $tree_view->get_selection;
2128
        $selection->set_mode ("single");
2129
        my $cell = Gtk3::CellRendererText->new;
2130
        $cell->set ('style' => 'italic');
2131
        my $column = Gtk3::TreeViewColumn->new_with_attributes('Double-click to open',$cell, text => "0");
2132
        $tree_view->append_column($column);
2133
        $tree_view->set_headers_visible(TRUE);
2134
        return ($model,$tree_view);
2135
}
2136
 
2137
 
2138
#       my $column = Gtk3::TreeViewColumn->new_with_attributes ("select", $cell, 'text' => 0, 'style_set' => 3);
2139
 
2140
 
2141
 
2142
 
2143
 
2144
##########
2145
#  run external commands
2146
##########
2147
 
2148
 
2149
 
2150
sub run_cmd_in_back_ground
2151
{
2152
  my $command = shift;
2153
  #print "\t$command\n";
2154
 
2155
  ### Start running the Background Job:
2156
    my $proc = Proc::Background->new($command);
2157
    my $PID = $proc->pid;
2158
    my $start_time = $proc->start_time;
2159
    my $alive = $proc->alive;
2160
 
2161
  ### While $alive is NOT '0', then keep checking till it is...
2162
  #  *When $alive is '0', it has finished executing.
2163
  while($alive ne 0)
2164
  {
2165
    $alive = $proc->alive;
2166
 
2167
    # This while loop will cause Gtk3 to continue processing events, if
2168
    # there are events pending... *which there are...
2169
    while (Gtk3::events_pending) {
2170 54 alirezamon
 
2171 48 alirezamon
      Gtk3::main_iteration;
2172
    }
2173
    Gtk3::Gdk::flush;
2174
 
2175
    usleep(1000);
2176
  }
2177
 
2178
  my $end_time = $proc->end_time;
2179
 # print "*Command Completed at $end_time, with PID = $PID\n\n";
2180
 
2181
  # Since the while loop has exited, the BG job has finished running:
2182
  # so close the pop-up window...
2183
 # $popup_window->hide;
2184
 
2185
  # Get the RETCODE from the Background Job using the 'wait' method
2186
  my $retcode = $proc->wait;
2187
  $retcode /= 256;
2188
 
2189
  #print "\t*RETCODE == $retcode\n\n";
2190
  Gtk3::Gdk::flush;
2191
  ### Check if the RETCODE returned with an Error:
2192
  if ($retcode ne 0) {
2193
    print "Error: The Background Job ($command) returned with an Error...!\n";
2194
    return 1;
2195
  } else {
2196
    #print "Success: The Background Job Completed Successfully...!\n";
2197
    return 0;
2198
  }
2199
 
2200
}
2201
 
2202
sub run_cmd_in_back_ground_get_stdout
2203
{
2204
        my $cmd=shift;
2205
        my $exit;
2206
        my ($stdout, $stderr);
2207 54 alirezamon
        STDOUT->flush();
2208
        STDERR->flush();
2209
 
2210 48 alirezamon
        capture { $exit=run_cmd_in_back_ground($cmd) } \$stdout, \$stderr;
2211
 
2212
        return ($stdout,$exit,$stderr);
2213
 
2214
}
2215
 
2216
sub run_cmd_message_dialog_errors{
2217
        my ($cmd)=@_;
2218
        my ($stdout,$exit,$stderr)=run_cmd_in_back_ground_get_stdout($cmd);
2219
        if(length $stderr>1){
2220
                message_dialog("$stderr\n",'error');
2221
                return 1;
2222
        }if($exit){
2223
                message_dialog("Error $cmd failed: $stdout\n",'error');
2224
                return 1;
2225
        }
2226
        return 0;
2227
 
2228
}
2229
 
2230
 
2231
sub run_cmd_textview_errors{
2232
        my ($cmd,$tview)=@_;
2233
        my ($stdout,$exit,$stderr)=run_cmd_in_back_ground_get_stdout($cmd);
2234
        if(length $stderr>1){
2235
                add_colored_info($tview,"Error: $stderr\n",'red');
2236
                add_colored_info($tview,"$cmd did not run successfully!\n",'red');
2237
                return undef;
2238
        }
2239
        if($exit){
2240
                add_colored_info($tview,"Error:$stdout\n",'red');
2241
                add_colored_info($tview,"$cmd did not run successfully!\n",'red');
2242
                return undef;
2243
        }
2244
        $stdout = "" if (!defined $stdout);
2245
        return  $stdout
2246
}
2247
 
2248
 
2249
sub create_iconview_model {
2250
#----------------------------------------------------
2251
#The Iconview needs a Gtk3::Treemodel implementation-
2252
#containing at least a Glib::String and -------------
2253
#Gtk3::Gdk::Pixbuf type. The first is used for the --
2254
#text of the icon, and the last for the icon self----
2255
#Gtk3::ListStore is ideal for this ------------------
2256
#----------------------------------------------------
2257
        my ($self,$name,$ref)=@_;
2258
        my @sources= (defined $ref)? @{$ref}:();
2259
    my $list_store = Gtk3::ListStore->new(qw/Glib::String Gtk3::Gdk::Pixbuf Glib::String/);
2260
 
2261
    #******************************************************
2262
    #we populate the Gtk3::ListStore with Gtk3::Stock icons
2263
    #******************************************************
2264
 
2265
 
2266
 
2267
    foreach my $val(@sources){
2268
        #get the iconset from the icon_factory
2269
        #my $iconset = $icon_factory->lookup_default($val);
2270
        #try and extract the icon from it
2271
        add_icon_to_tree($self,$name,$list_store,$val);
2272
    }
2273
 
2274
    return $list_store;
2275
}
2276
 
2277
####################
2278
#       SourceView
2279
####################
2280
 
2281
sub     gen_SourceView_with_buffer{
2282
        return Gtk3::SourceView::View->new_with_buffer(@_);
2283
}
2284
 
2285
 
2286
 
2287
 
2288
 
2289
sub create_SourceView_buffer {
2290
        my $self = shift;
2291
        my $tags = Gtk3::TextTagTable->new();
2292
 
2293
        add_tag_to_SourceView($tags, search => {
2294
                        background => 'yellow',
2295
        });
2296
        add_tag_to_SourceView($tags, goto_line => {
2297
                        'paragraph-background' => 'orange',
2298
        });
2299
 
2300
        my $buffer = Gtk3::SourceView::Buffer->new($tags);
2301
        $buffer->signal_connect('notify::cursor-position' => sub {
2302
                $self->clear_highlighted();
2303
        });
2304
 
2305
        return $buffer;
2306
}
2307
 
2308
 
2309
sub add_tag_to_SourceView {
2310
        my ($tags, $name, $properties) = @_;
2311
 
2312
        my $tag = Gtk3::TextTag->new($name);
2313
        $tag->set(%{ $properties });
2314
        $tags->add($tag);
2315
}
2316
 
2317
 
2318
sub detect_language {
2319
        my $self = shift;
2320
        my ($filename) = @_;
2321
 
2322
        # Guess the programming language of the file
2323
        my $manager = Gtk3::SourceView::LanguageManager->get_default;
2324
        my $language = $manager->guess_language($filename);
2325
        $self->buffer->set_language($language);
2326
}
2327
 
2328
 
2329
sub get_pressed_key{
2330
        my $event=shift;
2331
        my $key = Gtk3::Gdk::keyval_name( $event->keyval );
2332
        return $key;
2333
}
2334
 
2335
 
2336
 
2337
 
2338
 
2339
 
2340
 
2341
 
2342
 
2343
1

powered by: WebSVN 2.1.0

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