1: <?php
2: /**
3: * PHPExcel
4: *
5: * Copyright (c) 2006 - 2014 PHPExcel
6: *
7: * This library is free software; you can redistribute it and/or
8: * modify it under the terms of the GNU Lesser General Public
9: * License as published by the Free Software Foundation; either
10: * version 2.1 of the License, or (at your option) any later version.
11: *
12: * This library is distributed in the hope that it will be useful,
13: * but WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15: * Lesser General Public License for more details.
16: *
17: * You should have received a copy of the GNU Lesser General Public
18: * License along with this library; if not, write to the Free Software
19: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20: *
21: * @category PHPExcel
22: * @package PHPExcel_Worksheet
23: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24: * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25: * @version 1.8.0, 2014-03-02
26: */
27:
28:
29: /**
30: * PHPExcel_Worksheet_BaseDrawing
31: *
32: * @category PHPExcel
33: * @package PHPExcel_Worksheet
34: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
35: */
36: class PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable
37: {
38: /**
39: * Image counter
40: *
41: * @var int
42: */
43: private static $_imageCounter = 0;
44:
45: /**
46: * Image index
47: *
48: * @var int
49: */
50: private $_imageIndex = 0;
51:
52: /**
53: * Name
54: *
55: * @var string
56: */
57: protected $_name;
58:
59: /**
60: * Description
61: *
62: * @var string
63: */
64: protected $_description;
65:
66: /**
67: * Worksheet
68: *
69: * @var PHPExcel_Worksheet
70: */
71: protected $_worksheet;
72:
73: /**
74: * Coordinates
75: *
76: * @var string
77: */
78: protected $_coordinates;
79:
80: /**
81: * Offset X
82: *
83: * @var int
84: */
85: protected $_offsetX;
86:
87: /**
88: * Offset Y
89: *
90: * @var int
91: */
92: protected $_offsetY;
93:
94: /**
95: * Width
96: *
97: * @var int
98: */
99: protected $_width;
100:
101: /**
102: * Height
103: *
104: * @var int
105: */
106: protected $_height;
107:
108: /**
109: * Proportional resize
110: *
111: * @var boolean
112: */
113: protected $_resizeProportional;
114:
115: /**
116: * Rotation
117: *
118: * @var int
119: */
120: protected $_rotation;
121:
122: /**
123: * Shadow
124: *
125: * @var PHPExcel_Worksheet_Drawing_Shadow
126: */
127: protected $_shadow;
128:
129: /**
130: * Create a new PHPExcel_Worksheet_BaseDrawing
131: */
132: public function __construct()
133: {
134: // Initialise values
135: $this->_name = '';
136: $this->_description = '';
137: $this->_worksheet = null;
138: $this->_coordinates = 'A1';
139: $this->_offsetX = 0;
140: $this->_offsetY = 0;
141: $this->_width = 0;
142: $this->_height = 0;
143: $this->_resizeProportional = true;
144: $this->_rotation = 0;
145: $this->_shadow = new PHPExcel_Worksheet_Drawing_Shadow();
146:
147: // Set image index
148: self::$_imageCounter++;
149: $this->_imageIndex = self::$_imageCounter;
150: }
151:
152: /**
153: * Get image index
154: *
155: * @return int
156: */
157: public function getImageIndex() {
158: return $this->_imageIndex;
159: }
160:
161: /**
162: * Get Name
163: *
164: * @return string
165: */
166: public function getName() {
167: return $this->_name;
168: }
169:
170: /**
171: * Set Name
172: *
173: * @param string $pValue
174: * @return PHPExcel_Worksheet_BaseDrawing
175: */
176: public function setName($pValue = '') {
177: $this->_name = $pValue;
178: return $this;
179: }
180:
181: /**
182: * Get Description
183: *
184: * @return string
185: */
186: public function getDescription() {
187: return $this->_description;
188: }
189:
190: /**
191: * Set Description
192: *
193: * @param string $pValue
194: * @return PHPExcel_Worksheet_BaseDrawing
195: */
196: public function setDescription($pValue = '') {
197: $this->_description = $pValue;
198: return $this;
199: }
200:
201: /**
202: * Get Worksheet
203: *
204: * @return PHPExcel_Worksheet
205: */
206: public function getWorksheet() {
207: return $this->_worksheet;
208: }
209:
210: /**
211: * Set Worksheet
212: *
213: * @param PHPExcel_Worksheet $pValue
214: * @param bool $pOverrideOld If a Worksheet has already been assigned, overwrite it and remove image from old Worksheet?
215: * @throws PHPExcel_Exception
216: * @return PHPExcel_Worksheet_BaseDrawing
217: */
218: public function setWorksheet(PHPExcel_Worksheet $pValue = null, $pOverrideOld = false) {
219: if (is_null($this->_worksheet)) {
220: // Add drawing to PHPExcel_Worksheet
221: $this->_worksheet = $pValue;
222: $this->_worksheet->getCell($this->_coordinates);
223: $this->_worksheet->getDrawingCollection()->append($this);
224: } else {
225: if ($pOverrideOld) {
226: // Remove drawing from old PHPExcel_Worksheet
227: $iterator = $this->_worksheet->getDrawingCollection()->getIterator();
228:
229: while ($iterator->valid()) {
230: if ($iterator->current()->getHashCode() == $this->getHashCode()) {
231: $this->_worksheet->getDrawingCollection()->offsetUnset( $iterator->key() );
232: $this->_worksheet = null;
233: break;
234: }
235: }
236:
237: // Set new PHPExcel_Worksheet
238: $this->setWorksheet($pValue);
239: } else {
240: throw new PHPExcel_Exception("A PHPExcel_Worksheet has already been assigned. Drawings can only exist on one PHPExcel_Worksheet.");
241: }
242: }
243: return $this;
244: }
245:
246: /**
247: * Get Coordinates
248: *
249: * @return string
250: */
251: public function getCoordinates() {
252: return $this->_coordinates;
253: }
254:
255: /**
256: * Set Coordinates
257: *
258: * @param string $pValue
259: * @return PHPExcel_Worksheet_BaseDrawing
260: */
261: public function setCoordinates($pValue = 'A1') {
262: $this->_coordinates = $pValue;
263: return $this;
264: }
265:
266: /**
267: * Get OffsetX
268: *
269: * @return int
270: */
271: public function getOffsetX() {
272: return $this->_offsetX;
273: }
274:
275: /**
276: * Set OffsetX
277: *
278: * @param int $pValue
279: * @return PHPExcel_Worksheet_BaseDrawing
280: */
281: public function setOffsetX($pValue = 0) {
282: $this->_offsetX = $pValue;
283: return $this;
284: }
285:
286: /**
287: * Get OffsetY
288: *
289: * @return int
290: */
291: public function getOffsetY() {
292: return $this->_offsetY;
293: }
294:
295: /**
296: * Set OffsetY
297: *
298: * @param int $pValue
299: * @return PHPExcel_Worksheet_BaseDrawing
300: */
301: public function setOffsetY($pValue = 0) {
302: $this->_offsetY = $pValue;
303: return $this;
304: }
305:
306: /**
307: * Get Width
308: *
309: * @return int
310: */
311: public function getWidth() {
312: return $this->_width;
313: }
314:
315: /**
316: * Set Width
317: *
318: * @param int $pValue
319: * @return PHPExcel_Worksheet_BaseDrawing
320: */
321: public function setWidth($pValue = 0) {
322: // Resize proportional?
323: if ($this->_resizeProportional && $pValue != 0) {
324: $ratio = $this->_height / $this->_width;
325: $this->_height = round($ratio * $pValue);
326: }
327:
328: // Set width
329: $this->_width = $pValue;
330:
331: return $this;
332: }
333:
334: /**
335: * Get Height
336: *
337: * @return int
338: */
339: public function getHeight() {
340: return $this->_height;
341: }
342:
343: /**
344: * Set Height
345: *
346: * @param int $pValue
347: * @return PHPExcel_Worksheet_BaseDrawing
348: */
349: public function setHeight($pValue = 0) {
350: // Resize proportional?
351: if ($this->_resizeProportional && $pValue != 0) {
352: $ratio = $this->_width / $this->_height;
353: $this->_width = round($ratio * $pValue);
354: }
355:
356: // Set height
357: $this->_height = $pValue;
358:
359: return $this;
360: }
361:
362: /**
363: * Set width and height with proportional resize
364: * Example:
365: * <code>
366: * $objDrawing->setResizeProportional(true);
367: * $objDrawing->setWidthAndHeight(160,120);
368: * </code>
369: *
370: * @author Vincent@luo MSN:kele_100@hotmail.com
371: * @param int $width
372: * @param int $height
373: * @return PHPExcel_Worksheet_BaseDrawing
374: */
375: public function setWidthAndHeight($width = 0, $height = 0) {
376: $xratio = $width / $this->_width;
377: $yratio = $height / $this->_height;
378: if ($this->_resizeProportional && !($width == 0 || $height == 0)) {
379: if (($xratio * $this->_height) < $height) {
380: $this->_height = ceil($xratio * $this->_height);
381: $this->_width = $width;
382: } else {
383: $this->_width = ceil($yratio * $this->_width);
384: $this->_height = $height;
385: }
386: }
387: return $this;
388: }
389:
390: /**
391: * Get ResizeProportional
392: *
393: * @return boolean
394: */
395: public function getResizeProportional() {
396: return $this->_resizeProportional;
397: }
398:
399: /**
400: * Set ResizeProportional
401: *
402: * @param boolean $pValue
403: * @return PHPExcel_Worksheet_BaseDrawing
404: */
405: public function setResizeProportional($pValue = true) {
406: $this->_resizeProportional = $pValue;
407: return $this;
408: }
409:
410: /**
411: * Get Rotation
412: *
413: * @return int
414: */
415: public function getRotation() {
416: return $this->_rotation;
417: }
418:
419: /**
420: * Set Rotation
421: *
422: * @param int $pValue
423: * @return PHPExcel_Worksheet_BaseDrawing
424: */
425: public function setRotation($pValue = 0) {
426: $this->_rotation = $pValue;
427: return $this;
428: }
429:
430: /**
431: * Get Shadow
432: *
433: * @return PHPExcel_Worksheet_Drawing_Shadow
434: */
435: public function getShadow() {
436: return $this->_shadow;
437: }
438:
439: /**
440: * Set Shadow
441: *
442: * @param PHPExcel_Worksheet_Drawing_Shadow $pValue
443: * @throws PHPExcel_Exception
444: * @return PHPExcel_Worksheet_BaseDrawing
445: */
446: public function setShadow(PHPExcel_Worksheet_Drawing_Shadow $pValue = null) {
447: $this->_shadow = $pValue;
448: return $this;
449: }
450:
451: /**
452: * Get hash code
453: *
454: * @return string Hash code
455: */
456: public function getHashCode() {
457: return md5(
458: $this->_name
459: . $this->_description
460: . $this->_worksheet->getHashCode()
461: . $this->_coordinates
462: . $this->_offsetX
463: . $this->_offsetY
464: . $this->_width
465: . $this->_height
466: . $this->_rotation
467: . $this->_shadow->getHashCode()
468: . __CLASS__
469: );
470: }
471:
472: /**
473: * Implement PHP __clone to create a deep clone, not just a shallow copy.
474: */
475: public function __clone() {
476: $vars = get_object_vars($this);
477: foreach ($vars as $key => $value) {
478: if (is_object($value)) {
479: $this->$key = clone $value;
480: } else {
481: $this->$key = $value;
482: }
483: }
484: }
485: }
486: