From f6d9a42644861292ed0c6f073de8d2821affd1db Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Tue, 6 Mar 2007 15:38:29 +0000 Subject: [PATCH] Update Zotero.ProgressWindow to properly handle and stack multiple progress windows, stored in Zotero.ProgressWindowSet Refresher: var progress = new Zotero.ProgressWindow(); progress.changeHeadline('Indexing item...'); progress.addLines("My First Book", "chrome://zotero/skin/treeitem-book.png"); progress.addDescription('This is my first book.'); progress.show(); progress.fade(); var progress2 = new Zotero.ProgressWindow(); progress2.changeHeadline('Indexing item 2...'); progress2.addLines("My Second Book", "chrome://zotero/skin/treeitem-book.png"); progress2.addDescription('This is my second book.'); progress2.show(); progress2.fade(); --- chrome/content/zotero/xpcom/progressWindow.js | 62 +++++++++++++++++-- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/chrome/content/zotero/xpcom/progressWindow.js b/chrome/content/zotero/xpcom/progressWindow.js index 78346ce58..2adee453b 100644 --- a/chrome/content/zotero/xpcom/progressWindow.js +++ b/chrome/content/zotero/xpcom/progressWindow.js @@ -20,6 +20,57 @@ ***** END LICENSE BLOCK ***** */ + +Zotero.ProgressWindowSet = new function() { + this.add = add; + this.tile = tile; + this.remove = remove; + + var _numWindows = 0; + var _progressWindows = []; + + const X_OFFSET = 30; + const Y_OFFSET = 10; + + function add(progressWin) { + _progressWindows.push(progressWin); + _numWindows++; + } + + + function tile(progressWin) { + var parent = progressWin.opener; + var sum = 0; + + for (var i=0; i<_progressWindows.length; i++) { + var p = _progressWindows[i]; + + // Skip progress windows from other windows + if (p.opener != parent) { + continue; + } + + sum += Y_OFFSET + p.outerHeight; + + p.moveTo( + parent.screenX + parent.innerWidth - p.outerWidth - X_OFFSET, + parent.screenY + parent.innerHeight - sum + ); + } + } + + + function remove(progressWin) { + _numWindows--; + for (var i=0; i<_progressWindows.length; i++) { + if (_progressWindows[i] == progressWin) { + _progressWindows.splice(i, 1); + } + } + } +} + + /* * Handles the display of a div showing progress in scraping, indexing, etc. * @@ -55,11 +106,14 @@ Zotero.ProgressWindow = function(_window){ if(_windowLoading || _windowLoaded) { // already loading or loaded return false; } + _progressWindow = _window.openDialog("chrome://zotero/chrome/progressWindow.xul", "", "chrome,dialog=no,titlebar=no,popup=yes"); - _progressWindow.addEventListener("load", _onWindowLoaded, false); + _progressWindow.addEventListener("pageshow", _onWindowLoaded, false); _windowLoading = true; + Zotero.ProgressWindowSet.add(_progressWindow); + return true; } @@ -126,6 +180,7 @@ Zotero.ProgressWindow = function(_window){ function kill() { _windowLoaded = false; _windowLoading = false; + Zotero.ProgressWindowSet.remove(_progressWindow); try { _progressWindow.close(); } catch(ex) {} @@ -152,10 +207,7 @@ Zotero.ProgressWindow = function(_window){ function _move() { _progressWindow.sizeToContent(); - _progressWindow.moveTo( - _window.screenX + _window.innerWidth - _progressWindow.outerWidth - 30, - _window.screenY + _window.innerHeight - _progressWindow.outerHeight - 10 - ); + Zotero.ProgressWindowSet.tile(_progressWindow); } function _timeout() {