From 765864c89bc2eec4392c3ef5bbdb8e419d082899 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 17 Mar 2011 07:39:02 +0000 Subject: [PATCH] * EMail: speed improvments backported from Trunk - use a single bofelamimail instance (not backported but hack in CreateObject to get the same result) - queue refresh folder calls, to send only a single one - difference between click and doubleclick on mails to speed up doubleclick (opening mail in popup) --- felamimail/inc/class.ajaxfelamimail.inc.php | 20 +++++- felamimail/js/jscode/viewMainScreen.js | 73 ++++++++++++++++++++- felamimail/templates/default/mainscreen.tpl | 8 +-- felamimail/templates/jerryr/mainscreen.tpl | 8 +-- phpgwapi/inc/common_functions.inc.php | 11 ++++ 5 files changed, 107 insertions(+), 13 deletions(-) diff --git a/felamimail/inc/class.ajaxfelamimail.inc.php b/felamimail/inc/class.ajaxfelamimail.inc.php index 31e9e33e9d..3bb1df265f 100644 --- a/felamimail/inc/class.ajaxfelamimail.inc.php +++ b/felamimail/inc/class.ajaxfelamimail.inc.php @@ -809,6 +809,10 @@ class ajaxfelamimail $response->addScript("fm_previewMessageID=".$headerData['uid'].";"); $response->addAssign('spanMessagePreview', 'innerHTML', $this->uiwidgets->updateMessagePreview($headerData,$_folderType, $this->sessionData['mailbox'])); $response->addScript('if (typeof handleResize != "undefined") handleResize();'); + + // Also refresh the folder status + $this->refreshFolder($response); + return $response->getXML(); } @@ -817,12 +821,19 @@ class ajaxfelamimail return $this->generateMessageList($this->sessionData['mailbox']); } - function refreshFolder() + function refreshFolder($injectIntoResponse = false) { if ($this->_debug) error_log("ajaxfelamimail::refreshFolder"); $GLOBALS['egw']->session->commit_session(); - $response = new xajaxResponse(); + if (!$injectIntoResponse) + { + $response = new xajaxResponse(); + } + else + { + $response = $injectIntoResponse; + } if ($this->_connectionStatus === true) { $folderName = $this->sessionData['mailbox']; @@ -836,7 +847,10 @@ class ajaxfelamimail } } - return $response->getXML(); + if (!$injectIntoResponse) + { + return $response->getXML(); + } } function refreshFolderList($activeFolderList ='') diff --git a/felamimail/js/jscode/viewMainScreen.js b/felamimail/js/jscode/viewMainScreen.js index db4c368e24..b54bd3b192 100644 --- a/felamimail/js/jscode/viewMainScreen.js +++ b/felamimail/js/jscode/viewMainScreen.js @@ -472,7 +472,8 @@ function refreshFolderStatus(_nodeID,mode) { if (mode == "forced") {mode2use = mode;} } var activeFolders = getTreeNodeOpenItems(nodeToRefresh,mode2use); - egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.refreshFolderList', activeFolders); + queueRefreshFolderList(activeFolders); +// egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.refreshFolderList', activeFolders); // if (fm_previewMessageID>0) // { // //setStatusMessage(''+ egw_appWindow('felamimail').lang_updating_view +''); @@ -480,6 +481,33 @@ function refreshFolderStatus(_nodeID,mode) { // } } + +var felamimail_queuedFolders = []; +var felamimail_queuedFoldersIndex = 0; + +/** + * Queues a refreshFolderList request for 1ms. Actually this will just execute the + * code after the calling script has finished. + */ +function queueRefreshFolderList(_folders) +{ + felamimail_queuedFolders.push(_folders); + felamimail_queuedFoldersIndex++; + + // Copy idx onto the anonymous function scope + var idx = felamimail_queuedFoldersIndex; + window.setTimeout(function() { + if (idx == felamimail_queuedFoldersIndex) + { + var folders = felamimail_queuedFolders.join(","); + felamimail_queuedFoldersIndex = 0; + felamimail_queuedFolders = []; + + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.refreshFolderList', folders); + } + }, 1); +} + function refreshView() { if (document.getElementById('messageCounter').innerHTML.search(eval('/'+egw_appWindow('felamimail').lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} document.mainView.submit(); @@ -562,6 +590,44 @@ function fm_startTimerMessageListUpdate(_refreshTimeOut) { } } +var felamimail_messageUrls = {}; +var felamimail_dblclick_speed = 300; + +/** + * Handles message clicks and distinguishes between double clicks and single clicks + */ +function fm_handleMessageClick(_double, _url, _windowName, _node) +{ + if (_double) + { + // Unset the given message url - the timeout which was triggered in the + // click handler will now no longer call the fm_readMessage function + delete (felamimail_messageUrls[_url]); + + fm_readMessage(_url, _windowName, _node); + } + else + { + // Check whether the given url is already queued. Only continue if this + // is not the case + if (typeof felamimail_messageUrls[_url] == "undefined") + { + // Queue the url + felamimail_messageUrls[_url] = true; + + // Wait "felamimail_dblclick_speed" milliseconds. Only if the doubleclick + // event doesn't occur in this time, trigger the single click function + window.setTimeout(function () { + if (typeof felamimail_messageUrls[_url] == "boolean") + { + fm_readMessage(_url, _windowName, _node); + delete (felamimail_messageUrls[_url]); + } + }, felamimail_dblclick_speed); + } + } +} + function fm_readMessage(_url, _windowName, _node) { var windowArray = _windowName.split('_'); var tableElement =_node.parentNode.parentNode.parentNode.parentNode; @@ -576,9 +642,13 @@ function fm_readMessage(_url, _windowName, _node) { egw_appWindow('felamimail').setStatusMessage(''+ egw_appWindow('felamimail').lang_updating_view +''); fm_previewMessageID = windowArray[1]; fm_previewMessageFolderType = windowArray[2]; + // refreshMessagePreview now also refreshes the folder state egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshMessagePreview",windowArray[1],windowArray[2]); } else { egw_openWindowCentered(_url, _windowName, 750, egw_getWindowOuterHeight()); + + // Refresh the folder state (count of unread emails) + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshFolder"); } trElement = _node.parentNode.parentNode.parentNode; trElement.style.fontWeight='normal'; @@ -587,7 +657,6 @@ function fm_readMessage(_url, _windowName, _node) { aElements = trElement.getElementsByTagName("a"); aElements[0].style.fontWeight='normal'; aElements[1].style.fontWeight='normal'; - egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshFolder"); } function fm_readAttachments(_url, _windowName, _node) { diff --git a/felamimail/templates/default/mainscreen.tpl b/felamimail/templates/default/mainscreen.tpl index 32a2596b58..4296e2fd8c 100644 --- a/felamimail/templates/default/mainscreen.tpl +++ b/felamimail/templates/default/mainscreen.tpl @@ -275,8 +275,8 @@ fm_startTimerMessageListUpdate(refreshTimeOut); {header_subject} @@ -311,8 +311,8 @@ fm_startTimerMessageListUpdate(refreshTimeOut); {header_subject} diff --git a/felamimail/templates/jerryr/mainscreen.tpl b/felamimail/templates/jerryr/mainscreen.tpl index 3997a9829b..83fc9cff00 100644 --- a/felamimail/templates/jerryr/mainscreen.tpl +++ b/felamimail/templates/jerryr/mainscreen.tpl @@ -280,8 +280,8 @@ fm_startTimerMessageListUpdate(refreshTimeOut); {header_subject} @@ -316,8 +316,8 @@ fm_startTimerMessageListUpdate(refreshTimeOut); {header_subject} diff --git a/phpgwapi/inc/common_functions.inc.php b/phpgwapi/inc/common_functions.inc.php index 52d58c3082..d7e36b378c 100755 --- a/phpgwapi/inc/common_functions.inc.php +++ b/phpgwapi/inc/common_functions.inc.php @@ -731,6 +731,13 @@ function get_var($variable,$method='any',$default_value='') */ function &CreateObject($class) { + $useSingleton = $class == 'felamimail.bofelamimail'; + static $classReferences = array(); + if ($useSingleton && isset($classReferences[$class])) + { + return $classReferences[$class]; + } + list($appname,$classname) = explode('.',$class); if (!class_exists($classname)) @@ -795,6 +802,10 @@ function &CreateObject($class) { echo "

CreateObject('$class'): Cant instanciate class!!!
\n".function_backtrace(1)."

\n"; } + if ($useSingleton) + { + $classReferences[$class] = $obj; + } return $obj; }