Sync tab and friends with the trunk

This commit is contained in:
hyatt%netscape.com 2002-10-11 21:47:04 +00:00
Родитель 16f13e76be
Коммит 17685e1355
2 изменённых файлов: 171 добавлений и 146 удалений

Просмотреть файл

@ -11,7 +11,7 @@
</resources>
</binding>
<binding id="tabbox"
<binding id="tabbox" display="xul:box"
extends="chrome://global/content/widgets/tabbox.xml#tab-base">
<implementation implements="nsIAccessibleProvider">
<property name="accessible">
@ -109,44 +109,72 @@
]]>
</setter>
</property>
<field name="_keyEventHandler" readonly="true">
<![CDATA[({
tabbox: this,
handleEvent: function handleEvent(event) {
switch (event.keyCode) {
case event.DOM_VK_TAB:
if (event.ctrlKey && !event.altKey && !event.metaKey)
if (this.tabbox._tabs && this.tabbox.handleCtrlTab) {
this.tabbox._tabs.advanceSelectedTab(event.shiftKey ? -1 : 1);
event.stopPropagation();
event.preventDefault();
}
break;
case event.DOM_VK_PAGE_UP:
if (event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey)
if (this.tabbox._tabs && this.tabbox.handleCtrlPageUpDown) {
this.tabbox._tabs.advanceSelectedTab(-1);
event.stopPropagation();
event.preventDefault();
}
break;
case event.DOM_VK_PAGE_DOWN:
if (event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey)
if (this.tabbox._tabs && this.tabbox.handleCtrlPageUpDown) {
this.tabbox._tabs.advanceSelectedTab(1);
event.stopPropagation();
event.preventDefault();
}
break;
}
}
})]]>
</field>
<field name="_eventNode">
var eventNode = this;
switch (this.getAttribute("eventnode")) {
case "parent": eventNode = this.parentNode; break;
case "window": eventNode = window; break;
case "document": eventNode = document; break;
}
eventNode;
</field>
<property name="eventNode" onget="return this._eventNode;">
<setter>
<![CDATA[
if (val != this._eventNode) {
val.addEventListener("keypress", this._keyEventHandler, false);
this._eventNode.removeEventListener("keypress", this._keyEventHandler, false);
this._eventNode = val;
}
return val;
]]>
</setter>
</property>
<constructor>
this._eventNode.addEventListener("keypress", this._keyEventHandler, false);
</constructor>
<destructor>
this._eventNode.removeEventListener("keypress", this._keyEventHandler, false);
</destructor>
</implementation>
<handlers>
<handler event="keypress" keycode="vk_tab" modifiers="control">
<![CDATA[
if (this._tabs && this.handleCtrlTab) {
this._tabs.advanceSelectedTab(1);
event.preventDefault();
}
]]>
</handler>
<handler event="keypress" keycode="vk_tab" modifiers="control,shift">
<![CDATA[
if (this._tabs && this.handleCtrlTab) {
this._tabs.advanceSelectedTab(-1);
event.preventDefault();
}
]]>
</handler>
<handler event="keypress" keycode="vk_page_up" modifiers="control">
<![CDATA[
if (this._tabs && this.handleCtrlPageUpDown) {
this._tabs.advanceSelectedTab(-1);
}
]]>
</handler>
<handler event="keypress" keycode="vk_page_down" modifiers="control">
<![CDATA[
if (this._tabs && this.handleCtrlPageUpDown) {
this._tabs.advanceSelectedTab(1);
}
]]>
</handler>
</handlers>
</binding>
<binding id="tabs" display="xul:box"
@ -162,18 +190,11 @@
<![CDATA[
// first and last tabs need to be able to have unique styles
// and also need to select first tab on startup.
var tabs = this.getElementsByTagNameNS(
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"tab");
if (tabs.length) {
if (tabs.length > 1) {
tabs[0].setAttribute("first-tab", "true");
tabs[tabs.length - 1].setAttribute("last-tab", "true");
}
else if (tabs.length == 1)
tabs[0].setAttribute("first-tab", "true");
}
this.selectedItem = tabs[0];
if (this.firstChild)
this.firstChild.setAttribute("first-tab", "true");
if (this.lastChild)
this.lastChild.setAttribute("last-tab", "true");
this.selectedIndex = 0;
var o = this.getAttribute("orient");
if (!o)
this.setAttribute("orient", "horizontal");
@ -192,73 +213,70 @@
<property name="selectedIndex">
<getter>
<![CDATA[
for (var i = 0; i < this.childNodes.length; i++) {
if (this.childNodes[i].selected)
const tabs = this.childNodes;
for (var i = 0; i < tabs.length; i++) {
if (tabs.selected)
return i;
}
// throw an exception when no tab is selected (we shouldn't get here)
throw Components.results.NS_ERROR_FAILURE;
]]></getter>
<setter>
<![CDATA[
var tabs = this.getElementsByTagNameNS(
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"tab");
var tab = tabs.length >= val ? null : tabs[val];
if (tab)
this.selectedItem = tab;
return tab;
]]></setter>
</property>
<property name="selectedItem">
<getter>
<![CDATA[
for (var i = 0; i < this.childNodes.length; i++) {
if (this.childNodes[i].selected)
return this.childNodes[i];
}
// throw an exception when no tab is selected (we shouldn't get here)
throw Components.results.NS_ERROR_FAILURE;
]]>
</getter>
<setter>
<![CDATA[
const tabs = this.childNodes;
if (0 <= val && val < tabs.length && !tabs[val].selected) {
for (var i = 0; i < tabs.length; i++)
if (i != val && tabs[i].selected)
tabs[i].selected = false;
tabs[val].selected = true;
for (var parent = this.parentNode; parent; parent = parent.parentNode) {
if (parent.localName == 'tabbox') {
var tabpanels = parent._tabpanels;
// This will cause an onselect event to fire for the tabpanel element.
if (tabpanels)
tabpanels.selectedIndex = val;
break;
}
}
// Fire an onselect event for the tabs element.
var event = document.createEvent('Events');
event.initEvent('select', false, true);
this.dispatchEvent(event);
}
return val;
]]>
</setter>
</property>
<property name="selectedItem">
<getter>
<![CDATA[
const tabs = this.childNodes;
for (var i = 0; i < tabs.length; i++) {
if (tabs[i].selected)
return tabs[i];
}
// throw an exception when no tab is selected (we shouldn't get here)
throw Components.results.NS_ERROR_FAILURE;
]]>
</getter>
<setter>
<![CDATA[
if (!val)
throw Components.results.NS_ERROR_NULL_POINTER;
if (!val.selected)
val.selected = true;
var selectedIndex = 0;
for (var i = 0; i < this.childNodes.length; i++) {
if (this.childNodes[i].selected) {
if (this.childNodes[i] != val)
this.childNodes[i].selected = false;
else
selectedIndex = i;
}
if (!val.selected) {
const tabs = this.childNodes;
for (var i = 0; i < tabs.length; i++)
if (tabs[i] == val)
this.selectedIndex = i;
}
// Fire an onselect event for the tabs element.
var event = document.createEvent('Events');
event.initEvent('select', false, true);
this.dispatchEvent(event);
var parent = this.parentNode;
while (parent && parent.localName != 'tabbox')
parent = parent.parentNode;
if (!parent)
return val;
var tabpanels = parent.getElementsByTagNameNS(
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"tabpanels");
tabpanels = tabpanels.length ? tabpanels[0] : null;
// This will cause an onselect event to fire for the tabpanel element.
if (tabpanels)
tabpanels.selectedIndex = selectedIndex;
return val;
]]>
</setter>

Просмотреть файл

@ -14,9 +14,9 @@
- The Original Code is this file as it was released on
- March 28, 2001.
-
- The Initial Developer of the Original Code is David Hyatt
- Portions created by David Hyatt are Copyright (C) 2001
- David Hyatt. All Rights Reserved.
- The Initial Developer of the Original Code is Peter Annema.
- Portions created by Peter Annema are Copyright (C) 2001
- Peter Annema. All Rights Reserved.
-
- Contributor(s):
- David Hyatt <hyatt@netscape.com> (Original Author of <tabbrowser>)
@ -51,7 +51,7 @@
<content>
<xul:stringbundle src="chrome://global/locale/tabbrowser.properties"/>
<xul:tabbox flex="1"
<xul:tabbox flex="1" eventnode="document"
onselect="if (!('updateCurrentBrowser' in this.parentNode) || event.target.localName != 'tabpanels') return; this.parentNode.updateCurrentBrowser();">
<xul:hbox class="tabbrowser-strip chromeclass-toolbar" collapsed="true" tooltip="_child" context="_child">
<xul:tooltip onpopupshowing="event.preventBubble(); if (document.tooltipNode.hasAttribute('label')) { this.setAttribute('label', document.tooltipNode.getAttribute('label')); return true; } return false;"/>
@ -79,6 +79,7 @@
</xul:menupopup>
<xul:tabs class="tabbrowser-tabs" closebutton="true" flex="1"
tooltiptextnew="&newTabButton.tooltip;"
onclick="this.parentNode.parentNode.parentNode.onTabClick(event);"
ondragover="nsDragAndDrop.dragOver(event, this.parentNode.parentNode.parentNode);
event.stopPropagation();"
@ -97,7 +98,7 @@
</xul:tabs>
</xul:hbox>
<xul:tabpanels flex="1" class="plain">
<xul:browser type="content-primary" xbl:inherits="tooltip=contenttooltip,contextmenu=contentcontextmenu,autocompletepopup"/>
<xul:browser type="content-primary" xbl:inherits="tooltip=contenttooltip,contextmenu=contentcontextmenu"/>
</xul:tabpanels>
</xul:tabbox>
<children/>
@ -108,6 +109,10 @@
.getService(Components.interfaces.nsIPrefService)
.getBranch(null);
</field>
<field name="mURIFixup" readonly="true">
Components.classes["@mozilla.org/docshell/urifixup;1"]
.getService(Components.interfaces.nsIURIFixup);
</field>
<field name="mTabBox">
document.getAnonymousNodes(this)[1]
</field>
@ -350,7 +355,7 @@
var newTitle = "";
var docTitle;
if (this.docShell.contentViewer)
docTitle = this.contentDocument.title;
docTitle = this.contentTitle;
if (docTitle) {
newTitle += this.ownerDocument.documentElement.getAttribute("titlepreface");
@ -383,23 +388,12 @@
if (this.mCurrentBrowser)
this.mCurrentBrowser.setAttribute("type", "content");
var updatePageReport = false;
if ((this.mCurrentBrowser.pageReport && !newBrowser.pageReport) ||
(!this.mCurrentBrowser.pageReport && newBrowser.pageReport))
updatePageReport = true;
newBrowser.setAttribute("type", "content-primary");
this.mCurrentBrowser = newBrowser;
this.mCurrentTab = this.selectedTab;
if (updatePageReport)
this.mCurrentBrowser.updatePageReport();
// Update the URL bar.
var loc = this.mCurrentBrowser.currentURI;
if (!loc)
loc = ({ spec: "" });
var webProgress = this.mCurrentBrowser.webProgress;
var securityUI = this.mCurrentBrowser.securityUI;
var i, p;
@ -552,18 +546,38 @@
<body>
<![CDATA[
var browser = this.getBrowserForTab(aTab);
var title = browser.contentTitle;
var crop = "end";
var titleViaGetter = browser.contentDocument.__proto__.__lookupGetter__('title').call(browser.contentDocument);
var title;
if (titleViaGetter)
title = titleViaGetter
else if (browser.currentURI.spec && browser.currentURI.spec != "about:blank") {
title = browser.currentURI.spec;
crop = "center";
if (!title) {
if (browser.currentURI.spec) {
try {
title = this.mURIFixup.createExposableURI(browser.currentURI).spec;
}
catch(ex) {
title = browser.currentURI.spec;
}
}
if (title && title != "about:blank") {
// At this point, we now have a URI.
// Let's try to unescape it using a character set
// in case the URI is not ASCII.
try {
var characterSet = Components.lookupMethod(browser.contentDocument, 'characterSet')
.call(browser.contentDocument);
const textToSubURI = Components.classes["@mozilla.org/intl/texttosuburi;1"]
.getService(Components.interfaces.nsITextToSubURI);
title = textToSubURI.unEscapeNonAsciiURI(characterSet, title);
}
catch(ex) {
// Do nothing.
}
crop = "center";
} else // Still no title? Fall back to our untitled string.
title = this.mStringBundle.getString("tabs.untitled");
}
else
title = this.mStringBundle.getString("tabs.untitled");
aTab.label = title;
aTab.setAttribute("crop", crop);
@ -603,9 +617,9 @@
<![CDATA[
this.mTabbedMode = true; // Welcome to multi-tabbed mode.
// Get the first tab all hooked up with a title listener and popup blocking listener.
// Get the first tab all hooked up with a title listener.
this.mCurrentBrowser.addEventListener("DOMTitleChanged", this.onTitleChanged, false);
this.setTabTitle(this.mCurrentTab);
// Hook up our favicon.
@ -773,7 +787,7 @@
this.mTabFilters.splice(index, 1);
this.mTabListeners.splice(index, 1);
// Remove our title change and blocking listeners
// Remove our title change listener
oldBrowser.removeEventListener("DOMTitleChanged", this.onTitleChanged, false);
// We are no longer the primary content area.
@ -782,9 +796,6 @@
// Now select the new tab before nuking the old one.
var currentIndex = this.mPanelContainer.selectedIndex;
// Now select the new tab before nuking the old one.
var currentIndex = this.mPanelContainer.selectedIndex;
var newIndex = -1;
if (currentIndex > index)
newIndex = currentIndex-1;
@ -800,9 +811,6 @@
// clean up the before/afterselected attributes before removing the tab
oldTab.selected = false;
// XXX browser's destructor isn't always called, so we force a cleanup ourselves
oldBrowser.destroy();
this.mTabContainer.removeChild(oldTab);
this.mPanelContainer.removeChild(oldBrowser);
@ -1096,10 +1104,6 @@
</body>
</method>
<property name="pageReport"
onget="return this.mCurrentBrowser.pageReport;"
readonly="true"/>
<property name="currentURI"
onget="return this.mCurrentBrowser.currentURI;"
readonly="true"/>
@ -1148,6 +1152,10 @@
onget="return this.mCurrentBrowser.contentDocument;"
readonly="true"/>
<property name="contentTitle"
onget="return this.mCurrentBrowser.contentTitle;"
readonly="true"/>
<property name="securityUI"
onget="return this.mCurrentBrowser.securityUI;"
readonly="true"/>
@ -1156,7 +1164,6 @@
<![CDATA[
this.mCurrentBrowser = this.mPanelContainer.firstChild;
this.mCurrentTab = this.mTabContainer.firstChild;
this.mTabBox.setAttribute("handleCtrlTab", "false");
]]>
</constructor>