File Coverage

blib/lib/Tk/Chart.pm
Criterion Covered Total %
statement 21 451 4.6
branch 0 186 0.0
condition 0 141 0.0
subroutine 7 26 26.9
pod n/a
total 28 804 3.4


line stmt bran cond sub pod time code
1             package Tk::Chart;
2            
3             #==================================================================
4             # $Author : Djibril Ousmanou $
5             # $Copyright : 2018 $
6             # $Update : 09/02/2018 $
7             # $AIM : Private functions for Tk::Chart modules $
8             #==================================================================
9            
10 1     1   54421 use strict;
  1         2  
  1         23  
11 1     1   4 use warnings;
  1         1  
  1         18  
12 1     1   4 use Carp;
  1         1  
  1         44  
13 1     1   378 use Tk::Chart::Utils qw / :DUMMIES /;
  1         1  
  1         187  
14            
15 1     1   6 use vars qw($VERSION);
  1         1  
  1         42  
16             $VERSION = '1.22';
17            
18 1     1   5 use Exporter;
  1         1  
  1         51  
19            
20             my @module_export = qw (
21             _treatparameters _initconfig _error
22             _checksizelegend_data _zoomcalcul _destroyballoon_bind
23             _createtype _getmarkertype _display_line
24             _box _title _xlabelposition
25             _ylabelposition _ytick _chartconstruction
26             _manage_minmaxvalues _display_xticks _display_yticks
27             _get_configspecs
28             );
29            
30 1     1   4 use base qw/ Exporter /;
  1         2  
  1         5291  
31            
32             our @EXPORT_OK = @module_export;
33             our %EXPORT_TAGS = ( DUMMIES => \@module_export );
34             my $DASH = q{.};
35             my ( $MIN_ANGLE, $MAX_ANGLE ) = ( 0, 360 );
36             my $BORDERWITH_PLUS = 15;
37             my $PERCENT = 100;
38            
39             sub _get_configspecs {
40            
41 0     0     my $ref_config = _initconfig();
42            
43             my %configuration = (
44             -title => [ 'PASSIVE', 'Title', 'Title', undef ],
45             -titlecolor => [ 'PASSIVE', 'Titlecolor', 'TitleColor', 'black' ],
46             -titlefont => [ 'PASSIVE', 'Titlefont', 'TitleFont', $ref_config->{Font}{DefaultTitle} ],
47             -titleposition => [ 'PASSIVE', 'Titleposition', 'TitlePosition', 'center' ],
48             -titleheight => [ 'PASSIVE', 'Titleheight', 'TitleHeight', $ref_config->{Title}{Height} ],
49            
50             -xlabel => [ 'PASSIVE', 'Xlabel', 'XLabel', undef ],
51             -xlabelcolor => [ 'PASSIVE', 'Xlabelcolor', 'XLabelColor', 'black' ],
52             -xlabelfont => [ 'PASSIVE', 'Xlabelfont', 'XLabelFont', $ref_config->{Font}{DefaultLabel} ],
53             -xlabelposition => [ 'PASSIVE', 'Xlabelposition', 'XLabelPosition', 'center' ],
54             -xlabelheight => [ 'PASSIVE', 'Xlabelheight', 'XLabelHeight', $ref_config->{Axis}{Xaxis}{xlabelHeight} ],
55             -xlabelskip => [ 'PASSIVE', 'Xlabelskip', 'XLabelSkip', 0 ],
56            
57             -xvaluecolor => [ 'PASSIVE', 'Xvaluecolor', 'XValueColor', 'black' ],
58             -xvaluefont => [ 'PASSIVE', 'Xvaluefont', 'XValueFont', $ref_config->{Font}{DefaultXValues} ],
59             -xvaluesregex => [ 'PASSIVE', 'Xvaluesregex', 'XValuesRegex', qr/.+/ ],
60             -xvaluespace => [ 'PASSIVE', 'Xvaluespace', 'XValueSpace', $ref_config->{Axis}{Xaxis}{ScaleValuesHeight} ],
61             -xvaluevertical => [ 'PASSIVE', 'Xvaluevertical', 'XValueVertical', 0 ],
62             -xvalueview => [ 'PASSIVE', 'Xvalueview', 'XValueView', 1 ],
63             -yvaluefont => [ 'PASSIVE', 'Yvaluefont', 'YValueFont', $ref_config->{Font}{DefaultYValues} ],
64             -yvalueview => [ 'PASSIVE', 'Yvalueview', 'YValueView', 1 ],
65            
66             -ylabel => [ 'PASSIVE', 'Ylabel', 'YLabel', undef ],
67             -ylabelcolor => [ 'PASSIVE', 'Ylabelcolor', 'YLabelColor', 'black' ],
68             -ylabelfont => [ 'PASSIVE', 'Ylabelfont', 'YLabelFont', $ref_config->{Font}{DefaultLabel} ],
69             -ylabelposition => [ 'PASSIVE', 'Ylabelposition', 'YLabelPosition', 'center' ],
70             -ylabelwidth => [ 'PASSIVE', 'Ylabelwidth', 'YLabelWidth', $ref_config->{Axis}{Yaxis}{ylabelWidth} ],
71            
72             -yvaluecolor => [ 'PASSIVE', 'Yvaluecolor', 'YValueColor', 'black' ],
73            
74             -labelscolor => [ 'PASSIVE', 'Labelscolor', 'LabelsColor', undef ],
75             -valuescolor => [ 'PASSIVE', 'Valuescolor', 'ValuesColor', undef ],
76             -textcolor => [ 'PASSIVE', 'Textcolor', 'TextColor', undef ],
77             -textfont => [ 'PASSIVE', 'Textfont', 'TextFont', undef ],
78            
79             -axiscolor => [ 'PASSIVE', 'Axiscolor', 'AxisColor', 'black' ],
80             -boxaxis => [ 'PASSIVE', 'Boxaxis', 'BoxAxis', 0 ],
81             -noaxis => [ 'PASSIVE', 'Noaxis', 'NoAxis', 0 ],
82             -zeroaxisonly => [ 'PASSIVE', 'Zeroaxisonly', 'ZeroAxisOnly', 0 ],
83             -zeroaxis => [ 'PASSIVE', 'Zeroaxis', 'ZeroAxis', 0 ],
84             -longticks => [ 'PASSIVE', 'Longticks', 'LongTicks', 0 ],
85            
86             -xlongticks => [ 'PASSIVE', 'XLongticks', 'XLongTicks', 0 ],
87             -ylongticks => [ 'PASSIVE', 'YLongticks', 'YLongTicks', 0 ],
88             -xlongtickscolor => [ 'PASSIVE', 'XLongtickscolor', 'XLongTicksColor', '#B3B3B3' ],
89             -ylongtickscolor => [ 'PASSIVE', 'YLongtickscolor', 'YLongTicksColor', '#B3B3B3' ],
90             -longtickscolor => [ 'PASSIVE', 'Longtickscolor', 'LongTicksColor', undef ],
91            
92             -xtickheight => [ 'PASSIVE', 'Xtickheight', 'XTickHeight', $ref_config->{Axis}{Xaxis}{TickHeight} ],
93             -xtickview => [ 'PASSIVE', 'Xtickview', 'XTickView', 1 ],
94            
95             -yminvalue => [ 'PASSIVE', 'Yminvalue', 'YMinValue', 0 ],
96             -ymaxvalue => [ 'PASSIVE', 'Ymaxvalue', 'YMaxValue', undef ],
97             -interval => [ 'PASSIVE', 'interval', 'Interval', 0 ],
98            
99             # image size
100             -width => [ 'SELF', 'width', 'Width', $ref_config->{Canvas}{Width} ],
101             -height => [ 'SELF', 'height', 'Height', $ref_config->{Canvas}{Height} ],
102            
103             -yticknumber => [ 'PASSIVE', 'Yticknumber', 'YTickNumber', $ref_config->{Axis}{Yaxis}{TickNumber} ],
104             -ytickwidth => [ 'PASSIVE', 'Ytickwidth', 'YtickWidth', $ref_config->{Axis}{Yaxis}{TickWidth} ],
105             -ytickview => [ 'PASSIVE', 'Ytickview', 'YTickView', 1 ],
106            
107             -alltickview => [ 'PASSIVE', 'Alltickview', 'AllTickView', 1 ],
108            
109             -linewidth => [ 'PASSIVE', 'Linewidth', 'LineWidth', 1 ],
110             -colordata => [ 'PASSIVE', 'Colordata', 'ColorData', $ref_config->{Legend}{Colors} ],
111            
112 0           -legendfont => [ 'PASSIVE', 'Legendfont', 'LegendFont', $ref_config->{Legend}{legendfont} ],
113            
114             # verbose mode
115             -verbose => [ 'PASSIVE', 'verbose', 'Verbose', 1 ],
116             );
117            
118 0           return \%configuration;
119             }
120            
121             sub _initconfig {
122 0     0     my $cw = shift;
123 0           my %configuration = (
124             'Axis' => {
125             Cx0 => undef,
126             Cx0 => undef,
127             CxMin => undef,
128             CxMax => undef,
129             CyMin => undef,
130             CyMax => undef,
131             Xaxis => {
132             Width => undef,
133             Height => undef,
134             xlabelHeight => 30,
135             ScaleValuesHeight => 30,
136             TickHeight => 5,
137             CxlabelX => undef,
138             CxlabelY => undef,
139             Idxlabel => undef,
140             IdxTick => undef,
141             TagAxis0 => 'Axe00',
142             },
143             Yaxis => {
144             ylabelWidth => 5,
145             ScaleValuesWidth => 60,
146             TickWidth => 5,
147             TickNumber => 4,
148             Width => undef,
149             Height => undef,
150             CylabelX => undef,
151             CylabelY => undef,
152             Idylabel => undef,
153             },
154             },
155             'Balloon' => {
156             Obj => undef,
157             Message => {},
158             State => 0,
159             ColorData => [ '#000000', '#CB89D3' ],
160             MorePixelSelected => 2,
161             Background => 'snow',
162             BalloonMsg => undef,
163             IdLegData => undef,
164             },
165             'Canvas' => {
166             Height => 400,
167             Width => 400,
168             HeightEmptySpace => 20,
169             WidthEmptySpace => 20,
170             YTickWidth => 2,
171             },
172             'Data' => {
173             RefXLegend => undef,
174             RefAllData => undef,
175             PlotDefined => undef,
176             MaxYValue => undef,
177             MinYValue => undef,
178             GetIdData => {},
179             SubstitutionValue => 0,
180             NumberRealData => undef,
181             RefDataToDisplay => undef,
182             RefOptionDataToDisplay => undef,
183             },
184             'Font' => {
185             Default => '{Times} 10 {normal}',
186             DefaultTitle => '{Times} 12 {bold}',
187             DefaultLabel => '{Times} 10 {bold}',
188             DefaultXValues => '{Times} 8 {normal}',
189             DefaultYValues => '{Times} 8 {normal}',
190             DefaultLegend => '{Times} 8 {normal}',
191             DefaultLegendTitle => '{Times} 8 {bold}',
192             DefaultBarValues => '{Times} 8 {normal}',
193             },
194             'Legend' => {
195             HeightTitle => 30,
196             HLine => 20,
197             WCube => 10,
198             HCube => 10,
199             SpaceBeforeCube => 5,
200             SpaceAfterCube => 5,
201             WidthText => 250,
202             NbrLegPerLine => undef,
203             '-width' => undef,
204             Height => 0,
205             Width => undef,
206             LengthOneLegend => undef,
207             DataLegend => undef,
208             LengthTextMax => undef,
209             GetIdLeg => {},
210             title => undef,
211             titlefont => '{Times} 12 {bold}',
212             titlecolors => 'black',
213             textcolor => 'black',
214             legendcolor => 'black',
215             Colors => [
216             'red', 'green', 'blue', 'yellow', 'purple', 'cyan', '#996600', '#99A6CC',
217             '#669933', '#929292', '#006600', '#FFE100', '#00A6FF', '#009060', '#B000E0', '#A08000',
218             'orange', 'brown', 'black', '#FFCCFF', '#99CCFF', '#FF00CC', '#FF8000', '#006090',
219             ],
220             NbrLegend => 0,
221             box => 0,
222             legendfont => '{Times} 8 {normal}',
223             },
224             'TAGS' => {
225             AllTagsChart => '_AllTagsChart',
226             AllAXIS => '_AllAXISTag',
227             yAxis => '_yAxisTag',
228             xAxis => '_xAxisTag',
229             'xAxis0' => '_0AxisTag',
230             BoxAxis => '_BoxAxisTag',
231             xTick => '_xTickTag',
232             yTick => '_yTickTag',
233             AllTick => '_AllTickTag',
234             'xValue0' => '_xValue0Tag',
235             xValues => '_xValuesTag',
236             yValues => '_yValuesTag',
237             AllValues => '_AllValuesTag',
238             TitleLegend => '_TitleLegendTag',
239             BoxLegend => '_BoxLegendTag',
240             AllData => '_AllDataTag',
241             AllPie => '_AllPieTag',
242             Area => '_AreaTag',
243             Pie => '_PieTag',
244             PointLine => '_PointLineTag',
245             Line => '_LineTag',
246             Point => '_PointTag',
247             Bar => '_BarTag',
248             Mixed => '_MixedTag',
249             Legend => '_LegendTag',
250             DashLines => '_DashLineTag',
251             AllBars => '_AllBars',
252             BarValues => '_BarValuesTag',
253             Boxplot => '_BoxplotTag',
254             },
255             'Title' => {
256             Ctitrex => undef,
257             Ctitrey => undef,
258             IdTitre => undef,
259             '-width' => undef,
260             Width => undef,
261             Height => 40,
262             },
263             'Zoom' => {
264             CurrentX => 100,
265             CurrentY => 100,
266             },
267             'Mixed' => { DisplayOrder => [qw/ areas bars lines dashlines points /], },
268             );
269            
270 0           return \%configuration;
271             }
272            
273             sub _treatparameters {
274 0     0     my ($cw) = @_;
275            
276 0           my @integer_option = qw /
277             -xlabelheight -xlabelskip -xvaluespace -ylabelwidth
278             -boxaxis -noaxis -zeroaxisonly -xtickheight
279             -xtickview -yticknumber -ytickwidth -linewidth
280             -alltickview -xvaluevertical -titleheight -gridview
281             -ytickview -overwrite -cumulate -spacingbar
282             -showvalues -startangle -viewsection -zeroaxis
283             -longticks -markersize -pointline
284             -smoothline -spline -bezier
285             -interval -xlongticks -ylongticks -setlegend
286             -piesize -cumulatepercent
287             /;
288            
289 0           foreach my $option_name (@integer_option) {
290 0           my $data = $cw->cget($option_name);
291 0 0 0       if ( ( defined $data ) and ( !_isainteger($data) ) ) {
292 0           $cw->_error( "Can't set $option_name to '$data', $data' isn't numeric", 1 );
293 0           return;
294             }
295             }
296            
297 0           my $xvaluesregex = $cw->cget( -xvaluesregex );
298 0 0 0       if ( ( defined $xvaluesregex ) and ( ref $xvaluesregex ne 'Regexp' ) ) {
299 0           $cw->_error(
300             "Can't set -xvaluesregex to '$xvaluesregex', $xvaluesregex' is not a regex expression\nEx : -xvaluesregex => qr/my regex/;",
301             1
302             );
303 0           return;
304             }
305            
306 0           my $gradient = $cw->cget( -gradient );
307 0 0 0       if ( ( defined $gradient ) and ( ref $gradient ne 'HASH' ) ) {
308 0           $cw->_error( "Can't set -gradient to '$gradient', " . "$gradient' is not a hash reference expression\n",
309             1 );
310 0           return;
311             }
312            
313 0           my $colors = $cw->cget( -colordata );
314 0 0 0       if ( ( defined $colors ) and ( ref $colors ne 'ARRAY' ) ) {
315 0           $cw->_error(
316             "Can't set -colordata to '$colors', '$colors' is not an array reference\nEx : -colordata => ['blue','#2400FF',...]",
317             1
318             );
319 0           return;
320             }
321 0           my $markers = $cw->cget( -markers );
322 0 0 0       if ( ( defined $markers ) and ( ref $markers ne 'ARRAY' ) ) {
323 0           $cw->_error(
324             "Can't set -markers to '$markers', $markers' is not an array reference\nEx : -markers => [5,8,2]", 1 );
325            
326 0           return;
327             }
328 0           my $type_mixed = $cw->cget( -typemixed );
329 0 0 0       if ( ( defined $type_mixed ) and ( ref $type_mixed ne 'ARRAY' ) ) {
330 0           $cw->_error(
331             "Can't set -typemixed to '$type_mixed', $type_mixed' is not an array reference\nEx : -typemixed => ['bars','lines',...]",
332             1
333             );
334            
335 0           return;
336             }
337            
338 0 0         if ( my $xtickheight = $cw->cget( -xtickheight ) ) {
339 0           $cw->{RefChart}->{Axis}{Xaxis}{TickHeight} = $xtickheight;
340             }
341            
342             # -smoothline deprecated, use -bezier
343 0 0         if ( my $smoothline = $cw->cget( -smoothline ) ) {
344 0           $cw->configure( -bezier => $smoothline );
345             }
346            
347 0 0         if ( my $xvaluespace = $cw->cget( -xvaluespace ) ) {
348 0           $cw->{RefChart}->{Axis}{Xaxis}{ScaleValuesHeight} = $xvaluespace;
349             }
350            
351 0 0 0       if ( my $noaxis = $cw->cget( -noaxis ) and $cw->cget( -noaxis ) == 1 ) {
352 0           $cw->{RefChart}->{Axis}{Xaxis}{ScaleValuesHeight} = 0;
353 0           $cw->{RefChart}->{Axis}{Yaxis}{ScaleValuesWidth} = 0;
354 0           $cw->{RefChart}->{Axis}{Yaxis}{TickWidth} = 0;
355 0           $cw->{RefChart}->{Axis}{Xaxis}{TickHeight} = 0;
356             }
357            
358 0 0         if ( my $title = $cw->cget( -title ) ) {
359 0 0         if ( my $titleheight = $cw->cget( -titleheight ) ) {
360 0           $cw->{RefChart}->{Title}{Height} = $titleheight;
361             }
362             }
363             else {
364 0           $cw->{RefChart}->{Title}{Height} = 0;
365             }
366            
367 0 0         if ( my $xlabel = $cw->cget( -xlabel ) ) {
368 0 0         if ( my $xlabelheight = $cw->cget( -xlabelheight ) ) {
369 0           $cw->{RefChart}->{Axis}{Xaxis}{xlabelHeight} = $xlabelheight;
370             }
371             }
372             else {
373 0           $cw->{RefChart}->{Axis}{Xaxis}{xlabelHeight} = 0;
374             }
375            
376 0 0         if ( my $ylabel = $cw->cget( -ylabel ) ) {
377 0 0         if ( my $ylabel_width = $cw->cget( -ylabelWidth ) ) {
378 0           $cw->{RefChart}->{Axis}{Yaxis}{ylabelWidth} = $ylabel_width;
379             }
380             }
381             else {
382 0           $cw->{RefChart}->{Axis}{Yaxis}{ylabelWidth} = 0;
383             }
384            
385 0 0         if ( my $ytickwidth = $cw->cget( -ytickwidth ) ) {
386 0           $cw->{RefChart}->{Axis}{Yaxis}{TickWidth} = $ytickwidth;
387             }
388            
389 0 0         if ( my $valuescolor = $cw->cget( -valuescolor ) ) {
390 0           $cw->configure( -xvaluecolor => $valuescolor );
391 0           $cw->configure( -yvaluecolor => $valuescolor );
392             }
393            
394 0 0         if ( my $textcolor = $cw->cget( -textcolor ) ) {
    0          
395 0           $cw->configure( -titlecolor => $textcolor );
396 0           $cw->configure( -xlabelcolor => $textcolor );
397 0           $cw->configure( -ylabelcolor => $textcolor );
398             }
399             elsif ( my $labelscolor = $cw->cget( -labelscolor ) ) {
400 0           $cw->configure( -xlabelcolor => $labelscolor );
401 0           $cw->configure( -ylabelcolor => $labelscolor );
402             }
403            
404 0 0         if ( my $textfont = $cw->cget( -textfont ) ) {
405 0           $cw->configure( -titlefont => $textfont );
406 0           $cw->configure( -xlabelfont => $textfont );
407 0           $cw->configure( -ylabelfont => $textfont );
408             }
409 0 0         if ( my $startangle = $cw->cget( -startangle ) ) {
410 0 0 0       if ( $startangle < $MIN_ANGLE or $startangle > $MAX_ANGLE ) {
411 0           $cw->configure( -startangle => 0 );
412             }
413             }
414            
415             =for borderwidth:
416             If user call -borderwidth option, the graph will be trunc.
417             Then we will add HeightEmptySpace and WidthEmptySpace.
418            
419             =cut
420            
421 0 0         if ( my $borderwidth = $cw->cget( -borderwidth ) ) {
422 0           $cw->{RefChart}->{Canvas}{HeightEmptySpace} = $borderwidth + $BORDERWITH_PLUS;
423 0           $cw->{RefChart}->{Canvas}{WidthEmptySpace} = $borderwidth + $BORDERWITH_PLUS;
424             }
425            
426             #update=
427 0           my $yminvalue = $cw->cget( -yminvalue );
428 0 0 0       if ( ( defined $yminvalue ) and ( !_isanumber($yminvalue) ) ) {
429 0           $cw->_error( "-yminvalue option must be a number or real number ($yminvalue)", 1 );
430 0           return;
431             }
432 0           my $ymaxvalue = $cw->cget( -ymaxvalue );
433 0 0 0       if ( ( defined $ymaxvalue ) and ( !_isanumber($ymaxvalue) ) ) {
434 0           $cw->_error( '-ymaxvalue option must be a number or real number', 1 );
435 0           return;
436             }
437            
438 0 0 0       if ( defined $yminvalue and defined $ymaxvalue ) {
439 0 0         if ( $ymaxvalue <= $yminvalue ) {
440 0           $cw->_error( '-ymaxvalue must be greater than -yminvalue option', 1 );
441 0           return;
442             }
443             }
444            
445 0           return 1;
446             }
447            
448             sub _checksizelegend_data {
449 0     0     my ( $cw, $ref_data, $ref_legend ) = @_;
450            
451             # Check legend size
452 0 0         if ( not defined $ref_legend ) {
453 0           $cw->_error('legend not defined');
454 0           return;
455             }
456 0           my $size_legend = scalar @{$ref_legend};
  0            
457            
458             # Check size between legend and data
459 0           my $size_data = scalar @{$ref_data} - 1;
  0            
460 0 0         if ( $size_legend != $size_data ) {
461 0           $cw->_error('Legend and array size data are different');
462 0           return;
463             }
464            
465 0           return 1;
466             }
467            
468             sub _zoomcalcul {
469 0     0     my ( $cw, $zoomx, $zoomy ) = @_;
470            
471 0 0 0       if (
      0        
      0        
      0        
      0        
472             !( ( defined $zoomx and _isanumber($zoomx) and $zoomx > 0 )
473             or ( defined $zoomy and _isanumber($zoomy) and $zoomy > 0 )
474             )
475             )
476             {
477 0           $cw->_error( 'zoom value must be defined, numeric and great than 0', 1 );
478 0           return;
479             }
480            
481 0           my $current_width = $cw->{RefChart}->{Canvas}{Width};
482 0           my $current_height = $cw->{RefChart}->{Canvas}{Height};
483            
484 0           my ( $new_width, $new_height );
485 0           my $cent_percent_width = ( $PERCENT / $cw->{RefChart}->{Zoom}{CurrentX} ) * $current_width;
486 0           my $cent_percent_height = ( $PERCENT / $cw->{RefChart}->{Zoom}{CurrentY} ) * $current_height;
487 0 0         if ( defined $zoomx ) { $new_width = ( $zoomx / $PERCENT ) * $cent_percent_width; }
  0            
488 0 0         if ( defined $zoomy ) { $new_height = ( $zoomy / $PERCENT ) * $cent_percent_height; }
  0            
489 0 0         if ( defined $zoomx ) { $cw->{RefChart}->{Zoom}{CurrentX} = $zoomx; }
  0            
490 0 0         if ( defined $zoomy ) { $cw->{RefChart}->{Zoom}{CurrentY} = $zoomy; }
  0            
491            
492 0           return ( $new_width, $new_height );
493             }
494            
495             sub _destroyballoon_bind {
496 0     0     my ($cw) = @_;
497            
498             # balloon defined and user want to stop it
499 0 0 0       if ( $cw->{RefChart}->{Balloon}{Obj}
500             and Tk::Exists $cw->{RefChart}->{Balloon}{Obj} )
501             {
502 0           $cw->{RefChart}->{Balloon}{Obj}->configure( -state => 'none' );
503 0           $cw->{RefChart}->{Balloon}{Obj}->detach($cw);
504 0           undef $cw->{RefChart}->{Balloon}{Obj};
505             }
506            
507 0           return;
508             }
509            
510             sub _error {
511 0     0     my ( $cw, $error_message, $croak ) = @_;
512            
513 0           my $verbose = $cw->cget( -verbose );
514 0 0 0       if ( defined $croak and $croak == 1 ) {
515 0           croak "[BE CARREFUL] : $error_message\n";
516             }
517             else {
518 0 0 0       carp "[WARNING] : $error_message\n" if ( defined $verbose and $verbose == 1 );
519             }
520            
521 0           return;
522             }
523            
524             sub _getmarkertype {
525 0     0     my ( $cw, $number ) = @_;
526 0           my %marker_type = (
527            
528             # Num Type Filled
529             '1' => [ 'square', '1' ],
530             '2' => [ 'square', '0' ],
531             '3' => [ 'horizontal cross', '1' ],
532             '4' => [ 'diagonal cross', '1' ],
533             '5' => [ 'diamond', '1' ],
534             '6' => [ 'diamond', '0' ],
535             '7' => [ 'circle', '1' ],
536             '8' => [ 'circle', '0' ],
537             '9' => [ 'horizontal line', '1' ],
538             '10' => [ 'vertical line', '1' ],
539             );
540            
541 0 0         if ( !$marker_type{$number} ) { return; }
  0            
542            
543 0           return $marker_type{$number};
544             }
545            
546             =for _createtype
547             Calculate different points coord to create a rectangle, circle,
548             verticale or horizontal line, a cross, a plus and a diamond
549             from a point coord.
550             Arg : Reference of hash
551             {
552             x => value,
553             y => value,
554             pixel => value,
555             type => string, (circle, cross, plus, diamond, rectangle, Vline, Hline )
556             option => Hash reference ( {-fill => xxx, -outline => yy, ...} )
557             }
558            
559             =cut
560            
561             sub _createtype {
562 0     0     my ( $cw, %ref_coord ) = @_;
563            
564 0 0 0       if ( $ref_coord{type} eq 'circle' or $ref_coord{type} eq 'square' ) {
    0          
    0          
    0          
    0          
    0          
565 0           my $x1 = $ref_coord{x} - ( $ref_coord{pixel} / 2 );
566 0           my $y1 = $ref_coord{y} + ( $ref_coord{pixel} / 2 );
567 0           my $x2 = $ref_coord{x} + ( $ref_coord{pixel} / 2 );
568 0           my $y2 = $ref_coord{y} - ( $ref_coord{pixel} / 2 );
569            
570 0 0         if ( $ref_coord{type} eq 'circle' ) {
571 0           $cw->createOval( $x1, $y1, $x2, $y2, %{ $ref_coord{option} } );
  0            
572             }
573             else {
574 0           $cw->createRectangle( $x1, $y1, $x2, $y2, %{ $ref_coord{option} } );
  0            
575             }
576             }
577             elsif ( $ref_coord{type} eq 'horizontal cross' ) {
578 0           my $x1 = $ref_coord{x};
579 0           my $y1 = $ref_coord{y} - ( $ref_coord{pixel} / 2 );
580 0           my $x2 = $x1;
581 0           my $y2 = $ref_coord{y} + ( $ref_coord{pixel} / 2 );
582 0           my $x3 = $ref_coord{x} - ( $ref_coord{pixel} / 2 );
583 0           my $y3 = $ref_coord{y};
584 0           my $x4 = $ref_coord{x} + ( $ref_coord{pixel} / 2 );
585 0           my $y4 = $y3;
586 0           $cw->createLine( $x1, $y1, $x2, $y2, %{ $ref_coord{option} } );
  0            
587 0           $cw->createLine( $x3, $y3, $x4, $y4, %{ $ref_coord{option} } );
  0            
588             }
589             elsif ( $ref_coord{type} eq 'diagonal cross' ) {
590 0           my $x1 = $ref_coord{x} - ( $ref_coord{pixel} / 2 );
591 0           my $y1 = $ref_coord{y} + ( $ref_coord{pixel} / 2 );
592 0           my $x2 = $ref_coord{x} + ( $ref_coord{pixel} / 2 );
593 0           my $y2 = $ref_coord{y} - ( $ref_coord{pixel} / 2 );
594 0           my $x3 = $x1;
595 0           my $y3 = $y2;
596 0           my $x4 = $x2;
597 0           my $y4 = $y1;
598 0           $cw->createLine( $x1, $y1, $x2, $y2, %{ $ref_coord{option} } );
  0            
599 0           $cw->createLine( $x3, $y3, $x4, $y4, %{ $ref_coord{option} } );
  0            
600             }
601             elsif ( $ref_coord{type} eq 'diamond' ) {
602 0           my $x1 = $ref_coord{x} - ( $ref_coord{pixel} / 2 );
603 0           my $y1 = $ref_coord{y};
604 0           my $x2 = $ref_coord{x};
605 0           my $y2 = $ref_coord{y} + ( $ref_coord{pixel} / 2 );
606 0           my $x3 = $ref_coord{x} + ( $ref_coord{pixel} / 2 );
607 0           my $y3 = $ref_coord{y};
608 0           my $x4 = $ref_coord{x};
609 0           my $y4 = $ref_coord{y} - ( $ref_coord{pixel} / 2 );
610 0           $cw->createPolygon( $x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, %{ $ref_coord{option} } );
  0            
611             }
612             elsif ( $ref_coord{type} eq 'vertical line' ) {
613 0           my $x1 = $ref_coord{x};
614 0           my $y1 = $ref_coord{y} - ( $ref_coord{pixel} / 2 );
615 0           my $x2 = $ref_coord{x};
616 0           my $y2 = $ref_coord{y} + ( $ref_coord{pixel} / 2 );
617 0           $cw->createLine( $x1, $y1, $x2, $y2, %{ $ref_coord{option} } );
  0            
618             }
619             elsif ( $ref_coord{type} eq 'horizontal line' ) {
620 0           my $x1 = $ref_coord{x} - ( $ref_coord{pixel} / 2 );
621 0           my $y1 = $ref_coord{y};
622 0           my $x2 = $ref_coord{x} + ( $ref_coord{pixel} / 2 );
623 0           my $y2 = $ref_coord{y};
624 0           $cw->createLine( $x1, $y1, $x2, $y2, %{ $ref_coord{option} } );
  0            
625             }
626             else {
627 0           return;
628             }
629            
630 0           return 1;
631             }
632            
633             =for _display_line
634             Dispay point
635             Arg : Reference of hash
636             {
637             x => value,
638             y => value,
639             pixel => value,
640             type => string, (circle, cross, plus, diamond, rectangle, Vline, Hline )
641             option => Hash reference ( {-fill => xxx, -outline => yy, ...} )
642             }
643            
644             =cut
645            
646             # $cw->_display_line($ref_points, $line_number);
647             sub _display_line {
648 0     0     my ( $cw, $ref_points, $line_number ) = @_;
649            
650 0           my $ref_data_to_display = $cw->{RefChart}->{Data}{RefDataToDisplay};
651 0 0 0       if ( !( defined $ref_data_to_display and defined $ref_data_to_display->[$line_number] ) ) { return; }
  0            
652            
653 0           my %options;
654 0           my $font = $cw->{RefChart}->{Data}{RefOptionDataToDisplay}{'-font'};
655 0           my $color = $cw->{RefChart}->{Data}{RefOptionDataToDisplay}{'-foreground'};
656 0 0         if ( defined $font ) { $options{'-font'} = $font; }
  0            
657 0 0         if ( defined $color ) { $options{'-fill'} = $color; }
  0            
658            
659 0           my $indice_point = 0;
660            
661             DISPLAY:
662 0           foreach my $value ( @{ $ref_data_to_display->[$line_number] } ) {
  0            
663 0 0         if ( defined $value ) {
664 0           my $x = $ref_points->[$indice_point];
665 0           $indice_point++;
666 0           my $y = $ref_points->[$indice_point] - 10;
667 0           $cw->createText(
668             $x, $y,
669             -text => $value,
670             %options,
671             );
672 0           $indice_point++;
673 0 0         last DISPLAY if ( not defined $ref_points->[$indice_point] );
674 0           next DISPLAY;
675             }
676 0           $indice_point += 2;
677             }
678            
679 0           return;
680             }
681            
682             sub _box {
683 0     0     my ($cw) = @_;
684            
685 0           my $axiscolor = $cw->cget( -axiscolor );
686 0 0         if ( $cw->cget( -boxaxis ) == 0 ) {
687 0           return;
688             }
689            
690             # close axis
691             # X axis 2
692             $cw->createLine(
693             $cw->{RefChart}->{Axis}{CxMin},
694             $cw->{RefChart}->{Axis}{CyMax},
695             $cw->{RefChart}->{Axis}{CxMax},
696             $cw->{RefChart}->{Axis}{CyMax},
697             -tags => [
698             $cw->{RefChart}->{TAGS}{BoxAxis}, $cw->{RefChart}->{TAGS}{AllAXIS},
699             $cw->{RefChart}->{TAGS}{AllTagsChart},
700 0           ],
701             -fill => $axiscolor,
702             );
703            
704             # Y axis 2
705             $cw->createLine(
706             $cw->{RefChart}->{Axis}{CxMax},
707             $cw->{RefChart}->{Axis}{CyMin},
708             $cw->{RefChart}->{Axis}{CxMax},
709             $cw->{RefChart}->{Axis}{CyMax},
710             -tags => [
711             $cw->{RefChart}->{TAGS}{BoxAxis}, $cw->{RefChart}->{TAGS}{AllAXIS},
712             $cw->{RefChart}->{TAGS}{AllTagsChart},
713 0           ],
714             -fill => $axiscolor,
715             );
716            
717 0           return;
718             }
719            
720             sub _display_xticks {
721 0     0     my ( $cw, $x_tickx1, $x_ticky1, $x_tickx2, $x_ticky2 ) = @_;
722            
723 0           my $longticks = $cw->cget( -longticks );
724 0           my $xlongticks = $cw->cget( -xlongticks );
725 0           my $xlongtickscolor = $cw->cget( -xlongtickscolor );
726 0           my $longtickscolor = $cw->cget( -longtickscolor );
727 0           my $axiscolor = $cw->cget( -axiscolor );
728            
729             # Only short xticks
730             $cw->createLine(
731             $x_tickx1,
732             $x_ticky1,
733             $x_tickx2,
734             $x_ticky2,
735             -tags => [
736             $cw->{RefChart}->{TAGS}{xTick}, $cw->{RefChart}->{TAGS}{AllTick},
737             $cw->{RefChart}->{TAGS}{AllTagsChart},
738 0           ],
739             -fill => $axiscolor,
740             );
741            
742             # Long xTicks
743 0 0 0       if ( ( defined $longticks and $longticks == 1 ) or ( defined $xlongticks and $xlongticks == 1 ) ) {
      0        
      0        
744 0           $x_ticky1 = $cw->{RefChart}->{Axis}{CyMax};
745 0           $x_ticky2 = $cw->{RefChart}->{Axis}{CyMin};
746             $cw->createLine(
747             $x_tickx1,
748             $x_ticky1,
749             $x_tickx2,
750             $x_ticky2,
751             -tags => [
752             $cw->{RefChart}->{TAGS}{xTick}, $cw->{RefChart}->{TAGS}{AllTick},
753             $cw->{RefChart}->{TAGS}{AllTagsChart},
754 0   0       ],
755             -fill => $longtickscolor || $xlongtickscolor,
756             -dash => $DASH,
757             );
758             }
759            
760 0           return 1;
761             }
762            
763             sub _display_yticks {
764 0     0     my ( $cw, $y_tickx1, $y_ticky1, $y_tickx2, $y_ticky2 ) = @_;
765            
766 0           my $longticks = $cw->cget( -longticks );
767 0           my $ylongticks = $cw->cget( -ylongticks );
768 0           my $ylongtickscolor = $cw->cget( -ylongtickscolor );
769 0           my $longtickscolor = $cw->cget( -longtickscolor );
770 0           my $axiscolor = $cw->cget( -axiscolor );
771            
772             # Only short yticks
773             $cw->createLine(
774             $y_tickx1,
775             $y_ticky1,
776             $y_tickx2,
777             $y_ticky2,
778             -tags => [
779             $cw->{RefChart}->{TAGS}{yTick}, $cw->{RefChart}->{TAGS}{AllTick},
780             $cw->{RefChart}->{TAGS}{AllTagsChart},
781 0           ],
782             -fill => $axiscolor,
783             );
784            
785             # Long yTicks
786 0 0 0       if ( ( defined $longticks and $longticks == 1 ) or ( defined $ylongticks and $ylongticks == 1 ) ) {
      0        
      0        
787 0           $y_tickx1 = $cw->{RefChart}->{Axis}{CxMin};
788 0           $y_tickx2 = $cw->{RefChart}->{Axis}{CxMax};
789             $cw->createLine(
790             $y_tickx1,
791             $y_ticky1,
792             $y_tickx2,
793             $y_ticky2,
794             -tags => [
795             $cw->{RefChart}->{TAGS}{yTick}, $cw->{RefChart}->{TAGS}{AllTick},
796             $cw->{RefChart}->{TAGS}{AllTagsChart},
797 0   0       ],
798             -fill => $longtickscolor || $ylongtickscolor,
799             -dash => $DASH,
800             );
801             }
802            
803 0           return 1;
804             }
805            
806             sub _ytick {
807 0     0     my ($cw) = @_;
808            
809 0           my $yminvalue = $cw->cget( -yminvalue );
810 0           my $longticks = $cw->cget( -longticks );
811 0           my $yvaluefont = $cw->cget( -yvaluefont );
812 0           $cw->{RefChart}->{Axis}{Yaxis}{TickNumber} = $cw->cget( -yticknumber );
813            
814             # space between y ticks
815 0           my $space = $cw->{RefChart}->{Axis}{Yaxis}{Height} / $cw->{RefChart}->{Axis}{Yaxis}{TickNumber};
816             my $unit_value = ( $cw->{RefChart}->{Data}{MaxYValue} - $cw->{RefChart}->{Data}{MinYValue} )
817 0           / $cw->{RefChart}->{Axis}{Yaxis}{TickNumber};
818            
819 0           for my $tick_number ( 1 .. $cw->{RefChart}->{Axis}{Yaxis}{TickNumber} ) {
820            
821             # Display y ticks
822 0           my $y_tickx1 = $cw->{RefChart}->{Axis}{Cx0};
823 0           my $y_ticky1 = $cw->{RefChart}->{Axis}{CyMin} - ( $tick_number * $space );
824 0           my $y_tickx2 = $cw->{RefChart}->{Axis}{Cx0} - $cw->{RefChart}->{Axis}{Yaxis}{TickWidth};
825 0           my $y_ticky2 = $cw->{RefChart}->{Axis}{CyMin} - ( $tick_number * $space );
826            
827             my $y_valuex = $cw->{RefChart}->{Axis}{Cx0}
828 0           - ( $cw->{RefChart}->{Axis}{Yaxis}{TickWidth} + $cw->{RefChart}->{Axis}{Yaxis}{ScaleValuesWidth} / 2 );
829 0           my $y_valuey = $y_ticky1;
830 0           my $value = $unit_value * $tick_number + $cw->{RefChart}->{Data}{MinYValue};
831 0 0         next if ( $value == 0 );
832            
833             # round value if to long
834 0           $value = _roundvalue($value);
835            
836             # Display yticks short or long
837 0           $cw->_display_yticks( $y_tickx1, $y_ticky1, $y_tickx2, $y_ticky2 );
838            
839             $cw->createText(
840             $y_valuex,
841             $y_valuey,
842             -text => $value,
843             -fill => $cw->cget( -yvaluecolor ),
844             -font => $yvaluefont,
845             -tags => [
846             $cw->{RefChart}->{TAGS}{yValues}, $cw->{RefChart}->{TAGS}{AllValues},
847             $cw->{RefChart}->{TAGS}{AllTagsChart},
848 0           ],
849             );
850             }
851            
852             # Display 0 value or not
853 0 0 0       if (
      0        
      0        
854             !( $cw->{RefChart}->{Data}{MinYValue} == 0
855             or ( defined $yminvalue and $yminvalue > 0 )
856             or ( $cw->{RefChart}->{Data}{MinYValue} > 0 )
857             )
858             )
859             {
860             $cw->createText(
861             $cw->{RefChart}->{Axis}{Cx0} - ( $cw->{RefChart}->{Axis}{Yaxis}{TickWidth} ),
862             $cw->{RefChart}->{Axis}{Cy0},
863             -text => 0,
864             -font => $yvaluefont,
865             -tags => [
866             $cw->{RefChart}->{TAGS}{xValue0}, $cw->{RefChart}->{TAGS}{AllValues},
867             $cw->{RefChart}->{TAGS}{AllTagsChart},
868 0           ],
869             );
870             }
871            
872             # Display the minimale value
873             $cw->createText(
874             $cw->{RefChart}->{Axis}{CxMin}
875             - ( $cw->{RefChart}->{Axis}{Yaxis}{TickWidth} + $cw->{RefChart}->{Axis}{Yaxis}{ScaleValuesWidth} / 2 ),
876            
877             $cw->{RefChart}->{Axis}{CyMin},
878             -text => _roundvalue( $cw->{RefChart}->{Data}{MinYValue} ),
879             -fill => $cw->cget( -yvaluecolor ),
880             -font => $yvaluefont,
881             -tags => [
882             $cw->{RefChart}->{TAGS}{yValues}, $cw->{RefChart}->{TAGS}{AllValues},
883             $cw->{RefChart}->{TAGS}{AllTagsChart},
884 0           ],
885             );
886            
887             # Long tick
888 0 0 0       if ( ( not defined $longticks ) or ( $longticks != 1 ) ) {
889             $cw->createLine(
890             $cw->{RefChart}->{Axis}{Cx0},
891             $cw->{RefChart}->{Axis}{CyMin} - $space,
892             $cw->{RefChart}->{Axis}{Cx0} - $cw->{RefChart}->{Axis}{Yaxis}{TickWidth},
893             $cw->{RefChart}->{Axis}{CyMin} - $space,
894             -tags => [
895             $cw->{RefChart}->{TAGS}{yTick}, $cw->{RefChart}->{TAGS}{AllTick},
896             $cw->{RefChart}->{TAGS}{AllTagsChart},
897 0           ],
898             );
899             }
900            
901 0           return;
902             }
903            
904             sub _title {
905 0     0     my ($cw) = @_;
906            
907 0           my $title = $cw->cget( -title );
908 0           my $title_color = $cw->cget( -titlecolor );
909 0           my $title_font = $cw->cget( -titlefont );
910 0           my $titleposition = $cw->cget( -titleposition );
911            
912             # Title verification
913 0 0         if ( !$title ) { return; }
  0            
914            
915             # Space before the title
916             my $width_empty_before_title
917             = $cw->{RefChart}->{Canvas}{WidthEmptySpace}
918             + $cw->{RefChart}->{Axis}{Yaxis}{ylabelWidth}
919             + $cw->{RefChart}->{Axis}{Yaxis}{ScaleValuesWidth}
920 0           + $cw->{RefChart}->{Axis}{Yaxis}{TickWidth};
921            
922             # Coordinates title
923             $cw->{RefChart}->{Title}{Ctitrex}
924 0           = ( $cw->{RefChart}->{Axis}{Xaxis}{Width} / 2 ) + $width_empty_before_title;
925             $cw->{RefChart}->{Title}{Ctitrey}
926 0           = $cw->{RefChart}->{Canvas}{HeightEmptySpace} + ( $cw->{RefChart}->{Title}{Height} / 2 );
927            
928             # -width to createText
929 0           $cw->{RefChart}->{Title}{'-width'} = $cw->{RefChart}->{Axis}{Xaxis}{Width};
930            
931             # display title
932 0           my $anchor;
933 0 0         if ( $titleposition eq 'left' ) {
    0          
934 0           $cw->{RefChart}->{Title}{Ctitrex} = $width_empty_before_title;
935 0           $anchor = 'nw';
936 0           $cw->{RefChart}->{Title}{'-width'} = 0;
937             }
938             elsif ( $titleposition eq 'right' ) {
939 0           $cw->{RefChart}->{Title}{Ctitrex} = $width_empty_before_title + $cw->{RefChart}->{Axis}{Xaxis}{Width};
940 0           $cw->{RefChart}->{Title}{'-width'} = 0;
941 0           $anchor = 'ne';
942             }
943             else {
944 0           $anchor = 'center';
945             }
946             $cw->{RefChart}->{Title}{IdTitre} = $cw->createText(
947             $cw->{RefChart}->{Title}{Ctitrex},
948             $cw->{RefChart}->{Title}{Ctitrey},
949             -text => $title,
950             -width => $cw->{RefChart}->{Title}{'-width'},
951             -anchor => $anchor,
952 0           -tags => [ $cw->{RefChart}->{TAGS}{AllTagsChart}, ],
953             );
954 0 0 0       if ( $anchor eq 'left' and $anchor eq 'right' ) { return; }
  0            
955            
956             # get title information
957 0           my ($height);
958             ( $cw->{RefChart}->{Title}{Ctitrex},
959             $cw->{RefChart}->{Title}{Ctitrey},
960             $cw->{RefChart}->{Title}{Width}, $height
961 0           ) = $cw->bbox( $cw->{RefChart}->{Title}{IdTitre} );
962            
963 0 0         if ( $cw->{RefChart}->{Title}{Ctitrey} < $cw->{RefChart}->{Canvas}{HeightEmptySpace} ) {
964            
965             # cut title
966 0           $cw->delete( $cw->{RefChart}->{Title}{IdTitre} );
967            
968 0           $cw->{RefChart}->{Title}{Ctitrex} = $width_empty_before_title;
969             $cw->{RefChart}->{Title}{Ctitrey}
970 0           = $cw->{RefChart}->{Canvas}{HeightEmptySpace} + ( $cw->{RefChart}->{Title}{Height} / 2 );
971            
972 0           $cw->{RefChart}->{Title}{'-width'} = 0;
973            
974             # display title
975             $cw->{RefChart}->{Title}{IdTitre} = $cw->createText(
976             $cw->{RefChart}->{Title}{Ctitrex},
977             $cw->{RefChart}->{Title}{Ctitrey},
978             -text => $title,
979             -width => $cw->{RefChart}->{Title}{'-width'},
980             -anchor => 'nw',
981 0           -tags => [ $cw->{RefChart}->{TAGS}{AllTagsChart}, ],
982             );
983             }
984            
985             $cw->itemconfigure(
986             $cw->{RefChart}->{Title}{IdTitre},
987 0           -font => $title_font,
988             -fill => $title_color,
989             );
990 0           return;
991             }
992            
993             sub _xlabelposition {
994 0     0     my ($cw) = @_;
995            
996 0           my $xlabel = $cw->cget( -xlabel );
997            
998             # no x_label
999 0 0         if ( not defined $xlabel ) { return; }
  0            
1000            
1001             # coordinate (CxlabelX, CxlabelY)
1002             my $before_xlabel_x
1003             = $cw->{RefChart}->{Canvas}{WidthEmptySpace}
1004             + $cw->{RefChart}->{Axis}{Yaxis}{ylabelWidth}
1005             + $cw->{RefChart}->{Axis}{Yaxis}{ScaleValuesWidth}
1006 0           + $cw->{RefChart}->{Axis}{Yaxis}{TickWidth};
1007             my $before_xlabel_y
1008             = $cw->{RefChart}->{Canvas}{HeightEmptySpace}
1009             + $cw->{RefChart}->{Title}{Height}
1010             + $cw->{RefChart}->{Axis}{Yaxis}{Height}
1011             + $cw->{RefChart}->{Axis}{Xaxis}{TickHeight}
1012 0           + $cw->{RefChart}->{Axis}{Xaxis}{ScaleValuesHeight};
1013            
1014 0           $cw->{RefChart}->{Axis}{Xaxis}{CxlabelX} = $before_xlabel_x + ( $cw->{RefChart}->{Axis}{Xaxis}{Width} / 2 );
1015             $cw->{RefChart}->{Axis}{Xaxis}{CxlabelY}
1016 0           = $before_xlabel_y + ( $cw->{RefChart}->{Axis}{Xaxis}{xlabelHeight} / 2 );
1017            
1018             # display xlabel
1019             $cw->{RefChart}->{Axis}{Xaxis}{Idxlabel} = $cw->createText(
1020             $cw->{RefChart}->{Axis}{Xaxis}{CxlabelX},
1021             $cw->{RefChart}->{Axis}{Xaxis}{CxlabelY},
1022             -text => $xlabel,
1023             -width => $cw->{RefChart}->{Axis}{Xaxis}{Width},
1024 0           -tags => [ $cw->{RefChart}->{TAGS}{AllTagsChart}, ],
1025             );
1026            
1027             # get info ylabel xlabel
1028 0           my ( $width, $height );
1029             ( $cw->{RefChart}->{Axis}{Xaxis}{CxlabelX}, $cw->{RefChart}->{Axis}{Xaxis}{CxlabelY}, $width, $height )
1030 0           = $cw->bbox( $cw->{RefChart}->{Axis}{Xaxis}{Idxlabel} );
1031            
1032 0 0         if ( $cw->{RefChart}->{Axis}{Xaxis}{CxlabelY} < $before_xlabel_y ) {
1033            
1034 0           $cw->delete( $cw->{RefChart}->{Axis}{Xaxis}{Idxlabel} );
1035            
1036 0           $cw->{RefChart}->{Axis}{Xaxis}{CxlabelX} = $before_xlabel_x;
1037             $cw->{RefChart}->{Axis}{Xaxis}{CxlabelY}
1038 0           = $before_xlabel_y + ( $cw->{RefChart}->{Axis}{Xaxis}{xlabelHeight} / 2 );
1039            
1040             # display xlabel
1041             $cw->{RefChart}->{Axis}{Xaxis}{Idxlabel} = $cw->createText(
1042             $cw->{RefChart}->{Axis}{Xaxis}{CxlabelX},
1043             $cw->{RefChart}->{Axis}{Xaxis}{CxlabelY},
1044             -text => $xlabel,
1045             -width => 0,
1046             -anchor => 'nw',
1047 0           -tags => [ $cw->{RefChart}->{TAGS}{AllTagsChart}, ],
1048             );
1049             }
1050            
1051             $cw->itemconfigure(
1052             $cw->{RefChart}->{Axis}{Xaxis}{Idxlabel},
1053 0           -font => $cw->cget( -xlabelfont ),
1054             -fill => $cw->cget( -xlabelcolor ),
1055             );
1056            
1057 0           return;
1058             }
1059            
1060             sub _ylabelposition {
1061 0     0     my ($cw) = @_;
1062            
1063 0           my $ylabel = $cw->cget( -ylabel );
1064            
1065             # no y_label
1066 0 0         if ( not defined $ylabel ) {
1067 0           return;
1068             }
1069            
1070             # coordinate (CylabelX, CylabelY)
1071             $cw->{RefChart}->{Axis}{Yaxis}{CylabelX}
1072 0           = $cw->{RefChart}->{Canvas}{WidthEmptySpace} + ( $cw->{RefChart}->{Axis}{Yaxis}{ylabelWidth} / 2 );
1073             $cw->{RefChart}->{Axis}{Yaxis}{CylabelY}
1074             = $cw->{RefChart}->{Canvas}{HeightEmptySpace}
1075             + $cw->{RefChart}->{Title}{Height}
1076 0           + ( $cw->{RefChart}->{Axis}{Yaxis}{Height} / 2 );
1077            
1078             # display ylabel
1079             $cw->{RefChart}->{Axis}{Yaxis}{Idylabel} = $cw->createText(
1080             $cw->{RefChart}->{Axis}{Yaxis}{CylabelX},
1081             $cw->{RefChart}->{Axis}{Yaxis}{CylabelY},
1082             -text => $ylabel,
1083             -font => $cw->cget( -ylabelfont ),
1084             -width => $cw->{RefChart}->{Axis}{Yaxis}{ylabelWidth},
1085             -fill => $cw->cget( -ylabelcolor ),
1086 0           -tags => [ $cw->{RefChart}->{TAGS}{AllTagsChart}, ],
1087             );
1088            
1089             # get info ylabel
1090 0           my ( $width, $height );
1091             ( $cw->{RefChart}->{Axis}{Yaxis}{CylabelX}, $cw->{RefChart}->{Axis}{Yaxis}{CylabelY}, $width, $height )
1092 0           = $cw->bbox( $cw->{RefChart}->{Axis}{Yaxis}{Idylabel} );
1093            
1094 0           return;
1095             }
1096            
1097             sub _manage_minmaxvalues {
1098 0     0     my ($cw) = @_;
1099            
1100             # Bars : Cumulate percent => min = 0 and max = 100
1101 0           my $cumulatepercent = $cw->cget( -cumulatepercent );
1102 0 0 0       if ( defined $cumulatepercent and $cumulatepercent == 1 ) {
1103 0           $cw->{RefChart}->{Data}{MinYValue} = 0;
1104 0           $cw->{RefChart}->{Data}{MaxYValue} = 100;
1105 0           return 1;
1106             }
1107            
1108 0           my $cumulate = $cw->cget( -cumulate );
1109 0           my $yticknumber = $cw->cget( -yticknumber );
1110 0           my $yminvalue = $cw->cget( -yminvalue );
1111 0           my $ymaxvalue = $cw->cget( -ymaxvalue );
1112 0           my $interval = $cw->cget( -interval );
1113            
1114 0 0 0       if ( defined $yminvalue and defined $ymaxvalue ) {
1115 0 0 0       if (
      0        
      0        
1116             !(( $ymaxvalue >= $cw->{RefChart}->{Data}{MaxYValue}
1117             and $yminvalue <= $cw->{RefChart}->{Data}{MinYValue}
1118             )
1119             or ( defined $interval and $interval == 1 )
1120             )
1121             )
1122             {
1123 0           $cw->_error('-yminvalue and -ymaxvalue do not include all data');
1124             }
1125             }
1126            
1127 0 0 0       if ( defined $cumulate and $cumulate == 1 and $cw->{RefChart}->{Data}{MinYValue} > 0 ) {
      0        
1128 0           $cw->{RefChart}->{Data}{MinYValue} = 0;
1129             }
1130            
1131 0 0 0       if ( !( defined $interval and $interval == 1 ) ) {
1132 0 0         if ( $cw->{RefChart}->{Data}{MinYValue} > 0 ) {
1133 0           $cw->{RefChart}->{Data}{MinYValue} = 0;
1134             }
1135 0           while ( ( $cw->{RefChart}->{Data}{MaxYValue} / $yticknumber ) % 5 != 0 ) {
1136 0           $cw->{RefChart}->{Data}{MaxYValue} = int( $cw->{RefChart}->{Data}{MaxYValue} + 1 );
1137             }
1138            
1139 0 0 0       if ( defined $yminvalue and $yminvalue != 0 ) {
1140 0           $cw->{RefChart}->{Data}{MinYValue} = $yminvalue;
1141             }
1142 0 0 0       if ( defined $ymaxvalue and $ymaxvalue != 0 ) {
1143 0           $cw->{RefChart}->{Data}{MaxYValue} = $ymaxvalue;
1144             }
1145             }
1146            
1147 0           return 1;
1148             }
1149            
1150             sub _chartconstruction {
1151 0     0     my ($cw) = @_;
1152            
1153 0 0         if ( not defined $cw->{RefChart}->{Data}{PlotDefined} ) {
1154 0           return;
1155             }
1156            
1157 0           $cw->clearchart();
1158 0           $cw->_treatparameters();
1159            
1160             # For background gradient color
1161 0           $cw->set_gradientcolor;
1162            
1163             # Height and Width canvas
1164 0           $cw->{RefChart}->{Canvas}{Width} = $cw->width;
1165 0           $cw->{RefChart}->{Canvas}{Height} = $cw->height;
1166            
1167             # Pie graph
1168 0 0         if ( $cw->class eq 'Pie' ) {
1169            
1170             # Width Pie
1171             $cw->{RefChart}->{Pie}{Width}
1172 0           = $cw->{RefChart}->{Canvas}{Width} - ( 2 * $cw->{RefChart}->{Canvas}{WidthEmptySpace} );
1173            
1174 0 0         if ( $cw->{RefChart}->{Data}{RefAllData} ) {
1175 0           $cw->_titlepie;
1176 0           $cw->_viewdata;
1177 0           $cw->_viewlegend();
1178             }
1179 0           return;
1180             }
1181            
1182 0           $cw->_axis();
1183 0           $cw->_box();
1184 0           $cw->_ylabelposition();
1185 0           $cw->_xlabelposition();
1186 0           $cw->_title();
1187            
1188 0 0         if ( $cw->class eq 'Lines' ) {
1189 0 0         if ( $cw->cget( -pointline ) == 1 ) {
1190 0           $cw->_viewdatapoints();
1191             }
1192             else {
1193 0           $cw->_viewdatalines();
1194             }
1195             }
1196             else {
1197 0           $cw->_viewdata();
1198             }
1199            
1200             #
1201 0 0         if ( $cw->cget( -noaxis ) != 1 ) {
1202 0           $cw->_xtick();
1203 0           $cw->_ytick();
1204             }
1205            
1206 0 0         if ( $cw->{RefChart}->{Legend}{NbrLegend} > 0 ) {
1207 0           $cw->_viewlegend();
1208 0           $cw->_balloon();
1209             }
1210            
1211             # If Y value < 0, don't display O x-axis
1212 0 0         if ( $cw->{RefChart}->{Data}{MaxYValue} < 0 ) {
1213 0           $cw->delete( $cw->{RefChart}->{TAGS}{xAxis0} );
1214 0           $cw->delete( $cw->{RefChart}->{TAGS}{xValue0} );
1215             }
1216            
1217             # Axis
1218 0 0         if ( $cw->cget( -noaxis ) == 1 ) {
1219 0           $cw->delete( $cw->{RefChart}->{TAGS}{AllAXIS} );
1220 0           $cw->delete( $cw->{RefChart}->{TAGS}{AllTick} );
1221 0           $cw->delete( $cw->{RefChart}->{TAGS}{AllValues} );
1222             }
1223 0 0 0       if ( $cw->cget( -zeroaxisonly ) == 1
      0        
1224             and $cw->{RefChart}->{Data}{MaxYValue} > 0
1225             and $cw->{RefChart}->{Data}{MinYValue} < 0 )
1226             {
1227 0           $cw->delete( $cw->{RefChart}->{TAGS}{xAxis} );
1228             }
1229 0 0         if ( $cw->cget( -zeroaxis ) == 1 ) {
1230 0           $cw->delete( $cw->{RefChart}->{TAGS}{xAxis0} );
1231 0           $cw->delete( $cw->{RefChart}->{TAGS}{xTick} );
1232 0           $cw->delete( $cw->{RefChart}->{TAGS}{xValues} );
1233             }
1234 0 0         if ( $cw->cget( -xvalueview ) == 0 ) {
1235 0           $cw->delete( $cw->{RefChart}->{TAGS}{xValues} );
1236             }
1237 0 0         if ( $cw->cget( -yvalueview ) == 0 ) {
1238 0           $cw->delete( $cw->{RefChart}->{TAGS}{yValues} );
1239             }
1240            
1241             # ticks
1242 0           my $alltickview = $cw->cget( -alltickview );
1243 0 0         if ( defined $alltickview ) {
1244 0 0         if ( $alltickview == 0 ) {
1245 0           $cw->delete( $cw->{RefChart}->{TAGS}{AllTick} );
1246             }
1247             else {
1248 0           $cw->configure( -ytickview => 1 );
1249 0           $cw->configure( -xtickview => 1 );
1250             }
1251             }
1252             else {
1253 0 0         if ( $cw->cget( -xtickview ) == 0 ) {
1254 0           $cw->delete( $cw->{RefChart}->{TAGS}{xTick} );
1255             }
1256 0 0         if ( $cw->cget( -ytickview ) == 0 ) {
1257 0           $cw->delete( $cw->{RefChart}->{TAGS}{yTick} );
1258             }
1259             }
1260            
1261             # Legend
1262 0 0         if ( $cw->{RefChart}->{Legend}{box} == 0 ) {
1263 0           $cw->delete( $cw->{RefChart}->{TAGS}{BoxLegend} );
1264             }
1265            
1266 0 0         if ( $cw->class eq 'Mixed' ) {
1267            
1268             # Order displaying data
1269 0           $cw->display_order;
1270             }
1271            
1272             # Ticks always in background
1273 0           $cw->raise( $cw->{RefChart}->{TAGS}{AllData}, $cw->{RefChart}->{TAGS}{AllTick} );
1274            
1275             # values displayed above the bars must be display over the bars
1276 0           my $showvalues = $cw->cget( -showvalues );
1277 0 0 0       if ( defined $showvalues and $showvalues == 1 ) {
1278 0           $cw->raise( $cw->{RefChart}->{TAGS}{BarValues}, $cw->{RefChart}->{TAGS}{AllBars} );
1279             }
1280 0           return 1;
1281             }
1282            
1283             1;
1284            
1285             __END__