diff -r 000000000000 -r 4eba9c11703f web/Zend/Pdf/Action.php --- /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 @@ +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); + } +}