PK
7 content/PK
7 content/bindings/PK
7 content/settings/PK
7 locale/PK
7
locale/ca-AD/PK
7 locale/ca-AD/showcase/PK
7
locale/da-DK/PK
7 locale/da-DK/showcase/PK
7
locale/de-DE/PK
7 locale/de-DE/showcase/PK
7
locale/el-GR/PK
7 locale/el-GR/showcase/PK
7
locale/en-US/PK
7 locale/en-US/showcase/PK
7
locale/es-ES/PK
7 locale/es-ES/showcase/PK
7
locale/fa-IR/PK
7 locale/fa-IR/showcase/PK
7
locale/fi-FI/PK
7 locale/fi-FI/showcase/PK
7
locale/fr-FR/PK
7 locale/fr-FR/showcase/PK
7
locale/fy-NL/PK
7 locale/fy-NL/showcase/PK
7
locale/hu-HU/PK
7 locale/hu-HU/showcase/PK
7
locale/it-IT/PK
7 locale/it-IT/showcase/PK
7
locale/ja-JP/PK
7 locale/ja-JP/showcase/PK
7
locale/ko-KR/PK
7 locale/ko-KR/showcase/PK
7
locale/nl-NL/PK
7 locale/nl-NL/showcase/PK
7
locale/pl-PL/PK
7 locale/pl-PL/showcase/PK
7
locale/pt-BR/PK
7 locale/pt-BR/showcase/PK
7
locale/ru-RU/PK
7 locale/ru-RU/showcase/PK
7
locale/sk-SK/PK
7 locale/sk-SK/showcase/PK
7
locale/zh-CN/PK
7 locale/zh-CN/showcase/PK
7
locale/zh-TW/PK
7 locale/zh-TW/showcase/PK
7 skin/PK
7
skin/classic/PK
7 skin/classic/showcase/PK
7 ! skin/classic/showcase/background/PK
7$ $ content/bindings/tabbar.xml
%tabBrowserDTD;
%globalDTD;
%overlayDTD;
]>
document.getElementById("bundle_showcaseoverlay")
document.getElementById("bundle_showcaseoverlay")
PK
7{҂X X content/cache.jsvar showcaseCanvasCounter = 0;
// Tab cache
function ShowcaseTabCache(b)
{
this.browser = b;
this.thumb = null;
b.showcaseCache = this;
b.addEventListener("pageshow", this, true);
b.addEventListener("resize", this, false);
if (ShowcaseCache.updateThumbnailWhenScroll) {
b.addEventListener("scroll", this, true);
}
};
ShowcaseTabCache.prototype = {
QueryInterface: function(aIID) {
if (aIID.equals(Components.interfaces.nsITimerCallback) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
makeThumbnail: function () {
if (this.browser.currentURI != null &&
this.browser.currentURI.spec == "about:blank") {
this.thumb = null;
return;
}
if (!ShowcaseCache.activateCache) {
this.thumb = null;
return;
}
var cacheWidth, cacheHeight;
var targetWidth, targetHeight;
if (ShowcaseCache.detectImage && (this.browser.contentDocument instanceof ImageDocument)) {
var img = this.browser.contentDocument.imageRequest.decoderObserver;
targetWidth = img.width;
targetHeight = img.height;
} else {
targetWidth = this.browser.contentWindow.innerWidth;
targetHeight = this.browser.contentWindow.innerHeight;
}
if (targetWidth > targetHeight) {
if (targetWidth > ShowcaseCache.cacheSize) {
cacheWidth = ShowcaseCache.cacheSize;
cacheHeight = Math.ceil(ShowcaseCache.cacheSize * targetHeight / targetWidth);
} else {
cacheWidth = targetWidth;
cacheHeight = targetHeight;
}
} else {
if (targetHeight > ShowcaseCache.cacheSize) {
cacheHeight = ShowcaseCache.cacheSize;
cacheWidth = Math.ceil(ShowcaseCache.cacheSize * targetWidth / targetHeight);
} else {
cacheWidth = targetWidth;
cacheHeight = targetHeight;
}
}
if (this.thumb == null) {
this.createThumbnail();
}
this.thumb.width = cacheWidth;
this.thumb.height = cacheHeight;
if (ShowcaseCache.currentShowcases.length < 1) {
window.setTimeout(drawThumbnail, 0, this);
}
},
createThumbnail: function() {
this.thumb = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
this.thumb.id = "cachecanvas" + showcaseCanvasCounter++;
},
handleEvent: function (e) {
if (ShowcaseCache.currentShowcases.length > 0)
return;
if (e.type == "scroll") {
if (!this._scrollTimer) {
this._scrollTimer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer);
}
this._scrollTimer.cancel();
this._scrollTimer.initWithCallback(this, 300, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
this.waitingRepaint = true;
} else {
this.makeThumbnail();
}
},
notify: function(timer) {
this.makeThumbnail();
this.waitingRepaint = false;
},
unload: function() {
if (this.browser) {
this.browser.removeEventListener("pageshow", this, true);
this.browser.removeEventListener("resize", this, false);
if (ShowcaseCache.updateThumbnailWhenScroll) {
this.browser.removeEventListener("scroll", this, true);
}
this.browser.showcaseCache = null;
}
this.browser = null;
if (this._scrollTimer) {
this._scrollTimer.cancel();
this._scrollTimer = undefined;
}
this.thumb = null;
}
};
function drawThumbnail(target) {
if (target.drawingThumbnail) return;
var currentWebBrowserPrint = target.browser.contentWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebBrowserPrint);
if (currentWebBrowserPrint.doingPrint || currentWebBrowserPrint.doingPrintPreview) return;
target.drawingThumbnail = true;
try {
var ctx = target.thumb.getContext("2d");
ctx.clearRect(0, 0, target.thumb.width, target.thumb.height);
if (ShowcaseCache.detectImage && (target.browser.contentDocument instanceof ImageDocument)) {
var img = target.browser.contentDocument.imageRequest.decoderObserver;
ctx.drawImage(img, 0, 0, target.thumb.width, target.thumb.height);
} else {
ctx.save();
ctx.scale(target.thumb.width/target.browser.contentWindow.innerWidth, target.thumb.height/target.browser.contentWindow.innerHeight);
ctx.drawWindow(target.browser.contentWindow,
target.browser.contentWindow.scrollX,
target.browser.contentWindow.scrollY,
target.browser.contentWindow.innerWidth,
target.browser.contentWindow.innerHeight,
"rgb(255,255,255)");
ctx.restore();
}
} catch (e) {
//Paint thumbnail failed, probably because the thumbnail disappeared. Fail silently.
}
target.drawingThumbnail = false;
}
var ShowcaseCache = {
prefs: null,
activateCache: false,
cacheSize: 0,
isCaching: false,
detectImage: false,
enhancedTabBar: false,
allTabsButtonMode: -1,
updateThumbnailWhenScroll: false,
currentShowcases: null,
QueryInterface: function (aIID)
{
if (aIID.equals(Components.interfaces.nsIPrefBranchInternal) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
observe: function (aSubject, aTopic, aData)
{
if (aTopic != "nsPref:changed")
return;
switch (aData) {
case "extensions.showcase.cacheSize":
ShowcaseCache.cacheSize = ShowcaseCache.prefs.getIntPref("cacheSize");
break;
case "extensions.showcase.activateCache":
ShowcaseCache.activateCache = ShowcaseCache.prefs.getBoolPref("activateCache");
if (ShowcaseCache.activateCache && !ShowcaseCache.isCaching) {
ShowcaseCache.enableCaching();
} else if (!ShowcaseCache.activateCache && ShowcaseCache.isCaching) {
ShowcaseCache.disableCaching();
}
break;
case "extensions.showcase.detectImage":
ShowcaseCache.detectImage = ShowcaseCache.prefs.getBoolPref("detectImage");
// Update image thumbnails if necessary
if (ShowcaseCache.isCaching) {
var totalTabs = getBrowser().tabContainer.childNodes.length;
for (var d=0; d (targetScrollBox._scrollbox.boxObject.width + xPos.value)) && (currentTab >= 0)) {
currentX -= tabs[currentTab].boxObject.width;
currentTab--;
}
return (tabs.length - 1 - currentTab);
} else {
var height = { };
targetScrollBox.scrollBoxObject.getScrolledSize({}, height);
var yPos = { }
targetScrollBox.scrollBoxObject.getPosition({}, yPos);
var currentY = height.value;
var currentTab = tabs.length - 1;
while ((currentY > (targetScrollBox._scrollbox.boxObject.height + yPos.value)) && (currentTab >= 0)) {
currentY = tabs[currentTab].boxObject.height;
currentTab--;
}
return (tabs.length - 1 - currentTab);
}
},
onLoad: function() {
ShowcaseCache.currentShowcases = new Array();
ShowcaseCache.prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("extensions.showcase.");
ShowcaseCache.activateCache = ShowcaseCache.prefs.getBoolPref("activateCache");
ShowcaseCache.cacheSize = ShowcaseCache.prefs.getIntPref("cacheSize");
ShowcaseCache.detectImage = ShowcaseCache.prefs.getBoolPref("detectImage");
ShowcaseCache.updateThumbnailWhenScroll = ShowcaseCache.prefs.getBoolPref("updateThumbnailWhenScroll");
ShowcaseCache.enhancedTabBar = ShowcaseCache.prefs.getBoolPref("enhancedTabBar");
ShowcaseCache.allTabsButtonMode = ShowcaseCache.prefs.getIntPref("allTabsButtonMode");
Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch2).addObserver("extensions.showcase.", this, false);
if (ShowcaseCache.activateCache) {
ShowcaseCache.enableCaching();
}
// Catch event if necessary
if (ShowcaseCache.enhancedTabBar && getBrowser().mTabContainer.mAllTabsPopup) {
ShowcaseCache.registerEnhancedTabBar();
}
setTimeout(function() {ShowcaseCache.showWelcomeScreenIfNeeded() }, 400);
},
showWelcomeScreenIfNeeded: function() {
if (ShowcaseCache.prefs.getBoolPref("firstRunRedirection")) {
var currentVersion = ShowcaseCache.prefs.getCharPref("currentVersion");
if (currentVersion != "0.9.4.5") {
ShowcaseCache.prefs.setCharPref("currentVersion", "0.9.4.5");
var targetURL;
if (currentVersion == "none") {
targetURL = "http://showcase.uworks.net/welcome.html";
} else {
targetURL = "http://showcase.uworks.net/updated.html";
}
var newTab = getBrowser().addTab(targetURL);
getBrowser().selectedTab = newTab;
}
}
},
catchAllTabsPopupShowing: function(ev) {
switch (ShowcaseCache.allTabsButtonMode) {
case 0:
setTimeout(showShowcase, 0, false, false);
break;
case 1:
setTimeout(showShowcase, 0, true, false);
break;
case 2:
setTimeout(showShowcase, 0, false, true);
break;
case 3:
setTimeout(showShowcase, 0, true, true);
break;
case 4:
setTimeout(toggleSidebar, 0, 'viewShowcaseSidebar');
break;
case 5:
setTimeout(toggleSidebar, 0, 'viewShowcaseThisWindowSidebar');
break;
}
if (getBrowser().mTabContainer.mAllTabsPopup._onHidingAllTabsPopup)
getBrowser().mTabContainer.mAllTabsPopup._onHidingAllTabsPopup();
ev.preventDefault();
return false;
},
enableCaching: function() {
if (ShowcaseCache.isCaching) return;
if (typeof BrowserOpenAddonsMgr == "function") {
getBrowser().tabContainer.addEventListener("TabOpen", ShowcaseCache.firefox2CatchNewTab, false);
getBrowser().tabContainer.addEventListener("TabClose", ShowcaseCache.firefox2CatchDestroyTab, false);
} else {
getBrowser().mPanelContainer.addEventListener("DOMNodeInserted", ShowcaseCache.catchNewTab, false);
getBrowser().mPanelContainer.addEventListener("DOMNodeRemoved", ShowcaseCache.catchDestroyTab, false);
}
var totalTabs = getBrowser().tabContainer.childNodes.length;
for (var d=0; d -1) {
ShowcaseCache.currentShowcases.splice(targetIndex, 1);
}
}
};
window.addEventListener("load", function(e) { ShowcaseCache.onLoad(); }, false);
window.addEventListener("unload", function(e) { ShowcaseCache.onUnload(); }, false);
function debugLog(msg) {
var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
.getService(Components.interfaces.nsIConsoleService);
consoleService.logStringMessage(msg);
}
PK
7K` ! content/settings/pref-advanced.jsfunction advancedPrefInit() {
activateCacheChanged();
enhancedTabBarChanged();
}
function activateCacheChanged() {
var activateCacheCheckbox = document.getElementById("activateCache");
document.getElementById("cacheSize").disabled = !activateCacheCheckbox.checked;
document.getElementById("cacheSizeLabel").disabled = !activateCacheCheckbox.checked;
document.getElementById("cacheSizePixelsLabel").disabled = !activateCacheCheckbox.checked;
}
function enhancedTabBarChanged() {
var enhancedTabBarCheckbox = document.getElementById("enhancedTabBar");
document.getElementById("allTabsButtonModeLabel").disabled = !enhancedTabBarCheckbox.checked;
document.getElementById("allTabsButtonMode").disabled = !enhancedTabBarCheckbox.checked;
}PK
7` " content/settings/pref-advanced.xul
%dialogDTD;
%tabBrowserDTD;
%overlayDTD;
]>
PK
7 " content/settings/pref-shortcuts.jsfunction shortcutsPrefInit() {
var extensionManager;
var keyconfigExtension;
var shortcutsPanelDeck = document.getElementById("shortcutsPanelDeck");
extensionManager = Components.classes["@mozilla.org/extensions/manager;1"]
.getService(Components.interfaces.nsIExtensionManager);
keyconfigExtension = extensionManager.getItemForID("keyconfig@dorando");
// If it fails, try with old id
if ((!keyconfigExtension) || (keyconfigExtension.type == 0)) {
keyconfigExtension = extensionManager.getItemForID("{c8500d90-d72d-11d9-8cd5-0800200c9a66}");
}
if ((!keyconfigExtension) || (keyconfigExtension.type == 0)) {
shortcutsPanelDeck.setAttribute("selectedIndex", 0);
} else {
var xmlDoc = document.implementation.createDocument("", "keyconfig", null);
xmlDoc.async = false;
try {
xmlDoc.load("chrome://keyconfig/content/");
if (xmlDoc.documentElement) {
// Enabled
shortcutsPanelDeck.setAttribute("selectedIndex", 2);
} else {
// Disabled
shortcutsPanelDeck.setAttribute("selectedIndex", 1);
}
} catch (e) {
// Exception while loading, so it's disabled
shortcutsPanelDeck.setAttribute("selectedIndex", 1);
}
}
}
function callKeyConfig(createWindowIfNecessary) {
// Target all windows
var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
var windowIter = wm.getEnumerator('navigator:browser');
var keyconfigInvoked = false;
while (windowIter.hasMoreElements() && !keyconfigInvoked) {
var currentWindow = windowIter.getNext();
try {
currentWindow.openDialog('chrome://keyconfig/content/', 'keyconfig', 'resizable');
keyconfigInvoked = true;
} catch (e) { }
}
if (!keyconfigInvoked && createWindowIfNecessary) {
openURL();
setTimeout(callKeyConfig, 0, false);
}
}
PK
7m&| | # content/settings/pref-shortcuts.xul
%dialogDTD;
%tabBrowserDTD;
%showcaseDTD;
]>
&keyconfig.not_installed;
&keyconfig.not_enabled;
PK
7mc: : content/settings/pref-sidebar.jsfunction sidebarPrefInit() {
sidebarCustomColorsChanged();
sidebarScrollTypeChanged();
}
function sidebarCustomColorsChanged() {
var sidebarCustomColorsCheckbox = document.getElementById("sidebarCustomColors");
document.getElementById("sidebarCustomBackgroundColorLabel").disabled = !sidebarCustomColorsCheckbox.checked;
document.getElementById("sidebarCustomBackgroundColor").disabled = !sidebarCustomColorsCheckbox.checked;
}
function sidebarScrollTypeChanged() {
var sidebarScrollTypeComboBox = document.getElementById("sidebarScrollType");
document.getElementById("sidebarThumbnailPreferredMinimumSizeLabel").disabled = (sidebarScrollTypeComboBox.selectedIndex == 0);
document.getElementById("sidebarThumbnailPreferredMinimumSizePixelsLabel").disabled = (sidebarScrollTypeComboBox.selectedIndex == 0);
document.getElementById("sidebarThumbnailPreferredMinimumSize").disabled = (sidebarScrollTypeComboBox.selectedIndex == 0);
document.getElementById("sidebarAlwaysShowScrollbar").disabled = (sidebarScrollTypeComboBox.selectedIndex == 0);
}PK
7[u ! content/settings/pref-sidebar.xul
%dialogDTD;
%tabBrowserDTD;
]>
PK
70Z content/settings/pref-tab.jsfunction tabPrefInit() {
tabCustomColorsChanged();
tabScrollTypeChanged();
}
function tabCustomColorsChanged() {
var tabCustomColorsCheckbox = document.getElementById("tabCustomColors");
document.getElementById("tabCustomTitleColorLabel").disabled = !tabCustomColorsCheckbox.checked;
document.getElementById("tabCustomTitleColor").disabled = !tabCustomColorsCheckbox.checked;
document.getElementById("tabCustomBackgroundColorLabel").disabled = !tabCustomColorsCheckbox.checked;
document.getElementById("tabCustomBackgroundColor").disabled = !tabCustomColorsCheckbox.checked;
document.getElementById("tabColorizeLabel").disabled = !tabCustomColorsCheckbox.checked;
}
function tabScrollTypeChanged() {
var tabScrollTypeComboBox = document.getElementById("tabScrollType");
document.getElementById("tabThumbnailPreferredMinimumSizeLabel").disabled = (tabScrollTypeComboBox.selectedIndex == 0);
document.getElementById("tabThumbnailPreferredMinimumSizePixelsLabel").disabled = (tabScrollTypeComboBox.selectedIndex == 0);
document.getElementById("tabThumbnailPreferredMinimumSize").disabled = (tabScrollTypeComboBox.selectedIndex == 0);
document.getElementById("tabAlwaysShowScrollbar").disabled = (tabScrollTypeComboBox.selectedIndex == 0);
}
PK
7{ { content/settings/pref-tab.xul
%dialogDTD;
%tabBrowserDTD;
]>
PK
7anb # content/settings/pref-thumbnails.jsconst CONTEXTUALACTION_PREFIX = "contextualAction";
function thumbnailPrefInit() {
// Check all enable/disable dependancies
thumbnailShowLabelsChanged();
thumbnailAnimationChanged();
paintAfterLoadedChanged();
updateThumbnailWhenContentChangesChanged();
}
function contextualActionsChanged(el) {
if (el.attrName == "value") {
document.getElementById("paneThumbnails").userChangedValue(document.getElementById("contextualActions"));
}
}
function thumbnailShowLabelsChanged() {
var thumbnailShowLabelsCheckbox = document.getElementById("thumbnailShowLabels");
document.getElementById("thumbnailLabelStyleLabel").disabled = !thumbnailShowLabelsCheckbox .checked;
document.getElementById("thumbnailLabelStyleAction").disabled = !thumbnailShowLabelsCheckbox .checked;
}
function thumbnailAnimationChanged() {
var thumbnailAnimationCheckbox = document.getElementById("thumbnailAnimation");
document.getElementById("thumbnailActiveSizeLabel").disabled = !thumbnailAnimationCheckbox.checked;
document.getElementById("thumbnailActiveSizeSymbolLabel").disabled = !thumbnailAnimationCheckbox.checked;
document.getElementById("thumbnailActiveSize").disabled = !thumbnailAnimationCheckbox.checked;
document.getElementById("animationFramesLabel").disabled = !thumbnailAnimationCheckbox.checked;
document.getElementById("animationFrames").disabled = !thumbnailAnimationCheckbox.checked;
}
function paintAfterLoadedChanged() {
var paintThumbnailsAfterLoadingCheckbox = document.getElementById("paintThumbnailsAfterLoading");
document.getElementById("paintSelectedTabsFirst").disabled = !paintThumbnailsAfterLoadingCheckbox.checked;
}
function updateThumbnailWhenContentChangesChanged() {
var updateThumbnailWhenContentChangesCheckbox = document.getElementById("updateThumbnailWhenContentChanges");
document.getElementById("limitContentChangeUpdates").disabled = !updateThumbnailWhenContentChangesCheckbox.checked;
document.getElementById("limitContentChangeUpdatesTime").disabled = !updateThumbnailWhenContentChangesCheckbox.checked;
document.getElementById("contentUpdatesMillisecondsLabel").disabled = !updateThumbnailWhenContentChangesCheckbox.checked;
}PK
7D D $ content/settings/pref-thumbnails.xul
%dialogDTD;
%browserDTD;
%showcaseDTD;
%tabBrowserDTD;
%secondTabBrowserDTD;
]>
PK
7!
content/settings/pref-window.jsfunction windowPrefInit() {
// Check all enable/disable dependancies
windowWidthChanged();
windowHeightChanged();
windowCustomColorsChanged();
windowScrollTypeChanged();
}
function windowWidthChanged() {
var windowWidthComboBox = document.getElementById("windowWidth");
document.getElementById("windowWidthPercentageLabel").disabled = (windowWidthComboBox.selectedIndex == 3);
document.getElementById("windowWidthPercentageSymbolLabel").disabled = (windowWidthComboBox.selectedIndex == 3);
document.getElementById("windowWidthPercentage").disabled = (windowWidthComboBox.selectedIndex == 3);
document.getElementById("windowWidthModifierLabel").disabled = (windowWidthComboBox.selectedIndex == 3);
document.getElementById("windowWidthModifierUnitLabel").disabled = (windowWidthComboBox.selectedIndex == 3);
document.getElementById("windowWidthModifier").disabled = (windowWidthComboBox.selectedIndex == 3);
}
function windowHeightChanged() {
var windowHeightComboBox = document.getElementById("windowHeight");
document.getElementById("windowHeightPercentageLabel").disabled = (windowHeightComboBox.selectedIndex == 3);
document.getElementById("windowHeightPercentageSymbolLabel").disabled = (windowHeightComboBox.selectedIndex == 3);
document.getElementById("windowHeightPercentage").disabled = (windowHeightComboBox.selectedIndex == 3);
document.getElementById("windowHeightModifierLabel").disabled = (windowHeightComboBox.selectedIndex == 3);
document.getElementById("windowHeightModifierUnitLabel").disabled = (windowHeightComboBox.selectedIndex == 3);
document.getElementById("windowHeightModifier").disabled = (windowHeightComboBox.selectedIndex == 3);
}
function windowCustomColorsChanged() {
var windowCustomColorsCheckbox = document.getElementById("windowCustomColors");
document.getElementById("windowCustomBackgroundColorLabel").disabled = !windowCustomColorsCheckbox.checked;
document.getElementById("windowCustomBackgroundColor").disabled = !windowCustomColorsCheckbox.checked;
}
function windowScrollTypeChanged() {
var windowScrollTypeComboBox = document.getElementById("windowScrollType");
document.getElementById("windowThumbnailPreferredMinimumSizeLabel").disabled = (windowScrollTypeComboBox.selectedIndex == 0);
document.getElementById("windowThumbnailPreferredMinimumSizePixelsLabel").disabled = (windowScrollTypeComboBox.selectedIndex == 0);
document.getElementById("windowThumbnailPreferredMinimumSize").disabled = (windowScrollTypeComboBox.selectedIndex == 0);
document.getElementById("windowAlwaysShowScrollbar").disabled = (windowScrollTypeComboBox.selectedIndex == 0);
}
PK
7U9/`( `( content/settings/pref-window.xul
%dialogDTD;
%tabBrowserDTD;
]>
PK
7=3s content/settings/prefs.jsvar showcase_gPrefBranch = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("extensions.showcase.");
function showcase_initPrefs() {
if(document.documentElement.getButton && document.documentElement.getButton('extra2')) {
var extra2 = document.documentElement.getButton('extra2');
extra2.setAttribute('type', 'menu');
extra2.setAttribute('popup', 'showcase-settings-popup');
}
}
function showcase_defaultSettings() {
var strings = document.getElementById("prefsStrings");
if(!confirm(strings.getString('prefs.confirm'))) return false;
var count = { value : 0 };
var childList = showcase_gPrefBranch.getChildList("", count);
for(var i = 0; i < count.value; i++) {
if(showcase_gPrefBranch.prefHasUserValue(childList[i]) && childList[i] != "changelog") {
showcase_gPrefBranch.clearUserPref(childList[i]);
}
}
window.alert(strings.getString('prefs.defaultsuccess'));
return true;
}
function showcase_extendInt(aInput) {
if(aInput < 10) return "0" + aInput.toString();
else return aInput;
}
function showcase_exportSettings() {
var now = new Date();
var sDate = showcase_extendInt(now.getMonth() + 1) + "/" + showcase_extendInt(now.getDate()) + "/" + now.getFullYear();
var sTtime = showcase_extendInt(now.getHours()) + ":" + showcase_extendInt(now.getMinutes()) + ":" + showcase_extendInt(now.getSeconds());
var sGMT = now.toGMTString();
var showcaseExport = new Array;
showcaseExport[0] = "-----------------------------------------------------------------------\n";
showcaseExport[0]+= " Showcase - Settings\n";
showcaseExport[0]+= " " + sDate + ", " + sTtime + " (" + sGMT + ")\n";
showcaseExport[0]+= "-----------------------------------------------------------------------\n";
showcaseExport[0]+= " DO NOT EDIT THIS FILE\n";
showcaseExport[0]+= "-----------------------------------------------------------------------";
var count = { value : 0 };
var childList = showcase_gPrefBranch.getChildList("", count);
for(var i = 0; i < count.value; i++) {
try {
switch(showcase_gPrefBranch.getPrefType(childList[i])) {
case Components.interfaces.nsIPrefBranch.PREF_BOOL:
showcaseExport[i+1] = childList[i] + '=' + showcase_gPrefBranch.getBoolPref(childList[i]);
break;
case Components.interfaces.nsIPrefBranch.PREF_INT:
showcaseExport[i+1] = childList[i] + '=' + showcase_gPrefBranch.getIntPref(childList[i]);
break;
case Components.interfaces.nsIPrefBranch.PREF_STRING:
showcaseExport[i+1] = childList[i] + '=' + showcase_gPrefBranch.getCharPref(childList[i]);
break;
}
}
catch(e) { }
}
showcaseExport.sort();
showcase_saveToFile(showcaseExport);
}
function showcase_importSettings() {
var strings = document.getElementById("prefsStrings");
var pattern = showcase_loadFromFile();
if(!pattern) return false;
var i;
var showcaseImport = new Array;
var appendFilters = null;
if(pattern[1].indexOf("Showcase - Settings") < 0) {
alert(strings.getString('prefs.invalid'));
return false;
}
if(!confirm(strings.getString('prefs.import'))) return false;
for(i = 6; i < pattern.length; i++) {
var index = pattern[i].indexOf("=");
if(index > 0) {
showcaseImport[i] = [];
showcaseImport[i].push(pattern[i].substring(0, index));
showcaseImport[i].push(pattern[i].substring(index + 1, pattern[i].length));
}
}
if(pattern[1].indexOf("Showcase - Settings") >= 0) {
for(i = 6; i < showcaseImport.length; i++) {
try {
switch(showcase_gPrefBranch.getPrefType(showcaseImport[i][0])) {
case Components.interfaces.nsIPrefBranch.PREF_BOOL:
showcase_gPrefBranch.setBoolPref(showcaseImport[i][0],/true/i.test(showcaseImport[i][1]));
break;
case Components.interfaces.nsIPrefBranch.PREF_INT:
showcase_gPrefBranch.setIntPref(showcaseImport[i][0], showcaseImport[i][1]);
break;
case Components.interfaces.nsIPrefBranch.PREF_STRING:
var pref = showcaseImport[i][1];
if(pref.indexOf('"') == 0) // in prev version we use " " for string
pref = pref.substring(1,pref.length - 1);
showcase_gPrefBranch.setCharPref(showcaseImport[i][0], pref);
break;
}
}
catch(e) { }
}
window.alert(strings.getString('prefs.importsuccess'));
return true;
}
alert(strings.getString('prefs.importfailed'));
return false;
}
function showcase_saveToFile(patterns) {
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
var stream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
var strings = document.getElementById("prefsStrings");
fp.init(window, strings.getString('prefs.save'), fp.modeSave);
fp.defaultExtension = 'showcase';
fp.defaultString = strings.getString('prefs.defaultFileName') + '.' + fp.defaultExtension;
fp.appendFilter(strings.getString('prefs.filter'), "*.showcase");
fp.appendFilters(fp.filterAll);
if(fp.show() != fp.returnCancel) {
if(fp.file.exists()) fp.file.remove(true);
fp.file.create(fp.file.NORMAL_FILE_TYPE, 0666);
stream.init(fp.file, 0x02, 0x200, null);
for(var i = 0; i < patterns.length; i++) {
patterns[i] = patterns[i] + "\n";
stream.write(patterns[i], patterns[i].length);
}
stream.close();
} else {
}
}
function showcase_loadFromFile() {
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
var stream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
var streamIO = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
var strings = document.getElementById("prefsStrings");
fp.init(window, strings.getString('prefs.open'), fp.modeOpen);
fp.defaultExtension = 'showcase';
fp.appendFilter(strings.getString('prefs.filter'), "*.showcase");
fp.appendFilters(fp.filterAll);
if(fp.show() != fp.returnCancel) {
stream.init(fp.file, 0x01, 0444, null);
streamIO.init(stream);
var input = streamIO.read(stream.available());
streamIO.close();
stream.close();
var linebreak = input.match(/(((\n+)|(\r+))+)/m)[1]; // first: whole match -- second: backref-1 -- etc..
return input.split(linebreak);
}
return null;
}
PK
7`=
=
content/settings/settings.xul
%dialogDTD;
%tabBrowserDTD;
]>
PK
78M M content/showcase.js// Constants
const NUMBER_BORDER_COLORS = 12;
const ANIMATION_INTERVAL = 40;
const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START;
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP;
const STATE_REDIRECTING= Components.interfaces.nsIWebProgressListener.STATE_REDIRECTING;
const STATE_TRANSFERRING = Components.interfaces.nsIWebProgressListener.STATE_TRANSFERRING;
const STATE_IS_DOCUMENT = Components.interfaces.nsIWebProgressListener.STATE_IS_DOCUMENT;
const STATE_IS_WINDOW = Components.interfaces.nsIWebProgressListener.STATE_IS_WINDOW;
const STATE_IS_REQUEST = Components.interfaces.nsIWebProgressListener.STATE_IS_REQUEST;
const RELOAD_FLAGS = Components.interfaces.nsIWebNavigation.LOAD_FLAGS_NONE;
const RELOAD_SKIP_CACHE_FLAGS = Components.interfaces.nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY | Components.interfaces.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE;
const VK_SPACE = 32;
const VK_PRIOR = 33;
const VK_NEXT = 34;
const IETAB_URL = "chrome://ietab/content/reloaded.html?url=";
const SHOWCASE_SIDEBAR = "viewShowcaseSidebar";
const SHOWCASETHISWINDOW_SIDEBAR = "viewShowcaseThisWindowSidebar";
const OPTIONS_URL = "chrome://showcase/content/settings/settings.xul";
const FINDTYPE_TITLE = 0;
const FINDTYPE_LOCATION = 1;
const FINDTYPE_CONTENT = 2;
const FINDTYPE_ANY = 3;
const SCROLL_NONE = 0;
const SCROLL_VERTICAL = 1;
const SCROLL_HORIZONTAL = 2;
const CONTENTTYPE_HTML = "text/html";
const CONTENTTYPE_XHTML = "application/xhtml+xml";
const CONTENTTYPE_XUL = "application/vnd.mozilla.xul+xml";
const CACHEMODE_NOTHING = 0;
const CACHEMODE_CLEAR = 1;
const CACHEMODE_UPDATE = 2;
// Identification var
var isShowcaseWindow = true;
// Global vars
var showcaseBox;
var showcaseContentVertical;
var selectionBox;
var dropBox;
var selectionStartX;
var selectionStartY;
var selectionEndX;
var selectionEndY;
var originalSelection = new Array();
var originalGlobalMode;
var globalMode;
var topWindow;
var targetFocusWindow;
var currentAnimations = new Array();
var loadingTabTitle;
var untitledTabTitle;
var closeTabTitle;
var showcasePopupTab;
var pendingThumbnails = new Array();
var windowCurrentColor = 1;
var thumbWidth, thumbHeight;
var closingShowcase = false;
var processedWindows = new Array();
var currentCursor = null;
var showcaseOriginalTitle = null;
var tabOldStyle;
var showcaseOldBackgroundColor;
var paintThumbnailsThread;
var findPhraseNotFoundLabel;
var showOnlyCurrent =false;
var showOnlyCurrentLabel = null;
var localTargetWindow = null;
var scrollBoxObject = null;
var scrollActivated = false;
var isWaitingRefocus = false;
var lastMouseDownTab = null;
var selectTimer = null;
var selectTimerTarget = null;
var currentIconsThumbnail = null;
var thumbnailBackButtonObject = null;
var thumbnailForwardButtonObject = null;
var thumbnailReloadButtonObject = null;
var thumbnailStopButtonObject = null;
// Selection bars
var selectedTabs = new Array();
var lastFocusedTab = null;
var focusToggleSelection = false;
var focusSelectRange = false;
var focusIgnoreSelection = false;
var focusSelectIfUnselected = false;
// Search variables
var gFinder = Components.classes["@mozilla.org/embedcomp/rangefind;1"].createInstance()
.QueryInterface(Components.interfaces.nsIFind);
var searchCaseSensitive = false;
var searchActive = false;
var searchFindType = FINDTYPE_ANY;
var lastSearch = "";
var lastSearchFindType = FINDTYPE_ANY;
var lastSearchCaseSensitive = false;
// Configuration parameters
var coloredThumbnailsForMultipleWindows;
var paintThumbnailsAfterLoading;
var paintSelectedTabsFirst;
var thumbnailActiveAnimation;
var animationFrames;
var thumbnailIdleSizeFactor;
var thumbnailActiveSizeFactor;
var windowAttributeMaximized;
var windowAttributeFullScreen;
var windowAttributeTranslucent;
var updateThumbnailWhenContentLoaded;
var updateThumbnailWhenScroll;
var updateThumbnailWhenContentChanges;
var limitContentChangeUpdates;
var limitContentChangeUpdatesTime;
var thumbnailShowLabels;
var thumbnailLabelStyle;
var leftClickAction;
var middleClickAction;
var rightClickAction;
var showcaseCustomColors = false;
var showcaseCustomTitleColor;
var showcaseCustomBackgroundColor;
var showcaseCloseWhenBlur;
var showcaseCloseWhenParentFocus;
var showcaseCloseWhenSelect;
var showcaseCloseWhenZeroThumbnails;
var thumbnailTooltipTitle;
var thumbnailTooltipURL;
var browserChromeURL;
var showTitleStats;
var scrollType;
var thumbnailPreferredMinimumSize = 250;
var alwaysShowScrollbar;
var verticalScrollbarWidth;
var horizontalScrollbarHeight;
var useWindowZOrder;
var selectWhenMouseOver = false;
var selectWhenMouseOverDelay = 300;
var hideTabBar = false;
var synchFindBar = false;
var showOnlyCurrentByDefault = false;
var doubleClickOpen = false;
var detectBlank;
var detectIETab;
var detectPlugin;
var detectImage;
var renderingType;
var tabColorizeLabel;
var closeLastTabKeepOpen;
var dragDropExclude;
var zoomScrollIncrement;
var tabFlipping;
var findBarMode;
var thumbnailBackButton;
var thumbnailForwardButton;
var thumbnailStopButton;
var thumbnailReloadButton;
var imageThumbnailUpscale = false;
var zoomFitsScreen;
var selectWhenOpen;
var doubleClickAction;
// Contextual menu actions
var loadedContextualSettings = false;
var contextualActionOpen;
var contextualActionShowcaseThis;
var contextualActionBack;
var contextualActionForward;
var contextualActionReload;
var contextualActionStop;
var contextualActionDuplicateTab;
var contextualActionDuplicateSelected;
var contextualActionMoveTab;
var contextualActionMergeSelected;
var contextualActionBookmarkPage;
var contextualActionBookmarkSelected;
var contextualActionSavePage;
var contextualActionSendPage;
var contextualActionPrint;
var contextualActionViewSource;
var contextualActionPageInfo;
var contextualActionCloseOther;
var contextualActionClose;
var contextualActionCloseTab;
var contextualActionCloseWindow;
var gPref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.QueryInterface(Components.interfaces.nsIPrefBranch2);
// Mosaic vars
var mosaicRows;
var mosaicColumns;
var mosaicWidth;
var mosaicHeight;
// Zoom vars
var inZoomMode = false;
var zoomTargetThumbnail = null;
var zoomTargetPreviousCursorStyle = null;
var previousZoomScrollX = null;
var previousZoomScrollY = null;
var zoomScrollingUp = false;
var zoomScrollingDown = false;
var zoomScrollingLeft = false;
var zoomScrollingRight = false;
var zoomOffsetX = 0;
var zoomOffsetY = 0
var zoomTotalWidth;
var zoomTotalHeight;
var zoomCurrentWidth;
var zoomCurrentHeight;
var zoomCursorLeft;
var zoomCursorRight;
var zoomCursorUp;
var zoomCursorDown;
// Size checked
var thumbnailBorderWidth = -1;
var thumbnailBorderHeight = -1;
// Version detector
var isNewLayout = false;
// Observers
var windowObserver = {
observe: function(subject,topic,data){
switch(topic){
case 'domwindowopened':
subject.addEventListener("load", newWindowLoaded, false);
break;
case 'domwindowclosed':
var targetProcessedWindow = getProcessedWindowForWindow(subject);
if (targetProcessedWindow) {
unlinkProcessedWindow(targetProcessedWindow, CACHEMODE_NOTHING);
if ((processedWindows.length == 0) && showcaseCloseWhenZeroThumbnails) {
closeWindow();
} else {
if (processedWindows.length < 1) {
document.getElementById("emptyMessage").setAttribute("hidden", false);
}
if (processedWindows.length == 1) {
updateBorders(processedWindows[0]);
}
updateTitle();
refreshContent();
}
}
break;
}
}
};
// Array helper functions
function removeAllElements(targetArray) {
targetArray.length = 0;
}
function removeElementAt(targetArray, index) {
targetArray.splice(index, 1);
}
function insertElementAt(targetArray, element, index) {
targetArray.splice(index, 0, element);
}
function startup() {
showcaseBox = document.getElementById("showcase-box");
showcaseContentVertical = document.getElementById("showcase-content-vertical");
selectionBox = document.getElementById("selection-box");
dropBox = document.getElementById("drop-box");
// Detect version
var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
.getService(Components.interfaces.nsIXULAppInfo)
var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
.getService(Components.interfaces.nsIVersionComparator);
// if the engine version is 1.9, we're using the new layout engine
if (versionChecker.compare(appInfo.platformVersion, "1.9a1") >= 0) {
isNewLayout = true;
}
// Guess if we want single window mode or multi window
if (window.location.search) {
var globalModeParameter = window.location.search.substr("?global=".length, window.location.search.length);
globalMode = ((globalModeParameter == "true") || (globalModeParameter == "yes"));
} else {
globalMode = false;
}
originalGlobalMode = globalMode;
// Set top window if needed
topWindow = QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebNavigation).QueryInterface(Components.interfaces.nsIDocShellTreeItem).rootTreeItem.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindow);
/*
if (topWindow != window) {
// We're embedded (tab or sidebar)
if (window.top == topWindow) {
// Sidebar
}
}
*/
showcaseBox.setAttribute("focusable", "true");
showcaseBox.focus();
loadSettings();
// Default settings
showOnlyCurrent = showOnlyCurrentByDefault;
initShowcase();
if ((topWindow == window) && (windowAttributeFullScreen || windowAttributeMaximized)) {
// Invoke it "later", when window is created. If we don't do this, we won't overlap the taskbar in Windows
setTimeout(activateFullScreen, 0);
} else {
// Proceed
contentStartup(thumbnailActiveAnimation);
// Check synch find bar in tab mode
if (synchFindBar && (topWindow != window.top)) {
checkSynchFindBar(topWindow, this);
}
}
}
function initShowcase() {
// set the correct scrolling
if (scrollType != SCROLL_NONE) {
scrollBoxObject = showcaseContentVertical.boxObject.QueryInterface(Components.interfaces.nsIScrollBoxObject);
} else {
scrollBoxObject = null;
}
if (showcaseCustomColors) {
showcaseOldBackgroundColor = showcaseBox.style.backgroundColor;
showcaseBox.style.backgroundColor = showcaseCustomBackgroundColor + " !important;";
if ((window.top != topWindow) && (tabColorizeLabel)) {
// We're a tab, set the style...
var tabbrowser = topWindow.getBrowser();
for (var i = 0; i < tabbrowser.mTabContainer.childNodes.length; i++) {
var tab = tabbrowser.mTabContainer.childNodes[i];
if (tab.linkedBrowser.contentWindow == window) {
setTabColor(tab, topWindow.document);
}
}
window.focus();
}
}
if (showcaseCloseWhenParentFocus) {
try {
window.opener.addEventListener("focus", showcaseParentGotFocus, true);
} catch (e) {}
}
// window.addEventListener("focus", showcaseGainedFocus, false);
window.addEventListener("blur", showcaseLostFocus, false);
if (windowAttributeTranslucent) {
try {
var translucentWindowCss = window.document.createProcessingInstruction("xml-stylesheet","type=\"text/css\" href=\"chrome://showcase/skin/translucentWindow.css\"");
window.hidden = true;
window.document.insertBefore(translucentWindowCss, window.document.documentElement);
} catch (e) { alert("startup - " + e); }
}
if (window.sidebarFindBar) {
if (findBarMode == 0) {
searchActive = true;
document.getElementById("FindToolbar").hidden = false;
document.getElementById("find-closebutton").hidden = true;
} else if (findBarMode == 1) {
searchActive = false;
document.getElementById("FindToolbar").hidden = true;
document.getElementById("find-closebutton").hidden = true;
} else {
document.getElementById("FindToolbar").hidden = !searchActive;
document.getElementById("find-closebutton").hidden = false;
}
}
}
function showcaseParentGotFocus() {
if (!isWaitingRefocus) {
closeWindow();
}
}
// To unlink a tab from the events structure
function unlinkProcessedTab(processedTab, tabWindow) {
try {
if (selectedTabs.indexOf(processedTab) > -1) {
removeElementAt(selectedTabs, selectedTabs.indexOf(processedTab));
}
if (processedTab.showcaseCanvasBox) {
// Remove from current animations if it's there
if (thumbnailActiveAnimation) {
var animationPos = currentAnimations.indexOf(processedTab.showcaseCanvasBox);
if (animationPos > -1) {
removeElementAt(currentAnimations, animationPos);
}
}
if (currentCursor == processedTab) {
// Select next
var targetRow = currentCursor.showcaseRow;
var targetColumn = currentCursor.showcaseColumn;
if (targetColumn < mosaicColumns - 1) {
targetColumn++;
} else {
targetColumn = 0;
targetRow++;
}
var result = getTabAt(targetRow, targetColumn);
if (result) {
if (currentCursor == result) {
// No change, go to previous
targetRow = currentCursor.showcaseRow;
targetColumn = currentCursor.showcaseColumn;
if (targetColumn > 0) {
targetColumn--;
} else if (targetRow > 0) {
targetRow--;
targetColumn = mosaicColumns - 1;
} else {
currentCursor = null;
targetRow = -1;
}
if (targetRow > -1) {
var result = getTabAt(targetRow, targetColumn);
if (result) {
if (currentCursor == result) {
currentCursor = null;
} else {
focusIgnoreSelection = true;
result.showcaseCanvasBox.focus();
}
}
}
} else {
focusIgnoreSelection = true;
result.showcaseCanvasBox.focus();
}
}
}
// Check if it has the icons
if ((currentIconsThumbnail != null) && (currentIconsThumbnail.showcaseTab == processedTab)) {
hideThumbnailIcons();
currentIconsThumbnail = null;
}
// Remove event listeners
processedTab.showcaseCanvasBox.removeEventListener("focus", thumbnailFocus, false);
processedTab.showcaseCanvasBox.removeEventListener("blur", thumbnailBlur, false);
if (thumbnailActiveAnimation || selectWhenMouseOver || thumbnailBackButton || thumbnailForwardButton || thumbnailStopButton || thumbnailReloadButton) {
processedTab.showcaseCanvasBox.removeEventListener("mouseover", mouseOverCanvas, false);
processedTab.showcaseCanvasBox.removeEventListener("mouseout", mouseOutCanvas, false);
}
processedTab.showcaseCanvasBox.removeEventListener("mousedown", mouseDownCanvas, (topWindow != window));
processedTab.showcaseCanvasBox.removeEventListener("mouseup", mouseUpCanvas, (topWindow != window));
if (doubleClickOpen) {
processedTab.showcaseCanvasBox.removeEventListener("dblclick", mouseDoubleClickCanvas, (topWindow != window));
}
while (processedTab.showcaseCanvasBox.hasChildNodes()) {
processedTab.showcaseCanvasBox.removeChild(processedTab.showcaseCanvasBox.firstChild);
}
processedTab.showcaseCanvasBox.showcaseCanvas = undefined;
processedTab.showcaseCanvasBox.showcaseTab = undefined;
processedTab.showcaseCanvasBox.showcaseLabel = undefined;
processedTab.showcaseCanvasBox.showcaseImageLabel = undefined;
processedTab.showcaseCanvasBox.showcaseCloseButton = undefined;
processedTab.showcaseCanvasBox = undefined;
if (processedTab.showcaseCanvasSubBox) {
while (processedTab.showcaseCanvasSubBox.hasChildNodes()) {
processedTab.showcaseCanvasSubBox.removeChild(processedTab.showcaseCanvasSubBox.firstChild);
}
processedTab.showcaseCanvasSubBox = undefined;
}
}
if (processedTab._scrollTimer) {
processedTab._scrollTimer.cancel();
processedTab._scrollTimer = undefined;
}
processedTab.showcaseIETab = undefined;
processedTab.showcaseBlank = undefined;
processedTab.showcaseEmbedded = undefined;
if (processedTab.showcaseProgressListener) {
processedTab.showcaseProgressListener.unloadListener();
processedTab.showcaseProgressListener = undefined;
}
if (processedTab.showcaseTabEventListener) {
try {
processedTab.targetTab.removeEventListener("resize", processedTab.showcaseTabEventListener, false);
processedTab.targetTab.removeEventListener("load", processedTab.showcaseTabEventListener, true);
if (thumbnailShowLabels) {
processedTab.tabHeader.removeEventListener("DOMAttrModified", processedTab.showcaseTabEventListener, false);
}
if (updateThumbnailWhenScroll) {
processedTab.targetTab.removeEventListener("scroll", processedTab.showcaseTabEventListener, true);
}
} catch (e) {}
processedTab.showcaseTabEventListener = undefined;
}
if (processedTab.showcaseCanvas) {
processedTab.showcaseCanvas.width = 0;
processedTab.showcaseCanvas.height = 0;
processedTab.showcaseCanvas.showcaseCanvasBox = undefined;
processedTab.showcaseCanvas = undefined;
}
processedTab.targetTab = undefined;
processedTab.targetTabWindow = undefined;
processedTab.tabHeader = undefined;
if (tabWindow.processedTabs) {
var position = tabWindow.processedTabs.indexOf(processedTab);
if (position > -1) {
removeElementAt(tabWindow.processedTabs, position);
}
}
if (selectTimerTarget == processedTab) {
selectTimer.cancel();
selectTimerTarget = null;
}
} catch (e) { alert("unlinkProcessedTab: " + e); }
}
function setTabColor(tab, tabDocument) {
var style = "-moz-appearance: none !important; color: " + showcaseCustomTitleColor + " !important;";
// background: " + showcaseCustomBackgroundColor + " !important;";
tabOldStyle = tab.getAttribute("style");
tab.setAttribute("style", tabOldStyle + style);
var nodes = tabDocument.getAnonymousNodes(tab);
for (var i=0; i < nodes.length; i++)
nodes[i].style.setProperty('background-color', showcaseCustomBackgroundColor, '');
}
function restoreTabColor(tab, tabDocument) {
tab.setAttribute("style", tabOldStyle);
var nodes = tabDocument.getAnonymousNodes(tab);
for (var i=0; i < nodes.length; i++)
nodes[i].style.removeProperty ('background-color');
}
function updateBorders(targetProcessedWindow) {
// Get selected tab
var tabbrowser = targetProcessedWindow.targetWindow.getBrowser();
var tabs = tabbrowser.mTabContainer.childNodes;
var selectedTab = tabbrowser.getBrowserForTab(tabs[tabbrowser.mTabContainer.selectedIndex]);
var multipleWindows = (processedWindows.length > 1);
// Iterate array
for (var c=0; c 1);
if (multipleWindows && coloredThumbnailsForMultipleWindows) {
if (processedTab.targetTab == selectedTab) {
processedTab.showcaseCanvasBox.setAttribute("selectedtab", "true");
} else {
processedTab.showcaseCanvasBox.removeAttribute("selectedtab");
}
processedTab.showcaseCanvasSubBox.setAttribute("class", "coloredThumbnailBox" + targetWindow.showcaseColor);
} else {
if (processedTab.targetTab == selectedTab) {
processedTab.showcaseCanvasBox.setAttribute("selectedtab", "true");
} else {
processedTab.showcaseCanvasBox.removeAttribute("selectedtab");
}
processedTab.showcaseCanvasSubBox.setAttribute("class", "thumbnailBox");
}
}
function checkWindow(targetWindow, attempts) {
try {
if (linkWindow(targetWindow)) {
updateTitle();
setTimeout(refreshContent, 0);
}
} catch (e) {
// Window not ready, try again later...
if (attempts > 0) {
setTimeout(checkWindow, 100, targetWindow, --attempts);
} else if (processedWindows.length < 1) {
document.getElementById("emptyMessage").setAttribute("hidden", false);
}
}
}
function isWindowProcessed(targetWindow) {
var found = false;
for (var c=0; (c NUMBER_BORDER_COLORS)
windowCurrentColor = 1;
// Add listeners to tabsDOMNodeInserted
var tabsChangeListener = new TabsChangeListener(currentProcessedWindow, this);
tabbrowser.tabContainer.addEventListener("select", tabsChangeListener, false);
tabbrowser.tabContainer.addEventListener("DOMNodeInserted", tabsChangeListener, false);
tabbrowser.tabContainer.addEventListener("DOMNodeRemoved", tabsChangeListener, false);
currentProcessedWindow.showcaseTabsChangeListener = tabsChangeListener;
var tabs = tabbrowser.mTabContainer.childNodes;
var totalTabs = tabs.length;
var selectedTab = tabbrowser.getBrowserForTab(tabs[tabbrowser.mTabContainer.selectedIndex]);
currentProcessedWindow.showcaseLastGoodWidth = selectedTab.contentWindow.innerWidth;
currentProcessedWindow.showcaseLastGoodHeight = selectedTab.contentWindow.innerHeight;
// link current tabs
for (var j = 0; j< totalTabs; j++) {
var targetTab = tabbrowser.getBrowserForTab(tabs[j]);
if (targetTab.contentWindow && (!targetTab.contentWindow.isShowcaseWindow && (!targetTab.contentWindow.wrappedJSObject || !targetTab.contentWindow.wrappedJSObject.isShowcaseWindow))) {
var currentProcessedTab = new ProcessedTab(targetTab);
var newThumbnail = createThumbnail(tabs[j], currentProcessedTab, tabbrowser, currentProcessedWindow);
// Cache
if (!currentProcessedTab.showcaseIETab && !currentProcessedTab.showcaseBlank && !currentProcessedTab.showcaseEmbedded) {
if (targetWindow.ShowcaseCache.currentShowcases.length > 0) {
// Get the biggest one
var bestShowcase = targetWindow.ShowcaseCache.currentShowcases[0];
if (targetWindow.ShowcaseCache.currentShowcases.length > 1) {
for (var c=0; c bestShowcase.thumbWidth) && (targetShowcase.thumbHeight > bestShowcase.thumbHeight)) {
bestShowcase = targetShowcase;
}
}
}
var remoteCanvas = bestShowcase.getProcessedWindowForWindow(targetWindow).processedTabs[currentProcessedWindow.processedTabs.length].showcaseCanvas;
if (remoteCanvas) {
currentProcessedTab.showcaseCanvas.width = remoteCanvas.width;
currentProcessedTab.showcaseCanvas.height = remoteCanvas.height;
var ctx = currentProcessedTab.showcaseCanvas.getContext("2d");
ctx.drawImage(remoteCanvas, 0, 0, currentProcessedTab.showcaseCanvas.width, currentProcessedTab.showcaseCanvas.height);
currentProcessedTab.showcaseCanvas.showcasePainted = true;
}
} else if (currentProcessedTab.targetTab.showcaseCache) {
var cache = currentProcessedTab.targetTab.showcaseCache;
if ((cache.thumb) && (!cache.waitingRepaint)) {
currentProcessedTab.showcaseCanvas.width = cache.thumb.width;
currentProcessedTab.showcaseCanvas.height = cache.thumb.height;
var ctx = currentProcessedTab.showcaseCanvas.getContext("2d");
//var oriCtx = cache.thumb.getContext("2d");
ctx.drawImage(cache.thumb, 0, 0, currentProcessedTab.showcaseCanvas.width, currentProcessedTab.showcaseCanvas.height);
currentProcessedTab.showcaseCanvas.showcasePainted = true;
}
}
}
// insert in document
showcaseBox.insertBefore(newThumbnail, selectionBox);
currentProcessedWindow.processedTabs.push(currentProcessedTab);
if (thumbnailBorderWidth < 0) {
/*
var showcaseCanvasBox = document.getBoxObjectFor(currentProcessedTab.showcaseCanvas);
if (showcaseCanvasBox) {
thumbnailBorderWidth = currentProcessedTab.showcaseCanvasBox.boxObject.width - showcaseCanvasBox.width;
thumbnailBorderHeight = currentProcessedTab.showcaseCanvasBox.boxObject.height - showcaseCanvasBox.height;
} else {
thumbnailBorderWidth = 3;
thumbnailBorderHeight = 3;
}
*/
var externalBoxWidth = window.getComputedStyle(currentProcessedTab.showcaseCanvasBox, "width").width;
externalBoxWidth = externalBoxWidth.replace(/px/, "");
var externalBoxHeight = window.getComputedStyle(currentProcessedTab.showcaseCanvasBox, "height").height;
externalBoxHeight = externalBoxHeight.replace(/px/, "");
var internalBoxWidth = window.getComputedStyle(currentProcessedTab.showcaseCanvas, "width").width;
internalBoxWidth = internalBoxWidth.replace(/px/, "");
var internalBoxHeight = window.getComputedStyle(currentProcessedTab.showcaseCanvas, "height").height;
internalBoxHeight = internalBoxHeight.replace(/px/, "");
thumbnailBorderWidth = externalBoxWidth - internalBoxWidth;
thumbnailBorderHeight = externalBoxHeight - internalBoxHeight;
if (thumbnailBorderWidth < 0) thumbnailBorderWidth = 0;
if (thumbnailBorderHeight < 0) thumbnailBorderHeight = 0;
// Padding and border are not being computed...
// Add the padding.
// FIXME. This is a hack, there must be a better way to handle this.
if (thumbnailLabelStyle == 0) {
thumbnailBorderWidth += 8;
thumbnailBorderHeight += 8;
} else {
thumbnailBorderWidth += 10;
thumbnailBorderHeight += 10;
}
}
}
}
processedWindows.push(currentProcessedWindow);
// Register as window observer
targetWindow.ShowcaseCache.addShowcase(window);
return true;
}
return false;
}
// To unlink a window
function unlinkProcessedWindow(targetProcessedWindow, cacheMode) {
try {
var tabbrowser = targetProcessedWindow.targetWindow.getBrowser();
// Remove listeners to tabsDOMNodeInserted
tabbrowser.tabContainer.removeEventListener("select", targetProcessedWindow.showcaseTabsChangeListener, false);
tabbrowser.tabContainer.removeEventListener("DOMNodeInserted", targetProcessedWindow.showcaseTabsChangeListener, false);
tabbrowser.tabContainer.removeEventListener("DOMNodeRemoved", targetProcessedWindow.showcaseTabsChangeListener, false);
// Unlink tabs
if (targetProcessedWindow.processedTabs.length > 0) {
for (var c=targetProcessedWindow.processedTabs.length-1; c>=0; c--) {
var targetProcessedTab = targetProcessedWindow.processedTabs[c];
if (targetProcessedTab.showcaseCanvasBox) {
if (targetProcessedTab.targetTab.showcaseCache) {
if (cacheMode == CACHEMODE_CLEAR) {
targetProcessedTab.targetTab.showcaseCache.thumb = null;
} else if ((cacheMode == CACHEMODE_UPDATE) && (targetProcessedTab.targetTab.showcaseCache)) {
if (targetProcessedWindow.targetWindow.ShowcaseCache.currentShowcases.length < 2) {
if (!targetProcessedTab.targetTab.showcaseCache.thumb) {
targetProcessedTab.targetTab.showcaseCache.createThumbnail();
}
var targetThumb = targetProcessedTab.targetTab.showcaseCache.thumb;
targetThumb.width = targetProcessedTab.showcaseCanvas.width;
targetThumb.height = targetProcessedTab.showcaseCanvas.height;
var ctx = targetThumb.getContext("2d");
ctx.drawImage(targetProcessedTab.showcaseCanvas, 0, 0, targetThumb.width, targetThumb.height);
}
}
}
showcaseBox.removeChild(targetProcessedTab.showcaseCanvasBox);
unlinkProcessedTab(targetProcessedTab, targetProcessedWindow );
}
}
}
// Unregister
targetProcessedWindow.targetWindow.ShowcaseCache.removeShowcase(window);
var position = processedWindows.indexOf(targetProcessedWindow);
if (position > -1) {
removeElementAt(processedWindows, position);
}
} catch (e) {
setTimeout(alert, 0, "UnlinkProcessedWindow - " + e);
}
}
function unlinkShowcase(cacheMode) {
// Reset tab style
if (showcaseCustomColors) {
showcaseBox.style.backgroundColor = showcaseOldBackgroundColor;
if ((window.top != topWindow) && (tabColorizeLabel)) {
// We're a tab, set the style...
var tabbrowser = topWindow.getBrowser();
var l = tabbrowser.tabContainer.childNodes.length;
for (var i = 0; i < l; i++) {
var tab = tabbrowser.mTabContainer.childNodes[i];
if (tab.linkedBrowser.contentWindow == window) {
// We're in a tab
restoreTabColor(tab, topWindow.document);
}
}
}
}
// Unload all pending variables
try {
unregisterObservers();
while (processedWindows.length > 0) {
unlinkProcessedWindow(processedWindows[0], cacheMode);
}
removeAllElements(currentAnimations);
removeAllElements(pendingThumbnails);
window.removeEventListener("resize", sizeChanged, false);
showcaseContentVertical.removeEventListener("overflow", sizeChanged, false);
showcaseContentVertical.removeEventListener("underflow", sizeChanged, false);
showcaseContentVertical.removeEventListener("DOMMouseScroll", handleMouseWheel, true);
} catch (e) {
alert("unlinkShowcase - " + e);
}
// End selection if necessary
endSelection();
// Cancel selections
if (selectTimer) {
selectTimer.cancel();
selectTimer = undefined;
selectTimerTarget = undefined;
}
// Show tab bar if necessary
if (hideTabBar) {
var tabbrowser = window.top.getBrowser();
var tabstrip = window.top.document.getAnonymousElementByAttribute(tabbrowser,"class","tabbrowser-tabs");
if (tabstrip) {
tabstrip.collapsed=false;
}
}
if (showcaseCloseWhenParentFocus) {
try {
window.opener.removeEventListener("focus", showcaseParentGotFocus, true);
} catch (e) {}
}
// window.removeEventListener("focus", showcaseGainedFocus, false);
window.removeEventListener("blur", showcaseLostFocus, false);
return true;
}
var ShowcasePrefObserver =
{
prefObserver : {
refreshTimer : null,
observe: function(subject, topic, data) {
// subject is the nsIPrefBranch we're observing (after appropriate QI)
// data is the name of the pref that's been changed (relative to subject)
if(topic == "nsPref:changed") {
if ((data != "extensions.showcase.windowLastX") &&
(data != "extensions.showcase.windowLastY") &&
(data != "extensions.showcase.windowLastWidth") &&
(data != "extensions.showcase.windowLastHeight") &&
(data != "extensions.showcase.windowLastRelativeX") &&
(data != "extensions.showcase.windowLastRelativeY")) {
if (this.refreshTimer == null) {
this.refreshTimer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer);
}
this.refreshTimer.cancel();
this.refreshTimer.initWithCallback(this, 100, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
}
}
},
QueryInterface : function (aIID) {
if (aIID.equals(Components.interfaces.nsIObserver) ||
aIID.equals(Components.interfaces.nsITimerCallback) ||
aIID.equals(Components.interfaces.nsISupports) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference))
return this;
throw Components.results.NS_NOINTERFACE;
},
notify: function(timer) {
setTimeout(refreshScreen, 0);
}
},
addPrefObserver : function () {
if (!gPref) return;
gPref.addObserver("extensions.showcase.", ShowcasePrefObserver.prefObserver, true);
},
removePrefObserver : function () {
if (ShowcasePrefObserver.prefObserver.refreshTimer) {
ShowcasePrefObserver.prefObserver.refreshTimer.cancel();
ShowcasePrefObserver.prefObserver.refreshTimer = null;
}
if (!gPref) return;
gPref.removeObserver("extensions.showcase.", ShowcasePrefObserver.prefObserver);
}
}
function registerObservers() {
// We want to observe click actions in our window
addEventListener("mouseup", mouseUpWindow, (topWindow != window));
addEventListener("dblclick", mouseDblClickWindow, (topWindow != window));
addEventListener("keydown", windowKeyDown, false);
addEventListener("keyup", windowKeyUp, false);
// Add selection listener
showcaseBox.addEventListener("mousedown", selectionBoxStart, false);
showcaseBox.addEventListener("mouseup", selectionBoxEnd, false);
showcaseBox.addEventListener("mouseout", boxMouseOut, false);
showcaseBox.addEventListener("mousemove", selectionBoxCheck, false);
showcaseBox.addEventListener("keypress", showcaseBoxCheckKey, false);
var watcherService =
Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Components.interfaces.nsIWindowWatcher);
watcherService.registerNotification(windowObserver);
ShowcasePrefObserver.addPrefObserver();
}
function unregisterObservers() {
// Unregister mouse listener
removeEventListener("mouseup", mouseUpWindow, (topWindow != window));
removeEventListener("dblclick", mouseDblClickWindow, (topWindow != window));
removeEventListener("keydown", windowKeyDown, false);
removeEventListener("keyup", windowKeyUp, false);
// Add selection listener
showcaseBox.removeEventListener("mousedown", selectionBoxStart, false);
showcaseBox.removeEventListener("mouseup", selectionBoxEnd, false);
showcaseBox.removeEventListener("mouseout", boxMouseOut, false);
showcaseBox.removeEventListener("mousemove", selectionBoxCheck, false);
showcaseBox.removeEventListener("keypress", showcaseBoxCheckKey, false);
var watcherService =
Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Components.interfaces.nsIWindowWatcher);
watcherService.unregisterNotification(windowObserver);
ShowcasePrefObserver.removePrefObserver();
}
function loadContextualSettings() {
// Load showcase contextual settings
var prefsService = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefService);
var prefs = prefsService.getBranch("extensions.showcase.");
// Load contextual menu actions
contextualActionOpen = prefs.getBoolPref("contextualActionOpen");
contextualActionShowcaseThis = prefs.getBoolPref("contextualActionShowcaseThis");
contextualActionBack = prefs.getBoolPref("contextualActionBack");
contextualActionForward = prefs.getBoolPref("contextualActionForward");
contextualActionReload = prefs.getBoolPref("contextualActionReload");
contextualActionStop = prefs.getBoolPref("contextualActionStop");
contextualActionDuplicateTab = prefs.getBoolPref("contextualActionDuplicateTab");
contextualActionDuplicateSelected = prefs.getBoolPref("contextualActionDuplicateSelected");
contextualActionMoveTab = prefs.getBoolPref("contextualActionMoveTab");
contextualActionMergeSelected = prefs.getBoolPref("contextualActionMergeSelected");
contextualActionBookmarkPage = prefs.getBoolPref("contextualActionBookmarkPage");
contextualActionBookmarkSelected = prefs.getBoolPref("contextualActionBookmarkSelected");
contextualActionSavePage = prefs.getBoolPref("contextualActionSavePage");
contextualActionSendPage = prefs.getBoolPref("contextualActionSendPage");
contextualActionPrint = prefs.getBoolPref("contextualActionPrint");
contextualActionViewSource = prefs.getBoolPref("contextualActionViewSource");
contextualActionPageInfo = prefs.getBoolPref("contextualActionPageInfo");
contextualActionCloseOther = prefs.getBoolPref("contextualActionCloseOther");
contextualActionClose = prefs.getBoolPref("contextualActionClose");
contextualActionCloseTab = prefs.getBoolPref("contextualActionCloseTab");
contextualActionCloseWindow = prefs.getBoolPref("contextualActionCloseWindow");
loadedContextualSettings = true;
}
function loadSettings() {
// Load showcase settings
var prefsService = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefService);
var prefsRoot = prefsService.getBranch(null);
browserChromeURL = prefsRoot.getCharPref("browser.chromeURL");
var prefs = prefsService.getBranch("extensions.showcase.");
coloredThumbnailsForMultipleWindows = prefs.getBoolPref("coloredThumbnailsForMultipleWindows");
paintThumbnailsAfterLoading = prefs.getBoolPref("paintThumbnailsAfterLoading");
paintSelectedTabsFirst = prefs.getBoolPref("paintSelectedTabsFirst");
thumbnailActiveAnimation = prefs.getBoolPref("thumbnailActiveAnimation");
animationFrames = prefs.getIntPref("animationFrames");
thumbnailIdleSizeFactor = parseFloat(prefs.getCharPref("thumbnailIdleSizeFactor"));
thumbnailActiveSizeFactor = parseFloat(prefs.getCharPref("thumbnailActiveSizeFactor"));
thumbnailShowLabels = prefs.getBoolPref("thumbnailShowLabels");
thumbnailLabelStyle = prefs.getIntPref("thumbnailLabelStyle");
windowAttributeFullScreen = prefs.getBoolPref("windowAttributeFullScreen");
windowAttributeMaximized = prefs.getBoolPref("windowAttributeMaximized");
windowAttributeTranslucent = prefs.getBoolPref("windowAttributeTranslucent");
updateThumbnailWhenContentLoaded = prefs.getBoolPref("updateThumbnailWhenContentLoaded");
updateThumbnailWhenScroll = prefs.getBoolPref("updateThumbnailWhenScroll");
updateThumbnailWhenContentChanges = prefs.getBoolPref("updateThumbnailWhenContentChanges");
limitContentChangeUpdates = prefs.getBoolPref("limitContentChangeUpdates");
limitContentChangeUpdatesTime = prefs.getIntPref("limitContentChangeUpdatesTime");
leftClickAction = prefs.getIntPref("leftClickAction");
middleClickAction = prefs.getIntPref("middleClickAction");
rightClickAction = prefs.getIntPref("rightClickAction");
doubleClickOpen = prefs.getBoolPref("doubleClickOpen");
thumbnailTooltipTitle = prefs.getBoolPref("thumbnailTooltipTitle");
thumbnailTooltipURL = prefs.getBoolPref("thumbnailTooltipURL");
closeLastTabKeepOpen = prefs.getBoolPref("closeLastTabKeepOpen");
dragDropExclude = prefs.getIntPref("dragDropExclude");
zoomScrollIncrement = prefs.getIntPref("zoomScrollIncrement");
thumbnailBackButton = prefs.getBoolPref("thumbnailBackButton");
thumbnailForwardButton = prefs.getBoolPref("thumbnailForwardButton");
thumbnailStopButton = prefs.getBoolPref("thumbnailStopButton");
thumbnailReloadButton = prefs.getBoolPref("thumbnailReloadButton");
if (thumbnailActiveAnimation && (thumbnailIdleSizeFactor > thumbnailActiveSizeFactor)) {
// if idle size is bigger than active size, then we've a mistake here... deactivate animation
thumbnailActiveAnimation = false;
}
if (window != window.top) {
// Sidebar
showcaseCustomColors = prefs.getBoolPref("sidebarCustomColors");
showcaseCustomBackgroundColor = prefs.getCharPref("sidebarCustomBackgroundColor");
showcaseCloseWhenBlur = false;
showcaseCloseWhenParentFocus = false;
showcaseCloseWhenSelect = prefs.getBoolPref("sidebarCloseWhenSelect");
showcaseCloseWhenZeroThumbnails = false;
showTitleStats = prefs.getBoolPref("sidebarShowTitleStats");
scrollType = prefs.getIntPref("sidebarScrollType");
thumbnailPreferredMinimumSize = prefs.getIntPref("sidebarThumbnailPreferredMinimumSize");
alwaysShowScrollbar = prefs.getBoolPref("sidebarAlwaysShowScrollbar");
if (globalMode) {
showOnlyCurrentByDefault = prefs.getBoolPref("sidebarShowOnlyCurrentByDefault");
}
selectWhenMouseOver = prefs.getBoolPref("sidebarSelectWhenMouseOver");
selectWhenMouseOverDelay = prefs.getIntPref("sidebarSelectWhenMouseOverDelay");
hideTabBar = prefs.getBoolPref("sidebarHideTabBar");
tabFlipping = prefs.getBoolPref("sidebarTabFlipping");
findBarMode = prefs.getIntPref("sidebarFindBarMode");
zoomFitsScreen = prefs.getBoolPref("sidebarZoomFitsScreen");
selectWhenOpen = prefs.getBoolPref("sidebarSelectWhenOpen");;
doubleClickAction = prefs.getIntPref("sidebarDoubleClickAction");;
} else if (window.top != topWindow) {
// Tab
showcaseCustomColors = prefs.getBoolPref("tabCustomColors");
showcaseCustomTitleColor = prefs.getCharPref("tabCustomTitleColor");
showcaseCustomBackgroundColor = prefs.getCharPref("tabCustomBackgroundColor");
showcaseCloseWhenBlur = prefs.getBoolPref("tabCloseWhenBlur");
showcaseCloseWhenParentFocus = false;
showcaseCloseWhenSelect = prefs.getBoolPref("tabCloseWhenSelect");
showcaseCloseWhenZeroThumbnails = prefs.getBoolPref("tabCloseWhenZeroThumbnails");
showTitleStats = prefs.getBoolPref("tabShowTitleStats");
scrollType = prefs.getIntPref("tabScrollType");
thumbnailPreferredMinimumSize = prefs.getIntPref("tabThumbnailPreferredMinimumSize");
alwaysShowScrollbar = prefs.getBoolPref("tabAlwaysShowScrollbar");
if (globalMode) {
showOnlyCurrentByDefault = prefs.getBoolPref("tabShowOnlyCurrentByDefault");
}
synchFindBar = prefs.getBoolPref("tabSynchFindBar");
tabColorizeLabel = prefs.getBoolPref("tabColorizeLabel");
tabFlipping = prefs.getBoolPref("tabTabFlipping");
zoomFitsScreen = prefs.getBoolPref("tabZoomFitsScreen");
selectWhenOpen = prefs.getBoolPref("tabSelectWhenOpen");;
doubleClickAction = prefs.getIntPref("tabDoubleClickAction");;
} else {
// Window
showcaseCustomColors = prefs.getBoolPref("windowCustomColors");
showcaseCustomBackgroundColor = prefs.getCharPref("windowCustomBackgroundColor");
showcaseCloseWhenBlur = prefs.getBoolPref("windowCloseWhenBlur");
showcaseCloseWhenParentFocus = prefs.getBoolPref("windowCloseWhenParentFocus");
showcaseCloseWhenSelect = prefs.getBoolPref("windowCloseWhenSelect");
showcaseCloseWhenZeroThumbnails = prefs.getBoolPref("windowCloseWhenZeroThumbnails");
showTitleStats = prefs.getBoolPref("windowShowTitleStats");
scrollType = prefs.getIntPref("windowScrollType");
thumbnailPreferredMinimumSize = prefs.getIntPref("windowThumbnailPreferredMinimumSize");
alwaysShowScrollbar = prefs.getBoolPref("windowAlwaysShowScrollbar");
if (globalMode) {
showOnlyCurrentByDefault = prefs.getBoolPref("windowShowOnlyCurrentByDefault");
}
tabFlipping = prefs.getBoolPref("windowTabFlipping");
zoomFitsScreen = prefs.getBoolPref("windowZoomFitsScreen");
selectWhenOpen = prefs.getBoolPref("windowSelectWhenOpen");;
doubleClickAction = prefs.getIntPref("windowDoubleClickAction");;
}
// Detection settings
detectBlank = prefs.getBoolPref("detectBlank");
detectIETab = prefs.getBoolPref("detectIETab");
detectPlugin = prefs.getBoolPref("detectPlugin");
detectImage = prefs.getBoolPref("detectImage");
if (detectImage) {
imageThumbnailUpscale = prefs.getBoolPref("imageThumbnailUpscale");
}
// Rendering type
renderingType = prefs.getIntPref("renderingType");
// Scrolling
verticalScrollbarWidth = prefs.getIntPref("verticalScrollbarWidth");
horizontalScrollbarHeight = prefs.getIntPref("horizontalScrollbarHeight");
// Special parameters
useWindowZOrder = prefs.getBoolPref("useWindowZOrder");
}
function activateFullScreen() {
if (windowAttributeMaximized) {
window.maximize();
}
if (windowAttributeFullScreen) {
window.fullScreen = true;
}
contentStartup(thumbnailActiveAnimation);
}
function contentStartup(startAnimationThread) {
registerObservers();
createContent();
window.addEventListener("resize", sizeChanged, false);
showcaseContentVertical.addEventListener("overflow", sizeChanged, false);
showcaseContentVertical.addEventListener("underflow", sizeChanged, false);
showcaseContentVertical.addEventListener("DOMMouseScroll", handleMouseWheel, true);
// Start animation thread
if (startAnimationThread) {
setTimeout(animationThread, ANIMATION_INTERVAL);
}
// Hide tab bar if necessary
if (hideTabBar) {
var tabbrowser = window.top.getBrowser();
var tabstrip = window.top.document.getAnonymousElementByAttribute(tabbrowser,"class","tabbrowser-tabs");
if (tabstrip) {
tabstrip.collapsed=true;
}
}
}
function closeWindow() {
if (window.top != window) {
/*
if (!closingShowcase) {
closingShowcase = true;
unlinkShowcase();
}
*/
// Sidebar
if (originalGlobalMode) {
window.top.toggleSidebar(SHOWCASE_SIDEBAR);
} else {
window.top.toggleSidebar(SHOWCASETHISWINDOW_SIDEBAR);
}
} else {
window.close();
}
}
function showcaseLostFocus(event) {
if (event.originalTarget == window.document) {
if (showcaseBox) {
showcaseBox.setAttribute("windowFocused", "false");
}
if (showcaseCloseWhenBlur && !isWaitingRefocus) {
closeWindow();
}
}
}
function showcaseGainedFocus() {
if (showcaseBox) {
showcaseBox.setAttribute("windowFocused", "true");
}
}
function showcaseBrowserStop() {
try {
const stopFlags = nsIWebNavigation.STOP_ALL;
window.showcasePopupTab.targetTab.webNavigation.stop(stopFlags);
}
catch(ex) {
}
}
function showcaseBrowserReloadSkipCache() {
if (selectedTabs.length < 2) {
showcasePopupTab.targetTab.webNavigation.reload(RELOAD_SKIP_CACHE_FLAGS);
} else {
for (var c=0; c -1) {
removeElementAt(targetTabs, targetIndex);
}
}
// Remove them
closeShowcaseTabs(targetTabs);
}
function closeSelectedTabs() {
// Close the selected tabs
if (selectedTabs.length > 0) {
closeShowcaseTabs(selectedTabs);
} else if (currentCursor) {
closeShowcaseTab(currentCursor);
} else {
closeShowcaseTab(showcasePopupTab);
}
}
function closeSelectedWindow() {
// Look for the window that has the tab
var found = false;
var targetProcessedWindow;
for (var c=0; ((c -1) {
targetProcessedWindow = processedWindows[c];
found = true;
}
}
if (found) {
if ((targetProcessedWindow.targetWindow.BrowserTryToCloseWindow) && (typeof(targetProcessedWindow.targetWindow.BrowserTryToCloseWindow) == "function")) {
targetProcessedWindow.targetWindow.BrowserTryToCloseWindow();
} else {
targetProcessedWindow.targetWindow.close();
}
}
}
function getProcessedWindowForProcessedTab(targetProcessedTab) {
var foundProcessedTab = false;
var returnProcessedWindow = null;
for (var c=0; (c -1) {
found = true;
}
*/
}
return targetProcessedTab;
}
function keyboardHome(el) {
if (inZoomMode) {
if (!zoomFitsScreen) {
zoomOffsetX = 0;
zoomOffsetY = 0;
if ((zoomTargetThumbnail.targetTab.contentWindow.scrollX == 0) &&
(zoomTargetThumbnail.targetTab.contentWindow.scrollY == 0)) {
zoomTargetThumbnail.showcaseCanvas.showcasePainted = false;
setTimeout(function foo(a) { paintThumbnail(a); checkScrollCursorsVisibility(); }, 0, zoomTargetThumbnail);
}
}
zoomTargetThumbnail.targetTab.contentWindow.scroll(0, 0);
return;
}
if (!currentCursor) {
var result = getFirstCursor();
if (result) {
result.showcaseCanvasBox.focus();
}
} else {
var result = getFirstCursor();
if (result) {
if (el.shiftKey) {
focusSelectRange = true;
} else if (el.ctrlKey) {
focusIgnoreSelection = true;
}
if (currentCursor == result) {
processFocusedTab(currentCursor);
} else {
result.showcaseCanvasBox.focus();
}
}
}
}
function keyboardEnd(el) {
if (inZoomMode) {
if (!zoomFitsScreen) {
zoomOffsetX = zoomTotalWidth - zoomCurrentWidth;
zoomOffsetY = zoomTotalHeight - zoomCurrentHeight;
if ((zoomTargetThumbnail.targetTab.contentWindow.scrollX >= zoomTargetThumbnail.targetTab.contentWindow.scrollMaxX) &&
(zoomTargetThumbnail.targetTab.contentWindow.scrollY >= zoomTargetThumbnail.targetTab.contentWindow.scrollMaxY)) {
zoomTargetThumbnail.showcaseCanvas.showcasePainted = false;
setTimeout(function foo(a) { paintThumbnail(a); checkScrollCursorsVisibility(); }, 0, zoomTargetThumbnail);
}
}
zoomTargetThumbnail.targetTab.contentWindow.scrollBy(zoomTargetThumbnail.targetTab.contentWindow.scrollMaxX - zoomTargetThumbnail.targetTab.contentWindow.scrollX, zoomTargetThumbnail.targetTab.contentWindow.scrollMaxY - zoomTargetThumbnail.targetTab.contentWindow.scrollY);
return;
}
if (!currentCursor) {
var result = getLastCursor();
if (result) {
result.showcaseCanvasBox.focus();
}
} else {
var result = getLastCursor();
if (result) {
if (el.shiftKey) {
focusSelectRange = true;
} else if (el.ctrlKey) {
focusIgnoreSelection = true;
}
if (currentCursor == result) {
processFocusedTab(currentCursor);
} else {
result.showcaseCanvasBox.focus();
}
}
}
}
function keyboardLeft(el) {
if (inZoomMode) {
zoomPanLeft(zoomScrollIncrement);
return;
}
if (!currentCursor) {
var result = getLastCursor();
if (result) {
result.showcaseCanvasBox.focus();
}
} else {
var targetRow = currentCursor.showcaseRow;
var targetColumn = currentCursor.showcaseColumn;
if (targetColumn > 0) {
targetColumn--;
}
var result = getTabAt(targetRow, targetColumn);
if (result) {
if (el.shiftKey) {
focusSelectRange = true;
} else if (el.ctrlKey) {
focusIgnoreSelection = true;
}
if (currentCursor == result) {
processFocusedTab(currentCursor);
} else {
result.showcaseCanvasBox.focus();
}
} else {
var result = getLastCursor();
if (result) {
result.showcaseCanvasBox.focus();
}
}
}
}
function keyboardRight(el) {
if (inZoomMode) {
zoomPanRight(zoomScrollIncrement);
zoomTargetThumbnail.targetTab.contentWindow.scrollBy(zoomScrollIncrement, 0);
return;
}
if (!currentCursor) {
var result = getFirstCursor();
if (result) {
result.showcaseCanvasBox.focus();
}
} else {
var targetRow = currentCursor.showcaseRow;
var targetColumn = currentCursor.showcaseColumn;
if (targetColumn < mosaicColumns - 1) {
targetColumn++;
}
var result = getTabAt(targetRow, targetColumn);
if (result) {
if (el.shiftKey) {
focusSelectRange = true;
} else if (el.ctrlKey) {
focusIgnoreSelection = true;
}
if (currentCursor == result) {
processFocusedTab(currentCursor);
} else {
result.showcaseCanvasBox.focus();
}
} else {
var result = getFirstCursor();
if (result) {
result.showcaseCanvasBox.focus();
}
}
}
}
function keyboardUp(el) {
if (inZoomMode) {
zoomPanUp(zoomScrollIncrement);
return;
}
if (!currentCursor) {
var result = getLastCursor();
if (result) {
currentCursor = result;
currentCursor.showcaseCanvasBox.focus();
}
} else {
var targetRow = currentCursor.showcaseRow;
var targetColumn = currentCursor.showcaseColumn;
if (targetRow > 0) {
targetRow--;
}
var result = getTabAt(targetRow, targetColumn);
if (result) {
if (el.shiftKey) {
focusSelectRange = true;
} else if (el.ctrlKey) {
focusIgnoreSelection = true;
}
if (currentCursor == result) {
processFocusedTab(currentCursor);
} else {
result.showcaseCanvasBox.focus();
}
} else {
var result = getLastCursor();
if (result) {
currentCursor = result;
currentCursor.showcaseCanvasBox.focus();
}
}
}
}
function keyboardDown(el) {
if (inZoomMode) {
zoomPanDown(zoomScrollIncrement);
return;
}
if (!currentCursor) {
var result = getFirstCursor();
if (result) {
result.showcaseCanvasBox.focus();
}
} else {
var targetRow = currentCursor.showcaseRow;
var targetColumn = currentCursor.showcaseColumn;
if (targetRow < mosaicRows - 1) {
targetRow++;
}
var result = getTabAt(targetRow, targetColumn);
if (result && (result.showcaseColumn == targetColumn)) {
if (el.shiftKey) {
focusSelectRange = true;
} else if (el.ctrlKey) {
focusIgnoreSelection = true;
}
if (currentCursor == result) {
processFocusedTab(currentCursor);
} else {
result.showcaseCanvasBox.focus();
}
} else if (!result) {
var result = getFirstCursor();
if (result) {
result.showcaseCanvasBox.focus();
}
}
}
}
function keyboardEnter() {
if (!currentCursor)
return;
openTab(currentCursor);
}
function windowKeyDown(ev) {
if (ev.keyCode == VK_SPACE) {
if (!currentCursor)
return;
if (ev.ctrlKey) {
toggleSelection(currentCursor);
} else {
enterZoomMode(currentCursor);
}
}
}
function windowKeyUp(ev) {
if (ev.keyCode == VK_SPACE) {
if (!currentCursor)
return;
if (!ev.ctrlKey) {
leaveZoomMode();
}
} else if ((ev.keyCode == VK_PRIOR) && (inZoomMode)) {
if (zoomFitsScreen) {
zoomPanUp(zoomTargetThumbnail.targetTab.contentWindow.innerHeight);
} else {
zoomPanUp(zoomTotalHeight);
}
} else if ((ev.keyCode == VK_NEXT) && (inZoomMode)) {
if (zoomFitsScreen) {
zoomPanDown(zoomTargetThumbnail.targetTab.contentWindow.innerHeight);
} else {
zoomPanDown(zoomTotalHeight);
}
}
}
function keyboardDelete() {
if ((!currentCursor) && (selectedTabs.length == 0))
return;
if (inZoomMode)
leaveZoomMode();
closeSelectedTabs();
}
function toggleFullScreen() {
if (topWindow == window) {
window.fullScreen = !window.fullScreen;
} else {
topWindow.fullScreen = !topWindow.fullScreen;
}
}
function setCanvasSize(targetCanvas, width, height) {
targetCanvas.style.width = width+"px";
targetCanvas.style.height = height+"px";
targetCanvas.style.maxWidth = targetCanvas.style.width;
targetCanvas.style.minWidth = targetCanvas.style.width;
targetCanvas.style.maxHeight = targetCanvas.style.height;
targetCanvas.style.minHeight = targetCanvas.style.height;
}
function setSize(targetElement,width,height) {
targetElement.setAttribute("width", width);
targetElement.setAttribute("height", height);
targetElement.style.width = width+"px";
targetElement.style.height = height+"px";
// targetElement.style.minWidth = targetElement.style.width;
// targetElement.style.minHeight = targetElement.style.height;
targetElement.style.maxWidth = targetElement.style.width;
targetElement.style.maxHeight = targetElement.style.height;
}
function createContent() {
try {
var windows = getTargetWindows();
var shouldRefresh = false;
for (var i = 0; i < windows.length; i++) {
try {
linkWindow(windows[i]);
shouldRefresh = true;
} catch (e) {
// We failed, check window later
setTimeout(checkWindow, 100, windows[i], 15);
}
}
if (windows.length > 0) {
document.getElementById("emptyMessage").setAttribute("hidden", true);
} else {
document.getElementById("emptyMessage").setAttribute("hidden", false);
shouldRefresh = true;
}
for (var j=0; j 0) && (canvasBox.showcaseCloseButton)) {
canvasBox.showcaseCloseButton.setAttribute("ondraggesture", "if (selectedTabs.length < 2) event.stopPropagation();");
}
if ((dragDropExclude & 2) > 0) {
subCanvasBox.setAttribute("ondraggesture", "if (selectedTabs.length < 2) event.stopPropagation();");
}
canvasBox.addEventListener("focus", thumbnailFocus, false);
canvasBox.addEventListener("blur", thumbnailBlur, false);
if (thumbnailActiveAnimation || selectWhenMouseOver || thumbnailBackButton || thumbnailForwardButton || thumbnailStopButton || thumbnailReloadButton) {
canvasBox.addEventListener("mouseover", mouseOverCanvas, false);
canvasBox.addEventListener("mouseout", mouseOutCanvas, false);
}
canvasBox.addEventListener("mousedown", mouseDownCanvas, (topWindow != window));
canvasBox.addEventListener("mouseup", mouseUpCanvas, (topWindow != window));
if (doubleClickOpen) {
canvasBox.addEventListener("dblclick", mouseDoubleClickCanvas, (topWindow != window));
}
targetProcessedTab.showcaseCanvas = canvas;
targetProcessedTab.showcaseCanvas.showcaseCanvasBox = canvasBox;
targetProcessedTab.showcaseCanvasBox = canvasBox;
targetProcessedTab.showcaseCanvasBox.showcaseCanvas = canvas;
targetProcessedTab.showcaseCanvasBox.showcaseTab = targetProcessedTab;
targetProcessedTab.tabHeader = targetTabHeader;
targetProcessedTab.showcaseCanvasSubBox = subCanvasBox;
targetProcessedTab.showcaseProgressListener = new TabProgressListener(targetProcessedTab);
if (targetProcessedTab.targetTab.contentDocument) {
if (targetProcessedTab.targetTab.contentDocument.URL) {
if ((detectIETab) && (targetProcessedTab.targetTab.contentDocument.URL.substr(0, IETAB_URL.length) == IETAB_URL)) {
targetProcessedTab.showcaseIETab = true;
updateIEState(targetProcessedTab);
} else if ((detectBlank) && ((targetProcessedTab.targetTab.contentDocument.URL == "") || (targetProcessedTab.targetTab.contentDocument.URL == "about:blank"))) {
targetProcessedTab.showcaseBlank = true;
updateBlankState(targetProcessedTab);
}
}
checkEmbedding(targetProcessedTab, false);
checkImage(targetProcessedTab);
}
targetProcessedTab.showcaseTabEventListener = new TabEventListener(targetProcessedTab, tabwindow, window);
targetProcessedTab.targetTab.addEventListener("resize", targetProcessedTab.showcaseTabEventListener, false);
targetProcessedTab.targetTab.addEventListener("load", targetProcessedTab.showcaseTabEventListener, true);
if (thumbnailShowLabels) {
targetProcessedTab.tabHeader.addEventListener("DOMAttrModified", targetProcessedTab.showcaseTabEventListener, false);
if (targetTabHeader.hasAttribute("busy")) {
targetProcessedTab.showcaseProgressListener.progressListener.isLoading = true;
updateLoadingState(targetProcessedTab);
}
canvasBox.showcaseLabel.setAttribute("value", targetTabHeader.label);
canvasBox.showcaseLabel.setAttribute("tooltiptext", targetTabHeader.label);
canvasBox.showcaseImageLabel.setAttribute("tooltiptext", targetTabHeader.label);
canvasBox.showcaseImageLabel.setAttribute("src", targetTabHeader.getAttribute("image"));
canvasBox.showcaseLabel.setAttribute("crop", targetTabHeader.getAttribute("crop"));
}
if (updateThumbnailWhenScroll) {
targetProcessedTab.targetTab.addEventListener("scroll", targetProcessedTab.showcaseTabEventListener, true);
}
targetProcessedTab.targetTabWindow = tabwindow;
return canvasBox;
}
function showcaseSelectedWindow() {
if (closingShowcase) {
return;
}
// Set new target
if (selectedTabs.length > 0) {
localTargetWindow = selectedTabs[0].targetTabWindow.targetWindow;
} else {
localTargetWindow = window.showcasePopupTab.targetTabWindow.targetWindow;
}
// Unlink showcase
unlinkShowcase(CACHEMODE_UPDATE);
// Reset showcase sidebar title
showcaseOriginalTitle = null;
// Set new mode
globalMode = false;
// Startup...
contentStartup(false);
}
function refreshScreen() {
if (closingShowcase) {
return;
}
// Unlink showcase
unlinkShowcase(CACHEMODE_CLEAR);
// Reset window color
windowCurrentColor = 1;
// Reset status bar
if (scrollActivated) {
showcaseContentVertical.removeAttribute("scrolling");
scrollActivated = false;
}
// Reset margins
thumbnailBorderWidth = -1;
thumbnailBorderHeight = -1;
// Reload contextual settings
loadedContextualSettings = false;
// Reload settings
loadSettings();
initShowcase();
// Startup...
contentStartup(false);
}
function refreshContent() {
if (searchActive) {
updateFind();
} else if (showOnlyCurrent) {
updateShowOnlyCurrent();
}
// Extend showcase box
var innerBox = document.getElementById("showcase-content-horizontal");
// Mosaic code
if ((innerBox.boxObject.width > 100) && (innerBox.boxObject.height > 100)) {
mosaicWidth = innerBox.boxObject.width;
mosaicHeight = innerBox.boxObject.height;
} else if ((showcaseBox.boxObject.width > 100) && (showcaseBox.boxObject.height > 100)){
mosaicWidth = showcaseBox.boxObject.width;
mosaicHeight = showcaseBox.boxObject.height;
} else {
if (innerBox.boxObject.width > 100) {
mosaicWidth = innerBox.boxObject.width;
} else {
mosaicWidth = 100;
}
if (innerBox.boxObject.height > 100) {
mosaicHeight = innerBox.boxObject.height;
} else {
mosaicHeight = 100;
}
}
if (!inZoomMode) {
var mosaicSizeResult = mosaicCalculateBestGrid(mosaicWidth, mosaicHeight);
mosaicRows = mosaicSizeResult[0];
mosaicColumns = mosaicSizeResult[1];
thumbWidth = Math.ceil(mosaicWidth / mosaicColumns);
thumbHeight = Math.ceil(mosaicHeight / mosaicRows);
if (scrollType == SCROLL_VERTICAL) {
var estimatedThumbWidth = (thumbHeight - thumbnailBorderHeight) * mosaicSizeResult[2] / mosaicSizeResult[3];
if (estimatedThumbWidth > (thumbWidth - thumbnailBorderWidth)) {
estimatedThumbWidth = thumbWidth - thumbnailBorderWidth;
}
if ((estimatedThumbWidth < thumbnailPreferredMinimumSize) || alwaysShowScrollbar) {
// Adjust width
var newMosaicWidth = mosaicWidth;
if (newMosaicWidth > verticalScrollbarWidth) {
newMosaicWidth -= verticalScrollbarWidth;
}
var newMosaicColumns = Math.floor(newMosaicWidth / thumbnailPreferredMinimumSize);
if (newMosaicColumns > mosaicSizeResult[4]) {
newMosaicColumns = mosaicSizeResult[4];
}
if (newMosaicColumns <= 0) {
newMosaicColumns = 1;
}
var newMosaicRows = Math.floor(mosaicSizeResult[4] / newMosaicColumns);
if ((mosaicSizeResult[4] % newMosaicColumns) > 0) {
newMosaicRows++;
}
newThumbWidth = Math.ceil(newMosaicWidth / newMosaicColumns);
newThumbHeight = Math.ceil((newThumbWidth - thumbnailBorderWidth) * mosaicSizeResult[3] / mosaicSizeResult[2]) + thumbnailBorderHeight;
/*
var newMosaicHeight = thumbHeight * mosaicRows;
if (newMosaicHeight > mosaicHeight) {
mosaicHeight = newMosaicHeight;
} else {
thumbHeight = Math.ceil(mosaicHeight / mosaicRows);
}
*/
var newMosaicHeight = mosaicHeight;
if (newMosaicRows > 0)
newMosaicHeight = newThumbHeight * newMosaicRows;
if (((newThumbWidth - thumbnailBorderWidth) > estimatedThumbWidth) || alwaysShowScrollbar) {
thumbWidth = newThumbWidth;
thumbHeight = newThumbHeight;
mosaicRows = newMosaicRows;
mosaicColumns = newMosaicColumns;
mosaicWidth = newMosaicWidth;
mosaicHeight = newMosaicHeight;
// Activate scrolling
if (!scrollActivated) {
scrollActivated = true;
showcaseContentVertical.setAttribute("scrolling", "vertical");
}
} else if (scrollActivated) {
scrollActivated = false;
showcaseContentVertical.removeAttribute("scrolling");
}
} else if (scrollActivated) {
scrollActivated = false;
showcaseContentVertical.removeAttribute("scrolling");
}
} else if (scrollType == SCROLL_HORIZONTAL) {
var estimatedThumbHeight = (thumbWidth - thumbnailBorderWidth) * mosaicSizeResult[3] / mosaicSizeResult[2];
if (estimatedThumbHeight > (thumbHeight - thumbnailBorderHeight)) {
estimatedThumbHeight = thumbHeight - thumbnailBorderHeight;
}
if ((estimatedThumbHeight < thumbnailPreferredMinimumSize) || alwaysShowScrollbar) {
// Activate scrolling
if (!scrollActivated) {
scrollActivated = true;
showcaseContentVertical.setAttribute("scrolling", "horizontal");
}
// Adjust width
var newMosaicHeight = mosaicHeight;
if (newMosaicHeight > horizontalScrollbarHeight) {
newMosaicHeight -= horizontalScrollbarHeight;
}
var newMosaicRows = Math.floor(newMosaicHeight / thumbnailPreferredMinimumSize);
if (newMosaicRows > mosaicSizeResult[4]) {
newMosaicRows = mosaicSizeResult[4];
}
if (newMosaicRows <= 0) {
newMosaicRows = 1;
}
var newMosaicColumns = Math.floor(mosaicSizeResult[4] / newMosaicRows);
if ((mosaicSizeResult[4] % newMosaicRows) > 0) {
newMosaicColumns++;
}
var newThumbHeight = Math.ceil(newMosaicHeight / newMosaicRows);
var newThumbWidth = Math.ceil((newThumbHeight - thumbnailBorderHeight) * mosaicSizeResult[2] / mosaicSizeResult[3]) + thumbnailBorderWidth;
/*
var newMosaicWidth = thumbWidth * mosaicColumns;
if (newMosaicWidth > mosaicWidth) {
mosaicWidth = newMosaicWidth;
} else {
thumbWidth = Math.ceil(mosaicWidth / mosaicColumns);
}
*/
var newMosaicWidth = mosaicWidth;
if (newMosaicColumns > 0)
newMosaicWidth = newThumbWidth * newMosaicColumns;
if (((newThumbHeight - thumbnailBorderHeight) > estimatedThumbHeight) || alwaysShowScrollbar) {
thumbWidth = newThumbWidth;
thumbHeight = newThumbHeight;
mosaicRows = newMosaicRows;
mosaicColumns = newMosaicColumns;
mosaicWidth = newMosaicWidth;
mosaicHeight = newMosaicHeight;
// Activate scrolling
if (!scrollActivated) {
scrollActivated = true;
showcaseContentVertical.setAttribute("scrolling", "horizontal");
}
} else if (scrollActivated) {
scrollActivated = false;
showcaseContentVertical.removeAttribute("scrolling");
}
} else if (scrollActivated) {
scrollActivated = false;
showcaseContentVertical.removeAttribute("scrolling");
}
}
} else {
if (scrollActivated) {
showcaseContentVertical.removeAttribute("scrolling");
scrollActivated = false;
}
// In zoom mode, set a bit of margin to avoid errors...
thumbWidth = mosaicWidth;
thumbHeight = mosaicHeight;
}
setSize(showcaseBox, mosaicWidth, mosaicHeight);
updateThumbnails(thumbWidth, thumbHeight, thumbnailIdleSizeFactor / 100, thumbnailActiveSizeFactor / 100);
mosaicRefresh();
if (currentIconsThumbnail) {
if (inZoomMode || (currentIconsThumbnail.hidden)) {
hideThumbnailIcons();
} else {
showThumbnailIcons();
}
}
}
function zoomIn() {
if (inZoomMode) return;
if ((scrollType == SCROLL_VERTICAL) && (mosaicColumns > 1)) {
if (!scrollActivated) mosaicWidth -= verticalScrollbarWidth;
thumbnailPreferredMinimumSize = Math.floor(mosaicWidth / (mosaicColumns - 1));
refreshContent();
} else if ((scrollType == SCROLL_HORIZONTAL) && (mosaicRows > 1)) {
if (!scrollActivated) mosaicHeight -= horizontalScrollbarHeight;
thumbnailPreferredMinimumSize = Math.floor(mosaicHeight / (mosaicRows - 1));
refreshContent();
}
}
function zoomOut() {
if (inZoomMode) return;
if ((scrollType == SCROLL_VERTICAL) && (thumbnailPreferredMinimumSize > 10)) {
if (!scrollActivated) mosaicWidth -= verticalScrollbarWidth;
thumbnailPreferredMinimumSize = Math.floor(mosaicWidth / (mosaicColumns + 1));
if (thumbnailPreferredMinimumSize < 10) thumbnailPreferredMinimumSize = 10;
refreshContent();
} else if ((scrollType == SCROLL_HORIZONTAL) && (thumbnailPreferredMinimumSize > 10)) {
if (!scrollActivated) mosaicHeight -= horizontalScrollbarHeight;
thumbnailPreferredMinimumSize = Math.floor(mosaicHeight / (mosaicRows + 1));
if (thumbnailPreferredMinimumSize < 10) thumbnailPreferredMinimumSize = 10;
refreshContent();
}
}
function sizeChanged(el) {
refreshContent();
}
function handleMouseWheel(el) {
if (el.ctrlKey || el.shiftKey || el.altKey || el.metaKey) {
var actualNode = el.originalTarget;
while (actualNode != showcaseContentVertical && !actualNode.showcaseTab && actualNode.parentNode) {
actualNode = actualNode.parentNode;
}
if (actualNode.showcaseTab) {
if (el.detail == -32768) {
actualNode.showcaseTab.targetTab.contentDocument.defaultView.scrollBy(-zoomScrollIncrement, 0);
} else if (el.detail == 32768) {
actualNode.showcaseTab.targetTab.contentDocument.defaultView.scrollBy(zoomScrollIncrement, 0);
} else {
actualNode.showcaseTab.targetTab.contentDocument.defaultView.scrollByLines(el.detail*3);
}
}
} else if (scrollActivated) {
// Control regular scroll
var targetThumbnail;
var scrollX = {};
var scrollY = {};
scrollBoxObject.getPosition(scrollX,scrollY);
var linesToScroll = el.detail / 3;
if (scrollType == SCROLL_VERTICAL) {
var targetRow;
var nextTargetRow;
if (linesToScroll > 0) {
targetRow = Math.floor((scrollY.value + scrollBoxObject.height) * mosaicRows / mosaicHeight);
if (targetRow > mosaicRows) targetRow = mosaicRows;
nextTargetRow = targetRow + 1;
if (nextTargetRow > mosaicRows) nextTargetRow = -1;
} else {
targetRow = Math.floor(scrollY.value * mosaicRows / mosaicHeight);
if (targetRow < 0) targetRow = 0;
nextTargetRow = targetRow - 1;
if (nextTargetRow < 0) nextTargetRow = -1;
}
targetThumbnail = getTabAt(targetRow, 0);
if (isThumbnailVisible(targetThumbnail.showcaseCanvasBox) && (nextTargetRow != -1)) {
targetThumbnail = getTabAt(nextTargetRow, 0);
}
} else if (scrollType == SCROLL_HORIZONTAL) {
var targetColumn;
var nextTargetColumn;
if (linesToScroll > 0) {
targetColumn = Math.floor((scrollX.value + scrollBoxObject.width) * mosaicColumns / mosaicWidth);
if (targetColumn > mosaicColumns) targetColumn = mosaicColumns;
nextTargetRow = targetRow + 1;
if (nextTargetColumn > mosaicColumns) nextTargetColumn = -1;
} else {
targetColumn = Math.floor(scrollX.value * mosaicColumns / mosaicWidth);
if (targetColumn < 0) targetColumn = 0;
nextTargetColumn = targetColumn - 1;
if (nextTargetColumn < 0) nextTargetColumn = -1;
}
targetThumbnail = getTabAt(0, targetColumn);
if (isThumbnailVisible(targetThumbnail.showcaseCanvasBox) && (nextTargetColumn != -1)) {
targetThumbnail = getTabAt(0, nextTargetColumn);
}
}
ensureThumbnailIsVisible(targetThumbnail.showcaseCanvasBox);
}
el.preventDefault();
el.stopPropagation();
}
function hiddenTabPopup(ep) {
var tabMenu = document.getElementById("tabMenu");
for (var i = 0; i < tabMenu.childNodes.length; i++) {
tabMenu.childNodes[i].setAttribute("hidden", true);
}
}
function showingTabPopup(ep) {
if (rightClickAction != 4) {
ep.preventDefault();
return;
}
var lastSeparator = null;
if (selectedTabs.length < 1) {
if (document.popupNode.showcaseCanvasBox) {
showcasePopupTab = document.popupNode.showcaseCanvasBox.showcaseTab;
} else {
showcasePopupTab = document.popupNode.showcaseTab;
}
} else {
showcasePopupTab = selectedTabs[0];
}
if (!loadedContextualSettings) {
loadContextualSettings();
}
// "Open" action
var showMainSeparator = false;
if (contextualActionOpen && (selectedTabs.length < 2)) {
document.getElementById("context-opentab").setAttribute("hidden", false);
showMainSeparator = true;
}
if (contextualActionShowcaseThis && globalMode && (selectedTabs.length < 2)) {
document.getElementById("showcaseMenuItem").setAttribute("hidden", false);
/*
if (processedWindows.length < 2) {
document.getElementById("cmd_showcasethis").setAttribute("disabled", true);
} else {
document.getElementById("cmd_showcasethis").setAttribute("disabled", false);
}
*/
showMainSeparator = true;
}
if (showMainSeparator) {
lastSeparator = document.getElementById("openTabSeparator");
lastSeparator.setAttribute("hidden", false);
}
// Navigation actions
var showNavigationSeparator = false;
if (selectedTabs.length < 2) {
if (contextualActionBack) {
document.getElementById("context-back").setAttribute("hidden", false);
var backCommand = document.getElementById("Browser:Back");
var backDisabled = backCommand.hasAttribute("disabled");
if (backDisabled == showcasePopupTab.targetTab.canGoBack) {
if (backDisabled)
backCommand.removeAttribute("disabled");
else
backCommand.setAttribute("disabled", true);
}
showNavigationSeparator = true;
}
if (contextualActionForward) {
document.getElementById("context-forward").setAttribute("hidden", false);
var forwardCommand = document.getElementById("Browser:Forward");
var forwardDisabled = forwardCommand.hasAttribute("disabled");
if (forwardDisabled == showcasePopupTab.targetTab.canGoForward) {
if (forwardDisabled)
forwardCommand.removeAttribute("disabled");
else
forwardCommand.setAttribute("disabled", true);
}
showNavigationSeparator = true;
}
if (contextualActionReload) {
document.getElementById("context-reload").setAttribute("hidden", false);
var reloadCommand = document.getElementById("Browser:Reload");
var location;
if (showcasePopupTab.targetTab.currentURI) {
location = showcasePopupTab.targetTab.currentURI.spec;
} else {
location = "about:blank";
}
if (location == "about:blank" || location == "") {
reloadCommand.setAttribute("disabled", true);
} else {
reloadCommand.removeAttribute("disabled");
}
showNavigationSeparator = true;
}
if (contextualActionStop) {
document.getElementById("context-stop").setAttribute("hidden", false);
var stopCommand = document.getElementById("Browser:Stop");
if (showcasePopupTab.showcaseProgressListener.progressListener.isLoading) {
stopCommand.removeAttribute("disabled");
} else {
stopCommand.setAttribute("disabled", true);
}
showNavigationSeparator = true;
}
} else {
if (contextualActionReload) {
document.getElementById("context-reload").setAttribute("hidden", false);
var activeReload = false;
for (var c=0; (c 1) {
if (contextualActionDuplicateSelected) {
document.getElementById("duplicateSelected").setAttribute("hidden", false);
showToolsSeparator = true;
}
if (contextualActionMergeSelected) {
document.getElementById("mergeSelected").setAttribute("hidden", false);
showToolsSeparator = true;
}
if (contextualActionBookmarkSelected) {
document.getElementById("bookmarkSelectedTabs").setAttribute("hidden", false);
showToolsSeparator = true;
}
} else {
if (contextualActionBookmarkPage) {
document.getElementById("context-bookmarkpage").setAttribute("hidden", false);
showToolsSeparator = true;
}
if (contextualActionSavePage) {
document.getElementById("context-savepage").setAttribute("hidden", false);
showToolsSeparator = true;
}
if (contextualActionSendPage) {
document.getElementById("context-sendpage").setAttribute("hidden", false);
showToolsSeparator = true;
}
if (contextualActionPrint) {
document.getElementById("print").setAttribute("hidden", false);
showToolsSeparator = true;
}
if (contextualActionViewSource) {
document.getElementById("viewSource").setAttribute("hidden", false);
showToolsSeparator = true;
}
if (contextualActionPageInfo) {
document.getElementById("pageInfo").setAttribute("hidden", false);
showToolsSeparator = true;
}
if (contextualActionDuplicateTab) {
document.getElementById("duplicateTab").setAttribute("hidden", false);
showToolsSeparator = true;
}
if (contextualActionMoveTab) {
document.getElementById("moveTab").setAttribute("hidden", false);
showToolsSeparator = true;
}
}
if (showToolsSeparator) {
lastSeparator = document.getElementById("toolsSeparator");
lastSeparator.setAttribute("hidden", false);
}
// Close actions
var hideLastSeparator = true;
if (selectedTabs.length < 2) {
var found = false;
var targetWindow;
for (var c=0; ((c -1) {
targetWindow = processedWindows[c];
found = true;
}
}
if (found) {
// Modify popup options depending of item
var tabbrowser = targetWindow.targetWindow.getBrowser();
if (tabbrowser.mTabContainer.childNodes.length > 1) {
// Hide popupclose, show popupclosetab and popupclosewindow
if (contextualActionCloseTab) {
document.getElementById("popupCloseTab").setAttribute("hidden", false);
hideLastSeparator = false;
}
if (contextualActionCloseWindow) {
document.getElementById("popupCloseWindow").setAttribute("hidden", false);
hideLastSeparator = false;
}
} else {
if (contextualActionCloseWindow && closeLastTabKeepOpen) {
document.getElementById("popupCloseWindow").setAttribute("hidden", false);
hideLastSeparator = false;
}
// show popupclose
if (contextualActionClose) {
document.getElementById("popupClose").setAttribute("hidden", false);
hideLastSeparator = false;
}
}
} else {
// Show simple close option
if (contextualActionCloseTab) {
document.getElementById("popupCloseTab").setAttribute("hidden", false);
hideLastSeparator = false;
}
if (contextualActionCloseWindow) {
document.getElementById("popupCloseWindow").setAttribute("hidden", false);
hideLastSeparator = false;
}
}
} else {
if (contextualActionClose) {
document.getElementById("popupClose").setAttribute("hidden", false);
hideLastSeparator = false;
}
}
if (contextualActionCloseOther) {
document.getElementById("popupCloseOther").setAttribute("hidden", false);
hideLastSeparator = false;
}
if (hideLastSeparator && lastSeparator) {
lastSeparator.setAttribute("hidden", true);
}
}
function enterZoomMode(targetTab) {
if (inZoomMode) {
return;
}
inZoomMode = true;
zoomTargetThumbnail = targetTab;
if (!zoomFitsScreen) {
// Reset canvas!
zoomTargetThumbnail.showcaseCanvas.showcasePainted = false;
}
zoomTargetPreviousCursorStyle = zoomTargetThumbnail.showcaseCanvas.style.cursor;
zoomTargetThumbnail.showcaseCanvas.style.cursor = "-moz-zoom-in";
zoomOffsetX = 0;
zoomOffsetY = 0;
// Move it a bit...
zoomTargetThumbnail.showcaseCanvasBox.setAttribute("top", zoomTargetThumbnail.showcaseCanvasBox.getAttribute("top") - 1);
zoomTargetThumbnail.showcaseCanvasBox.setAttribute("left", zoomTargetThumbnail.showcaseCanvasBox.getAttribute("left") - 1);
// Make other thumbnails invisible
for (var i = 0; i < processedWindows.length; i++) {
var targetWindow = processedWindows[i];
for (var j = 0; j 0) || (!zoomFitsScreen && (zoomOffsetY > 0))) {
zoomCursorUp.removeAttribute("hidden");
} else {
zoomCursorUp.setAttribute("hidden", true);
zoomScrollingUp = false;
}
if ((targetView.scrollY < targetView.scrollMaxY) || (!zoomFitsScreen && (zoomOffsetY < (zoomTotalHeight - zoomCurrentHeight)))) {
zoomCursorDown.removeAttribute("hidden");
} else {
zoomCursorDown.setAttribute("hidden", true);
zoomScrollingDown = false;
}
if ((targetView.scrollX > 0) || (!zoomFitsScreen && (zoomOffsetX > 0))) {
zoomCursorLeft.removeAttribute("hidden");
} else {
zoomCursorLeft.setAttribute("hidden", true);
zoomScrollingLeft = false;
}
if ((targetView.scrollX < targetView.scrollMaxX) || (!zoomFitsScreen && (zoomOffsetX < (zoomTotalWidth - zoomCurrentWidth)))) {
zoomCursorRight.removeAttribute("hidden");
} else {
zoomCursorRight.setAttribute("hidden", true);
zoomScrollingRight = false;
}
}
} else {
zoomCursorUp.setAttribute("hidden", true);
zoomCursorDown.setAttribute("hidden", true);
zoomCursorLeft.setAttribute("hidden", true);
zoomCursorRight.setAttribute("hidden", true);
zoomScrollingUp = false;
zoomScrollingDown = false;
zoomScrollingLeft = false;
zoomScrollingRight = false;
}
}
function doZoomScrollUp() {
if (inZoomMode && zoomScrollingUp) {
zoomPanUp(zoomScrollIncrement);
setTimeout(function foo(a) { a.doZoomScrollUp() }, 20, this);
}
}
function doZoomScrollDown() {
if (inZoomMode && zoomScrollingDown) {
zoomPanDown(zoomScrollIncrement);
setTimeout(function foo(a) { a.doZoomScrollDown() }, 20, this);
}
}
function doZoomScrollLeft() {
if (inZoomMode && zoomScrollingLeft) {
zoomPanLeft(zoomScrollIncrement);
setTimeout(function foo(a) { a.doZoomScrollLeft() }, 20, this);
}
}
function doZoomScrollRight() {
if (inZoomMode && zoomScrollingRight) {
zoomPanRight(zoomScrollIncrement);
setTimeout(function foo(a) { a.doZoomScrollRight() }, 20, this);
}
}
function zoomPanLeft(increment) {
if (!zoomFitsScreen && (zoomOffsetX > 0)) {
zoomOffsetX -= increment;
if ((zoomOffsetX < 0) && (zoomTargetThumbnail.targetTab.contentWindow.scrollX > 0)) {
increment = -zoomOffsetX;
zoomOffsetX = 0;
} else {
increment = 0;
// Refresh thumbnail
zoomTargetThumbnail.showcaseCanvas.showcasePainted = false;
setTimeout(function foo(a) { paintThumbnail(a); checkScrollCursorsVisibility(); }, 0, zoomTargetThumbnail);
}
}
if (increment != 0) {
zoomTargetThumbnail.targetTab.contentWindow.scrollBy(-increment, 0);
}
}
function zoomPanRight(increment) {
if (!zoomFitsScreen && (zoomOffsetX < (zoomTotalWidth - zoomCurrentWidth))) {
zoomOffsetX += increment;
if ((zoomOffsetX > (zoomTotalWidth - zoomCurrentWidth)) && (zoomTargetThumbnail.targetTab.contentWindow.scrollX < zoomTargetThumbnail.targetTab.contentWindow.scrollMaxX)) {
increment = zoomOffsetX - (zoomTotalWidth - zoomCurrentWidth);
zoomOffsetX = (zoomTotalWidth - zoomCurrentWidth);
} else {
increment = 0;
// Refresh thumbnail
zoomTargetThumbnail.showcaseCanvas.showcasePainted = false;
setTimeout(function foo(a) { paintThumbnail(a); checkScrollCursorsVisibility(); }, 0, zoomTargetThumbnail);
}
}
if (increment != 0) {
zoomTargetThumbnail.targetTab.contentWindow.scrollBy(increment, 0);
}
}
function zoomPanUp(increment) {
if (!zoomFitsScreen && (zoomOffsetY > 0)) {
zoomOffsetY -= increment;
if ((zoomOffsetY < 0) && (zoomTargetThumbnail.targetTab.contentWindow.scrollY > 0)) {
increment = -zoomOffsetY;
zoomOffsetY = 0;
} else {
increment = 0;
// Refresh thumbnail
zoomTargetThumbnail.showcaseCanvas.showcasePainted = false;
setTimeout(function foo(a) { paintThumbnail(a); checkScrollCursorsVisibility(); }, 0, zoomTargetThumbnail);
}
}
if (increment != 0) {
zoomTargetThumbnail.targetTab.contentWindow.scrollBy(0, -increment);
}
}
function zoomPanDown(increment) {
if (!zoomFitsScreen && (zoomOffsetY < (zoomTotalHeight - zoomCurrentHeight))) {
zoomOffsetY += increment;
if ((zoomOffsetY < (zoomTotalHeight - zoomCurrentHeight)) && (zoomTargetThumbnail.targetTab.contentWindow.scrollY < zoomTargetThumbnail.targetTab.contentWindow.scrollMaxY)) {
increment = zoomOffsetY - (zoomTotalHeight - zoomCurrentHeight);
zoomOffsetY = zoomTotalHeight - zoomCurrentHeight;
} else {
increment = 0;
// Refresh thumbnail
zoomTargetThumbnail.showcaseCanvas.showcasePainted = false;
setTimeout(function foo(a) { paintThumbnail(a); checkScrollCursorsVisibility(); }, 0, zoomTargetThumbnail);
}
}
if (increment != 0) {
zoomTargetThumbnail.targetTab.contentWindow.scrollBy(0, increment);
}
}
function thumbnailFocus(el) {
if (currentCursor != el.target.showcaseTab) {
processFocusedTab(el.target.showcaseTab);
// Ensure it's visible
ensureThumbnailIsVisible(el.target);
}
}
function ensureThumbnailIsVisible(targetThumbnail) {
if (scrollBoxObject) {
var targetBoxObject = targetThumbnail.boxObject;
var scrollX = {};
var scrollY = {};
scrollBoxObject.getPosition(scrollX,scrollY);
var newX = scrollX.value;
var newY = scrollY.value;
var boxX = parseInt(targetThumbnail.getAttribute("left"));
var boxY = parseInt(targetThumbnail.getAttribute("top"));
if ((boxX + targetBoxObject.width - scrollX.value - scrollBoxObject.width) > 0) {
newX = targetBoxObject.width + boxX - scrollBoxObject.width;
}
if ((boxY + targetBoxObject.height - scrollY.value - scrollBoxObject.height) > 0) {
newY = targetBoxObject.height + boxY - scrollBoxObject.height;
}
if ((boxX - scrollX.value) < 0) {
newX = boxX - 1;
}
if ((boxY - scrollY.value) < 0) {
newY = boxY - 1;
}
if ((newX != scrollX.value) || (newY != scrollY.value))
scrollBoxObject.scrollTo(newX, newY);
}
}
function isThumbnailVisible(targetThumbnail) {
if (scrollBoxObject) {
var targetBoxObject = targetThumbnail.boxObject;
var scrollX = {};
var scrollY = {};
scrollBoxObject.getPosition(scrollX,scrollY);
var newX = scrollX.value;
var newY = scrollY.value;
var boxX = parseInt(targetThumbnail.getAttribute("left"));
var boxY = parseInt(targetThumbnail.getAttribute("top"));
if ((boxX + targetBoxObject.width - scrollX.value - scrollBoxObject.width) > 0) {
return false;
}
if ((boxY + targetBoxObject.height - scrollY.value - scrollBoxObject.height) > 0) {
return false;
}
if ((boxX - scrollX.value) < 0) {
return false;
}
if ((boxY - scrollY.value) < 0) {
return false;
}
}
return true;
}
function ensureSelectedThumbnailVisible(targetProcessedWindow) {
// Get selected tab
var tabbrowser = targetProcessedWindow.targetWindow.getBrowser();
var tabs = tabbrowser.mTabContainer.childNodes;
var selectedTab = tabbrowser.getBrowserForTab(tabs[tabbrowser.mTabContainer.selectedIndex]);
var found = false;
// Iterate array
for (var c=0; ((c -1) {
removeFromSelection(targetProcessedTab);
} else {
addToSelection(targetProcessedTab);
}
}
function removeFromSelection(targetProcessedTab) {
var targetIndex = selectedTabs.indexOf(targetProcessedTab);
if (targetIndex > -1) {
targetProcessedTab.showcaseCanvasBox.removeAttribute("selected");
removeElementAt(selectedTabs, targetIndex);
}
}
function addToSelection(targetProcessedTab) {
if (selectedTabs.indexOf(targetProcessedTab) < 0) {
selectedTabs.push(targetProcessedTab);
targetProcessedTab.showcaseCanvasBox.setAttribute("selected", "true");
}
}
function removeAllSelections() {
while (selectedTabs.length > 0) {
var currentTab = selectedTabs.shift();
currentTab.showcaseCanvasBox.removeAttribute("selected");
}
}
function selectAll() {
removeAllSelections();
for (var c=0; c 0) {
if (selectTimer == null) {
selectTimer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer);
}
selectTimer.cancel();
selectTimerTarget = targetBox;
var selectTimerNotifier = {
QueryInterface : function (aIID) {
if (aIID.equals(Components.interfaces.nsITimerCallback) ||
aIID.equals(Components.interfaces.nsISupports) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference))
return this;
throw Components.results.NS_NOINTERFACE;
},
notify: function(timer) {
if (selectTimerTarget && !selectTimerTarget.hasAttribute("selectedtab")) {
openTab(selectTimerTarget.showcaseTab);
}
}
};
selectTimer.initWithCallback(selectTimerNotifier, selectWhenMouseOverDelay, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
} else {
if (!targetBox.hasAttribute("selectedtab")) {
openTab(targetBox.showcaseTab);
}
}
}
}
}
function mouseOutCanvas(el) {
var hasExited = true;
var currentNode = el.relatedTarget;
lastMouseDownTab = null;
if (currentNode) {
while (hasExited && currentNode.parentNode) {
hasExited = ((el.currentTarget != currentNode.parentNode) && (!currentNode.hasAttribute("class") || currentNode.getAttribute("class") != "thumb-icon"));
currentNode = currentNode.parentNode;
}
}
if (hasExited) {
if (currentIconsThumbnail == el.currentTarget) {
hideThumbnailIcons();
currentIconsThumbnail = null;
}
if (thumbnailActiveAnimation) {
animateBox(el.currentTarget, false);
}
if (selectTimer) {
selectTimer.cancel();
selectTimerTarget = null;
}
}
}
function mouseDownCanvas(el) {
// Zoom mode
var targetTab = el.currentTarget.showcaseTab;
lastMouseDownTab = targetTab;
if ((el.button == 2) && (rightClickAction == 4)) {
focusSelectIfUnselected = true;
} else if (el.ctrlKey || el.shiftKey) {
if (el.ctrlKey) {
focusIgnoreSelection = true;
} else { // if (el.shiftKey) {
focusSelectRange = true;
}
} else if ((el.button >= 0) && (el.button <= 2)) {
var clickAction;
if (el.button == 0) {
clickAction = leftClickAction;
} else if (el.button == 1) {
clickAction = middleClickAction;
} else { // if (el.button == 2) {
clickAction = rightClickAction;
}
if (clickAction == 1) {
focusIgnoreSelection = true;
enterZoomMode(targetTab);
if (topWindow != window) {
el.stopPropagation();
el.preventDefault();
}
} else {
if (selectedTabs.indexOf(targetTab) > -1) {
focusIgnoreSelection = true;
}
if (clickAction == 2) {
if (!selectWhenOpen) {
removeAllSelections();
focusIgnoreSelection = true;
}
if ((topWindow != window) && (el.button != 0)) {
el.stopPropagation();
el.preventDefault();
}
}
}
}
if ((targetTab) && (targetTab == currentCursor)) {
processFocusedTab(currentCursor);
}
}
function mouseDblClickWindow(el) {
if (el.originalTarget == showcaseBox) {
// If double clicking on box check the double click action
switch (doubleClickAction) {
case 0:
// select all thumbnails
selectAll();
break;
case 1:
// Open new tab
// TODO
break;
case 2:
// Close showcase
closeWindow();
break;
}
}
}
function mouseUpWindow(el) {
if (((el.button == 0) || (el.button == 1) || ((el.button == 2) && (rightClickAction != 4)) ) && !(el.ctrlKey || el.shiftKey)) {
var clickAction;
if (el.button == 0) {
clickAction = leftClickAction;
} else if (el.button == 1) {
clickAction = middleClickAction;
} else { // if (button == 2) {
clickAction = rightClickAction;
}
if (clickAction == 1) {
// Zoom mode
leaveZoomMode();
if (topWindow != window) {
el.stopPropagation();
}
}
}
}
function mouseUpCanvas(el) {
if (!selectionBox.hasAttribute("hidden")) {
return;
}
var targetProcessedTab = el.currentTarget.showcaseTab;
if (((el.button == 0) || (el.button == 1) || ((el.button == 2) && (rightClickAction != 4)) ) && !(el.ctrlKey || el.shiftKey) && (lastMouseDownTab == targetProcessedTab)) {
var clickAction;
if (el.target != targetProcessedTab.showcaseCanvasBox.showcaseCloseButton) {
if (el.button == 0) {
clickAction = leftClickAction;
} else if (el.button == 1) {
clickAction = middleClickAction;
} else { // if (el.button == 2) {
clickAction = rightClickAction;
}
if (clickAction == 1) {
// Zoom mode
leaveZoomMode();
} else if (!((el.button == 2) && (rightClickAction == 4))) {
switch (clickAction) {
case 0:
// Close
closeShowcaseTab(targetProcessedTab);
break;
case 2:
// Open
openTab(targetProcessedTab);
break;
case 3:
// Nothing
if ((el.button == 0) && ((selectedTabs.length > 1) || (selectedTabs[0] != targetProcessedTab))) {
removeAllSelections();
addToSelection(targetProcessedTab);
}
break;
}
}
}
} else if ((el.button == 0) && el.ctrlKey && (lastMouseDownTab == targetProcessedTab)) {
var targetProcessedTab = el.currentTarget.showcaseTab;
toggleSelection(targetProcessedTab);
}
lastMouseDownTab = null;
if (topWindow != window) {
el.preventDefault();
el.stopPropagation();
}
}
function mouseClickClose(el) {
if (el.button == 0) {
if (el.target.targetProcessedTab) {
closeShowcaseTab(el.target.targetProcessedTab);
}
}
}
function mouseDoubleClickCanvas(el) {
// As easy as opening the tab
if (el.currentTarget.showcaseTab) {
openTab(el.currentTarget.showcaseTab);
}
}
function openTab(targetProcessedTab) {
// Look for the tab that has the canvas
try {
var found = false;
var targetProcessedWindow;
var targetTabIndex;
var targetTabBrowser;
for (var i = 0; (i < processedWindows.length) && !found; i++) {
var currentWindow = processedWindows[i];
if (currentWindow.processedTabs.indexOf(targetProcessedTab) > -1) {
targetTabBrowser = currentWindow.targetWindow.getBrowser();
found = true;
targetProcessedWindow = currentWindow;
var foundTab = false;
for (var j = 0; (j 0) {
prefs.setIntPref("extensions.showcase.windowLastWidth", window.innerWidth);
}
if (window.innerHeight > 0) {
prefs.setIntPref("extensions.showcase.windowLastHeight", window.innerHeight);
}
var lastRelativeX = window.screenX - window.opener.screenX;
var lastRelativeY = window.screenY - window.opener.screenY;
prefs.setIntPref("extensions.showcase.windowLastRelativeX", lastRelativeX);
prefs.setIntPref("extensions.showcase.windowLastRelativeY", lastRelativeY);
} catch (ex) {
// We may have trouble in the case window is closed, so just fail silently
}
}
// Free resources
if (!closingShowcase) {
closingShowcase = true;
unlinkShowcase(CACHEMODE_UPDATE);
// Check synch find bar in tab mode
if (synchFindBar && (topWindow != window.top) && searchActive) {
if (topWindow.openFindBar) {
topWindow.openFindBar();
} else if (topWindow.gFindBar) {
topWindow.gFindBar.openFindBar();
}
}
// See if we've to toggle the find bar...
if (targetFocusWindow) {
try {
targetFocusWindow.focus();
} catch (e) {
showFocusAlert(targetFocusWindow);
}
}
}
}
function animateBox(targetElement, growBox) {
var targetBox;
if (targetElement.showcaseCanvas) {
targetBox = targetElement.showcaseCanvas.showcaseCanvasBox;
} else {
targetBox = targetElement.showcaseCanvasBox;
}
targetBox.showcaseGrowing = growBox;
if (currentAnimations.indexOf(targetBox) < 0) {
if (growBox) {
if (thumbnailActiveSizeFactor > 100) {
// Hack to bring it to the front
if (showcaseBox.childNodes[showcaseBox.childNodes.length - 2] != targetBox) {
targetBox.removeEventListener("mouseover", mouseOverCanvas, false);
targetBox.removeEventListener("mouseout", mouseOutCanvas, false);
targetBox.removeEventListener("focus", thumbnailFocus, false);
targetBox.removeEventListener("blur", thumbnailBlur, false);
if (targetBox.showcaseCloseButton) {
targetBox.showcaseCloseButton.removeEventListener("click", mouseClickClose, true);
}
targetBox.removeEventListener("mousedown", mouseDownCanvas, (topWindow != window));
targetBox.removeEventListener("mouseup", mouseUpCanvas, (topWindow != window));
if (doubleClickOpen) {
targetBox.removeEventListener("dblclick", mouseDoubleClickCanvas, (topWindow != window));
}
showcaseBox.removeChild(targetBox);
showcaseBox.insertBefore(targetBox, selectionBox);
targetBox.addEventListener("mouseover", mouseOverCanvas, false);
targetBox.addEventListener("mouseout", mouseOutCanvas, false);
targetBox.addEventListener("focus", thumbnailFocus, false);
targetBox.addEventListener("blur", thumbnailBlur, false);
if (targetBox.showcaseCloseButton) {
targetBox.showcaseCloseButton.addEventListener("click", mouseClickClose, true);
}
targetBox.addEventListener("mousedown", mouseDownCanvas, (topWindow != window));
targetBox.addEventListener("mouseup", mouseUpCanvas, (topWindow != window));
if (doubleClickOpen) {
targetBox.addEventListener("dblclick", mouseDoubleClickCanvas, (topWindow != window));
}
if (currentCursor == targetBox.showcaseTab) {
focusIgnoreSelection = true;
targetBox.focus();
}
}
}
targetBox.showcaseAnimationFrame = 0;
} else {
targetBox.showcaseAnimationFrame = animationFrames;
}
currentAnimations.push(targetBox);
}
}
function animationThread() {
var checkpointTime = new Date().getTime();
if (currentAnimations && (currentAnimations.length > 0)) {
var c = 0;
while (c < currentAnimations.length) {
var currentBox = currentAnimations[c];
var endAnimation = false;
if (!currentBox.showcaseIdleWidth || !currentBox.showcaseIdleHeight || !currentBox.showcaseActiveWidth ||!currentBox.showcaseActiveHeight) {
c++;
continue;
}
if (currentBox.showcaseGrowing) {
currentBox.showcaseAnimationFrame++;
if (currentBox.showcaseAnimationFrame >= animationFrames) {
currentBox.showcaseAnimationFrame = animationFrames;
endAnimation = true;
}
} else {
currentBox.showcaseAnimationFrame--;
if (currentBox.showcaseAnimationFrame <= 0) {
currentBox.showcaseAnimationFrame = 0;
endAnimation = true;
}
}
var newWidth = currentBox.showcaseIdleWidth + (currentBox.showcaseActiveWidth - currentBox.showcaseIdleWidth) * currentBox.showcaseAnimationFrame / animationFrames;
var newHeight = currentBox.showcaseIdleHeight + (currentBox.showcaseActiveHeight - currentBox.showcaseIdleHeight) * currentBox.showcaseAnimationFrame / animationFrames;
if (newWidth > showcaseBox.boxObject.width) {
// We're getting out of the limits!! Set maximum size that will fit the window...
newHeight = ((newHeight - thumbnailBorderHeight) * (showcaseBox.boxObject.width - thumbnailBorderWidth) / (newWidth - thumbnailBorderWidth)) + thumbnailBorderHeight;
newWidth = showcaseBox.boxObject.width;
}
if (newHeight > showcaseBox.boxObject.height) {
// We're getting out of the limits!! Set maximum size that will fit the window...
newWidth = ((newWidth - thumbnailBorderWidth) * (showcaseBox.boxObject.height - thumbnailBorderHeight) / (newHeight - thumbnailBorderHeight)) + thumbnailBorderWidth;
newHeight = showcaseBox.boxObject.height;
}
var newTop = currentBox.showcaseCenterY - newHeight / 2;
var newLeft = currentBox.showcaseCenterX - newWidth / 2;
var limitX = showcaseBox.boxObject.width - newWidth;
var limitY = showcaseBox.boxObject.height - newHeight;
if (newTop < 0) {
if ((currentBox.getAttribute("top") == 0) && !currentBox.showcaseGrowing) {
newTop = -1;
} else {
newTop = 0;
}
} else if (newTop > limitY) {
if ((currentBox.getAttribute("top") == limitY) && !currentBox.showcaseGrowing) {
newTop = limitY + 1;
} else {
newTop = limitY;
}
}
if (newLeft < 0) {
if ((currentBox.getAttribute("left") == 0) && !currentBox.showcaseGrowing) {
newLeft = -1;
} else {
newLeft = 0;
}
} else if (newLeft > limitX) {
if ((currentBox.getAttribute("left") == limitX) && !currentBox.showcaseGrowing) {
newLeft = limitX + 1;
} else {
newLeft = limitX;
}
}
currentBox.setAttribute("top", newTop);
currentBox.setAttribute("left", newLeft);
if (isNewLayout) {
setCanvasSize(currentBox.showcaseCanvas, (newWidth - thumbnailBorderWidth), (newHeight - thumbnailBorderHeight));
}
setSize(currentBox, newWidth, newHeight);
if (endAnimation) {
removeElementAt(currentAnimations, c);
// Check if is the end of a thumbnail growing
if (currentBox.showcaseGrowing) {
// Show thumbnail icons
setCurrentIconsThumbnail(currentBox);
if (currentBox.showcaseCanvas.showcasePainted) {
var showcaseCanvasScreenBox = document.getBoxObjectFor(currentBox.showcaseCanvas);
if ((showcaseCanvasScreenBox.width > currentBox.showcaseCanvas.width) || (showcaseCanvasScreenBox.height > currentBox.showcaseCanvas.height)) {
currentBox.showcaseCanvas.showcasePainted = false;
setTimeout(paintThumbnail, 0, currentBox.showcaseTab);
}
}
}
} else {
c++;
}
}
}
if (!closingShowcase && thumbnailActiveAnimation) {
var currentWaitTime = ANIMATION_INTERVAL - (new Date().getTime() - checkpointTime);
if (currentWaitTime < 0) {
currentWaitTime = 0;
}
setTimeout(animationThread, currentWaitTime);
}
}
function updateThumbnail(targetThumbnail, thumbWidth, thumbHeight, idleFactor, activeFactor) {
try {
var canvasActiveW, canvasActiveH;
var canvasIdleW, canvasIdleH;
var windowW, windowH;
var innerThumbWidth = thumbWidth - thumbnailBorderWidth;
var innerThumbHeight = thumbHeight - thumbnailBorderHeight;
if (targetThumbnail.showcaseImage) {
var img = targetThumbnail.targetTab.contentDocument.imageRequest.decoderObserver;
windowW = img.width;
windowH = img.height;
if ((windowW < 1) || (windowH < 1)) {
windowW = 100;
windowH = 100;
}
} else {
windowW = targetThumbnail.targetTab.contentWindow.innerWidth;
windowH = targetThumbnail.targetTab.contentWindow.innerHeight;
}
if (inZoomMode && !zoomFitsScreen) {
if (windowW < innerThumbWidth) {
canvasIdleW = windowW;
} else {
canvasIdleW = innerThumbWidth;
}
if (windowH < innerThumbHeight) {
canvasIdleH = windowH;
} else {
canvasIdleH = innerThumbHeight;
}
canvasActiveW = canvasIdleW;
canvasActiveH = canvasIdleH;
zoomCurrentWidth = canvasIdleW;
zoomCurrentHeight = canvasIdleH;
zoomTotalWidth = windowW;
zoomTotalHeight = windowH;
} else {
if ((innerThumbWidth * windowH / windowW) > innerThumbHeight) {
canvasIdleW = Math.ceil(innerThumbHeight * windowW * idleFactor / windowH);
canvasIdleH = Math.ceil(innerThumbHeight * idleFactor);
canvasActiveW = Math.ceil(innerThumbHeight * windowW * activeFactor / windowH);
canvasActiveH = Math.ceil(innerThumbHeight * activeFactor);
} else {
canvasIdleW = Math.ceil(innerThumbWidth * idleFactor);
canvasIdleH = Math.ceil(innerThumbWidth * windowH * idleFactor / windowW);
canvasActiveW = Math.ceil(innerThumbWidth * activeFactor);
canvasActiveH = Math.ceil(innerThumbWidth * windowH * activeFactor / windowW);
}
if (targetThumbnail.showcaseImage && !imageThumbnailUpscale) {
var img = targetThumbnail.targetTab.contentDocument.imageRequest.decoderObserver;
if ((img.width > 0) && (img.height > 0) && ((canvasIdleW > img.width) || (canvasIdleH > img.height))) {
canvasIdleW = img.width;
canvasIdleH = img.height;
canvasActiveW = canvasIdleW;
canvasActiveH = canvasIdleH;
}
}
}
targetThumbnail.showcaseCanvasBox.showcaseIdleWidth = canvasIdleW + thumbnailBorderWidth;
targetThumbnail.showcaseCanvasBox.showcaseIdleHeight = canvasIdleH + thumbnailBorderHeight;
targetThumbnail.showcaseCanvasBox.showcaseActiveWidth = canvasActiveW + thumbnailBorderWidth;
targetThumbnail.showcaseCanvasBox.showcaseActiveHeight = canvasActiveH + thumbnailBorderHeight;
if (isNewLayout) {
setCanvasSize(targetThumbnail.showcaseCanvas, (targetThumbnail.showcaseCanvasBox.showcaseIdleWidth - thumbnailBorderWidth), (targetThumbnail.showcaseCanvasBox.showcaseIdleHeight - thumbnailBorderHeight));
}
setSize(targetThumbnail.showcaseCanvasBox,
targetThumbnail.showcaseCanvasBox.showcaseIdleWidth,
targetThumbnail.showcaseCanvasBox.showcaseIdleHeight);
} catch (e) {
// Probably we failed because the thumbnail has disappeared, so fail silently
}
}
function updateThumbnails(thumbWidth, thumbHeight, idleFactor, activeFactor) {
var targetItem;
var pendingSelectedThumbnailIndex = 0;
if (inZoomMode) {
targetItem = zoomTargetThumbnail;
if ((targetItem) && (targetItem.showcaseCanvas) && (targetItem.showcaseCanvasBox)) {
try {
updateThumbnail(targetItem, thumbWidth, thumbHeight, 1, 1);
} catch (e) {
alert("updateThumbs1: " + e);
}
if (!targetItem.showcaseCanvasBox.hasAttribute("top")) {
targetItem.showcaseCanvasBox.setAttribute("top", 0);
targetItem.showcaseCanvasBox.setAttribute("left", 0);
}
var showcaseCanvasScreenBox = document.getBoxObjectFor(targetItem.showcaseCanvas);
if (!targetItem.showcaseCanvas.showcasePainted || (showcaseCanvasScreenBox.width > targetItem.showcaseCanvas.width) || (showcaseCanvasScreenBox.height > targetItem.showcaseCanvas.height)) {
// if (!targetItem.showcaseCanvas.showcasePainted || (targetItem.showcaseCanvasBox.showcaseIdleWidth > targetItem.showcaseCanvas.width) || (targetItem.showcaseCanvasBox.showcaseIdleHeight > targetItem.showcaseCanvas.height)) {
try {
createTooltip(targetItem);
} catch (e) {
// We can fail while creating the tooltip, since window
}
// We're gonna paint it, so set it to false
targetItem.showcaseCanvas.showcasePainted = false;
if (paintThumbnailsAfterLoading) {
// If it's a window's selected thumbnail, give it priority over the others
if (pendingThumbnails.indexOf(targetItem) < 0) {
pendingThumbnails.unshift(targetItem);
}
} else {
setTimeout(paintThumbnail, 0, targetItem);
}
}
}
} else {
for (var i = 0; i < processedWindows.length; i++) {
var targetWindow = processedWindows[i];
if (targetWindow.processedTabs) {
var tabbrowser = targetWindow.targetWindow.getBrowser();
var currentSelectedTab = tabbrowser.getBrowserForTab(tabbrowser.mCurrentTab);
for (var j = 0; j< targetWindow.processedTabs.length; j++) {
// Resize canvas and canvasBox
targetItem = targetWindow.processedTabs[j];
if ((targetItem) && (targetItem.showcaseCanvas) && (targetItem.showcaseCanvasBox)) {
try {
updateThumbnail(targetItem, thumbWidth, thumbHeight, idleFactor, activeFactor);
} catch (e) {
alert("updateThumbs1: " + e);
}
if (!targetItem.showcaseCanvasBox.hasAttribute("top")) {
targetItem.showcaseCanvasBox.setAttribute("top", 0);
targetItem.showcaseCanvasBox.setAttribute("left", 0);
}
var showcaseCanvasScreenBox = document.getBoxObjectFor(targetItem.showcaseCanvas);
if (!targetItem.showcaseCanvas.showcasePainted || (showcaseCanvasScreenBox.width > targetItem.showcaseCanvas.width) || (showcaseCanvasScreenBox.height > targetItem.showcaseCanvas.height) || (renderingType == 2)) {
// if (!targetItem.showcaseCanvas.showcasePainted || (targetItem.showcaseCanvasBox.showcaseIdleWidth > targetItem.showcaseCanvas.width) || (targetItem.showcaseCanvasBox.showcaseIdleHeight > targetItem.showcaseCanvas.height) || (renderingType == 2)) {
try {
createTooltip(targetItem);
} catch (e) {
// We can fail while creating the tooltip, since window
}
// We're gonna paint it, so set it to false
targetItem.showcaseCanvas.showcasePainted = false;
if (paintThumbnailsAfterLoading) {
// If it's a window's selected thumbnail, give it priority over the others
if (pendingThumbnails.indexOf(targetItem) < 0) {
if (paintSelectedTabsFirst && (targetItem.targetTab == currentSelectedTab)) {
insertElementAt(pendingThumbnails, targetItem, pendingSelectedThumbnailIndex);
pendingSelectedThumbnailIndex++;
} else {
pendingThumbnails.push(targetItem);
}
}
} else {
setTimeout(paintThumbnail, 0, targetItem);
}
}
}
}
}
}
}
if (paintThumbnailsAfterLoading && !paintThumbnailsThread) {
setTimeout(paintThumbnails, 0);
}
}
function paintThumbnails() {
if (pendingThumbnails.length > 0) {
paintThumbnailsThread = true;
var targetItem = pendingThumbnails.shift();
paintThumbnail(targetItem);
setTimeout(paintThumbnails, 0);
} else {
paintThumbnailsThread = false;
}
}
function paintThumbnail(targetThumbnail) {
try {
if (targetThumbnail.showcaseCanvasBox.hidden)
return;
if (targetThumbnail.showcaseCanvas && targetThumbnail.showcaseCanvas.showcasePainted)
return;
var currentWebBrowserPrint = targetThumbnail.targetTab.contentWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebBrowserPrint);
if (currentWebBrowserPrint.doingPrint || currentWebBrowserPrint.doingPrintPreview) return;
var ctx = targetThumbnail.showcaseCanvas.getContext("2d");
var showcaseCanvasBox = document.getBoxObjectFor(targetThumbnail.showcaseCanvas);
var targetWidth = showcaseCanvasBox.width;
var targetHeight = showcaseCanvasBox.height;
targetThumbnail.showcaseCanvas.width = targetWidth;
targetThumbnail.showcaseCanvas.height = targetHeight;
if (targetThumbnail.showcaseImage) {
var img = targetThumbnail.targetTab.contentDocument.imageRequest.decoderObserver;
ctx.drawImage(img, 0, 0, targetWidth, targetHeight);
} else if (!targetThumbnail.showcaseIETab && !targetThumbnail.showcaseBlank && !targetThumbnail.showcaseEmbedded) {
if (inZoomMode && !zoomFitsScreen) {
ctx.save();
ctx.drawWindow(targetThumbnail.targetTab.contentWindow,
targetThumbnail.targetTab.contentWindow.scrollX + zoomOffsetX,
targetThumbnail.targetTab.contentWindow.scrollY + zoomOffsetY,
zoomCurrentWidth,
zoomCurrentHeight,
"rgb(255,255,255)");
ctx.restore();
} else if (renderingType == 0) {
ctx.save();
ctx.scale(targetWidth/targetThumbnail.targetTab.contentWindow.innerWidth, targetHeight/targetThumbnail.targetTab.contentWindow.innerHeight);
ctx.drawWindow(targetThumbnail.targetTab.contentWindow,
targetThumbnail.targetTab.contentWindow.scrollX,
targetThumbnail.targetTab.contentWindow.scrollY,
targetThumbnail.targetTab.contentWindow.innerWidth,
targetThumbnail.targetTab.contentWindow.innerHeight,
"rgb(255,255,255)");
ctx.restore();
} else if (renderingType == 1) {
ctx.save();
ctx.scale(targetWidth/targetThumbnail.targetTab.contentWindow.innerWidth, targetHeight/targetThumbnail.targetTab.contentWindow.innerHeight);
// bug 313178: when painting thumbnails without scroll, there's an important bug
ctx.drawWindow(targetThumbnail.targetTab.contentWindow,
0,
0,
targetThumbnail.targetTab.contentWindow.innerWidth,
targetThumbnail.targetTab.contentWindow.innerHeight + targetThumbnail.targetTab.contentWindow.scrollMaxY,
"rgb(255,255,255)");
ctx.restore();
} else { // if (renderingType == 2) {
// bug 313178: when painting thumbnails without scroll, there's an important bug
ctx.drawWindow(targetThumbnail.targetTab.contentWindow,
0,
0,
targetWidth,
targetHeight + targetThumbnail.targetTab.contentWindow.scrollMaxY,
"rgb(255,255,255)");
}
} else {
ctx.clearRect(0, 0, targetWidth, targetHeight);
}
} catch (e) {
//Paint thumbnail failed, probably because the thumbnail disappeared. Fail silently.
}
// Mark it has been painted
if (targetThumbnail.showcaseCanvas) {
targetThumbnail.showcaseCanvas.showcasePainted = true;
// Painting is a slow process, so we check if thumbnail has changed size while we were painting
if ((targetWidth != showcaseCanvasBox.width) || (targetHeight != showcaseCanvasBox.height)) {
// repaint
setTimeout(paintThumbnail, 0, targetThumbnail);
}
}
}
function updateTitle() {
if (closingShowcase)
return;
if (!showcaseOriginalTitle) {
if (window != window.top) {
// Sidebar
if (globalMode) {
showcaseOriginalTitle = topWindow.document.getElementById(SHOWCASE_SIDEBAR).getAttribute('label');
} else {
showcaseOriginalTitle = topWindow.document.getElementById(SHOWCASETHISWINDOW_SIDEBAR).getAttribute('label');
}
} else {
showcaseOriginalTitle = document.title;
}
}
var finalTitle = showcaseOriginalTitle;
var currentTitle;
if (window != window.top) {
// Sidebar
if (topWindow.MultiSidebar) {
if (originalGlobalMode) {
currentTitle = topWindow.MultiSidebar.getSidebarTitle(SHOWCASE_SIDEBAR);
} else {
currentTitle = topWindow.MultiSidebar.getSidebarTitle(SHOWCASETHISWINDOW_SIDEBAR);
}
} else {
currentTitle = topWindow.document.getElementById('sidebar-title').getAttribute('value');
}
} else {
currentTitle = document.title;
}
if (showOnlyCurrent) {
if (!showOnlyCurrentLabel) {
var showcaseBundle = document.getElementById("bundle_showcase");
showOnlyCurrentLabel = showcaseBundle.getString("onlyCurrentTitle");
}
finalTitle += " " + showOnlyCurrentLabel;
}
if (showTitleStats) {
finalTitle += " [";
if (globalMode) {
if (processedWindows) {
var totalTabs = 0;
for (var c=0; c 0) && (processedWindows[0].processedTabs)) {
finalTitle += processedWindows[0].processedTabs.length;
} else {
finalTitle += "?";
}
}
finalTitle += "]";
}
if (currentTitle != finalTitle) {
if (window != window.top) {
// Sidebar
if (topWindow.MultiSidebar) {
if (originalGlobalMode) {
topWindow.MultiSidebar.setSidebarTitle(SHOWCASE_SIDEBAR, finalTitle);
} else {
topWindow.MultiSidebar.setSidebarTitle(SHOWCASETHISWINDOW_SIDEBAR, finalTitle);
}
} else {
topWindow.document.getElementById('sidebar-title').setAttribute('value', finalTitle);
}
} else {
document.title = finalTitle;
}
}
}
function createTooltip(targetItem) {
var targetTitle = targetItem.tabHeader.label;
var targetURL = "";
if (targetItem.targetTab.currentURI) {
if (targetItem.showcaseIETab) {
try {
targetURL = targetItem.targetTab.contentDocument.URL.substring(IETAB_URL.length);
} catch (stringException) {
targetURL = targetItem.targetTab.currentURI.spec;
}
} else {
targetURL = targetItem.targetTab.currentURI.spec;
}
}
if (targetURL == "") targetURL = "about:blank";
targetItem.showcaseCanvasSubBox.thumbnailTooltipTitle = targetTitle;
targetItem.showcaseCanvasSubBox.thumbnailTooltipURL = targetURL;
}
function showingThumbnailTooltip(event) {
event.stopPropagation();
var currentTitle = document.getElementById("thumbnailTooltipTitle");
var currentURL = document.getElementById("thumbnailTooltipURL");
var showTooltip = false;
var targetNode = document.tooltipNode;
if (targetNode.childNodes.length == 0) {
targetNode = targetNode.parentNode;
}
if (thumbnailTooltipTitle && targetNode.thumbnailTooltipTitle) {
currentTitle.removeAttribute("hidden");
currentTitle.value = targetNode.thumbnailTooltipTitle;
showTooltip = true;
} else {
currentTitle.setAttribute("hidden", true);
}
if (thumbnailTooltipURL && targetNode.thumbnailTooltipURL) {
currentURL.removeAttribute("hidden");
currentURL.value = targetNode.thumbnailTooltipURL;
showTooltip = true;
} else {
currentURL.setAttribute("hidden", true);
}
return showTooltip;
}
function mosaicRefresh() {
var thumbWidth = mosaicWidth / mosaicColumns;
var thumbHeight = mosaicHeight / mosaicRows;
var currentRow = 0;
var currentColumn = 0;
var c = 0;
if (inZoomMode) {
for (var i = 0; i < processedWindows.length; i++) {
var targetWindow = processedWindows[i];
for (var j = 0; j= mosaicColumns) {
currentColumn = 0;
currentRow++;
}
}
}
}
}
}
function mosaicCalculateBestGrid(width, height) {
var retValues = new Array(2);
var numberRows, numberColumns;
var currentWidth;
var numTabs = 0;
var maxTabWidth = -1;
var maxTabHeight = -1;
numberRows = 1;
var maxWidth;
for (var i=0; i maxTabWidth) {
maxTabWidth = targetWindow.showcaseLastGoodWidth;
}
if (targetWindow.showcaseLastGoodHeight > maxTabHeight) {
maxTabHeight = targetWindow.showcaseLastGoodHeight;
}
}
var firstIteration = true;
do {
numberColumns = Math.floor(numTabs / numberRows);
if ((numTabs % numberRows) > 0) {
numberColumns++;
}
currentWidth = width / numberColumns - thumbnailBorderWidth;
var thumbHeight = height / numberRows - thumbnailBorderHeight;
var widthForHeight = thumbHeight * maxTabWidth / maxTabHeight;
if (currentWidth > widthForHeight) {
currentWidth = widthForHeight;
}
if (firstIteration || (currentWidth > maxWidth)) {
retValues[0] = numberRows;
retValues[1] = numberColumns;
maxWidth = currentWidth;
firstIteration = false;
}
numberRows++;
} while (currentWidth >= maxWidth);
// Return information for proportions
retValues[2] = maxTabWidth;
retValues[3] = maxTabHeight;
retValues[4] = numTabs;
return retValues;
}
// getTargetWindows
// Retrieves the target windows we want to "showcase"
function getTargetWindows() {
var windowArray = new Array();
if (globalMode) {
// Target all windows
var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
var windowIter;
var windowIndex = 0;
if (useWindowZOrder) {
windowIter = wm.getZOrderDOMWindowEnumerator('navigator:browser', true);
} else {
windowIter = wm.getEnumerator('navigator:browser');
}
while (windowIter.hasMoreElements()) {
windowArray[windowIndex] = windowIter.getNext();
windowIndex++;
}
if ((windowIndex == 0) && useWindowZOrder) {
// No windows?! Verify that with getEnumerator!
windowIter = wm.getEnumerator('navigator:browser');
while (windowIter.hasMoreElements()) {
windowArray[windowIndex] = windowIter.getNext();
windowIndex++;
}
}
} else {
// Target "this" window (which is an argument)
windowArray[0] = getParentWindow();
}
return windowArray;
}
function getParentWindow() {
if (localTargetWindow) {
return localTargetWindow;
} else if (window.opener) {
return window.opener;
} else {
return QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebNavigation).QueryInterface(Components.interfaces.nsIDocShellTreeItem).rootTreeItem.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindow);
}
}
function updateLoadingState(targetProgressTab) {
targetProgressTab.showcaseCanvasBox.setAttribute("loading", targetProgressTab.showcaseProgressListener.progressListener.isLoading);
if (currentIconsThumbnail && (currentIconsThumbnail.showcaseTab == targetProgressTab)) {
checkThumbnailIconsState();
}
}
function updateIEState(targetProgressTab) {
targetProgressTab.showcaseCanvasBox.setAttribute("ietab", targetProgressTab.showcaseIETab);
}
function updateBlankState(targetProgressTab) {
targetProgressTab.showcaseCanvasBox.setAttribute("blank", targetProgressTab.showcaseBlank);
}
function setEmbeddingState(targetProgressTab, newState, repaintThumbnail) {
targetProgressTab.showcaseEmbedded = newState;
if (newState) {
if ((targetProgressTab.targetTab.contentDocument.contentType == 'video/quicktime') || (targetProgressTab.targetTab.contentDocument.contentType == 'video/x-quicktime')) {
targetProgressTab.showcaseCanvasBox.setAttribute("plugintype", "quicktime");
} else if (targetProgressTab.targetTab.contentDocument.contentType == "application/x-shockwave-flash") {
targetProgressTab.showcaseCanvasBox.setAttribute("plugintype", "flash");
} else if (targetProgressTab.targetTab.contentDocument.contentType == "application/pdf") {
targetProgressTab.showcaseCanvasBox.setAttribute("plugintype", "pdf");
} else {
targetProgressTab.showcaseCanvasBox.setAttribute("plugintype", "generic");
}
} else {
targetProgressTab.showcaseCanvasBox.removeAttribute("plugintype");
}
if (repaintThumbnail) {
setTimeout(paintThumbnail, 0, targetProgressTab);
}
}
function setImageState(targetProgressTab, newState) {
targetProgressTab.showcaseImage = newState;
if (newState) {
targetProgressTab.showcaseCanvasBox.setAttribute("isimage", "true");
} else {
targetProgressTab.showcaseCanvasBox.removeAttribute("isimage");
}
}
function closeShowcaseTab(targetProcessedTab) {
var tabbrowser = targetProcessedTab.targetTabWindow.targetWindow.getBrowser();
if (tabbrowser.mTabContainer.childNodes.length < 2) {
if (closeLastTabKeepOpen) {
// Blank tab
tabbrowser.loadURI("about:blank");
} else {
closeProcessedWindow(targetProcessedTab.targetTabWindow);
}
} else if (targetProcessedTab.showcaseCanvasBox.hasAttribute("selectedtab")) {
var showcaseRefocus = new ShowcaseRefocus(tabbrowser, tabbrowser.tabContainer, this);
isWaitingRefocus = true;
tabbrowser.tabContainer.addEventListener("select", showcaseRefocus, false);
tabbrowser.removeCurrentTab();
} else {
tabbrowser.removeTab(targetProcessedTab.tabHeader);
}
}
function closeShowcaseTabs(targetProcessedTabs) {
for (var c=0; c -1) {
if (currentProcessedTab.showcaseCanvasBox.hasAttribute("selectedtab")) {
selectedFound = true;
selectedProcessedTab = currentProcessedTab;
} else {
targetTabs.push(currentProcessedTab);
}
} else {
deleteWindow = false;
}
}
if (deleteWindow && !closeLastTabKeepOpen) {
//currentProcessedWindow.targetWindow.close();
currentProcessedWindow.targetWindow.setTimeout(currentProcessedWindow.targetWindow.close, 0);
} else {
for (var e=0; e 0) && (targetProgressTab.targetTab.contentDocument.contentType != CONTENTTYPE_HTML) && (targetProgressTab.targetTab.contentDocument.contentType != CONTENTTYPE_XHTML) && (targetProgressTab.targetTab.contentDocument.contentType != CONTENTTYPE_XUL)) {
// Update embedding
setEmbeddingState(targetProgressTab, true, repaintThumbnail);
}
}
function checkImage(targetProgressTab) {
if (!detectImage) return;
if ((targetProgressTab.targetTab.contentDocument) && (targetProgressTab.targetTab.contentDocument instanceof ImageDocument)) {
setImageState(targetProgressTab, true);
} else {
setImageState(targetProgressTab, false);
}
}
function checkImageSize(targetProgressTab) {
if ((targetProgressTab.targetTab.contentDocument.imageRequest.width > 0) && (targetProgressTab.targetTab.contentDocument.imageRequest.height > 0)) {
refreshContent();
return true;
}
return false;
}
// Object TabEventListener
function TabEventListener(targetTab, targetWindow, showcaseWindow) {
this.listenTab = targetTab;
this.tabwindow = targetWindow;
this.showcaseWindow = showcaseWindow
}
TabEventListener.prototype.QueryInterface = function(aIID) {
if (aIID.equals(Components.interfaces.nsITimerCallback) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
}
TabEventListener.prototype.handleEvent = function(evt){
switch(evt.type){
case 'resize':
// Update size
try {
this.tabwindow.showcaseLastGoodWidth = this.listenTab.targetTab.contentWindow.innerWidth;
this.tabwindow.showcaseLastGoodHeight = this.listenTab.targetTab.contentWindow.innerHeight;
} catch (e) {
alert("tablisten1: " + e);
}
if (this.tabwindow.processedTabs) {
for (var c=0; c 1) {
var foundProcessedTab = false;
for (var c=0; (c<(orderedProcessedTabs.length-1)) && !foundProcessedTab; c++) {
if (targetProcessedWindow.processedTabs[c] != orderedProcessedTabs[c]) {
if (orderedProcessedTabs[c+1] == targetProcessedWindow.processedTabs[c]) {
orderedProcessedTabs[c].tabHeader.removeEventListener("DOMAttrModified", orderedProcessedTabs[c].showcaseTabEventListener, false);
orderedProcessedTabs[c].tabHeader.addEventListener("DOMAttrModified", orderedProcessedTabs[c].showcaseTabEventListener, false);
foundProcessedTab = true;
}
if (orderedProcessedTabs[c] == targetProcessedWindow.processedTabs[c+1]) {
targetProcessedWindow.processedTabs[c].tabHeader.removeEventListener("DOMAttrModified", targetProcessedWindow.processedTabs[c].showcaseTabEventListener, false);
targetProcessedWindow.processedTabs[c].tabHeader.addEventListener("DOMAttrModified", targetProcessedWindow.processedTabs[c].showcaseTabEventListener, false);
foundProcessedTab = true;
}
}
}
}
targetProcessedWindow.processedTabs = orderedProcessedTabs;
found = true;
}
if (found) {
updateTitle();
refreshContent();
}
} catch (e) {
if (attempts > 0) {
setTimeout(checkTabCreation, 10, --attempts);
} else {
alert("checkTabCreation - " + e);
}
}
}
function checkTabDestruction(targetProcessedWindow) {
try {
var found = false;
var tabbrowser = targetProcessedWindow.targetWindow.getBrowser();
var tabArray = new Array();
for (var j = 0; j< tabbrowser.tabContainer.childNodes.length; j++) {
tabArray[j] = tabbrowser.getBrowserForTab(tabbrowser.tabContainer.childNodes.item(j));
}
var tabArrayArgument = new DualArgument(tabArray, targetProcessedWindow);
if (targetProcessedWindow.processedTabs.some(singleTabDestructionCheck, tabArrayArgument)) {
updateTitle();
setTimeout(refreshContent, 0);
}
} catch (e) { alert("checkTabDestruction - " + e); }
}
// Helper function that will check if an element is inside another
function singleTabDestructionCheck(element, index, array) {
if ((this.firstArgument.indexOf(element.targetTab) == -1) && element.showcaseCanvasBox) {
// Destruction found
showcaseBox.removeChild(element.showcaseCanvasBox);
unlinkProcessedTab(element, this.secondArgument);
return true;
}
return false;
}
// Helper object that simply holds an argument
function DualArgument(firstArgument, secondArgument) {
this.firstArgument = firstArgument;
this.secondArgument = secondArgument;
}
function showShowcaseOptions() {
var features;
try {
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
var instantApply = prefs.getBoolPref("browser.preferences.instantApply");
features = "chrome,titlebar,toolbar,centerscreen," + (instantApply ? "dialog=no" : "modal,resizable");
} catch (e) {
features = "chrome,titlebar,toolbar,centerscreen,modal,resizable";
}
openDialog(OPTIONS_URL, "", features);
}
// Object ProcessedWindow
function ProcessedWindow(targetWindow) {
this.targetWindow = targetWindow;
this.processedTabs = new Array();
}
// Object ProcessedTab
function ProcessedTab(targetTab) {
this.targetTab = targetTab;
}
// Search functions
function updateFind() {
if (inZoomMode) {
return;
}
var field = document.getElementById("find-field");
var statusIcon = document.getElementById("find-status-icon");
var statusText = document.getElementById("find-status");
var invertField = document.getElementById("find-invert");
var targetWindow;
var targetProcessedTab;
var noMatchingTabs = true;
var value = field.value;
var invert = invertField.getAttribute("checked");
if (!searchActive || (value.length < 1)) {
invertField.setAttribute("disabled", true);
if (showOnlyCurrent) {
updateShowOnlyCurrent();
} else {
for (var c=0; (c lastSearch.length))) {
moreSpecificSearch = true;
}
if ((lastSearchCaseSensitive && !searchCaseSensitive) ||
((lastSearchFindType != FINDTYPE_ANY) && (searchFindType == FINDTYPE_ANY)) ||
((lastSearch.indexOf(value) == 0) && (lastSearch.length > value.length))) {
lessSpecificSearch = true;
}
gFinder.caseSensitive = searchCaseSensitive;
for (var c=0; (c -1);
} else {
found = (targetTitle.toLowerCase().indexOf(value.toLowerCase()) > -1);
}
}
}
if (!found && ((searchFindType == FINDTYPE_LOCATION) || (searchFindType == FINDTYPE_ANY))) {
if (targetTab.currentURI) {
var targetLocation = targetTab.currentURI.spec;
if (searchCaseSensitive) {
found = (targetLocation.indexOf(value) > -1);
} else {
found = (targetLocation.toLowerCase().indexOf(value.toLowerCase()) > -1);
}
}
}
if (!found && ((searchFindType == FINDTYPE_CONTENT) || (searchFindType == FINDTYPE_ANY))) {
try {
found = findWindowContent(targetTab.contentWindow, value);
} catch (e) {
// Fail silently
}
}
return found;
}
function findWindowContent(targetWindow, value) {
var found;
var body = targetWindow.document.body;
var count = body.childNodes.length;
var searchRange = targetWindow.document.createRange();
searchRange.setStart(body, 0);
searchRange.setEnd(body, count);
var startPt = targetWindow.document.createRange();
var endPt = targetWindow.document.createRange();
startPt.setStart(body, 0);
startPt.setEnd(body, 0);
endPt.setStart(body, count);
endPt.setEnd(body, count);
found = gFinder.Find(value, searchRange, startPt, endPt);
if (found) {
return true;
} else if (targetWindow.frames) {
for (var c=0; (c 0) {
findTypeField.selectedIndex--;
} else {
findTypeField.selectedIndex = findTypeField.firstChild.childNodes.length - 1;
}
evt.preventDefault();
}
else if (evt.keyCode == KeyEvent.DOM_VK_DOWN) {
if (findTypeField.selectedIndex >= (findTypeField.firstChild.childNodes.length - 1)) {
findTypeField.selectedIndex = 0;
} else {
findTypeField.selectedIndex++;
}
evt.preventDefault();
}
}
function openFoundSearchResult() {
var firstVisibleFound = false;
var firstVisibleTab = null;
var secondVisibleFound = false;
// if there's just one result, open it
for (var c=0; (c 0) {
for (var c=0; c 0) newHistory.PurgeHistory(newHistory.count);
for (var i = 0; i < originalHistory.length; i++) {
var entry = originalHistory[i].QueryInterface(Components.interfaces.nsISHEntry);
var newEntry = cloneHistoryEntry(entry);
if (newEntry)
newHistory.addEntry(newEntry, true);
}
// Goto current history location
if (originalHistory.index < originalHistory.length) {
try {
webNav.gotoIndex(originalHistory.index);
} catch(e) {
window.setTimeout(webNav.gotoIndex, 0, originalHistory.index);
}
}
}
// copy a sessionHistory and put it into an array
// Argument1 originalHistory: webNavigation.sessionHistory browser history to be copied
// returns: an array containing a copy of the history
function copyTabHistory(originalHistory, aOnlyBack) {
// variables used in this function
var backHistoryEnabled, forwardHistoryEnabled, forwardPagesNum, backPagesNum;
var pageCount, currentPageNum, firstPageNum, lastPageNum;
// check if copying forward or back history is enabled and checking for history length to be copied
currentPageNum = originalHistory.index;
lastPageNum = originalHistory.count-1;
firstPageNum = 0;
if (!aOnlyBack) {
pageCount = lastPageNum+1;
}
else
pageCount = currentPageNum+1;
currentPageNum = currentPageNum-firstPageNum;
var copiedHistory = new Array();
for (var i = firstPageNum; i < pageCount; i++) {
copiedHistory.push(originalHistory.getEntryAtIndex(i, false));
}
copiedHistory.index = currentPageNum;
return copiedHistory;
}
function cloneHistoryEntry(aEntry) {
if (!aEntry)
return null;
aEntry = aEntry.QueryInterface(Components.interfaces.nsISHContainer);
var newEntry = aEntry.clone();
newEntry = newEntry.QueryInterface(Components.interfaces.nsISHContainer);
newEntry.loadType = Math.floor(aEntry.loadType);
if (aEntry.childCount) {
for (var j = 0; j < aEntry.childCount; j++) {
var childEntry = cloneHistoryEntry(aEntry.GetChildAt(j));
if (childEntry)
newEntry.AddChild(childEntry, j);
}
}
return newEntry;
}
function waitForSessionHistory(targetWindow, pages, attempts, closeDuplicated) {
// Test if sessionHistory exists yet
var webNav = targetWindow.getBrowser().webNavigation;
try {
webNav.sessionHistory;
} catch (err) {
// webNav.sessionHistory is not yet available, try again later
if (attempts)
window.setTimeout(waitForSessionHistory, 100, targetWindow, pages, --attempts, closeDuplicated);
return;
}
if ((webNav.sessionHistory == null) && attempts) {
window.setTimeout(waitForSessionHistory, 100, targetWindow, pages, --attempts, closeDuplicated);
return;
}
var openedBrowser = targetWindow.getBrowser().mCurrentBrowser;
setTabsInBrowser(targetWindow, pages);
if (closeDuplicated) {
var tabsArray = new Array();
for (var c=0; c -1) {
if (originalSelection.indexOf(currentProcessedTab) > -1) {
removeFromSelection(currentProcessedTab);
}
} else if (originalSelection.indexOf(currentProcessedTab) < 0) {
addToSelection(currentProcessedTab);
}
} else {
if (selectedTabs.indexOf(currentProcessedTab) < 0) {
addToSelection(currentProcessedTab);
}
var originalSelectionIndex = originalSelection.indexOf(currentProcessedTab);
if (originalSelectionIndex > -1) {
removeElementAt(originalSelection, originalSelectionIndex);
}
}
} else {
if (e.ctrlKey) {
if (selectedTabs.indexOf(currentProcessedTab) > -1) {
if (originalSelection.indexOf(currentProcessedTab) < 0) {
removeFromSelection(currentProcessedTab);
}
} else if (originalSelection.indexOf(currentProcessedTab) > -1) {
addToSelection(currentProcessedTab);
}
} else if ((selectedTabs.indexOf(currentProcessedTab) > -1) && (originalSelection.indexOf(currentProcessedTab) < 0)) {
removeFromSelection(currentProcessedTab);
}
}
}
}
}
}
function showcaseBoxCheckKey(el) {
if (el.ctrlKey || el.altKey || el.metaKey) return;
if (el.charCode >= 33) {
var createdChar = String.fromCharCode(el.charCode);
if ((createdChar != "+") && (createdChar != "-")) {
var field = document.getElementById("find-field");
if (!searchActive) {
if (!window.sidebarFindBar || (findBarMode != 1)) {
var findToolbar = document.getElementById("FindToolbar");
searchActive = true;
findToolbar.setAttribute("hidden", false);
}
field.value = createdChar;
} else {
field.value += createdChar;
}
field.inputField.focus();
setTimeout(field.setSelectionRange, 0, field.length, field.length);
refreshContent();
}
}
}
function checkTabInSelectionBox(targetTab) {
var selectionLeft, selectionRight, selectionUp, selectionDown;
if (selectionStartX < selectionEndX) {
selectionLeft = selectionStartX;
selectionRight = selectionEndX;
} else {
selectionRight = selectionStartX;
selectionLeft = selectionEndX;
}
if (selectionStartY < selectionEndY) {
selectionUp = selectionStartY;
selectionDown = selectionEndY;
} else {
selectionUp = selectionEndY;
selectionDown = selectionStartY;
}
if ((targetTab.showcaseCanvasBox.boxObject.x > selectionRight) || ((targetTab.showcaseCanvasBox.boxObject.width + targetTab.showcaseCanvasBox.boxObject.x) < selectionLeft)) {
return false;
}
if ((targetTab.showcaseCanvasBox.boxObject.y > selectionDown) || ((targetTab.showcaseCanvasBox.boxObject.height + targetTab.showcaseCanvasBox.boxObject.y) < selectionUp)) {
return false;
}
return true;
}
// Drag & drop
var thumbnailObserver = {
onDragStart: function (evt,transferData,action) {
var dataArray = new Array();
var currentTime = new Date().getTime();
if (selectedTabs.length > 1) {
for (var c=0; c 0) {
targetColumn--;
} else {
targetRow--;
targetColumn = mosaicColumns - 1;
}
var prevTab = getTabAt(targetRow, targetColumn);
if (prevTab.targetTabWindow != targetTab.targetTabWindow) {
isFrontier = true;
}
}
} else {
var targetRow = currentMosaicRow;
var targetColumn = currentMosaicCol;
if (targetColumn < (mosaicColumns - 1)) {
targetColumn++;
} else {
targetRow++;
targetColumn = 0;
}
var nextTab = getTabAt(targetRow, targetColumn);
if (nextTab == targetTab) {
isFrontier = true;
} else if (nextTab.targetTabWindow != targetTab.targetTabWindow) {
isFrontier = true;
}
}
if (atLeftSide && isFrontier) {
dropBox.setAttribute("dropside", "left");
dropBox.setAttribute("left", currentMosaicCol * mosaicWidth / mosaicColumns);
} else if (isFrontier) {
dropBox.setAttribute("dropside", "right");
dropBox.setAttribute("left", (currentMosaicCol + 1) * mosaicWidth / mosaicColumns - 6);
} else {
dropBox.setAttribute("dropside", "middle");
if (atLeftSide) {
if (currentMosaicCol > 0) {
dropBox.setAttribute("left", currentMosaicCol * mosaicWidth / mosaicColumns - 1);
} else {
dropBox.setAttribute("left", 0);
}
} else {
if ((currentMosaicCol + 1) < mosaicColumns) {
dropBox.setAttribute("left", (currentMosaicCol + 1) * mosaicWidth / mosaicColumns - 1);
} else {
dropBox.setAttribute("left", (currentMosaicCol + 1) * mosaicWidth / mosaicColumns - 2);
}
}
}
},
onDragExit: function (aEvent, aDragSession) {
dropBox.setAttribute("hidden", true);
},
onDrop: function (evt,dropdata,session) {
dropBox.setAttribute("hidden", true);
var currentMosaicCol = Math.floor(evt.layerX * mosaicColumns / mosaicWidth);
var currentMosaicRow = Math.floor(evt.layerY * mosaicRows / mosaicHeight);
var targetTab = getTabAt(currentMosaicRow, currentMosaicCol);
currentMosaicCol = targetTab.showcaseColumn;
currentMosaicRow = targetTab.showcaseRow;
var atLeftSide = ((evt.layerX - currentMosaicCol * mosaicWidth / mosaicColumns) < (mosaicWidth / (mosaicColumns * 2)));
var targetTabWindow = getProcessedWindowForProcessedTab(targetTab);
var tabbrowser = targetTabWindow.targetWindow.getBrowser();
const kDSIID = Components.interfaces.nsIDragService;
const kCopyAction = kDSIID.DRAGDROP_ACTION_COPY + kDSIID.DRAGDROP_ACTION_LINK;
var moveIfPossible = !(session.dragAction & kCopyAction);
var insertionIndex = targetTab.tabHeader._tPos;
//try {
var targets = getSelectionFromXferData(session);
var processedTabsMoved = new Array();
for (var d=0; d 0)) {
tabbrowser.moveTabTo(currentTabHeader, insertionIndex - 1);
} else {
tabbrowser.moveTabTo(currentTabHeader, insertionIndex);
}
if (currentTabHeader._tPos >= insertionIndex) {
insertionIndex++;
}
} else {
if (currentTabHeader._tPos >= insertionIndex) {
insertionIndex++;
}
tabbrowser.moveTabTo(currentTabHeader, insertionIndex);
}
} else {
// Insert new tab
var newTab = tabbrowser.addTab(url);
if (atLeftSide) {
if ((newTab._tPos < insertionIndex) && (insertionIndex > 0)) {
tabbrowser.moveTabTo(newTab, insertionIndex - 1);
} else {
tabbrowser.moveTabTo(newTab, insertionIndex);
}
if (newTab._tPos >= insertionIndex) {
insertionIndex++;
}
} else {
if (newTab._tPos >= insertionIndex) {
insertionIndex++;
}
tabbrowser.moveTabTo(newTab, insertionIndex);
}
var pageInfo = [copyTabHistory(currentTab.webNavigation.sessionHistory),
currentTab.contentWindow.scrollX, currentTab.contentWindow.scrollY,
currentTab.markupDocumentViewer.textZoom,currentProcessedTab];
setClonedContent(newTab.linkedBrowser, pageInfo);
if (moveIfPossible) {
if (currentProcessedTab) {
processedTabsMoved.push(currentProcessedTab);
} else {
currentTab.contentWindow.close();
}
}
}
}
}
if (processedTabsMoved.length > 0) {
closeShowcaseTabs(processedTabsMoved);
}
//} catch (e) { log(e); }
},
canHandleMultipleItems: true
};
function getSelectionFromXferData(aDragSession) {
var selection = [];
var trans = Components.classes["@mozilla.org/widget/transferable;1"]
.createInstance(Components.interfaces.nsITransferable);
if (aDragSession.sourceDocument != null) {
trans.addDataFlavor("text/x-showcase-tab");
}
trans.addDataFlavor("text/x-moz-url");
trans.addDataFlavor("text/x-moz-file");
trans.addDataFlavor("text/unicode");
var uri, extra, rSource, rParent, parent;
for (var i = 0; i < aDragSession.numDropItems; ++i) {
var bestFlavour = {}, dataObj = {}, len = {};
aDragSession.getData(trans, i);
trans.getAnyTransferData(bestFlavour, dataObj, len);
dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsString);
if (!dataObj)
continue;
var value = dataObj.data.substring(0, len.value);
var newValue = {};
newValue.value = value;
switch (bestFlavour.value) {
case "text/x-showcase-tab":
newValue.type = "showcaseId";
break;
case "text/x-moz-url":
case "text/x-moz-file":
case "text/unicode":
newValue.type = "url";
newValue.contentType = bestFlavour.value;
newValue.data = dataObj.data;
break;
}
selection.push(newValue);
}
return selection;
}
function createTransferDataForThumbnail(targetProcessedTab, tabId) {
var value;
if (targetProcessedTab.targetTab.currentURI) {
value = targetProcessedTab.targetTab.currentURI.spec;
} else {
value = "about:blank";
}
if ((detectIETab) && (value.substr(0, IETAB_URL.length) == IETAB_URL)) {
value = value.substring(IETAB_URL.length);
}
var urlString = value + "\n" + targetProcessedTab.targetTab.contentDocument.title;
var htmlString = "" + targetProcessedTab.targetTab.contentDocument.title + "";
var targetTab = targetProcessedTab.targetTab;
if (targetTab.wrappedJSObject) {
targetTab = targetTab.wrappedJSObject;
}
var targetTabId = tabId.toString();
if (targetTab.showcaseTabId) {
targetTabId = targetTab.showcaseTabId;
} else {
targetTab.showcaseTabId = targetTabId;
}
var data = new TransferData();
data.addDataForFlavour("text/x-showcase-tab", targetTabId);
if ((value == "") || (value == "about:blank")) {
data.addDataForFlavour("text/unicode", value);
} else {
data.addDataForFlavour("text/x-moz-url", urlString);
data.addDataForFlavour("text/unicode", value);
data.addDataForFlavour("text/html", htmlString);
}
return data;
}
function findProcessedTabById(targetId) {
var foundProcessedTab = null;
for (var c=0; (c 8) ? index - 8 : 0;
if ((index - 1) < end) return false;
for (var pos = index - 1; pos >= end; pos--) {
entry = sessionHistory.getEntryAtIndex(pos, false);
if (entry) {
var menuitem = document.createElement("menuitem");
menuitem.setAttribute("label", entry.title);
menuitem.setAttribute("index", pos);
menu.appendChild(menuitem);
}
}
}
return true;
}
function thumbIconPopulateForwardMenu(event) {
var menu = event.target;
while (menu.firstChild)
menu.removeChild(menu.firstChild);
if ((currentIconsThumbnail)&&(currentIconsThumbnail.showcaseTab.targetTab.sessionHistory)) {
var sessionHistory = currentIconsThumbnail.showcaseTab.targetTab.sessionHistory;
var index = sessionHistory.index;
var count = sessionHistory.count;
var entry;
var end = ((count-index) > 8) ? index + 8 : count - 1;
if ((index + 1) > end) return false;
for (var pos = index + 1; pos <= end; pos++) {
entry = sessionHistory.getEntryAtIndex(pos, false);
if (entry) {
var menuitem = document.createElement("menuitem");
menuitem.setAttribute("label", entry.title);
menuitem.setAttribute("index", pos);
menu.appendChild(menuitem);
}
}
}
return true;
}
function thumbIconGoToHistoryIndex(event) {
var index = event.target.getAttribute("index");
if (!index)
return false;
var targetWindow = getProcessedWindowForProcessedTab(currentIconsThumbnail.showcaseTab).targetWindow;
var where;
if (targetWindow.whereToOpenLink) {
where = targetWindow.whereToOpenLink(event);
} else {
where = "current";
}
if (where == "current") {
// Normal click. Go there in the current tab and update session history.
currentIconsThumbnail.showcaseTab.targetTab.gotoIndex(index);
return true;
} else {
// Modified click. Go there in a new tab/window.
// This code doesn't copy history or work well with framed pages.
var sessionHistory = currentIconsThumbnail.showcaseTab.targetTab.sessionHistory;
var entry = sessionHistory.getEntryAtIndex(index, false);
var url = entry.URI.spec;
targetWindow.openUILinkIn(url, where);
return true;
}
}
function thumbIconBackCommand(event) {
if ((!currentIconsThumbnail.showcaseTab.targetTab)||(!currentIconsThumbnail.showcaseTab.targetTab.docShell))
return;
if (event) {
var targetWindow = getProcessedWindowForProcessedTab(currentIconsThumbnail.showcaseTab).targetWindow;
var where;
if (targetWindow.whereToOpenLink) {
where = targetWindow.whereToOpenLink(event, false, false);
} else {
where = "current";
}
if (where == "current") {
currentIconsThumbnail.showcaseTab.targetTab.goBack();
} else {
var sessionHistory = currentIconsThumbnail.showcaseTab.targetTab.sessionHistory;
var currentIndex = sessionHistory.index;
var entry = sessionHistory.getEntryAtIndex(currentIndex - 1, false);
var url = entry.URI.spec;
targetWindow.openUILinkIn(url, where);
}
} else {
currentIconsThumbnail.showcaseTab.targetTab.goBack();
}
}
function thumbIconForwardCommand(event) {
if ((!currentIconsThumbnail.showcaseTab.targetTab)||(!currentIconsThumbnail.showcaseTab.targetTab.docShell))
return;
if (event) {
var targetWindow = getProcessedWindowForProcessedTab(currentIconsThumbnail.showcaseTab).targetWindow;
var where;
if (targetWindow.whereToOpenLink) {
where = targetWindow.whereToOpenLink(event, false, false);
} else {
where = "current";
}
if (where == "current") {
currentIconsThumbnail.showcaseTab.targetTab.goForward();
} else {
var sessionHistory = currentIconsThumbnail.showcaseTab.targetTab.sessionHistory;
var currentIndex = sessionHistory.index;
var entry = sessionHistory.getEntryAtIndex(currentIndex + 1, false);
var url = entry.URI.spec;
targetWindow.openUILinkIn(url, where);
}
} else {
currentIconsThumbnail.showcaseTab.targetTab.goForward();
}
}
function thumbIconCheckMiddleClick(node, event) {
if (event.button == 1) {
var func = new Function("event",node.getAttribute("oncommand"));
func.call(node,event);
if ("tagName" in node) {
if (node.namespaceURI == "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" && (node.tagName == "menupopup" || node.tagName == "popup"))
node.hidePopup();
}
}
}
function thumbIconReloadCommand(event) {
if (event.shiftKey) {
currentIconsThumbnail.showcaseTab.targetTab.webNavigation.reload(RELOAD_SKIP_CACHE_FLAGS);
} else {
currentIconsThumbnail.showcaseTab.targetTab.webNavigation.reload(RELOAD_FLAGS);
}
}
function thumbIconStopCommand() {
currentIconsThumbnail.showcaseTab.targetTab.webNavigation.stop(nsIWebNavigation.STOP_ALL);
}
function hideThumbnailIcons() {
if (thumbnailBackButton) {
getThumbnailBackButton().setAttribute("collapsed", true);
}
if (thumbnailForwardButton) {
getThumbnailForwardButton().setAttribute("collapsed", true);
}
if (thumbnailStopButton) {
getThumbnailStopButton().setAttribute("collapsed", true);
}
if (thumbnailReloadButton) {
getThumbnailReloadButton().setAttribute("collapsed", true);
}
}
// Log
function log(msg) {
var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
.getService(Components.interfaces.nsIConsoleService);
consoleService.logStringMessage(msg);
}
PK
7+i.1C 1C content/showcase.xul
%brandDTD;
%realBrowserDTD;
%browserDTD;
%showcaseDTD;
%globalDTD;
%tabBrowserDTD;
%secondTabBrowserDTD;
]>
PK
7-(+ + content/showcaseOverlay.jsfunction showShowcaseAllWindows(event) {
if ((!event) || (event.type != "command")) {
showShowcase(true, false);
} else if (event.shiftKey) {
if (event.ctrlKey) {
showShowcase(false, true);
} else {
showShowcase(false, false);
}
} else {
if (event.ctrlKey) {
showShowcase(true, true);
} else {
showShowcase(true, false);
}
}
}
function showShowcaseThisWindow(event) {
if ((!event) || (event.type != "command")) {
showShowcase(false, false);
} else if (event.shiftKey) {
if (event.ctrlKey) {
showShowcase(true, true);
} else {
showShowcase(true, false);
}
} else {
if (event.ctrlKey) {
showShowcase(false, true);
} else {
showShowcase(false, false);
}
}
}
function showShowcaseTabAllWindows(event) {
if ((!event) || (event.type != "command")) {
showShowcase(true, true);
} else if (event.shiftKey) {
if (event.ctrlKey) {
showShowcase(false, false);
} else {
showShowcase(false, true);
}
} else {
if (event.ctrlKey) {
showShowcase(true, false);
} else {
showShowcase(true, true);
}
}
}
function showShowcaseTabThisWindow(event) {
if ((!event) || (event.type != "command")) {
showShowcase(false, true);
} else if (event.shiftKey) {
if (event.ctrlKey) {
showShowcase(true, false);
} else {
showShowcase(true, true);
}
} else {
if (event.ctrlKey) {
showShowcase(false, false);
} else {
showShowcase(false, true);
}
}
}
function showShowcase(allWindows, embedTab) {
var prefs = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefService);
prefs = prefs.getBranch("extensions.showcase.");
// First close the window so we can keep the "last position" and "last size" values
if (!embedTab) {
var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
var windowIter = wm.getEnumerator('extension:showcase');
if (windowIter.hasMoreElements()) {
var targetWindow = windowIter.getNext();
if (targetWindow.wrappedJSObject) targetWindow = targetWindow.wrappedJSObject;
if (targetWindow) {
var shouldRefresh = false;
if (allWindows) {
if (!targetWindow.globalMode) {
targetWindow.globalMode = true;
shouldRefresh = true;
}
} else {
if (targetWindow.globalMode) {
targetWindow.globalMode = false;
targetWindow.localTargetWindow = window;
shouldRefresh = true;
} else {
if ((targetWindow.localTargetWindow && (targetWindow.localTargetWindow != window)) ||
(!targetWindow.localTargetWindow && (window.opener != window))) {
targetWindow.localTargetWindow = window;
shouldRefresh = true;
}
}
}
if (shouldRefresh)
targetWindow.refreshScreen();
targetWindow.focus();
return;
}
}
}
// Check if we've to embed showcase in a tab
if (embedTab) {
// Look for any old instance
var tabbrowser = document.getElementById("content");
var tabs = tabbrowser.mTabContainer.childNodes;
var totalTabs = tabs.length;
var selectedTab = tabbrowser.getBrowserForTab(tabs[tabbrowser.mTabContainer.selectedIndex]);
var found = false;
for (var j = 0; (j < totalTabs) && !found; j++) {
var targetTab = tabbrowser.getBrowserForTab(tabs[j]);
if (targetTab.contentWindow) {
var targetTabWindow = targetTab.contentWindow;
if (targetTabWindow.wrappedJSObject) {
targetTabWindow = targetTabWindow.wrappedJSObject;
}
if (targetTabWindow.isShowcaseWindow) {
found = true;
if (targetTab == selectedTab) {
targetTabWindow.close();
} else {
if (targetTabWindow.globalMode != allWindows) {
targetTabWindow.location = "chrome://showcase/content/showcase.xul?global=" + allWindows;
//targetTabWindow.globalMode = allWindows;
//targetTabWindow.refreshScreen();
}
tabbrowser.mTabContainer.selectedIndex = j;
targetTabWindow.focus();
}
}
}
}
if (!found) {
var showcaseTab = getBrowser().addTab("chrome://showcase/content/showcase.xul?global=" + allWindows);
var initialPosition = prefs.getIntPref("tabInitialPosition");
var tabbrowser = getBrowser();
if (initialPosition == 0) {
// Current position
tabbrowser.moveTabTo(showcaseTab, tabbrowser.selectedTab._tPos);
} else if (initialPosition == 2) {
// First position
tabbrowser.moveTabTo(showcaseTab, 0);
}
tabbrowser.selectedTab = showcaseTab;
}
return;
}
var windowHeight, windowWidth;
var createWindowString = "chrome";
var showcaseWidthType = prefs.getIntPref("windowWidth");
var widthPercentage = parseFloat(prefs.getCharPref("windowWidthPercentage"));
var widthModifier = prefs.getIntPref("windowWidthModifier");
createWindowString += ",outerWidth=";
if (showcaseWidthType == 0) {
var contentArea = getBrowser().mCurrentBrowser;
windowWidth = Math.floor(contentArea.boxObject.width * widthPercentage / 100 + widthModifier);
createWindowString += windowWidth;
} else if (showcaseWidthType == 1) {
windowWidth = Math.floor(window.screen.availWidth * widthPercentage / 100 + widthModifier);
createWindowString += windowWidth;
} else if (showcaseWidthType == 2) {
windowWidth = prefs.getIntPref("windowLastWidth");
createWindowString += windowWidth;
if (windowWidth < 1) {
windowWidth = 300;
}
} else { // if (showcaseWidthType == 3) {
windowWidth = Math.floor(window.outerWidth * widthPercentage / 100 + widthModifier);
createWindowString += windowWidth;
}
var showcaseHeightType = prefs.getIntPref("windowHeight");
var heightPercentage = parseFloat(prefs.getCharPref("windowHeightPercentage"));
var heightModifier = prefs.getIntPref("windowHeightModifier");
createWindowString += ",outerHeight=";
if (showcaseHeightType == 0) {
var contentArea = getBrowser().mCurrentBrowser;
windowHeight = Math.floor(contentArea.boxObject.height * heightPercentage / 100 + heightModifier);
createWindowString += windowHeight;
} else if (showcaseHeightType == 1) {
windowHeight = Math.floor(window.screen.availHeight * heightPercentage / 100 + heightModifier);
createWindowString += windowHeight;
} else if (showcaseHeightType == 2) {
windowHeight = prefs.getIntPref("windowLastHeight");
if (windowHeight < 1) {
windowHeight = 300;
}
createWindowString += windowHeight;
} else { // if (showcaseHeightType == 3) {
windowHeight = Math.floor(window.outerHeight * heightPercentage / 100 + heightModifier);
createWindowString += windowHeight;
}
if (prefs.getBoolPref("windowAttributeDialog")) {
createWindowString += ",dialog=yes";
} else {
createWindowString += ",dialog=no";
}
if (prefs.getBoolPref("windowAttributeDependent")) {
createWindowString += ",dependent=yes";
}
if (!prefs.getBoolPref("windowAttributeTitleBar")) {
createWindowString += ",titlebar=no";
}
if (prefs.getBoolPref("windowAttributeModal")) {
createWindowString += ",modal=yes";
}
if (prefs.getBoolPref("windowAttributeAlwaysRaised")) {
createWindowString += ",alwaysRaised=yes";
}
var showcasePosition = prefs.getIntPref("windowPosition");
if (showcasePosition == 0) {
// Center on invoking content area
var contentArea = getBrowser().mCurrentBrowser;
createWindowString += ",left=" +
Math.floor(contentArea.boxObject.screenX + contentArea.boxObject.width / 2 - windowWidth / 2) +
",top=" +
Math.floor(contentArea.boxObject.screenY + contentArea.boxObject.height / 2 - windowHeight / 2);
} else if (showcasePosition == 1) {
// Center on current screen
createWindowString += ",centerscreen=yes";
} else if (showcasePosition == 2) {
// Remember last position
createWindowString += ",left=" +
prefs.getIntPref("windowLastX") +
",top=" +
prefs.getIntPref("windowLastY");
} else if (showcasePosition == 3) {
// Remember last position relative to invoking window
createWindowString += ",left=" +
(window.screenX + prefs.getIntPref("windowLastRelativeX")) +
",top=" +
(window.screenY + prefs.getIntPref("windowLastRelativeY"));
} else { // if (showcasePosition == 4) {
// Center on invoking window
createWindowString += ",left=" +
Math.floor(window.screenX + window.outerWidth / 2 - windowWidth / 2) +
",top=" +
Math.floor(window.screenY + window.outerHeight / 2 - windowHeight / 2);
}
// Add "normal" parameters
createWindowString += ",close=yes,resizable=yes";
var showcaseURL = "chrome://showcase/content/showcase.xul?global=" + allWindows;
var showcaseWindow = window.openDialog(showcaseURL,
"showcaseDialog", createWindowString, window);
// Try to focus on new window (will fail if window is modal, but that's not an issue)
try {
showcaseWindow.focus();
} catch (e) {}
}
function showShowcaseOptions() {
var features;
try {
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
var instantApply = prefs.getBoolPref("browser.preferences.instantApply");
features = "chrome,titlebar,toolbar,centerscreen," + (instantApply ? "dialog=no" : "modal,resizable");
} catch (e) {
features = "chrome,titlebar,toolbar,centerscreen,modal,resizable";
}
openDialog("chrome://showcase/content/settings/settings.xul", "", features);
}
PK
7% % content/showcaseOverlay.xul
PK
7Ru4B 4B content/showcaseSidebar.xul
%brandDTD;
%realBrowserDTD;
%browserDTD;
%showcaseDTD;
%globalDTD;
%findBarDTD;
%tabBrowserDTD;
%secondTabBrowserDTD;
]>
PK
7iP̟ content/utils.js
function openURL(aURL)
{
if (aURL == null) aURL = "about:blank";
var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
// check for an existing window and focus it; it's not application modal
var anyWindow = windowManager.getMostRecentWindow("navigator:browser");
if (!anyWindow) {
var hiddenWin = Components.classes[ "@mozilla.org/appshell/appShellService;1" ].
getService(Components.interfaces.nsIAppShellService).
hiddenDOMWindow;
hiddenWin.open(aURL, "_blank");
} else {
anyWindow.open(aURL, "_blank");
}
}
PK
7vBK| | ! locale/ca-AD/showcase/browser.dtd
PK
7u ! locale/ca-AD/showcase/overlay.dtd
PK
7OK K ( locale/ca-AD/showcase/overlay.propertiesshowcaseTabLeftTooltip=1 pestanya més a l'esquerra
showcaseTabsLeftTooltip=pestanyes més a l'esquerra
showcaseNoTabsLeftTooltip=No hi ha més pestanyes a l'esquerra
showcaseTabRightTooltip=1 pestanya més a la dreta
showcaseTabsRightTooltip=pestanyes més a la dreta
showcaseNoTabsRightTooltip=No hi ha més pestanyes a la dreta
PK
7vU' ' ' locale/ca-AD/showcase/pref-showcase.dtd
PK
7'T T &