[TASK] Harmonize coding style of if constructs in /typo3/sysext/cms/
[Packages/TYPO3.CMS.git] / typo3 / sysext / opendocs / class.tx_opendocs.php
index e40da02..7921d03 100644 (file)
@@ -2,7 +2,7 @@
 /***************************************************************
 *  Copyright notice
 *
-*  (c) 2008 Benjamin Mack <mack@xnos.org>
+*  (c) 2008-2011 Benjamin Mack <mack@xnos.org>
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/
 
+require_once(PATH_typo3 . 'interfaces/interface.backend_toolbaritem.php');
+
        // load the language file
 $GLOBALS['LANG']->includeLLFile('EXT:opendocs/locallang_opendocs.xml');
 
-require_once(PATH_typo3.'interfaces/interface.backend_toolbaritem.php');
-
 
 /**
  * Adding a list of all open documents of a user to the backend.php
  *
- * @author     Benjamin Mack <mack@xnos.org>
+ * @author     Benjamin Mack <benni@typo3.org>
+ * @author     Ingo Renner <ingo@typo3.org>
  * @package    TYPO3
  * @subpackage opendocs
  */
@@ -45,10 +46,11 @@ class tx_opendocs implements backend_toolbarItem {
         *
         * @var TYPO3backend
         */
-       private $backendReference;
-       private $openDocs;
-       private $recentDocs;
-       private $EXTKEY = 'opendocs';
+       protected $backendReference;
+
+       protected $openDocs;
+       protected $recentDocs;
+       protected $EXTKEY = 'opendocs';
 
 
        /**
@@ -56,80 +58,147 @@ class tx_opendocs implements backend_toolbarItem {
         *
         * @param       TYPO3backend    TYPO3 backend object reference
         */
-       public function __construct(TYPO3backend &$backendReference) {
+       public function __construct(TYPO3backend &$backendReference = NULL) {
                $this->backendReference = $backendReference;
-
-               list($this->openDocs,)  = $GLOBALS['BE_USER']->getModuleData('alt_doc.php','ses');
-               $this->recentDocs       = $GLOBALS['BE_USER']->getModuleData('opendocs::recent');
+               $this->loadDocsFromUserSession();
        }
 
        /**
         * checks whether the user has access to this toolbar item
         *
-        * @return  boolean  true if user has access, false if not
+        * @return  boolean  TRUE if user has access, FALSE if not
         */
        public function checkAccess() {
-                       // FIXME - needs proper access check
-               return true;
+               $conf = $GLOBALS['BE_USER']->getTSConfig('backendToolbarItem.tx_opendocs.disabled');
+               return ($conf['value'] == 1 ? FALSE : TRUE);
        }
 
        /**
-        * renders the toolbar item and the empty menu
+        * loads the opened and recently opened documents from the user
         *
-        * @return      void
+        * @return  void
+        */
+       public function loadDocsFromUserSession() {
+               list($this->openDocs, )  = $GLOBALS['BE_USER']->getModuleData('alt_doc.php', 'ses');
+               $this->recentDocs        = $GLOBALS['BE_USER']->getModuleData('opendocs::recent');
+       }
+
+       /**
+        * renders the toolbar item and the initial menu
+        *
+        * @return      string          the toolbar item including the initial menu content as HTML
         */
        public function render() {
                $this->addJavascriptToBackend();
                $this->addCssToBackend();
+               $numDocs      = count($this->openDocs);
+               $opendocsMenu = array();
+               $title        = $GLOBALS['LANG']->getLL('toolbaritem', TRUE);
 
-                       // return the toolbar item and an empty UL
-               $output  = '<a href="#" class="toolbar-item">';
-               $output .= '<img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], t3lib_extMgm::extRelPath($this->EXTKEY).'opendocs.png', 'width="23" height="14"').' title="'.$GLOBALS['LANG']->getLL('toolbaritem',1).'" alt="" />';
-               $output .= '</a>';
-               $output .= '<ul class="toolbar-item-menu" style="display: none;"></ul>';
+                       // toolbar item icon
+               $opendocsMenu[] = '<a href="#" class="toolbar-item">';
+               $opendocsMenu[] = '<input type="text" id="tx-opendocs-counter" disabled="disabled" value="' . $numDocs . '" />';
+               $opendocsMenu[] = t3lib_iconWorks::getSpriteIcon('apps-toolbar-menu-opendocs', array('title' => $title)) . '</a>';
 
-               return $output;
-       }
+                       // toolbar item menu and initial content
+               $opendocsMenu[] = '<div class="toolbar-item-menu" style="display: none;">';
+               $opendocsMenu[] = $this->renderMenu();
+               $opendocsMenu[] = '</div>';
 
+               return implode(LF, $opendocsMenu);
+       }
 
        /**
-        * returns the opened documents list as an array
+        * renders the pure contents of the menu
         *
-        * @return      array   all open documents as list-items
+        * @return      string          the menu's content
         */
-       public function getOpenDocuments() {
-               $docs = array();
+       public function renderMenu() {
+               $openDocuments   = $this->openDocs;
+               $recentDocuments = $this->recentDocs;
+               $entries         = array();
+               $content         = '';
+
+               if (count($openDocuments)) {
+                       $entries[] = '<tr><th colspan="3">' . $GLOBALS['LANG']->getLL('open_docs', TRUE) . '</th></tr>';
+
+                       $i = 0;
+                       foreach ($openDocuments as $md5sum => $openDocument) {
+                               $i++;
+                               $entries[] = $this->renderMenuEntry($openDocument, $md5sum, FALSE, ($i == 1));
+                       }
+               }
+
+                       // if there are "recent documents" in the list, add them
+               if (count($recentDocuments)) {
+                       $entries[] = '<tr><th colspan="3">' . $GLOBALS['LANG']->getLL('recent_docs', TRUE) . '</th></tr>';
 
-                       // Traverse the list of open documents:
-               if (is_array($this->openDocs)) {
-                       foreach($this->openDocs as $md5k => $lnk) {
-                               $docs[] = '<li><a target="content" href="'.htmlspecialchars('alt_doc.php?'.$lnk[2]).'">'.htmlspecialchars(strip_tags(t3lib_div::htmlspecialchars_decode($lnk[0]))).'</a></li>';
+                       $i = 0;
+                       foreach ($recentDocuments as $md5sum => $recentDocument) {
+                               $i++;
+                               $entries[] = $this->renderMenuEntry($recentDocument, $md5sum, TRUE, ($i == 1));
                        }
                }
-               return $docs;
-       }
 
+               if (count($entries)) {
+                       $content = '<table class="list" cellspacing="0" cellpadding="0" border="0">' . implode('', $entries) . '</table>';
+               } else {
+                       $content = '<div class="no-docs">' . $GLOBALS['LANG']->getLL('no_docs', TRUE) . '</div>';
+               }
+
+               return $content;
+       }
 
        /**
         * returns the recent documents list as an array
         *
         * @return      array   all recent documents as list-items
         */
-       public function getRecentDocuments() {
-               $docs = array();
+       public function renderMenuEntry($document, $md5sum, $isRecentDoc = FALSE, $isFirstDoc = FALSE) {
+               $table  = $document[3]['table'];
+               $uid    = $document[3]['uid'];
+               $record = t3lib_BEfunc::getRecordWSOL($table, $uid);
+               if (!is_array($record)) {
+                               // record seems to be deleted
+                       return '';
+               }
+               $label  = htmlspecialchars(strip_tags(t3lib_div::htmlspecialchars_decode($document[0])));
+               $icon   = t3lib_iconWorks::getSpriteIconForRecord($table, $record);
+               $link   = $GLOBALS['BACK_PATH'] . 'alt_doc.php?' . $document[2];
 
-               if (is_array($this->recentDocs)) {
-                       $docs[] = '<li class="menu-item-div">'.$GLOBALS['LANG']->getLL('recent_docs',1).'</li>';
+               $pageId = intval($document[3]['uid']);
+               if ($document[3]['table'] !== 'pages') {
+                       $pageId = intval($document[3]['pid']);
+               }
 
-                               // Traverse the list of open documents:
-                       foreach($this->recentDocs as $md5k => $lnk) {
-                               $docs[] = '<li><a target="content" href="'.htmlspecialchars('alt_doc.php?'.$lnk[2]).'">'.htmlspecialchars(strip_tags(t3lib_div::htmlspecialchars_decode($lnk[0]))).'</a></li>';
-                       }
+               $firstRow = '';
+               if ($isFirstDoc) {
+                       $firstRow = ' first-row';
                }
-               return $docs;
-       }
 
+               if (!$isRecentDoc) {
+                       $title = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:rm.closeDoc', TRUE);
+
+                               // open document
+                       $closeIcon = t3lib_iconWorks::getSpriteIcon('actions-document-close');
 
+                       $entry = '
+                               <tr class="opendoc' . $firstRow . '">
+                                       <td class="icon">' . $icon . '</td>
+                                       <td class="label"><a href="#" onclick="jump(unescape(\'' . htmlspecialchars($link) . '\'), \'web_list\', \'web\', ' . $pageId . '); TYPO3BackendOpenDocs.toggleMenu(); return false;" target="content">' . $label . '</a></td>
+                                       <td class="close" onclick="return TYPO3BackendOpenDocs.closeDocument(\'' . $md5sum . '\');">' . $closeIcon . '</td>
+                               </tr>';
+               } else {
+                               // recently used document
+                       $entry = '
+                               <tr class="recentdoc' . $firstRow . '">
+                                       <td class="icon">' . $icon . '</td>
+                                       <td class="label" colspan="2"><a href="#" onclick="jump(unescape(\'' . htmlspecialchars($link) . '\'), \'web_list\', \'web\', ' . $pageId . '); TYPO3BackendOpenDocs.toggleMenu(); return false;" target="content">' . $label . '</a></td>
+                               </tr>';
+               }
+
+               return $entry;
+       }
 
        /**
         * returns additional attributes for the list item in the toolbar
@@ -137,57 +206,97 @@ class tx_opendocs implements backend_toolbarItem {
         * @return      string          list item HTML attibutes
         */
        public function getAdditionalAttributes() {
-               return ' id="open-documents-menu"';
+               return ' id="tx-opendocs-menu"';
        }
 
-
        /**
         * adds the neccessary javascript to the backend
         *
         * @return      void
         */
-       private function addJavascriptToBackend() {
-               $this->backendReference->addJavascriptFile(t3lib_extMgm::extRelPath($this->EXTKEY).'opendocs.js');
+       protected function addJavascriptToBackend() {
+               $this->backendReference->addJavascriptFile(t3lib_extMgm::extRelPath($this->EXTKEY) . 'opendocs.js');
        }
 
-
        /**
         * adds the neccessary CSS to the backend
         *
         * @return      void
         */
-       private function addCssToBackend() {
-               $this->backendReference->addCssFile('opendocs', t3lib_extMgm::extRelPath($this->EXTKEY).'opendocs.css');
+       protected function addCssToBackend() {
+               $this->backendReference->addCssFile('opendocs', t3lib_extMgm::extRelPath($this->EXTKEY) . 'opendocs.css');
        }
 
 
+       /*******************
+        ***    HOOKS    ***
+        *******************/
+
+       /**
+        * called as a hook in t3lib_BEfunc::setUpdateSignal, calls a JS function to change
+        * the number of opened documents
+        *
+        * @param       array           $params
+        * @param       unknown_type            $ref
+        * @return      string          list item HTML attibutes
+        */
+       public function updateNumberOfOpenDocsHook(&$params, $ref) {
+               $params['JScode'] = '
+                       if (top && top.TYPO3BackendOpenDocs) {
+                               top.TYPO3BackendOpenDocs.updateNumberOfDocs(' . count($this->openDocs) . ', true);
+                       }
+               ';
+       }
+
 
+       /******************
+        *** AJAX CALLS ***
+        ******************/
 
        /**
-        * returns the opened documents list for the AJAX call formatted as HTML list
+        * closes a document in the session and
         *
+        * @param       array           array of parameters from the AJAX interface, currently unused
+        * @param       TYPO3AJAX       object of type TYPO3AJAX
         * @return      string          list item HTML attibutes
         */
-       public function renderBackendMenuContents($params, &$ajaxObj) {
-               $itms = $this->getOpenDocuments();
-               $itmsRecent = $this->getRecentDocuments();
+       public function closeDocument($params = array(), TYPO3AJAX &$ajaxObj = NULL) {
+               $md5sum = t3lib_div::_GP('md5sum');
 
+               if ($md5sum && isset($this->openDocs[$md5sum])) {
 
-                       // if there are "recent documents" in the list, add them
-               if (count($itmsRecent)) {
-                       $itms = array_merge($itms, $itmsRecent);
-               }
+                               // add the document to be closed to the recent documents
+                       $this->recentDocs = array_merge(
+                               array($md5sum => $this->openDocs[$md5sum]),
+                               $this->recentDocs
+                       );
 
+                               // allow a maximum of 8 recent documents
+                       if (count($this->recentDocs) > 8) {
+                               $this->recentDocs = array_slice($this->recentDocs, 0, 8);
+                       }
 
-               if (count($itms)) {
-                       $ajaxObj->addContent('opendocs', implode('', $itms));
-               } else {
-                       $ajaxObj->addContent('opendocs', '<li>'.$GLOBALS['LANG']->getLL('no_docs',1).'</li>');
+                               // remove it from the list of the open documents, and store the status
+                       unset($this->openDocs[$md5sum]);
+                       list(, $docDat) = $GLOBALS['BE_USER']->getModuleData('alt_doc.php', 'ses');
+                       $GLOBALS['BE_USER']->pushModuleData('alt_doc.php', array($this->openDocs, $docDat));
+                       $GLOBALS['BE_USER']->pushModuleData('opendocs::recent', $this->recentDocs);
                }
+
+               $this->renderAjax($params, $ajaxObj);
        }
-}
 
-if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['EXT:opendocs/class.tx_opendocs.php']) {
-       include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['EXT:opendocs/class.tx_opendocs.php']);
+       /**
+        * renders the menu so that it can be returned as response to an AJAX call
+        *
+        * @param       array           array of parameters from the AJAX interface, currently unused
+        * @param       TYPO3AJAX       object of type TYPO3AJAX
+        * @return      void
+        */
+       public function renderAjax($params = array(), TYPO3AJAX &$ajaxObj = NULL) {
+               $menuContent = $this->renderMenu();
+
+               $ajaxObj->addContent('opendocsMenu', $menuContent);
+       }
 }
-?>
+?>
\ No newline at end of file