Completed
Push — master ( ccb877...3ce8ef )
by Stefan
02:31
created

Sheet::setFreezePaneId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
3
namespace OneSheet;
4
5
use OneSheet\Xml\RowXml;
6
use OneSheet\Style\Style;
7
use OneSheet\Xml\SheetXml;
8
use OneSheet\Width\WidthCalculator;
9
10
/**
11
 * Class Sheet
12
 *
13
 * @package OneSheet
14
 */
15
class Sheet
16
{
17
    /**
18
     * @var CellBuilder
19
     */
20
    private $cellBuilder;
21
22
    /**
23
     * @var WidthCalculator
24
     */
25
    private $widthCalculator;
26
27
    /**
28
     * @var bool
29
     */
30
    private $useCellAutosizing = false;
31
32
    /**
33
     * @var int
34
     */
35
    private $freezePaneId;
36
37
    /**
38
     * Track next row index.
39
     *
40
     * @var int
41
     */
42
    private $rowIndex = 1;
43
44
    /**
45
     * Holds width/column count of the widest row.
46
     *
47
     * @var int
48
     */
49
    private $maxRowWidth;
50
51
    /**
52
     * Holds widths of the widest cells for column sizing.
53
     *
54
     * @var array
55
     */
56
    private $columnWidths;
57
58
    /**
59
     * Sheet constructor.
60
     */
61 3
    public function __construct()
62 1
    {
63 3
        $this->cellBuilder = new CellBuilder();
64 3
        $this->widthCalculator = new WidthCalculator();
65 3
    }
66
67
    /**
68
     * Enable cell autosizing (~30% performance hit!).
69
     */
70 2
    public function enableCellAutosizing()
71
    {
72 2
        $this->useCellAutosizing = true;
73 2
    }
74
75
    /**
76
     * Disable cell autosizing (default).
77
     */
78
    public function disableCellAutosizing()
79
    {
80
        $this->useCellAutosizing = false;
81
    }
82
83
    /**
84
     * Return array containing all column widths.
85
     *
86
     * @return array
87
     */
88 1
    public function getColumnWidths()
89
    {
90 1
        return $this->columnWidths;
91
    }
92
93
    /**
94
     * Return cellId for dimensions.
95
     *
96
     * @return string
97
     */
98 1
    public function getDimensionUpperBound()
99
    {
100 1
        return $this->cellBuilder->getCellId($this->maxRowWidth, $this->rowIndex - 1);
101
    }
102
103
    /**
104
     * Add single row and style to sheet.
105
     *
106
     * @param array $row
107
     * @param Style $style
108
     *
109
     * @return string
110
     */
111 2
    public function addRow(array $row, Style $style)
112
    {
113 2
        $rowWidth = count($row);
114 2
        $this->updateMaxRowWidth($rowWidth);
115
116 2
        $this->widthCalculator->setFont($style->getFont());
117 2
        $cellXml = $this->getCellXml($row, $style);
118
119 2
        if (!$this->useCellAutosizing || $style->getFont()->getSize() < 14) {
120 2
            return sprintf(RowXml::DEFAULT_XML, $this->rowIndex++, $rowWidth, $cellXml);
121
        }
122
123
        return sprintf(RowXml::HEIGHT_XML, $this->rowIndex++, $rowWidth,
124
            $style->getFont()->getSize() * 1.4, $cellXml);
125
    }
126
127
    /**
128
     * @param int $cellId
129
     */
130 1
    public function setFreezePaneId($cellId)
131
    {
132 1
        $this->freezePaneId = $cellId;
133 1
    }
134
135
    /**
136
     * Track widest row for dimensions xml (e.g. A1:K123).
137
     *
138
     * @param int $rowWidth
139
     */
140 2
    private function updateMaxRowWidth($rowWidth)
141
    {
142 2
        if ($this->maxRowWidth < $rowWidth) {
143 2
            $this->maxRowWidth = $rowWidth;
144 2
        }
145 2
    }
146
147
    /**
148
     * Get xml string for single cell and update cell widths.
149
     *
150
     * @param array $row
151
     * @param Style $style
152
     * @return string
153
     */
154 2
    private function getCellXml(array $row, Style $style)
155
    {
156 2
        $cellXml = '';
157 2
        foreach (array_values($row) as $cellIndex => $cellValue) {
158 2
            if (0 == strlen($cellValue)) {
159
                continue;
160
            }
161 2
            if ($this->useCellAutosizing) {
162 2
                $this->updateColumnWidths($cellValue, $cellIndex, $style);
163 2
            }
164 2
            $cellXml .= $this->cellBuilder->build($this->rowIndex, $cellIndex, $cellValue,
165 2
                $style->getId());
166 2
        }
167
168 2
        return $cellXml;
169
    }
170
171
    /**
172
     * Track cell width for column width sizing.
173
     *
174
     * @param mixed $value
175
     * @param int   $cellIndex
176
     * @param Style $style
177
     */
178 2
    private function updateColumnWidths($value, $cellIndex, Style $style)
179
    {
180 2
        $cellWidth = $this->widthCalculator->getCellWidth($value, $style->getFont()->isBold());
181
182 2
        if (!isset($this->columnWidths[$cellIndex])
183 2
            || $this->columnWidths[$cellIndex] < $cellWidth
184 2
        ) {
185 2
            $this->columnWidths[$cellIndex] = $cellWidth;
186 2
        }
187 2
    }
188
189
    /**
190
     * Return freeze pane xml string for sheezview.
191
     *
192
     * @return string
193
     */
194 2
    public function getFreezePaneXml()
195
    {
196 2
        if (!$this->freezePaneId
197 2
            || 1 !== preg_match('~^[A-Z]+(\d+)$~', $this->freezePaneId, $m)
198 2
        ) {
199 2
            return '';
200
        }
201 1
        return sprintf(SheetXml::FREEZE_PANE_XML, array_pop($m) - 1, $this->freezePaneId);
202
    }
203
}
204