1<?php
2
3namespace PhpOffice\PhpSpreadsheet\Chart;
4
5/**
6 * Created by PhpStorm.
7 * User: Wiktor Trzonkowski
8 * Date: 6/17/14
9 * Time: 12:11 PM.
10 */
11class Axis extends Properties
12{
13    /**
14     * Axis Number.
15     *
16     * @var array of mixed
17     */
18    private $axisNumber = [
19        'format' => self::FORMAT_CODE_GENERAL,
20        'source_linked' => 1,
21    ];
22
23    /**
24     * Axis Options.
25     *
26     * @var array of mixed
27     */
28    private $axisOptions = [
29        'minimum' => null,
30        'maximum' => null,
31        'major_unit' => null,
32        'minor_unit' => null,
33        'orientation' => self::ORIENTATION_NORMAL,
34        'minor_tick_mark' => self::TICK_MARK_NONE,
35        'major_tick_mark' => self::TICK_MARK_NONE,
36        'axis_labels' => self::AXIS_LABELS_NEXT_TO,
37        'horizontal_crosses' => self::HORIZONTAL_CROSSES_AUTOZERO,
38        'horizontal_crosses_value' => null,
39    ];
40
41    /**
42     * Fill Properties.
43     *
44     * @var array of mixed
45     */
46    private $fillProperties = [
47        'type' => self::EXCEL_COLOR_TYPE_ARGB,
48        'value' => null,
49        'alpha' => 0,
50    ];
51
52    /**
53     * Line Properties.
54     *
55     * @var array of mixed
56     */
57    private $lineProperties = [
58        'type' => self::EXCEL_COLOR_TYPE_ARGB,
59        'value' => null,
60        'alpha' => 0,
61    ];
62
63    /**
64     * Line Style Properties.
65     *
66     * @var array of mixed
67     */
68    private $lineStyleProperties = [
69        'width' => '9525',
70        'compound' => self::LINE_STYLE_COMPOUND_SIMPLE,
71        'dash' => self::LINE_STYLE_DASH_SOLID,
72        'cap' => self::LINE_STYLE_CAP_FLAT,
73        'join' => self::LINE_STYLE_JOIN_BEVEL,
74        'arrow' => [
75            'head' => [
76                'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,
77                'size' => self::LINE_STYLE_ARROW_SIZE_5,
78            ],
79            'end' => [
80                'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW,
81                'size' => self::LINE_STYLE_ARROW_SIZE_8,
82            ],
83        ],
84    ];
85
86    /**
87     * Shadow Properties.
88     *
89     * @var array of mixed
90     */
91    private $shadowProperties = [
92        'presets' => self::SHADOW_PRESETS_NOSHADOW,
93        'effect' => null,
94        'color' => [
95            'type' => self::EXCEL_COLOR_TYPE_STANDARD,
96            'value' => 'black',
97            'alpha' => 40,
98        ],
99        'size' => [
100            'sx' => null,
101            'sy' => null,
102            'kx' => null,
103        ],
104        'blur' => null,
105        'direction' => null,
106        'distance' => null,
107        'algn' => null,
108        'rotWithShape' => null,
109    ];
110
111    /**
112     * Glow Properties.
113     *
114     * @var array of mixed
115     */
116    private $glowProperties = [
117        'size' => null,
118        'color' => [
119            'type' => self::EXCEL_COLOR_TYPE_STANDARD,
120            'value' => 'black',
121            'alpha' => 40,
122        ],
123    ];
124
125    /**
126     * Soft Edge Properties.
127     *
128     * @var array of mixed
129     */
130    private $softEdges = [
131        'size' => null,
132    ];
133
134    /**
135     * Get Series Data Type.
136     *
137     * @param mixed $format_code
138     *
139     * @return string
140     */
141    public function setAxisNumberProperties($format_code)
142    {
143        $this->axisNumber['format'] = (string) $format_code;
144        $this->axisNumber['source_linked'] = 0;
145    }
146
147    /**
148     * Get Axis Number Format Data Type.
149     *
150     * @return string
151     */
152    public function getAxisNumberFormat()
153    {
154        return $this->axisNumber['format'];
155    }
156
157    /**
158     * Get Axis Number Source Linked.
159     *
160     * @return string
161     */
162    public function getAxisNumberSourceLinked()
163    {
164        return (string) $this->axisNumber['source_linked'];
165    }
166
167    /**
168     * Set Axis Options Properties.
169     *
170     * @param string $axis_labels
171     * @param string $horizontal_crosses_value
172     * @param string $horizontal_crosses
173     * @param string $axis_orientation
174     * @param string $major_tmt
175     * @param string $minor_tmt
176     * @param string $minimum
177     * @param string $maximum
178     * @param string $major_unit
179     * @param string $minor_unit
180     */
181    public function setAxisOptionsProperties($axis_labels, $horizontal_crosses_value = null, $horizontal_crosses = null, $axis_orientation = null, $major_tmt = null, $minor_tmt = null, $minimum = null, $maximum = null, $major_unit = null, $minor_unit = null)
182    {
183        $this->axisOptions['axis_labels'] = (string) $axis_labels;
184        ($horizontal_crosses_value !== null) ? $this->axisOptions['horizontal_crosses_value'] = (string) $horizontal_crosses_value : null;
185        ($horizontal_crosses !== null) ? $this->axisOptions['horizontal_crosses'] = (string) $horizontal_crosses : null;
186        ($axis_orientation !== null) ? $this->axisOptions['orientation'] = (string) $axis_orientation : null;
187        ($major_tmt !== null) ? $this->axisOptions['major_tick_mark'] = (string) $major_tmt : null;
188        ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null;
189        ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null;
190        ($minimum !== null) ? $this->axisOptions['minimum'] = (string) $minimum : null;
191        ($maximum !== null) ? $this->axisOptions['maximum'] = (string) $maximum : null;
192        ($major_unit !== null) ? $this->axisOptions['major_unit'] = (string) $major_unit : null;
193        ($minor_unit !== null) ? $this->axisOptions['minor_unit'] = (string) $minor_unit : null;
194    }
195
196    /**
197     * Get Axis Options Property.
198     *
199     * @param string $property
200     *
201     * @return string
202     */
203    public function getAxisOptionsProperty($property)
204    {
205        return $this->axisOptions[$property];
206    }
207
208    /**
209     * Set Axis Orientation Property.
210     *
211     * @param string $orientation
212     */
213    public function setAxisOrientation($orientation)
214    {
215        $this->axisOptions['orientation'] = (string) $orientation;
216    }
217
218    /**
219     * Set Fill Property.
220     *
221     * @param string $color
222     * @param int $alpha
223     * @param string $type
224     */
225    public function setFillParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB)
226    {
227        $this->fillProperties = $this->setColorProperties($color, $alpha, $type);
228    }
229
230    /**
231     * Set Line Property.
232     *
233     * @param string $color
234     * @param int $alpha
235     * @param string $type
236     */
237    public function setLineParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB)
238    {
239        $this->lineProperties = $this->setColorProperties($color, $alpha, $type);
240    }
241
242    /**
243     * Get Fill Property.
244     *
245     * @param string $property
246     *
247     * @return string
248     */
249    public function getFillProperty($property)
250    {
251        return $this->fillProperties[$property];
252    }
253
254    /**
255     * Get Line Property.
256     *
257     * @param string $property
258     *
259     * @return string
260     */
261    public function getLineProperty($property)
262    {
263        return $this->lineProperties[$property];
264    }
265
266    /**
267     * Set Line Style Properties.
268     *
269     * @param float $line_width
270     * @param string $compound_type
271     * @param string $dash_type
272     * @param string $cap_type
273     * @param string $join_type
274     * @param string $head_arrow_type
275     * @param string $head_arrow_size
276     * @param string $end_arrow_type
277     * @param string $end_arrow_size
278     */
279    public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null)
280    {
281        ($line_width !== null) ? $this->lineStyleProperties['width'] = $this->getExcelPointsWidth((float) $line_width) : null;
282        ($compound_type !== null) ? $this->lineStyleProperties['compound'] = (string) $compound_type : null;
283        ($dash_type !== null) ? $this->lineStyleProperties['dash'] = (string) $dash_type : null;
284        ($cap_type !== null) ? $this->lineStyleProperties['cap'] = (string) $cap_type : null;
285        ($join_type !== null) ? $this->lineStyleProperties['join'] = (string) $join_type : null;
286        ($head_arrow_type !== null) ? $this->lineStyleProperties['arrow']['head']['type'] = (string) $head_arrow_type : null;
287        ($head_arrow_size !== null) ? $this->lineStyleProperties['arrow']['head']['size'] = (string) $head_arrow_size : null;
288        ($end_arrow_type !== null) ? $this->lineStyleProperties['arrow']['end']['type'] = (string) $end_arrow_type : null;
289        ($end_arrow_size !== null) ? $this->lineStyleProperties['arrow']['end']['size'] = (string) $end_arrow_size : null;
290    }
291
292    /**
293     * Get Line Style Property.
294     *
295     * @param array|string $elements
296     *
297     * @return string
298     */
299    public function getLineStyleProperty($elements)
300    {
301        return $this->getArrayElementsValue($this->lineStyleProperties, $elements);
302    }
303
304    /**
305     * Get Line Style Arrow Excel Width.
306     *
307     * @param string $arrow
308     *
309     * @return string
310     */
311    public function getLineStyleArrowWidth($arrow)
312    {
313        return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'w');
314    }
315
316    /**
317     * Get Line Style Arrow Excel Length.
318     *
319     * @param string $arrow
320     *
321     * @return string
322     */
323    public function getLineStyleArrowLength($arrow)
324    {
325        return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'len');
326    }
327
328    /**
329     * Set Shadow Properties.
330     *
331     * @param int $sh_presets
332     * @param string $sh_color_value
333     * @param string $sh_color_type
334     * @param string $sh_color_alpha
335     * @param float $sh_blur
336     * @param int $sh_angle
337     * @param float $sh_distance
338     */
339    public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null)
340    {
341        $this->setShadowPresetsProperties((int) $sh_presets)
342            ->setShadowColor(
343                $sh_color_value === null ? $this->shadowProperties['color']['value'] : $sh_color_value,
344                $sh_color_alpha === null ? (int) $this->shadowProperties['color']['alpha'] : $sh_color_alpha,
345                $sh_color_type === null ? $this->shadowProperties['color']['type'] : $sh_color_type
346            )
347            ->setShadowBlur($sh_blur)
348            ->setShadowAngle($sh_angle)
349            ->setShadowDistance($sh_distance);
350    }
351
352    /**
353     * Set Shadow Color.
354     *
355     * @param int $shadow_presets
356     *
357     * @return Axis
358     */
359    private function setShadowPresetsProperties($shadow_presets)
360    {
361        $this->shadowProperties['presets'] = $shadow_presets;
362        $this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets));
363
364        return $this;
365    }
366
367    /**
368     * Set Shadow Properties from Mapped Values.
369     *
370     * @param array $properties_map
371     * @param mixed &$reference
372     *
373     * @return Axis
374     */
375    private function setShadowProperiesMapValues(array $properties_map, &$reference = null)
376    {
377        $base_reference = $reference;
378        foreach ($properties_map as $property_key => $property_val) {
379            if (is_array($property_val)) {
380                if ($reference === null) {
381                    $reference = &$this->shadowProperties[$property_key];
382                } else {
383                    $reference = &$reference[$property_key];
384                }
385                $this->setShadowProperiesMapValues($property_val, $reference);
386            } else {
387                if ($base_reference === null) {
388                    $this->shadowProperties[$property_key] = $property_val;
389                } else {
390                    $reference[$property_key] = $property_val;
391                }
392            }
393        }
394
395        return $this;
396    }
397
398    /**
399     * Set Shadow Color.
400     *
401     * @param string $color
402     * @param int $alpha
403     * @param string $type
404     *
405     * @return Axis
406     */
407    private function setShadowColor($color, $alpha, $type)
408    {
409        $this->shadowProperties['color'] = $this->setColorProperties($color, $alpha, $type);
410
411        return $this;
412    }
413
414    /**
415     * Set Shadow Blur.
416     *
417     * @param float $blur
418     *
419     * @return Axis
420     */
421    private function setShadowBlur($blur)
422    {
423        if ($blur !== null) {
424            $this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur);
425        }
426
427        return $this;
428    }
429
430    /**
431     * Set Shadow Angle.
432     *
433     * @param int $angle
434     *
435     * @return Axis
436     */
437    private function setShadowAngle($angle)
438    {
439        if ($angle !== null) {
440            $this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle);
441        }
442
443        return $this;
444    }
445
446    /**
447     * Set Shadow Distance.
448     *
449     * @param float $distance
450     *
451     * @return Axis
452     */
453    private function setShadowDistance($distance)
454    {
455        if ($distance !== null) {
456            $this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance);
457        }
458
459        return $this;
460    }
461
462    /**
463     * Get Shadow Property.
464     *
465     * @param string|string[] $elements
466     *
467     * @return null|array|int|string
468     */
469    public function getShadowProperty($elements)
470    {
471        return $this->getArrayElementsValue($this->shadowProperties, $elements);
472    }
473
474    /**
475     * Set Glow Properties.
476     *
477     * @param float $size
478     * @param string $color_value
479     * @param int $color_alpha
480     * @param string $color_type
481     */
482    public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null)
483    {
484        $this->setGlowSize($size)
485            ->setGlowColor(
486                $color_value === null ? $this->glowProperties['color']['value'] : $color_value,
487                $color_alpha === null ? (int) $this->glowProperties['color']['alpha'] : $color_alpha,
488                $color_type === null ? $this->glowProperties['color']['type'] : $color_type
489            );
490    }
491
492    /**
493     * Get Glow Property.
494     *
495     * @param array|string $property
496     *
497     * @return string
498     */
499    public function getGlowProperty($property)
500    {
501        return $this->getArrayElementsValue($this->glowProperties, $property);
502    }
503
504    /**
505     * Set Glow Color.
506     *
507     * @param float $size
508     *
509     * @return Axis
510     */
511    private function setGlowSize($size)
512    {
513        if ($size !== null) {
514            $this->glowProperties['size'] = $this->getExcelPointsWidth($size);
515        }
516
517        return $this;
518    }
519
520    /**
521     * Set Glow Color.
522     *
523     * @param string $color
524     * @param int $alpha
525     * @param string $type
526     *
527     * @return Axis
528     */
529    private function setGlowColor($color, $alpha, $type)
530    {
531        $this->glowProperties['color'] = $this->setColorProperties($color, $alpha, $type);
532
533        return $this;
534    }
535
536    /**
537     * Set Soft Edges Size.
538     *
539     * @param float $size
540     */
541    public function setSoftEdges($size)
542    {
543        if ($size !== null) {
544            $softEdges['size'] = (string) $this->getExcelPointsWidth($size);
545        }
546    }
547
548    /**
549     * Get Soft Edges Size.
550     *
551     * @return string
552     */
553    public function getSoftEdgesSize()
554    {
555        return $this->softEdges['size'];
556    }
557}
558