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

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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