web/Zend/Pdf/Action.php
changeset 0 4eba9c11703f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/Zend/Pdf/Action.php	Mon Dec 13 18:29:26 2010 +0100
@@ -0,0 +1,404 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category   Zend
+ * @package    Zend_Pdf
+ * @subpackage Actions
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @version    $Id: Action.php 22437 2010-06-15 16:13:46Z alexander $
+ */
+
+
+/** Internally used classes */
+require_once 'Zend/Pdf/Element.php';
+require_once 'Zend/Pdf/Element/Array.php';
+
+
+/** Zend_Pdf_Target */
+require_once 'Zend/Pdf/Target.php';
+
+
+/**
+ * Abstract PDF action representation class
+ *
+ * @package    Zend_Pdf
+ * @subpackage Actions
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ */
+abstract class Zend_Pdf_Action extends Zend_Pdf_Target implements RecursiveIterator, Countable
+{
+    /**
+     * Action dictionary
+     *
+     * @var Zend_Pdf_Element_Dictionary|Zend_Pdf_Element_Object|Zend_Pdf_Element_Reference
+     */
+    protected $_actionDictionary;
+
+
+    /**
+     * An original list of chained actions
+     *
+     * @var array  Array of Zend_Pdf_Action objects
+     */
+    protected $_originalNextList;
+
+    /**
+     * A list of next actions in actions tree (used for actions chaining)
+     *
+     * @var array  Array of Zend_Pdf_Action objects
+     */
+    public $next = array();
+
+    /**
+     * Object constructor
+     *
+     * @param Zend_Pdf_Element_Dictionary $dictionary
+     * @param SplObjectStorage            $processedActions  list of already processed action dictionaries, used to avoid cyclic references
+     * @throws Zend_Pdf_Exception
+     */
+    public function __construct(Zend_Pdf_Element $dictionary, SplObjectStorage $processedActions)
+    {
+        require_once 'Zend/Pdf/Element.php';
+        if ($dictionary->getType() != Zend_Pdf_Element::TYPE_DICTIONARY) {
+            require_once 'Zend/Pdf/Exception.php';
+            throw new Zend_Pdf_Exception('$dictionary mast be a direct or an indirect dictionary object.');
+        }
+
+        $this->_actionDictionary = $dictionary;
+
+        if ($dictionary->Next !== null) {
+            if ($dictionary->Next instanceof Zend_Pdf_Element_Dictionary) {
+                // Check if dictionary object is not already processed
+                if (!$processedActions->contains($dictionary->Next)) {
+                    $processedActions->attach($dictionary->Next);
+                    $this->next[] = Zend_Pdf_Action::load($dictionary->Next, $processedActions);
+                }
+            } else if ($dictionary->Next instanceof Zend_Pdf_Element_Array) {
+                foreach ($dictionary->Next->items as $chainedActionDictionary) {
+                    // Check if dictionary object is not already processed
+                    if (!$processedActions->contains($chainedActionDictionary)) {
+                        $processedActions->attach($chainedActionDictionary);
+                        $this->next[] = Zend_Pdf_Action::load($chainedActionDictionary, $processedActions);
+                    }
+                }
+            } else {
+                require_once 'Zend/Pdf/Exception.php';
+                throw new Zend_Pdf_Exception('PDF Action dictionary Next entry must be a dictionary or an array.');
+            }
+        }
+
+        $this->_originalNextList = $this->next;
+    }
+
+    /**
+     * Load PDF action object using specified dictionary
+     *
+     * @internal
+     * @param Zend_Pdf_Element $dictionary (It's actually Dictionary or Dictionary Object or Reference to a Dictionary Object)
+     * @param SplObjectStorage $processedActions  list of already processed action dictionaries, used to avoid cyclic references
+     * @return Zend_Pdf_Action
+     * @throws Zend_Pdf_Exception
+     */
+    public static function load(Zend_Pdf_Element $dictionary, SplObjectStorage $processedActions = null)
+    {
+        if ($processedActions === null) {
+            $processedActions = new SplObjectStorage();
+        }
+
+        require_once 'Zend/Pdf/Element.php';
+        if ($dictionary->getType() != Zend_Pdf_Element::TYPE_DICTIONARY) {
+            require_once 'Zend/Pdf/Exception.php';
+            throw new Zend_Pdf_Exception('$dictionary mast be a direct or an indirect dictionary object.');
+        }
+        if (isset($dictionary->Type)  &&  $dictionary->Type->value != 'Action') {
+            require_once 'Zend/Pdf/Exception.php';
+            throw new Zend_Pdf_Exception('Action dictionary Type entry must be set to \'Action\'.');
+        }
+
+        if ($dictionary->S === null) {
+            require_once 'Zend/Pdf/Exception.php';
+            throw new Zend_Pdf_Exception('Action dictionary must contain S entry');
+        }
+
+        switch ($dictionary->S->value) {
+            case 'GoTo':
+                require_once 'Zend/Pdf/Action/GoTo.php';
+                return new Zend_Pdf_Action_GoTo($dictionary, $processedActions);
+                break;
+
+            case 'GoToR':
+                require_once 'Zend/Pdf/Action/GoToR.php';
+                return new Zend_Pdf_Action_GoToR($dictionary, $processedActions);
+                break;
+
+            case 'GoToE':
+                require_once 'Zend/Pdf/Action/GoToE.php';
+                return new Zend_Pdf_Action_GoToE($dictionary, $processedActions);
+                break;
+
+            case 'Launch':
+                require_once 'Zend/Pdf/Action/Launch.php';
+                return new Zend_Pdf_Action_Launch($dictionary, $processedActions);
+                break;
+
+            case 'Thread':
+                require_once 'Zend/Pdf/Action/Thread.php';
+                return new Zend_Pdf_Action_Thread($dictionary, $processedActions);
+                break;
+
+            case 'URI':
+                require_once 'Zend/Pdf/Action/URI.php';
+                return new Zend_Pdf_Action_URI($dictionary, $processedActions);
+                break;
+
+            case 'Sound':
+                require_once 'Zend/Pdf/Action/Sound.php';
+                return new Zend_Pdf_Action_Sound($dictionary, $processedActions);
+                break;
+
+            case 'Movie':
+                require_once 'Zend/Pdf/Action/Movie.php';
+                return new Zend_Pdf_Action_Movie($dictionary, $processedActions);
+                break;
+
+            case 'Hide':
+                require_once 'Zend/Pdf/Action/Hide.php';
+                return new Zend_Pdf_Action_Hide($dictionary, $processedActions);
+                break;
+
+            case 'Named':
+                require_once 'Zend/Pdf/Action/Named.php';
+                return new Zend_Pdf_Action_Named($dictionary, $processedActions);
+                break;
+
+            case 'SubmitForm':
+                require_once 'Zend/Pdf/Action/SubmitForm.php';
+                return new Zend_Pdf_Action_SubmitForm($dictionary, $processedActions);
+                break;
+
+            case 'ResetForm':
+                require_once 'Zend/Pdf/Action/ResetForm.php';
+                return new Zend_Pdf_Action_ResetForm($dictionary, $processedActions);
+                break;
+
+            case 'ImportData':
+                require_once 'Zend/Pdf/Action/ImportData.php';
+                return new Zend_Pdf_Action_ImportData($dictionary, $processedActions);
+                break;
+
+            case 'JavaScript':
+                require_once 'Zend/Pdf/Action/JavaScript.php';
+                return new Zend_Pdf_Action_JavaScript($dictionary, $processedActions);
+                break;
+
+            case 'SetOCGState':
+                require_once 'Zend/Pdf/Action/SetOCGState.php';
+                return new Zend_Pdf_Action_SetOCGState($dictionary, $processedActions);
+                break;
+
+            case 'Rendition':
+                require_once 'Zend/Pdf/Action/Rendition.php';
+                return new Zend_Pdf_Action_Rendition($dictionary, $processedActions);
+                break;
+
+            case 'Trans':
+                require_once 'Zend/Pdf/Action/Trans.php';
+                return new Zend_Pdf_Action_Trans($dictionary, $processedActions);
+                break;
+
+            case 'GoTo3DView':
+                require_once 'Zend/Pdf/Action/GoTo3DView.php';
+                return new Zend_Pdf_Action_GoTo3DView($dictionary, $processedActions);
+                break;
+
+            default:
+                require_once 'Zend/Pdf/Action/Unknown.php';
+                return new Zend_Pdf_Action_Unknown($dictionary, $processedActions);
+                break;
+        }
+    }
+
+    /**
+     * Get resource
+     *
+     * @internal
+     * @return Zend_Pdf_Element
+     */
+    public function getResource()
+    {
+        return $this->_actionDictionary;
+    }
+
+    /**
+     * Dump Action and its child actions into PDF structures
+     *
+     * Returns dictionary indirect object or reference
+     *
+     * @internal
+     * @param Zend_Pdf_ElementFactory $factory   Object factory for newly created indirect objects
+     * @param SplObjectStorage $processedActions  list of already processed actions (used to prevent infinity loop caused by cyclic references)
+     * @return Zend_Pdf_Element_Object|Zend_Pdf_Element_Reference   Dictionary indirect object
+     */
+    public function dumpAction(Zend_Pdf_ElementFactory_Interface $factory, SplObjectStorage $processedActions = null)
+    {
+        if ($processedActions === null) {
+            $processedActions = new SplObjectStorage();
+        }
+        if ($processedActions->contains($this)) {
+            require_once 'Zend/Pdf/Exception.php';
+            throw new Zend_Pdf_Exception('Action chain cyclyc reference is detected.');
+        }
+        $processedActions->attach($this);
+
+        $childListUpdated = false;
+        if (count($this->_originalNextList) != count($this->next)) {
+            // If original and current children arrays have different size then children list was updated
+            $childListUpdated = true;
+        } else if ( !(array_keys($this->_originalNextList) === array_keys($this->next)) ) {
+            // If original and current children arrays have different keys (with a glance to an order) then children list was updated
+            $childListUpdated = true;
+        } else {
+            foreach ($this->next as $key => $childAction) {
+                if ($this->_originalNextList[$key] !== $childAction) {
+                    $childListUpdated = true;
+                    break;
+                }
+            }
+        }
+
+        if ($childListUpdated) {
+            $this->_actionDictionary->touch();
+            switch (count($this->next)) {
+                case 0:
+                    $this->_actionDictionary->Next = null;
+                    break;
+
+                case 1:
+                    $child = reset($this->next);
+                    $this->_actionDictionary->Next = $child->dumpAction($factory, $processedActions);
+                    break;
+
+                default:
+                    require_once 'Zend/Pdf/Element/Array.php';
+                    $pdfChildArray = new Zend_Pdf_Element_Array();
+                    foreach ($this->next as $child) {
+
+                        $pdfChildArray->items[] = $child->dumpAction($factory, $processedActions);
+                    }
+                    $this->_actionDictionary->Next = $pdfChildArray;
+                    break;
+            }
+        } else {
+            foreach ($this->next as $child) {
+                $child->dumpAction($factory, $processedActions);
+            }
+        }
+
+        if ($this->_actionDictionary instanceof Zend_Pdf_Element_Dictionary) {
+            // It's a newly created action. Register it within object factory and return indirect object
+            return $factory->newObject($this->_actionDictionary);
+        } else {
+            // It's a loaded object
+            return $this->_actionDictionary;
+        }
+    }
+
+
+    ////////////////////////////////////////////////////////////////////////
+    //  RecursiveIterator interface methods
+    //////////////
+
+    /**
+     * Returns current child action.
+     *
+     * @return Zend_Pdf_Action
+     */
+    public function current()
+    {
+        return current($this->next);
+    }
+
+    /**
+     * Returns current iterator key
+     *
+     * @return integer
+     */
+    public function key()
+    {
+        return key($this->next);
+    }
+
+    /**
+     * Go to next child
+     */
+    public function next()
+    {
+        return next($this->next);
+    }
+
+    /**
+     * Rewind children
+     */
+    public function rewind()
+    {
+        return reset($this->next);
+    }
+
+    /**
+     * Check if current position is valid
+     *
+     * @return boolean
+     */
+    public function valid()
+    {
+        return current($this->next) !== false;
+    }
+
+    /**
+     * Returns the child action.
+     *
+     * @return Zend_Pdf_Action|null
+     */
+    public function getChildren()
+    {
+        return current($this->next);
+    }
+
+    /**
+     * Implements RecursiveIterator interface.
+     *
+     * @return bool  whether container has any pages
+     */
+    public function hasChildren()
+    {
+        return count($this->next) > 0;
+    }
+
+
+    ////////////////////////////////////////////////////////////////////////
+    //  Countable interface methods
+    //////////////
+
+    /**
+     * count()
+     *
+     * @return int
+     */
+    public function count()
+    {
+        return count($this->childOutlines);
+    }
+}