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 48

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

powered by: WebSVN 2.1.0

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