1<?php
2
3namespace PhpOffice\PhpSpreadsheet;
4
5use PhpOffice\PhpSpreadsheet\RichText\RichText;
6
7class Comment implements IComparable
8{
9    /**
10     * Author.
11     *
12     * @var string
13     */
14    private $author;
15
16    /**
17     * Rich text comment.
18     *
19     * @var RichText
20     */
21    private $text;
22
23    /**
24     * Comment width (CSS style, i.e. XXpx or YYpt).
25     *
26     * @var string
27     */
28    private $width = '96pt';
29
30    /**
31     * Left margin (CSS style, i.e. XXpx or YYpt).
32     *
33     * @var string
34     */
35    private $marginLeft = '59.25pt';
36
37    /**
38     * Top margin (CSS style, i.e. XXpx or YYpt).
39     *
40     * @var string
41     */
42    private $marginTop = '1.5pt';
43
44    /**
45     * Visible.
46     *
47     * @var bool
48     */
49    private $visible = false;
50
51    /**
52     * Comment height (CSS style, i.e. XXpx or YYpt).
53     *
54     * @var string
55     */
56    private $height = '55.5pt';
57
58    /**
59     * Comment fill color.
60     *
61     * @var Style\Color
62     */
63    private $fillColor;
64
65    /**
66     * Alignment.
67     *
68     * @var string
69     */
70    private $alignment;
71
72    /**
73     * Create a new Comment.
74     */
75    public function __construct()
76    {
77        // Initialise variables
78        $this->author = 'Author';
79        $this->text = new RichText();
80        $this->fillColor = new Style\Color('FFFFFFE1');
81        $this->alignment = Style\Alignment::HORIZONTAL_GENERAL;
82    }
83
84    /**
85     * Get Author.
86     *
87     * @return string
88     */
89    public function getAuthor()
90    {
91        return $this->author;
92    }
93
94    /**
95     * Set Author.
96     *
97     * @param string $author
98     *
99     * @return Comment
100     */
101    public function setAuthor($author)
102    {
103        $this->author = $author;
104
105        return $this;
106    }
107
108    /**
109     * Get Rich text comment.
110     *
111     * @return RichText
112     */
113    public function getText()
114    {
115        return $this->text;
116    }
117
118    /**
119     * Set Rich text comment.
120     *
121     * @param RichText $pValue
122     *
123     * @return Comment
124     */
125    public function setText(RichText $pValue)
126    {
127        $this->text = $pValue;
128
129        return $this;
130    }
131
132    /**
133     * Get comment width (CSS style, i.e. XXpx or YYpt).
134     *
135     * @return string
136     */
137    public function getWidth()
138    {
139        return $this->width;
140    }
141
142    /**
143     * Set comment width (CSS style, i.e. XXpx or YYpt).
144     *
145     * @param string $width
146     *
147     * @return Comment
148     */
149    public function setWidth($width)
150    {
151        $this->width = $width;
152
153        return $this;
154    }
155
156    /**
157     * Get comment height (CSS style, i.e. XXpx or YYpt).
158     *
159     * @return string
160     */
161    public function getHeight()
162    {
163        return $this->height;
164    }
165
166    /**
167     * Set comment height (CSS style, i.e. XXpx or YYpt).
168     *
169     * @param string $value
170     *
171     * @return Comment
172     */
173    public function setHeight($value)
174    {
175        $this->height = $value;
176
177        return $this;
178    }
179
180    /**
181     * Get left margin (CSS style, i.e. XXpx or YYpt).
182     *
183     * @return string
184     */
185    public function getMarginLeft()
186    {
187        return $this->marginLeft;
188    }
189
190    /**
191     * Set left margin (CSS style, i.e. XXpx or YYpt).
192     *
193     * @param string $value
194     *
195     * @return Comment
196     */
197    public function setMarginLeft($value)
198    {
199        $this->marginLeft = $value;
200
201        return $this;
202    }
203
204    /**
205     * Get top margin (CSS style, i.e. XXpx or YYpt).
206     *
207     * @return string
208     */
209    public function getMarginTop()
210    {
211        return $this->marginTop;
212    }
213
214    /**
215     * Set top margin (CSS style, i.e. XXpx or YYpt).
216     *
217     * @param string $value
218     *
219     * @return Comment
220     */
221    public function setMarginTop($value)
222    {
223        $this->marginTop = $value;
224
225        return $this;
226    }
227
228    /**
229     * Is the comment visible by default?
230     *
231     * @return bool
232     */
233    public function getVisible()
234    {
235        return $this->visible;
236    }
237
238    /**
239     * Set comment default visibility.
240     *
241     * @param bool $value
242     *
243     * @return Comment
244     */
245    public function setVisible($value)
246    {
247        $this->visible = $value;
248
249        return $this;
250    }
251
252    /**
253     * Get fill color.
254     *
255     * @return Style\Color
256     */
257    public function getFillColor()
258    {
259        return $this->fillColor;
260    }
261
262    /**
263     * Set Alignment.
264     *
265     * @param string $alignment see Style\Alignment::HORIZONTAL_*
266     *
267     * @return Comment
268     */
269    public function setAlignment($alignment)
270    {
271        $this->alignment = $alignment;
272
273        return $this;
274    }
275
276    /**
277     * Get Alignment.
278     *
279     * @return string
280     */
281    public function getAlignment()
282    {
283        return $this->alignment;
284    }
285
286    /**
287     * Get hash code.
288     *
289     * @return string Hash code
290     */
291    public function getHashCode()
292    {
293        return md5(
294            $this->author .
295            $this->text->getHashCode() .
296            $this->width .
297            $this->height .
298            $this->marginLeft .
299            $this->marginTop .
300            ($this->visible ? 1 : 0) .
301            $this->fillColor->getHashCode() .
302            $this->alignment .
303            __CLASS__
304        );
305    }
306
307    /**
308     * Implement PHP __clone to create a deep clone, not just a shallow copy.
309     */
310    public function __clone()
311    {
312        $vars = get_object_vars($this);
313        foreach ($vars as $key => $value) {
314            if (is_object($value)) {
315                $this->$key = clone $value;
316            } else {
317                $this->$key = $value;
318            }
319        }
320    }
321
322    /**
323     * Convert to string.
324     *
325     * @return string
326     */
327    public function __toString()
328    {
329        return $this->text->getPlainText();
330    }
331}
332