File Coverage

blib/lib/Tk/ForDummies/Graph/Lines.pm
Criterion Covered Total %
statement 15 15 100.0
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 20 20 100.0


line stmt bran cond sub pod time code
1             package Tk::ForDummies::Graph::Lines;
2            
3 1     1   5210 use warnings;
  1         2  
  1         36  
4 1     1   6 use strict;
  1         2  
  1         32  
5 1     1   5 use Carp;
  1         2  
  1         77  
6            
7             #==================================================================
8             # Author : Djibril Ousmanou
9             # Copyright : 2010
10             # Update : 19/06/2010 22:47:12
11             # AIM : Create line graph
12             #==================================================================
13            
14 1     1   6 use vars qw($VERSION);
  1         2  
  1         54  
15             $VERSION = '1.11';
16            
17 1     1   5 use base qw/ Tk::Derived Tk::Canvas::GradientColor /;
  1         2  
  1         721  
18             use Tk::Balloon;
19            
20             use Tk::ForDummies::Graph::Utils qw / :DUMMIES :DISPLAY /;
21             use Tk::ForDummies::Graph qw (:DUMMIES);
22            
23             Construct Tk::Widget 'Lines';
24            
25             sub Populate {
26            
27             my ( $CompositeWidget, $RefParameters ) = @_;
28            
29             # Get initial parameters
30             $CompositeWidget->{RefInfoDummies} = _InitConfig();
31            
32             $CompositeWidget->SUPER::Populate($RefParameters);
33            
34             $CompositeWidget->Advertise( 'GradientColor' => $CompositeWidget->SUPER::GradientColor );
35             $CompositeWidget->Advertise( 'canvas' => $CompositeWidget->SUPER::Canvas );
36             $CompositeWidget->Advertise( 'Canvas' => $CompositeWidget->SUPER::Canvas );
37            
38             # remove highlightthickness if necessary
39             unless ( exists $RefParameters->{-highlightthickness} ) {
40             $CompositeWidget->configure( -highlightthickness => 0 );
41             }
42            
43             # ConfigSpecs
44             $CompositeWidget->ConfigSpecs(
45             -title => [ 'PASSIVE', 'Title', 'Title', undef ],
46             -titlecolor => [ 'PASSIVE', 'Titlecolor', 'TitleColor', 'black' ],
47             -titlefont =>
48             [ 'PASSIVE', 'Titlefont', 'TitleFont', $CompositeWidget->{RefInfoDummies}->{Font}{DefaultTitle} ],
49             -titleposition => [ 'PASSIVE', 'Titleposition', 'TitlePosition', 'center' ],
50             -titleheight =>
51             [ 'PASSIVE', 'Titleheight', 'TitleHeight', $CompositeWidget->{RefInfoDummies}->{Title}{Height} ],
52            
53             -xlabel => [ 'PASSIVE', 'Xlabel', 'XLabel', undef ],
54             -xlabelcolor => [ 'PASSIVE', 'Xlabelcolor', 'XLabelColor', 'black' ],
55             -xlabelfont =>
56             [ 'PASSIVE', 'Xlabelfont', 'XLabelFont', $CompositeWidget->{RefInfoDummies}->{Font}{DefaultLabel} ],
57             -xlabelposition => [ 'PASSIVE', 'Xlabelposition', 'XLabelPosition', 'center' ],
58             -xlabelheight => [
59             'PASSIVE', 'Xlabelheight',
60             'XLabelHeight', $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{xlabelHeight}
61             ],
62             -xlabelskip => [ 'PASSIVE', 'Xlabelskip', 'XLabelSkip', 0 ],
63            
64             -xvaluecolor => [ 'PASSIVE', 'Xvaluecolor', 'XValueColor', 'black' ],
65             -xvaluevertical => [ 'PASSIVE', 'Xvaluevertical', 'XValueVertical', 0 ],
66             -xvaluespace => [
67             'PASSIVE', 'Xvaluespace',
68             'XValueSpace', $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{ScaleValuesHeight}
69             ],
70             -xvalueview => [ 'PASSIVE', 'Xvalueview', 'XValueView', 1 ],
71             -yvalueview => [ 'PASSIVE', 'Yvalueview', 'YValueView', 1 ],
72             -xvaluesregex => [ 'PASSIVE', 'Xvaluesregex', 'XValuesRegex', qr/.+/ ],
73            
74             -ylabel => [ 'PASSIVE', 'Ylabel', 'YLabel', undef ],
75             -ylabelcolor => [ 'PASSIVE', 'Ylabelcolor', 'YLabelColor', 'black' ],
76             -ylabelfont =>
77             [ 'PASSIVE', 'Ylabelfont', 'YLabelFont', $CompositeWidget->{RefInfoDummies}->{Font}{DefaultLabel} ],
78             -ylabelposition => [ 'PASSIVE', 'Ylabelposition', 'YLabelPosition', 'center' ],
79             -ylabelwidth => [
80             'PASSIVE', 'Ylabelwidth',
81             'YLabelWidth', $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{ylabelWidth}
82             ],
83            
84             -yvaluecolor => [ 'PASSIVE', 'Yvaluecolor', 'YValueColor', 'black' ],
85            
86             -labelscolor => [ 'PASSIVE', 'Labelscolor', 'LabelsColor', undef ],
87             -valuescolor => [ 'PASSIVE', 'Valuescolor', 'ValuesColor', undef ],
88             -textcolor => [ 'PASSIVE', 'Textcolor', 'TextColor', undef ],
89             -textfont => [ 'PASSIVE', 'Textfont', 'TextFont', undef ],
90            
91             -boxaxis => [ 'PASSIVE', 'Boxaxis', 'BoxAxis', 0 ],
92             -noaxis => [ 'PASSIVE', 'Noaxis', 'NoAxis', 0 ],
93             -zeroaxisonly => [ 'PASSIVE', 'Zeroaxisonly', 'ZeroAxisOnly', 0 ],
94             -zeroaxis => [ 'PASSIVE', 'Zeroaxis', 'ZeroAxis', 0 ],
95             -longticks => [ 'PASSIVE', 'Longticks', 'LongTicks', 0 ],
96            
97             -xtickheight => [
98             'PASSIVE', 'Xtickheight',
99             'XTickHeight', $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{TickHeight}
100             ],
101             -xtickview => [ 'PASSIVE', 'Xtickview', 'XTickView', 1 ],
102            
103             -yticknumber => [
104             'PASSIVE', 'Yticknumber',
105             'YTickNumber', $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{TickNumber}
106             ],
107             -ytickwidth =>
108             [ 'PASSIVE', 'Ytickwidth', 'YtickWidth', $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{TickWidth} ],
109             -ytickview => [ 'PASSIVE', 'Ytickview', 'YTickView', 1 ],
110            
111             -alltickview => [ 'PASSIVE', 'Alltickview', 'AllTickView', 1 ],
112            
113             -width => [ 'SELF', 'width', 'Width', $CompositeWidget->{RefInfoDummies}->{Canvas}{Width} ],
114             -height => [ 'SELF', 'height', 'Height', $CompositeWidget->{RefInfoDummies}->{Canvas}{Height} ],
115            
116             -linewidth => [ 'PASSIVE', 'Linewidth', 'LineWidth', 1 ],
117             -colordata =>
118             [ 'PASSIVE', 'Colordata', 'ColorData', $CompositeWidget->{RefInfoDummies}->{Legend}{Colors} ],
119            
120             # splined
121             -bezier => [ 'PASSIVE', 'Bezier', 'Bezier', 0 ],
122             -spline => [ 'PASSIVE', 'Spline', 'Spline', 0 ],
123             -dash => [ 'PASSIVE', 'Dash', 'Dash', undef ],
124            
125             # points
126             -pointline => [ 'PASSIVE', 'Pointline', 'PointLine', 0 ],
127             -markersize => [ 'PASSIVE', 'Markersize', 'MarkerSize', 8 ],
128             -markers => [ 'PASSIVE', 'Markers', 'Markers', [ 1 .. 8 ] ],
129             );
130            
131             $CompositeWidget->Delegates( DEFAULT => $CompositeWidget, );
132            
133             # recreate graph after widget resize
134             $CompositeWidget->enabled_automatic_redraw();
135             $CompositeWidget->disabled_gradientcolor();
136             }
137            
138             sub _Balloon {
139             my ($CompositeWidget) = @_;
140            
141             # balloon defined and user want to stop it
142             if ( defined $CompositeWidget->{RefInfoDummies}->{Balloon}{Obj}
143             and $CompositeWidget->{RefInfoDummies}->{Balloon}{State} == 0 )
144             {
145             $CompositeWidget->_DestroyBalloonAndBind();
146             return;
147             }
148            
149             # balloon not defined and user want to stop it
150             elsif ( $CompositeWidget->{RefInfoDummies}->{Balloon}{State} == 0 ) {
151             return;
152             }
153            
154             # balloon defined and user want to start it again (may be new option)
155             elsif ( defined $CompositeWidget->{RefInfoDummies}->{Balloon}{Obj}
156             and $CompositeWidget->{RefInfoDummies}->{Balloon}{State} == 1 )
157             {
158            
159             # destroy the balloon, it will be re create above
160             $CompositeWidget->_DestroyBalloonAndBind();
161             }
162            
163             # Balloon creation
164             $CompositeWidget->{RefInfoDummies}->{Balloon}{Obj} = $CompositeWidget->Balloon(
165             -statusbar => $CompositeWidget,
166             -background => $CompositeWidget->{RefInfoDummies}->{Balloon}{Background},
167             );
168             $CompositeWidget->{RefInfoDummies}->{Balloon}{Obj}->attach(
169             $CompositeWidget,
170             -balloonposition => 'mouse',
171             -msg => $CompositeWidget->{RefInfoDummies}->{Legend}{MsgBalloon},
172             );
173            
174             # no legend, no bind
175             unless ( my $LegendTextNumber = $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLegend} ) {
176             return;
177             }
178            
179             # bind legend and lines
180             for my $IndexLegend ( 1 .. $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLegend} ) {
181            
182             my $LegendTag = $IndexLegend . $CompositeWidget->{RefInfoDummies}->{TAGS}{Legend};
183             my $LineTag = $IndexLegend . $CompositeWidget->{RefInfoDummies}->{TAGS}{Line};
184            
185             $CompositeWidget->bind(
186             $LegendTag,
187             '',
188             sub {
189             my $OtherColor = $CompositeWidget->{RefInfoDummies}->{Balloon}{ColorData}->[0];
190            
191             # Change color if line have the same color
192             if ( $OtherColor eq $CompositeWidget->{RefInfoDummies}{Line}{$LineTag}{color} ) {
193             $OtherColor = $CompositeWidget->{RefInfoDummies}->{Balloon}{ColorData}->[1];
194             }
195            
196             # if -fill enabled
197             if ( $CompositeWidget->itemcget( $LineTag, -fill ) ) {
198             $CompositeWidget->itemconfigure( $LineTag, -fill => $OtherColor, );
199             }
200             $CompositeWidget->itemconfigure( $LineTag,
201             -width => $CompositeWidget->cget( -linewidth )
202             + $CompositeWidget->{RefInfoDummies}->{Balloon}{MorePixelSelected}, );
203            
204             # if -outline enabled
205             eval {
206             if ( $CompositeWidget->itemcget( $LineTag, -outline ) )
207             {
208             $CompositeWidget->itemconfigure( $LineTag, -outline => $OtherColor, );
209             }
210             };
211             }
212             );
213            
214             $CompositeWidget->bind(
215             $LegendTag,
216             '',
217             sub {
218             if ( $CompositeWidget->itemcget( $LineTag, -fill ) ) {
219             $CompositeWidget->itemconfigure( $LineTag,
220             -fill => $CompositeWidget->{RefInfoDummies}{Line}{$LineTag}{color}, );
221             }
222             $CompositeWidget->itemconfigure( $LineTag, -width => $CompositeWidget->cget( -linewidth ), );
223            
224             eval {
225             if ( $CompositeWidget->itemcget( $LineTag, -outline ) )
226             {
227             $CompositeWidget->itemconfigure( $LineTag,
228             -outline => $CompositeWidget->{RefInfoDummies}{Line}{$LineTag}{color}, );
229             }
230             };
231             }
232             );
233             }
234            
235             return;
236             }
237            
238             sub set_legend {
239             my ( $CompositeWidget, %InfoLegend ) = @_;
240            
241             my $RefLegend = $InfoLegend{-data};
242             unless ( defined $RefLegend ) {
243             $CompositeWidget->_error(
244             "Can't set -data in set_legend method. "
245             . "May be you forgot to set the value\n"
246             . "Ex : set_legend( -data => ['legend1', 'legend2', ...] );",
247             1
248             );
249             }
250            
251             unless ( defined $RefLegend and ref($RefLegend) eq 'ARRAY' ) {
252             $CompositeWidget->_error(
253             "Can't set -data in set_legend method. Bad data\n"
254             . "Ex : set_legend( -data => ['legend1', 'legend2', ...] );",
255             1
256             );
257             }
258            
259             if ( defined $InfoLegend{-title} ) {
260             $CompositeWidget->{RefInfoDummies}->{Legend}{title} = $InfoLegend{-title};
261             }
262             else {
263             undef $CompositeWidget->{RefInfoDummies}->{Legend}{title};
264             $CompositeWidget->{RefInfoDummies}->{Legend}{HeightTitle} = 5;
265             }
266             $CompositeWidget->{RefInfoDummies}->{Legend}{titlefont} = $InfoLegend{-titlefont}
267             || $CompositeWidget->{RefInfoDummies}->{Font}{DefaultLegendTitle};
268             $CompositeWidget->{RefInfoDummies}->{Legend}{legendfont} = $InfoLegend{-legendfont}
269             || $CompositeWidget->{RefInfoDummies}->{Font}{DefaultLegendTitle};
270            
271             if ( defined $InfoLegend{-box} and $InfoLegend{-box} =~ m{^\d+$} ) {
272             $CompositeWidget->{RefInfoDummies}->{Legend}{box} = $InfoLegend{-box};
273             }
274             if ( defined $InfoLegend{-titlecolors} ) {
275             $CompositeWidget->{RefInfoDummies}->{Legend}{titlecolors} = $InfoLegend{-titlecolors};
276             }
277             if ( defined $InfoLegend{-legendmarkerheight}
278             and $InfoLegend{-legendmarkerheight} =~ m{^\d+$} )
279             {
280             $CompositeWidget->{RefInfoDummies}->{Legend}{HCube} = $InfoLegend{-legendmarkerheight};
281             }
282             if ( defined $InfoLegend{-legendmarkerwidth}
283             and $InfoLegend{-legendmarkerwidth} =~ m{^\d+$} )
284             {
285             $CompositeWidget->{RefInfoDummies}->{Legend}{WCube} = $InfoLegend{-legendmarkerwidth};
286             }
287             if ( defined $InfoLegend{-heighttitle}
288             and $InfoLegend{-heighttitle} =~ m{^\d+$} )
289             {
290             $CompositeWidget->{RefInfoDummies}->{Legend}{HeightTitle} = $InfoLegend{-heighttitle};
291             }
292            
293             # Check legend and data size
294             if ( my $RefData = $CompositeWidget->{RefInfoDummies}->{Data}{RefAllData} ) {
295             $CompositeWidget->_CheckSizeLengendAndData( $RefData, $RefLegend );
296             }
297            
298             # Get the biggest length of legend text
299             my @LengthLegend = map { length; } @{$RefLegend};
300             my $BiggestLegend = _MaxArray( \@LengthLegend );
301            
302             # 100 pixel => 13 characters, 1 pixel => 0.13 pixels then 1 character = 7.69 pixels
303             $CompositeWidget->{RefInfoDummies}->{Legend}{WidthOneCaracter} = 7.69;
304            
305             # Max pixel width for a legend text for us
306             $CompositeWidget->{RefInfoDummies}->{Legend}{LengthTextMax}
307             = int( $CompositeWidget->{RefInfoDummies}->{Legend}{WidthText}
308             / $CompositeWidget->{RefInfoDummies}->{Legend}{WidthOneCaracter} );
309            
310             # We have free space
311             my $Diff = $CompositeWidget->{RefInfoDummies}->{Legend}{LengthTextMax} - $BiggestLegend;
312            
313             # Get new size width for a legend text with one pixel security
314             $CompositeWidget->{RefInfoDummies}->{Legend}{WidthText}
315             -= ( $Diff - 1 ) * $CompositeWidget->{RefInfoDummies}->{Legend}{WidthOneCaracter};
316            
317             # Store Reference data
318             $CompositeWidget->{RefInfoDummies}->{Legend}{DataLegend} = $RefLegend;
319             $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLegend} = scalar @{$RefLegend};
320            
321             return 1;
322             }
323            
324             sub _Legend {
325             my ( $CompositeWidget, $RefLegend ) = @_;
326            
327             # One legend width
328             $CompositeWidget->{RefInfoDummies}->{Legend}{LengthOneLegend}
329             = +$CompositeWidget->{RefInfoDummies}->{Legend}{SpaceBeforeCube} # space between each legend
330             + $CompositeWidget->{RefInfoDummies}->{Legend}{WCube} # width legend marker
331             + $CompositeWidget->{RefInfoDummies}->{Legend}{SpaceAfterCube} # space after marker
332             + $CompositeWidget->{RefInfoDummies}->{Legend}{WidthText} # legend text width allowed
333             ;
334            
335             # Number of legends per line
336             $CompositeWidget->{RefInfoDummies}->{Legend}{NbrPerLine}
337             = int( $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{Width}
338             / $CompositeWidget->{RefInfoDummies}->{Legend}{LengthOneLegend} );
339             $CompositeWidget->{RefInfoDummies}->{Legend}{NbrPerLine} = 1
340             if ( $CompositeWidget->{RefInfoDummies}->{Legend}{NbrPerLine} == 0 );
341            
342             # How many legend we will have
343             $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLegend}
344             = scalar @{ $CompositeWidget->{RefInfoDummies}->{Data}{RefAllData} } - 1;
345            
346             =for NumberLines:
347             We calculate the number of lines set for the legend graph.
348             It can set 11 legends per line, then for 3 legend, we will need one line
349             and for 12 legends, we will need 2 lines
350             If NbrLeg / NbrPerLine = integer => get number of lines
351             If NbrLeg / NbrPerLine = float => int(float) + 1 = get number of lines
352            
353             =cut
354            
355             $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLine}
356             = $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLegend}
357             / $CompositeWidget->{RefInfoDummies}->{Legend}{NbrPerLine};
358             unless (
359             int( $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLine} )
360             == $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLine} )
361             {
362             $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLine}
363             = int( $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLine} ) + 1;
364             }
365            
366             # Total Height of Legend
367             $CompositeWidget->{RefInfoDummies}->{Legend}{Height}
368             = $CompositeWidget->{RefInfoDummies}->{Legend}{HeightTitle} # Hauteur Titre légende
369             + $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLine}
370             * $CompositeWidget->{RefInfoDummies}->{Legend}{HLine};
371            
372             # Get number legend text max per line to reajust our graph
373             if ( $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLegend}
374             < $CompositeWidget->{RefInfoDummies}->{Legend}{NbrPerLine} )
375             {
376             $CompositeWidget->{RefInfoDummies}->{Legend}{NbrPerLine}
377             = $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLegend};
378             }
379            
380             return;
381             }
382            
383             sub _ViewLegend {
384             my ($CompositeWidget) = @_;
385            
386             # legend option
387             my $LegendTitle = $CompositeWidget->{RefInfoDummies}->{Legend}{title};
388             my $legendmarkercolors = $CompositeWidget->cget( -colordata );
389             my $legendfont = $CompositeWidget->{RefInfoDummies}->{Legend}{legendfont};
390             my $titlecolor = $CompositeWidget->{RefInfoDummies}->{Legend}{titlecolors};
391             my $titlefont = $CompositeWidget->{RefInfoDummies}->{Legend}{titlefont};
392            
393             if ( defined $LegendTitle ) {
394             my $xLegendTitle = $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin}
395             + $CompositeWidget->{RefInfoDummies}->{Legend}{SpaceBeforeCube};
396             my $yLegendTitle
397             = $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin}
398             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{TickHeight}
399             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{ScaleValuesHeight}
400             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{xlabelHeight};
401            
402             $CompositeWidget->createText(
403             $xLegendTitle,
404             $yLegendTitle,
405             -text => $LegendTitle,
406             -anchor => 'nw',
407             -font => $titlefont,
408             -fill => $titlecolor,
409             -width => $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{Width},
410             -tags => [
411             $CompositeWidget->{RefInfoDummies}->{TAGS}{TitleLegend},
412             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph},
413             ],
414             );
415             }
416            
417             # Display legend
418             my $IndexColor = 0;
419             my $IndexLegend = 0;
420             my $IndexMarker = 0;
421             $CompositeWidget->{RefInfoDummies}->{Legend}{GetIdLeg} = {};
422            
423             for my $NumberLine ( 0 .. $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLine} - 1 ) {
424             my $x1Cube = $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin}
425             + $CompositeWidget->{RefInfoDummies}->{Legend}{SpaceBeforeCube};
426             my $y1Cube
427             = ( $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin}
428             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{TickHeight}
429             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{ScaleValuesHeight}
430             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{xlabelHeight}
431             + $CompositeWidget->{RefInfoDummies}->{Legend}{HeightTitle}
432             + $CompositeWidget->{RefInfoDummies}->{Legend}{HLine} / 2 )
433             + $NumberLine * $CompositeWidget->{RefInfoDummies}->{Legend}{HLine};
434            
435             my $x2Cube = $x1Cube + $CompositeWidget->{RefInfoDummies}->{Legend}{WCube};
436             my $y2Cube = $y1Cube - $CompositeWidget->{RefInfoDummies}->{Legend}{HCube};
437             my $xText = $x2Cube + $CompositeWidget->{RefInfoDummies}->{Legend}{SpaceAfterCube};
438             my $yText = $y2Cube;
439             my $MaxLength = $CompositeWidget->{RefInfoDummies}->{Legend}{LengthTextMax};
440            
441             LEGEND:
442             for my $NumberLegInLine ( 0 .. $CompositeWidget->{RefInfoDummies}->{Legend}{NbrPerLine} - 1 ) {
443            
444             my $LineColor = $legendmarkercolors->[$IndexColor];
445             unless ( defined $LineColor ) {
446             $IndexColor = 0;
447             $LineColor = $legendmarkercolors->[$IndexColor];
448             }
449            
450             # Cut legend text if too long
451             my $Legende = $CompositeWidget->{RefInfoDummies}->{Legend}{DataLegend}->[$IndexLegend];
452             next unless ( defined $Legende );
453             my $NewLegend = $Legende;
454            
455             if ( length $NewLegend > $MaxLength ) {
456             $MaxLength -= 3;
457             $NewLegend =~ s/^(.{$MaxLength}).*/$1/;
458             $NewLegend .= '...';
459             }
460            
461             my $Tag = ( $IndexLegend + 1 ) . $CompositeWidget->{RefInfoDummies}->{TAGS}{Legend};
462            
463             if ( $CompositeWidget->cget( -pointline ) == 1 ) {
464             my $markersize = $CompositeWidget->cget( -markersize );
465             my $markers = $CompositeWidget->cget( -markers );
466             my $NumMarker = $markers->[$IndexMarker];
467             unless ( defined $NumMarker ) {
468             $IndexMarker = 0;
469             $NumMarker = $markers->[$IndexMarker];
470             }
471             my $RefType = $CompositeWidget->_GetMarkerType($NumMarker);
472             my %Option;
473             if ( $RefType->[1] == 1 ) {
474             $Option{-fill} = $LineColor;
475             }
476             if ( $NumMarker =~ m{^[125678]$} ) {
477             $Option{-outline} = $LineColor;
478             }
479             my $x = $x1Cube + ( ( $x2Cube - $x1Cube ) / 2 );
480             my $y = $y1Cube + ( ( $y2Cube - $y1Cube ) / 2 );
481             $Option{-tags} = [ $Tag, $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph}, ];
482             $CompositeWidget->_CreateType(
483             x => $x,
484             y => $y,
485             pixel => 10,
486             type => $RefType->[0],
487             option => \%Option,
488             );
489             $IndexMarker++;
490             }
491             else {
492             $CompositeWidget->createRectangle(
493             $x1Cube, $y1Cube, $x2Cube, $y2Cube,
494             -fill => $LineColor,
495             -outline => $LineColor,
496             -tags => [ $Tag, $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph}, ],
497             );
498            
499             }
500            
501             my $Id = $CompositeWidget->createText(
502             $xText, $yText,
503             -text => $NewLegend,
504             -anchor => 'nw',
505             -tags => [ $Tag, $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph}, ],
506             );
507             if ($legendfont) {
508             $CompositeWidget->itemconfigure( $Id, -font => $legendfont, );
509             }
510             $CompositeWidget->{RefInfoDummies}->{Legend}{GetIdLeg}{$Tag} = $IndexLegend;
511             $CompositeWidget->{RefInfoDummies}->{Legend}{GetIdLeg}{$Tag} = $IndexLegend;
512            
513             $IndexColor++;
514             $IndexLegend++;
515            
516             # cube
517             $x1Cube += $CompositeWidget->{RefInfoDummies}->{Legend}{LengthOneLegend};
518             $x2Cube += $CompositeWidget->{RefInfoDummies}->{Legend}{LengthOneLegend};
519            
520             # Text
521             $xText += $CompositeWidget->{RefInfoDummies}->{Legend}{LengthOneLegend};
522            
523             my $LineTag = $IndexLegend . $CompositeWidget->{RefInfoDummies}->{TAGS}{Line};
524             $CompositeWidget->{RefInfoDummies}->{Legend}{MsgBalloon}->{$Tag} = $Legende;
525             $CompositeWidget->{RefInfoDummies}->{Legend}{MsgBalloon}->{$LineTag} = $Legende;
526            
527             if ( $IndexLegend == $CompositeWidget->{RefInfoDummies}->{Legend}{NbrLegend} ) {
528             last LEGEND;
529             }
530             }
531            
532             }
533            
534             # box legend
535             my $x1Box = $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin};
536             my $y1Box
537             = $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin}
538             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{TickHeight}
539             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{ScaleValuesHeight}
540             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{xlabelHeight};
541             my $x2Box
542             = $x1Box
543             + ( $CompositeWidget->{RefInfoDummies}->{Legend}{NbrPerLine}
544             * $CompositeWidget->{RefInfoDummies}->{Legend}{LengthOneLegend} );
545            
546             # Reajuste box if width box < legend title text
547             my @InfoLegendTitle = $CompositeWidget->bbox( $CompositeWidget->{RefInfoDummies}->{TAGS}{TitleLegend} );
548             if ( $InfoLegendTitle[2] and $x2Box <= $InfoLegendTitle[2] ) {
549             $x2Box = $InfoLegendTitle[2] + 2;
550             }
551             my $y2Box = $y1Box + $CompositeWidget->{RefInfoDummies}->{Legend}{Height};
552             $CompositeWidget->createRectangle(
553             $x1Box, $y1Box, $x2Box, $y2Box,
554             -tags => [
555             $CompositeWidget->{RefInfoDummies}->{TAGS}{BoxLegend},
556             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph},
557             ]
558             );
559            
560             return;
561             }
562            
563             sub _axis {
564             my ($CompositeWidget) = @_;
565            
566             # x axis width
567             $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{Width}
568             = $CompositeWidget->{RefInfoDummies}->{Canvas}{Width}
569             - ( 2 * $CompositeWidget->{RefInfoDummies}->{Canvas}{WidthEmptySpace}
570             + $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{ylabelWidth}
571             + $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{ScaleValuesWidth}
572             + $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{TickWidth} );
573            
574             # get Height legend
575             if ( $CompositeWidget->{RefInfoDummies}->{Legend}{DataLegend} ) {
576             $CompositeWidget->_Legend( $CompositeWidget->{RefInfoDummies}->{Legend}{DataLegend} );
577             }
578            
579             # Height y axis
580             $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{Height}
581             = $CompositeWidget->{RefInfoDummies}->{Canvas}{Height} # Largeur canvas
582             - (
583             2 * $CompositeWidget->{RefInfoDummies}->{Canvas}{HeightEmptySpace} # 2 fois les espace vides
584             + $CompositeWidget->{RefInfoDummies}->{Title}{Height} # Hauteur du titre
585             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{TickHeight} # Hauteur tick (axe x)
586             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{ScaleValuesHeight} # Hauteur valeurs axe
587             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{xlabelHeight} # Hauteur x label
588             + $CompositeWidget->{RefInfoDummies}->{Legend}{Height} # Hauteur légende
589             );
590            
591             #===========================
592             # Y axis
593             # Set 2 points (CxMin, CyMin) et (CxMin, CyMax)
594             $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin} # Coordonnées CxMin
595             = $CompositeWidget->{RefInfoDummies}->{Canvas}{WidthEmptySpace} # Largeur vide
596             + $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{ylabelWidth} # Largeur label y
597             + $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{ScaleValuesWidth} # Largeur valeur axe y
598             + $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{TickWidth}; # Largeur tick axe y
599            
600             $CompositeWidget->{RefInfoDummies}->{Axis}{CyMax} # Coordonnées CyMax
601             = $CompositeWidget->{RefInfoDummies}->{Canvas}{HeightEmptySpace} # Hauteur vide
602             + $CompositeWidget->{RefInfoDummies}->{Title}{Height} # Hauteur titre
603             ;
604            
605             $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin} # Coordonnées CyMin
606             = $CompositeWidget->{RefInfoDummies}->{Axis}{CyMax} # Coordonnées CyMax (haut)
607             + $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{Height} # Hauteur axe Y
608             ;
609            
610             # display Y axis
611             $CompositeWidget->createLine(
612             $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin},
613             $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin},
614             $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin},
615             $CompositeWidget->{RefInfoDummies}->{Axis}{CyMax},
616             -tags => [
617             $CompositeWidget->{RefInfoDummies}->{TAGS}{yAxis},
618             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllAXIS},
619             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph},
620             ],
621             );
622            
623             #===========================
624             # X axis
625             # Set 2 points (CxMin,CyMin) et (CxMax,CyMin)
626             # ou (Cx0,Cy0) et (CxMax,Cy0)
627             $CompositeWidget->{RefInfoDummies}->{Axis}{CxMax} # Coordonnées CxMax
628             = $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin} # Coordonnées CxMin
629             + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{Width} # Largeur axe x
630             ;
631            
632             # Bottom x axis
633             $CompositeWidget->createLine(
634             $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin},
635             $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin},
636             $CompositeWidget->{RefInfoDummies}->{Axis}{CxMax},
637             $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin},
638             -tags => [
639             $CompositeWidget->{RefInfoDummies}->{TAGS}{xAxis},
640             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllAXIS},
641             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph},
642             ],
643             );
644            
645             # POINT (0,0)
646             # min positive value >= 0
647             if ( $CompositeWidget->{RefInfoDummies}->{Data}{MinYValue} >= 0 ) {
648             $CompositeWidget->{RefInfoDummies}->{Axis}{Cx0} = $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin};
649             $CompositeWidget->{RefInfoDummies}->{Axis}{Cy0} = $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin};
650            
651             $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{HeightUnit}
652             = $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{Height}
653             / ( $CompositeWidget->{RefInfoDummies}->{Data}{MaxYValue} - 0 );
654             }
655            
656             # min positive value < 0
657             else {
658            
659             $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{HeightUnit}
660             = $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{Height}
661             / ( $CompositeWidget->{RefInfoDummies}->{Data}{MaxYValue}
662             - $CompositeWidget->{RefInfoDummies}->{Data}{MinYValue} );
663             $CompositeWidget->{RefInfoDummies}->{Axis}{Cx0} = $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin};
664             $CompositeWidget->{RefInfoDummies}->{Axis}{Cy0}
665             = $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin}
666             + ( $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{HeightUnit}
667             * $CompositeWidget->{RefInfoDummies}->{Data}{MinYValue} );
668            
669             # X Axis (0,0)
670             $CompositeWidget->createLine(
671             $CompositeWidget->{RefInfoDummies}->{Axis}{Cx0},
672             $CompositeWidget->{RefInfoDummies}->{Axis}{Cy0},
673             $CompositeWidget->{RefInfoDummies}->{Axis}{CxMax},
674             $CompositeWidget->{RefInfoDummies}->{Axis}{Cy0},
675             -tags => [
676             $CompositeWidget->{RefInfoDummies}->{TAGS}{xAxis0},
677             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllAXIS},
678             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph},
679             ],
680             );
681             }
682            
683             return;
684             }
685            
686             sub _xtick {
687             my ($CompositeWidget) = @_;
688            
689             my $xvaluecolor = $CompositeWidget->cget( -xvaluecolor );
690             my $longticks = $CompositeWidget->cget( -longticks );
691            
692             # x coordinates y ticks on bottom x axis
693             my $Xtickx1 = $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin};
694             my $Xticky1 = $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin};
695            
696             # x coordinates y ticks on 0,0 x axis if the graph have only y value < 0
697             if ( $CompositeWidget->cget( -zeroaxisonly ) == 1
698             and $CompositeWidget->{RefInfoDummies}->{Data}{MaxYValue} > 0 )
699             {
700             $Xticky1 = $CompositeWidget->{RefInfoDummies}->{Axis}{Cy0};
701             }
702            
703             my $Xtickx2 = $Xtickx1;
704             my $Xticky2 = $Xticky1 + $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{TickHeight};
705            
706             # Coordinates of x values (first value)
707             my $XtickxValue = $CompositeWidget->{RefInfoDummies}->{Axis}{CxMin};
708             my $XtickyValue = $Xticky2 + ( $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{ScaleValuesHeight} / 2 );
709             my $NbrLeg = scalar( @{ $CompositeWidget->{RefInfoDummies}->{Data}{RefXLegend} } );
710            
711             my $xlabelskip = $CompositeWidget->cget( -xlabelskip );
712            
713             # index of tick and vlaues that will be skip
714             my %IndiceToSkip;
715             if ( defined $xlabelskip ) {
716             for ( my $i = 1; $i <= $NbrLeg; $i++ ) {
717             $IndiceToSkip{$i} = 1;
718             $i += $xlabelskip;
719             }
720             }
721            
722             for ( my $Indice = 1; $Indice <= $NbrLeg; $Indice++ ) {
723             my $data = $CompositeWidget->{RefInfoDummies}->{Data}{RefXLegend}->[ $Indice - 1 ];
724            
725             # tick
726             $Xtickx1 += $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{SpaceBetweenTick};
727             $Xtickx2 = $Xtickx1;
728            
729             # tick legend
730             $XtickxValue += $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{SpaceBetweenTick};
731             my $RegexXtickselect = $CompositeWidget->cget( -xvaluesregex );
732            
733             if ( $data =~ m{$RegexXtickselect} ) {
734             next unless ( defined $IndiceToSkip{$Indice} );
735            
736             # Long tick
737             if ( defined $longticks and $longticks == 1 ) {
738             $Xticky1 = $CompositeWidget->{RefInfoDummies}->{Axis}{CyMax};
739             $Xticky2 = $CompositeWidget->{RefInfoDummies}->{Axis}{CyMin};
740             }
741            
742             $CompositeWidget->createLine(
743             $Xtickx1, $Xticky1, $Xtickx2, $Xticky2,
744             -tags => [
745             $CompositeWidget->{RefInfoDummies}->{TAGS}{xTick},
746             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTick},
747             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph},
748             ],
749             );
750             $CompositeWidget->createText(
751             $XtickxValue,
752             $XtickyValue,
753             -text => $data,
754             -fill => $xvaluecolor,
755             -tags => [
756             $CompositeWidget->{RefInfoDummies}->{TAGS}{xValues},
757             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllValues},
758             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph},
759             ],
760             );
761             }
762             }
763            
764             return;
765             }
766            
767             sub _ViewDataLines {
768             my ($CompositeWidget) = @_;
769            
770             my $legendmarkercolors = $CompositeWidget->cget( -colordata );
771             my $bezier = $CompositeWidget->cget( -bezier );
772             my $spline = $CompositeWidget->cget( -spline );
773             my $dash = $CompositeWidget->cget( -dash );
774            
775             # number of value for x axis
776             $CompositeWidget->{RefInfoDummies}->{Data}{xtickNumber}
777             = $CompositeWidget->{RefInfoDummies}->{Data}{NumberXValues};
778            
779             # Space between x ticks
780             $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{SpaceBetweenTick}
781             = $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{Width}
782             / ( $CompositeWidget->{RefInfoDummies}->{Data}{xtickNumber} + 1 );
783            
784             my $IdData = 0;
785             my $IndexColor = 0;
786             foreach my $RefArrayData ( @{ $CompositeWidget->{RefInfoDummies}->{Data}{RefAllData} } ) {
787             if ( $IdData == 0 ) {
788             $IdData++;
789             next;
790             }
791             my $NumberData = 1; # Number of data
792             my @PointsData; # coordinate x and y
793             foreach my $data ( @{$RefArrayData} ) {
794             unless ( defined $data ) {
795             $NumberData++;
796             next;
797             }
798            
799             # coordinates x and y values
800             my $x = $CompositeWidget->{RefInfoDummies}->{Axis}{Cx0}
801             + $NumberData * $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{SpaceBetweenTick};
802             my $y = $CompositeWidget->{RefInfoDummies}->{Axis}{Cy0}
803             - ( $data * $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{HeightUnit} );
804             push( @PointsData, ( $x, $y ) );
805             $NumberData++;
806             }
807             my $LineColor = $legendmarkercolors->[$IndexColor];
808             unless ( defined $LineColor ) {
809             $IndexColor = 0;
810             $LineColor = $legendmarkercolors->[$IndexColor];
811             }
812             my $tag = $IdData . $CompositeWidget->{RefInfoDummies}->{TAGS}{Line};
813            
814             # Add control points
815             my @PointsDataWithoutControlPoints;
816             if ( $spline == 1 and $bezier == 1 ) {
817             @PointsDataWithoutControlPoints = @PointsData;
818             my $RefPointsData = $CompositeWidget->_GetControlPoints( \@PointsData );
819             @PointsData = @{$RefPointsData};
820             }
821            
822             $CompositeWidget->createLine(
823             @PointsData,
824             -fill => $LineColor,
825             -tags => [
826             $tag,
827             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllData},
828             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph},
829             ],
830             -width => $CompositeWidget->cget( -linewidth ),
831             -smooth => $bezier,
832             -dash => $dash,
833             );
834            
835             # Display values above each points of lines
836             my $LineNumber = $IdData - 1;
837             if (@PointsDataWithoutControlPoints) {
838             @PointsData = @PointsDataWithoutControlPoints;
839             @PointsDataWithoutControlPoints = ();
840             undef @PointsDataWithoutControlPoints;
841             }
842            
843             if ( !( $spline == 0 and $bezier == 1 ) ) {
844             $CompositeWidget->_display_line( \@PointsData, $LineNumber );
845             }
846            
847             $CompositeWidget->{RefInfoDummies}{Line}{$tag}{color} = $LineColor;
848            
849             $IdData++;
850             $IndexColor++;
851             }
852            
853             if ( $spline == 0 and $bezier == 1 and $CompositeWidget->{RefInfoDummies}->{Data}{RefDataToDisplay} ) {
854             $CompositeWidget->_error(
855             'The values are not displayed because the curve crosses only by the extreme points.');
856             }
857            
858             return 1;
859             }
860            
861             sub _ViewDataPoints {
862             my ($CompositeWidget) = @_;
863            
864             my $legendmarkercolors = $CompositeWidget->cget( -colordata );
865             my $markersize = $CompositeWidget->cget( -markersize );
866             my $markers = $CompositeWidget->cget( -markers );
867            
868             # number of value for x axis
869             $CompositeWidget->{RefInfoDummies}->{Data}{xtickNumber}
870             = $CompositeWidget->{RefInfoDummies}->{Data}{NumberXValues};
871            
872             # Space between x ticks
873             $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{SpaceBetweenTick}
874             = $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{Width}
875             / ( $CompositeWidget->{RefInfoDummies}->{Data}{xtickNumber} + 1 );
876            
877             my $IdData = 0;
878             my $IndexColor = 0;
879             my $IndexMarker = 0;
880             foreach my $RefArrayData ( @{ $CompositeWidget->{RefInfoDummies}->{Data}{RefAllData} } ) {
881             if ( $IdData == 0 ) {
882             $IdData++;
883             next;
884             }
885            
886             my $LineColor = $legendmarkercolors->[$IndexColor];
887             my $NumMarker = $markers->[$IndexMarker];
888             unless ( defined $LineColor ) {
889             $IndexColor = 0;
890             $LineColor = $legendmarkercolors->[$IndexColor];
891             }
892             unless ( defined $NumMarker ) {
893             $IndexMarker = 0;
894             $NumMarker = $markers->[$IndexMarker];
895             }
896             my $tag = $IdData . $CompositeWidget->{RefInfoDummies}->{TAGS}{Line};
897             $CompositeWidget->{RefInfoDummies}{Line}{$tag}{color} = $LineColor;
898            
899             my $NumberData = 1; # Number of data
900             my @PointsData; # coordinate x and y
901             foreach my $data ( @{$RefArrayData} ) {
902             unless ( defined $data ) {
903             $NumberData++;
904             next;
905             }
906            
907             # coordinates x and y values
908             my $x = $CompositeWidget->{RefInfoDummies}->{Axis}{Cx0}
909             + $NumberData * $CompositeWidget->{RefInfoDummies}->{Axis}{Xaxis}{SpaceBetweenTick};
910             my $y = $CompositeWidget->{RefInfoDummies}->{Axis}{Cy0}
911             - ( $data * $CompositeWidget->{RefInfoDummies}->{Axis}{Yaxis}{HeightUnit} );
912            
913             my %Option = (
914             -tags => [
915             $tag,
916             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllData},
917             $CompositeWidget->{RefInfoDummies}->{TAGS}{AllTagsDummiesGraph},
918             ],
919             -width => $CompositeWidget->cget( -linewidth ),
920             );
921             my $RefType = $CompositeWidget->_GetMarkerType($NumMarker);
922             if ( $RefType->[1] == 1 ) {
923             $Option{-fill} = $LineColor;
924             }
925             if ( $NumMarker =~ m{^[125678]$} ) {
926             $Option{-outline} = $LineColor;
927             }
928            
929             $CompositeWidget->_CreateType(
930             x => $x,
931             y => $y,
932             pixel => $markersize,
933             type => $RefType->[0],
934             option => \%Option,
935             );
936             $NumberData++;
937             push( @PointsData, ( $x, $y ) );
938             }
939            
940             # Display values above each points of lines
941             my $LineNumber = $IdData - 1;
942             $CompositeWidget->_display_line( \@PointsData, $LineNumber );
943            
944             $IdData++;
945             $IndexColor++;
946             $IndexMarker++;
947             }
948            
949             return 1;
950             }
951            
952             sub plot {
953             my ( $CompositeWidget, $RefData, %option ) = @_;
954            
955             my $yticknumber = $CompositeWidget->cget( -yticknumber );
956            
957             if ( defined $option{-substitutionvalue}
958             and _isANumber( $option{-substitutionvalue} ) )
959             {
960             $CompositeWidget->{RefInfoDummies}->{Data}{SubstitutionValue} = $option{-substitutionvalue};
961             }
962            
963             unless ( defined $RefData ) {
964             $CompositeWidget->_error('data not defined');
965             return;
966             }
967            
968             unless ( scalar @{$RefData} > 1 ) {
969             $CompositeWidget->_error('You must have at least 2 arrays');
970             return;
971             }
972            
973             # Check legend and data size
974             if ( my $RefLegend = $CompositeWidget->{RefInfoDummies}->{Legend}{DataLegend} ) {
975             $CompositeWidget->_CheckSizeLengendAndData( $RefData, $RefLegend );
976             }
977            
978             # Check array size
979             $CompositeWidget->{RefInfoDummies}->{Data}{NumberXValues} = scalar @{ $RefData->[0] };
980             my $i = 0;
981             foreach my $RefArray ( @{$RefData} ) {
982             unless ( scalar @{$RefArray} == $CompositeWidget->{RefInfoDummies}->{Data}{NumberXValues} ) {
983             $CompositeWidget->_error( 'Make sure that every array has the same size in plot data method', 1 );
984             return;
985             }
986            
987             # Get min and max size
988             if ( $i != 0 ) {
989            
990             # substitute none real value
991             foreach my $data ( @{$RefArray} ) {
992             if ( defined $data and !_isANumber($data) ) {
993             $data = $CompositeWidget->{RefInfoDummies}->{Data}{SubstitutionValue};
994             }
995             }
996            
997             $CompositeWidget->{RefInfoDummies}->{Data}{MaxYValue}
998             = _MaxArray( [ $CompositeWidget->{RefInfoDummies}->{Data}{MaxYValue}, _MaxArray($RefArray) ] );
999             $CompositeWidget->{RefInfoDummies}->{Data}{MinYValue}
1000             = _MinArray( [ $CompositeWidget->{RefInfoDummies}->{Data}{MinYValue}, _MinArray($RefArray) ] );
1001             }
1002             $i++;
1003             }
1004             $CompositeWidget->{RefInfoDummies}->{Data}{RefXLegend} = $RefData->[0];
1005             $CompositeWidget->{RefInfoDummies}->{Data}{RefAllData} = $RefData;
1006             $CompositeWidget->{RefInfoDummies}->{Data}{PlotDefined} = 1;
1007            
1008             if ( $CompositeWidget->{RefInfoDummies}->{Data}{MinYValue} > 0 ) {
1009             $CompositeWidget->{RefInfoDummies}->{Data}{MinYValue} = 0;
1010             }
1011            
1012             while ( ( $CompositeWidget->{RefInfoDummies}->{Data}{MaxYValue} / $yticknumber ) % 5 != 0 ) {
1013             $CompositeWidget->{RefInfoDummies}->{Data}{MaxYValue}
1014             = int( $CompositeWidget->{RefInfoDummies}->{Data}{MaxYValue} + 1 );
1015             }
1016            
1017             $CompositeWidget->_GraphForDummiesConstruction;
1018            
1019             return 1;
1020             }
1021            
1022             1;
1023            
1024             __END__