171101 - new toolbar customization features

This commit is contained in:
hewitt%netscape.com 2002-09-27 04:06:56 +00:00
Родитель e3872e9f1c
Коммит 5bc4bbc584
27 изменённых файлов: 1501 добавлений и 269 удалений

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

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

@ -2592,7 +2592,24 @@ function BrowserToolbarChanged()
function BrowserCustomizeToolbar()
{
window.openDialog("chrome://browser/content/customizeToolbar.xul", "Customize Toolbar", "modal,chrome,resizable=yes");
var cmd = document.getElementById("cmd_CustomizeToolbars");
cmd.setAttribute("disabled", "true");
var iframe = document.createElement("iframe");
iframe.flex = 1;
iframe.setAttribute("src", "chrome://global/content/customizeToolbar.xul");
gBrowser.parentNode.insertBefore(iframe, gBrowser);
gBrowser.collapsed = true;
}
function onToolbarCustomizeComplete()
{
var cmd = document.getElementById("cmd_CustomizeToolbars");
cmd.removeAttribute("disabled");
var iframe = gBrowser.previousSibling;
iframe.parentNode.removeChild(iframe);
gBrowser.collapsed = false;
}
var FullScreen =
@ -3000,6 +3017,48 @@ nsBrowserStatusHandler.prototype =
}
}
function onViewToolbarsPopupShowing(aEvent)
{
var popup = aEvent.target;
// Empty the menu
for (var i = popup.childNodes.length-1; i >= 0; --i) {
var deadItem = popup.childNodes[i];
if (deadItem.hasAttribute("toolbarindex"))
popup.removeChild(deadItem);
}
var firstMenuItem = popup.firstChild;
var toolbox = document.getElementById("navigator-toolbox");
for (var i = 0; i < toolbox.childNodes.length; ++i) {
var toolbar = toolbox.childNodes[i];
var toolbarName = toolbar.getAttribute("toolbarname");
if (toolbarName) {
var menuItem = document.createElement("menuitem");
menuItem.setAttribute("toolbarindex", i);
menuItem.setAttribute("type", "checkbox");
menuItem.setAttribute("label", toolbarName);
menuItem.setAttribute("accesskey", toolbar.getAttribute("accesskey"));
menuItem.setAttribute("checked", toolbar.getAttribute("collapsed") != "true");
popup.insertBefore(menuItem, firstMenuItem);
menuItem.addEventListener("command", onViewToolbarCommand, false);
}
toolbar = toolbar.nextSibling;
}
}
function onViewToolbarCommand(aEvent)
{
var toolbox = document.getElementById("navigator-toolbox");
var index = aEvent.originalTarget.getAttribute("toolbarindex");
var toolbar = toolbox.childNodes[index];
toolbar.collapsed = aEvent.originalTarget.getAttribute("checked") != "true";
document.persist(toolbar.id, "collapsed");
}
function displayPageInfo()
{
window.openDialog("chrome://navigator/content/pageInfo.xul", "_blank",

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

@ -118,7 +118,8 @@ Contributor(s):
<command id="cmd_quit"/>
<command id="cmd_close" oncommand="BrowserCloseTabOrWindow()"/>
<command id="cmd_closeWindow" oncommand="BrowserCloseWindow()"/>
<command id="cmd_CustomizeToolbars" oncommand="BrowserCustomizeToolbar()"/>
<command id="cmd_copyLink"
oncommand="goDoCommand('cmd_copyLink')"
disabled="false"/>
@ -228,7 +229,7 @@ Contributor(s):
<tooltip id="aHTMLTooltip" onpopupshowing="return FillInHTMLTooltip(document.tooltipNode);"/>
<popup id="toolbar-context-menu">
<menuitem oncommand="BrowserCustomizeToolbar()"
<menuitem command="cmd_CustomizeToolbars"
label="&viewCustomizeToolbar.label;"
accesskey="&viewCustomizeToolbar.accesskey;"/>
</popup>
@ -396,7 +397,7 @@ Contributor(s):
oncommand="gContextMenu.showMetadata();"/>
</popup>
<toolbox id="navigator-toolbox" class="toolbox-top">
<toolbox id="navigator-toolbox" class="toolbox-top" mode="icons">
<!-- Menu -->
<menubar id="main-menubar" class="chromeclass-menubar">
<menu label="&fileMenu.label;"
@ -467,15 +468,14 @@ Contributor(s):
<menu label="&viewMenu.label;" accesskey="&viewMenu.accesskey;">
<menupopup>
<menu label="&viewToolbarsMenu.label;" accesskey="&viewToolbarsMenu.accesskey;">
<menu label="&viewToolbarsMenu.label;" accesskey="&viewToolbarsMenu.accesskey;"
onpopupshowing="onViewToolbarsPopupShowing(event);">
<menupopup onpopupshowing="updateToolbarStates(this);">
<menuitem id="toggle_navbar" label="&navbarCmd.label;" accesskey="&navbarCmd.accesskey;" type="checkbox" oncommand="goToggleToolbar( 'nav-bar','toggle_navbar');" checked="true" />
<menuitem id="toggle_ptoolbar" label="&personalbarCmd.label;" accesskey="&personalbarCmd.accesskey;" type="checkbox" oncommand="goToggleToolbar('PersonalToolbar','toggle_ptoolbar');" checked="true" />
<menuitem id="toggle_taskbar" label="&taskbarCmd.label;" accesskey="&taskbarCmd.accesskey;" type="checkbox" oncommand="goToggleToolbar('status-bar','toggle_taskbar');" checked="true" />
</menupopup>
</menu>
<menuitem label="&viewCustomizeToolbar.label;" accesskey="&viewCustomizeToolbar.accesskey;"
oncommand="BrowserCustomizeToolbar()"/>
command="cmd_CustomizeToolbars"/>
<menuitem accesskey="&fullScreenCmd.accesskey;"
label="&fullScreenCmd.label;" key="key_fullScreen"
command="View:FullScreen"/>
@ -683,104 +683,115 @@ Contributor(s):
</menu>
</menubar>
<toolbar class="toolbar-primary chromeclass-toolbar" id="nav-bar"
fullscreentoolbar="true" mode="icons"
defaultset="back-button,forward-button,reload-button,stop-button,urlbar-container,throbber-box"
<toolbarpalette>
<toolbarbutton id="back-button" type="menu-button" class="toolbarbutton-1"
label="&backCmd.label;"
command="Browser:Back"
context="backMenu"
tooltiptext="&backButton.tooltip;">
<menupopup context="" onpopupshowing="BrowserBackMenu(event);"
oncommand="gotoHistoryIndex(event); event.preventBubble();"/>
</toolbarbutton>
<toolbarbutton id="forward-button" type="menu-button" class="toolbarbutton-1"
label="&forwardCmd.label;"
command="Browser:Forward"
context="forwardMenu"
tooltiptext="&forwardButton.tooltip;">
<menupopup context="" oncommand="gotoHistoryIndex(event); event.preventBubble()"
onpopupshowing="BrowserForwardMenu(event);"/>
</toolbarbutton>
<toolbarbutton id="reload-button" class="toolbarbutton-1"
label="&reloadCmd.label;"
oncommand="if (event.shiftKey) BrowserReloadSkipCache(); else BrowserReload();"
tooltiptext="&reloadButton.tooltip;"/>
<toolbarbutton id="stop-button" class="toolbarbutton-1"
label="&stopCmd.label;"
command="Browser:Stop"
tooltiptext="&stopButton.tooltip;"/>
<toolbarbutton id="home-button" class="toolbarbutton-1"
label="&homeButton.label;"
ondragover="nsDragAndDrop.dragOver(event, homeButtonObserver);"
ondragdrop="nsDragAndDrop.drop(event, homeButtonObserver);"
ondragexit="nsDragAndDrop.dragExit(event, homeButtonObserver);"
oncommand="BrowserHome();"/>
<toolbaritem id="urlbar-container" align="center" flex="1"
class="chromeclass-location">
<textbox id="urlbar" flex="1"
type="autocomplete" searchSessions="history"
timeout="50" maxrows="6" alwaysopenpopup="true"
disablehistory="false"
defaultSearchEngine="true" tabScrolling="true"
showCommentColumn="true"
inputtooltiptext="&locationBar.tooltip;"
oninput="window.XULBrowserWindow.userTyped.value=true;"
ontextcommand="return handleURLBarCommand(eventParam, domEvent);"
ontextrevert="return handleURLBarRevert();"
onfocus="URLBarFocusHandler(event);"
onmousedown="URLBarMouseDownHandler(event);"
onclick="URLBarClickHandler(event);">
<deck id="page-proxy-deck">
<image id="page-proxy-button"
ondraggesture="PageProxyDragGesture(event);"
tooltiptext="&proxyIcon.tooltip;"/>
<image id="page-proxy-favicon" validate="never"
ondraggesture="PageProxyDragGesture(event);"
onload="this.parentNode.selectedIndex = 1;
event.stopPropagation();
event.preventBubble();
HandleBookmarkIcon(this.src, true);"
onerror="gBrowser.addToMissedIconCache(this.src); HandleBookmarkIcon(this.src, false);"
tooltiptext="&proxyIcon.tooltip;"/>
</deck>
<menupopup class="autocomplete-history-popup"
popupalign="topleft" popupanchor="bottomleft"
onpopupshowing="createUBHistoryMenu(event.target);"
oncommand="executeUrlBarHistoryCommand(event.target);"/>
</textbox>
</toolbaritem>
<toolbaritem id="search-container" align="center" class="chromeclass-location">
<textbox id="search-bar" flex="1"/>
</toolbaritem>
<toolbaritem id="go-container" align="center" class="chromeclass-location">
<button id="go-button" class="button-toolbar"
label="&goButton.label;"
oncommand="addToUrlbarHistory(); BrowserLoadURL();"
ondragover="nsDragAndDrop.dragOver(event, goButtonObserver);"
ondragdrop="nsDragAndDrop.drop(event, goButtonObserver);"
ondragexit="nsDragAndDrop.dragExit(event, goButtonObserver);"
tooltiptext="&goButton.tooltip;"/>
</toolbaritem>
<toolbarbutton id="print-button" class="toolbarbutton-1"
label="&printButton.label;"
oncommand="BrowserPrint();"
tooltiptext="&printButton.tooltip;"/>
<toolbaritem id="throbber-box" align="center" pack="center">
<button id="navigator-throbber" oncommand="goClickThrobber('browser.throbber.url')"
tooltiptext="&throbber.tooltip;"/>
</toolbaritem>
<toolbaritem id="personal-bookmarks" flex="1">
<bookmarks-toolbar id="bookmarks-toolbar" flex="1"/>
</toolbaritem>
</toolbarpalette>
<toolbar id="nav-bar" class="toolbar-primary chromeclass-toolbar"
toolbarname="&navbarCmd.label;" accesskey="&navbarCmd.accesskey;"
fullscreentoolbar="true"
customizable="true" mode="icons"
defaultset="back-button,forward-button,urlbar-container,reload-button,stop-button,throbber-box"
context="toolbar-context-menu">
<toolbarpalette>
<toolbarbutton id="back-button" type="menu-button" class="toolbarbutton-1"
label="&backCmd.label;"
command="Browser:Back"
context="backMenu"
tooltiptext="&backButton.tooltip;">
<menupopup context="" onpopupshowing="BrowserBackMenu(event);"
oncommand="gotoHistoryIndex(event); event.preventBubble();"/>
</toolbarbutton>
<toolbarbutton id="forward-button" type="menu-button" class="toolbarbutton-1"
label="&forwardCmd.label;"
command="Browser:Forward"
context="forwardMenu"
tooltiptext="&forwardButton.tooltip;">
<menupopup context="" oncommand="gotoHistoryIndex(event); event.preventBubble()"
onpopupshowing="BrowserForwardMenu(event);"/>
</toolbarbutton>
<toolbarbutton id="reload-button" class="toolbarbutton-1"
label="&reloadCmd.label;"
oncommand="if (event.shiftKey) BrowserReloadSkipCache(); else BrowserReload();"
tooltiptext="&reloadButton.tooltip;"/>
<toolbarbutton id="stop-button" class="toolbarbutton-1"
label="&stopCmd.label;"
command="Browser:Stop"
tooltiptext="&stopButton.tooltip;"/>
<toolbarbutton id="home-button" class="toolbarbutton-1"
label="&homeButton.label;"
ondragover="nsDragAndDrop.dragOver(event, homeButtonObserver);"
ondragdrop="nsDragAndDrop.drop(event, homeButtonObserver);"
ondragexit="nsDragAndDrop.dragExit(event, homeButtonObserver);"
oncommand="BrowserHome();"/>
<toolbaritem id="urlbar-container" align="center" flex="1"
class="chromeclass-location">
<textbox id="urlbar" flex="1"
type="autocomplete" searchSessions="history"
timeout="50" maxrows="6" alwaysopenpopup="true"
disablehistory="false"
defaultSearchEngine="true" tabScrolling="true"
showCommentColumn="true"
inputtooltiptext="&locationBar.tooltip;"
oninput="window.XULBrowserWindow.userTyped.value=true;"
ontextcommand="return handleURLBarCommand(eventParam, domEvent);"
ontextrevert="return handleURLBarRevert();"
onfocus="URLBarFocusHandler(event);"
onmousedown="URLBarMouseDownHandler(event);"
onclick="URLBarClickHandler(event);">
<deck id="page-proxy-deck">
<image id="page-proxy-button"
ondraggesture="PageProxyDragGesture(event);"
tooltiptext="&proxyIcon.tooltip;"/>
<image id="page-proxy-favicon" validate="never"
ondraggesture="PageProxyDragGesture(event);"
onload="this.parentNode.selectedIndex = 1;
event.stopPropagation();
event.preventBubble();
HandleBookmarkIcon(this.src, true);"
onerror="gBrowser.addToMissedIconCache(this.src); HandleBookmarkIcon(this.src, false);"
tooltiptext="&proxyIcon.tooltip;"/>
</deck>
<menupopup class="autocomplete-history-popup"
popupalign="topleft" popupanchor="bottomleft"
onpopupshowing="createUBHistoryMenu(event.target);"
oncommand="executeUrlBarHistoryCommand(event.target);"/>
</textbox>
</toolbaritem>
<toolbaritem id="go-container" align="center" class="chromeclass-location">
<button id="go-button" class="button-toolbar"
label="&goButton.label;"
oncommand="addToUrlbarHistory(); BrowserLoadURL();"
ondragover="nsDragAndDrop.dragOver(event, goButtonObserver);"
ondragdrop="nsDragAndDrop.drop(event, goButtonObserver);"
ondragexit="nsDragAndDrop.dragExit(event, goButtonObserver);"
tooltiptext="&goButton.tooltip;"/>
</toolbaritem>
<toolbarbutton id="print-button" class="toolbarbutton-1"
label="&printButton.label;"
oncommand="BrowserPrint();"
tooltiptext="&printButton.tooltip;"/>
<toolbaritem id="throbber-box" align="center" pack="center">
<button id="navigator-throbber" oncommand="goClickThrobber('browser.throbber.url')"
tooltiptext="&throbber.tooltip;"/>
</toolbaritem>
</toolbarpalette>
<hbox id="window-controls" hidden="true" fullscreencontrol="true">
<hbox id="window-controls" hidden="true" fullscreencontrol="true">
<toolbarbutton id="minimize-button" class="toolbarbutton-1"
oncommand="window.minimize();"/>
@ -791,12 +802,13 @@ Contributor(s):
oncommand="window.close();"/>
</hbox>
</toolbar>
<!-- Bookmarks in the personal toolbar folder -->
<toolbar id="PersonalToolbar" class="chromeclass-directories">
<bookmarks-toolbar id="bookmarks-toolbar" flex="1"/>
</toolbar>
<toolbarset id="customToolbars" context="toolbar-context-menu"/>
<toolbar id="PersonalToolbar" class="chromeclass-directories"
customizable="true" defaultset="personal-bookmarks"
toolbarname="&personalbarCmd.label;" accesskey="&personalbarCmd.accesskey;"/>
</toolbox>
<!-- we only need to handle |ondragdrop| because everything else is

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

@ -3,9 +3,6 @@ browser.jar:
content/browser/browser.xul (content/browser.xul)
content/browser/browser.js (content/browser.js)
content/browser/utilityOverlay.js (content/utilityOverlay.js)
content/browser/customizeToolbar.xul (content/customizeToolbar.xul)
content/browser/customizeToolbar.js (content/customizeToolbar.js)
content/browser/customizeToolbar.css (content/customizeToolbar.css)
content/browser/about.gif (content/about.gif)
content/browser/aboutDialog.xul (content/aboutDialog.xul)
content/browser/viewPartialSource.xul (content/viewPartialSource.xul)
@ -32,9 +29,9 @@ classic.jar:
skin/classic/browser/home-small.png (skin/home-small.png)
skin/classic/browser/print-small.png (skin/print-small.png)
skin/classic/browser/bookmarks.png (skin/bookmarks.png)
skin/classic/browser/bookmark-large.png (skin/bookmark-large.png)
skin/classic/browser/dropmarker.png (skin/dropmarker.png)
skin/classic/browser/close.png (skin/close.png)
skin/classic/browser/customizeToolbar.css (skin/customizeToolbar.css)
skin/classic/browser/browser.xml (skin/browser.xml)
skin/classic/browser/throbber-stopped.gif (skin/throbber-stopped.gif)
skin/classic/browser/throbber.gif (skin/throbber.gif)
@ -48,7 +45,6 @@ en-US.jar:
locale/en-US/browser/contents.rdf (locale/contents.rdf)
locale/en-US/browser/browser.dtd (locale/browser.dtd)
locale/en-US/browser/browser.properties (locale/browser.properties)
locale/en-US/browser/customizeToolbar.dtd (locale/customizeToolbar.dtd)
locale/en-US/browser/aboutDialog.dtd (locale/aboutDialog.dtd)
locale/en-US/browser/viewSource.dtd (locale/viewSource.dtd)
locale/en-US/browser/openLocation.dtd (locale/openLocation.dtd)

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

@ -146,7 +146,7 @@
<!ENTITY viewMenu.accesskey "V">
<!ENTITY viewToolbarsMenu.label "Show/Hide">
<!ENTITY viewToolbarsMenu.accesskey "w">
<!ENTITY viewCustomizeToolbar.label "Customize Toolbar...">
<!ENTITY viewCustomizeToolbar.label "Customize Toolbars...">
<!ENTITY viewCustomizeToolbar.accesskey "t">
<!ENTITY showTaskbarCmd.label "Status Bar">
<!ENTITY showTaskbarCmd.accesskey "S">

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

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

@ -78,11 +78,21 @@ toolbarbutton.bookmark-item:not([container="true"]):hover:active {
height: 16px;
}
/* Prevent [mode="icons"] from hiding the label */
.bookmark-item > .toolbarbutton-text {
display: -moz-box !important;
}
.bookmark-item > .toolbarbutton-menu-dropmarker {
display: none;
}
toolbarpaletteitem[type="bookmarks"] {
background: url("chrome://browser/skin/bookmark-large.png") no-repeat center;
}
/* ::::: bookmark menus ::::: */
menu.bookmark-item,
menuitem.bookmark-item {
min-width: 0;
@ -466,6 +476,10 @@ toolbar[iconsize="small"] #print-button[disabled="true"] {
margin: 2px 3px;
}
#search-bar {
width: 12em;
}
/* ::::: page proxy icon ::::: */
#page-proxy-deck,
@ -503,11 +517,8 @@ toolbar[iconsize="small"] #print-button[disabled="true"] {
}
/* ::::: autocomplete ::::: */
.autocomplete-outlinerbody:-moz-outliner-cell-text(value) {
padding-left: 15px;
}
.autocomplete-outlinerbody:-moz-outliner-cell-text(comment) {
.autocomplete-treebody:-moz-outliner-cell-text(treecolAutoCompleteComment) {
color: #555566;
}
@ -615,10 +626,12 @@ toolbar[iconsize="small"] #print-button[disabled="true"] {
/* ::::: throbber ::::: */
#navigator-throbber {
-moz-appearance: none;
-moz-user-focus: ignore;
padding: 0px !important;
border: none !important;
margin: 2px 4px !important;
border: none !important;
padding: 0px !important;
min-width: 0;
background-color: transparent;
list-style-image: url("chrome://browser/skin/throbber-stopped.gif");
}

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

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

@ -0,0 +1,41 @@
/*
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is David Hyatt.
Portions created by David Hyatt are
Copyright (C) 2002 David Hyatt. All
Rights Reserved.
Contributor(s):
David Hyatt (hyatt@apple.com)
Blake Ross (blaker@netscape.com)
*/
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); /* set default namespace to XUL */
@namespace html url("http://www.w3.org/1999/xhtml"); /* namespace for HTML elements */
#palette-box {
overflow: auto;
margin: 0px 15px 10px 15px;
}
#palette-box > hbox > toolbarpaletteitem {
padding-top: 8px;
padding-bottom: 8px;
}
#palette-box > hbox {
min-height: 8em;
}

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

@ -0,0 +1,910 @@
/*
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is David Hyatt.
Portions created by David Hyatt are
Copyright (C) 2002 David Hyatt. All
Rights Reserved.
Contributor(s):
David Hyatt (hyatt@apple.com)
Blake Ross (blaker@netscape.com)
Joe Hewitt (hewitt@netscape.com)
*/
const kRowMax = 4;
var gToolboxDocument = null;
var gToolbox = null;
var gCurrentDragOverItem = null;
var gToolboxChanged = false;
var gPreviousSets = {};
var gPreviousMode = null;
var gPreviousIconSize = null;
function onLoad()
{
gToolboxDocument = window.opener ? window.opener.document : window.parent.document;
gToolbox = gToolboxDocument.getElementsByTagName("toolbox")[0];
gToolbox.addEventListener("draggesture", onToolbarDragGesture, false);
gToolbox.addEventListener("dragover", onToolbarDragOver, false);
gToolbox.addEventListener("dragexit", onToolbarDragExit, false);
gToolbox.addEventListener("dragdrop", onToolbarDragDrop, false);
var mode = gToolbox.getAttribute("mode");
document.getElementById("modelist").value = mode;
var iconSize = gToolbox.getAttribute("iconsize");
document.getElementById("smallicons").checked = iconSize == "small";
// The dialog version has the option to position/size itself.
if (window.opener) {
var cover = window.arguments ? window.arguments[0] : null;
if (cover) {
document.documentElement.setAttribute("hidechrome", "true");
window.screenX = cover.boxObject.screenX;
window.screenY = cover.boxObject.screenY;
window.outerWidth = cover.boxObject.width;
window.outerHeight = cover.boxObject.height;
} else {
// Position the dialog just after the toolbox.
window.screenY = gToolbox.boxObject.screenY + gToolbox.boxObject.height;
}
}
cacheCurrentState();
// Build up the palette of other items.
buildPalette();
// Wrap all the items on the toolbar in toolbarpaletteitems.
wrapToolbarItems();
}
function onAccept(aEvent)
{
removeToolboxListeners();
unwrapToolbarItems();
persistCurrentSets();
notifyParentComplete();
}
function onCancel(aEvent)
{
removeToolboxListeners();
reverToPreviousState();
unwrapToolbarItems();
notifyParentComplete();
}
function removeToolboxListeners()
{
gToolbox.removeEventListener("draggesture", onToolbarDragGesture, false);
gToolbox.removeEventListener("dragover", onToolbarDragOver, false);
gToolbox.removeEventListener("dragexit", onToolbarDragExit, false);
gToolbox.removeEventListener("dragdrop", onToolbarDragDrop, false);
}
/**
* Invoke a callback on our parent window to notify it that
* the dialog is done and going away.
*/
function notifyParentComplete()
{
var parent = window.parent ? window.parent : window.opener;
if (parent && "onToolbarCustomizeComplete" in parent.top)
parent.top.onToolbarCustomizeComplete();
}
/**
* Cache the current state of all customizable toolbars so
* that we can undo changes.
*/
function cacheCurrentState()
{
gPreviousMode = gToolbox.getAttribute("mode");
gPreviousIconSize = gToolbox.getAttribute("iconsize");
var currentIndex = 0;
for (var i = 0; i < gToolbox.childNodes.length; ++i) {
var toolbar = gToolbox.childNodes[i];
if (isCustomizableToolbar(toolbar)) {
var currentSet = toolbar.getAttribute("currentset");
if (!currentSet)
currentSet = toolbar.getAttribute("defaultset");
gPreviousSets[toolbar.id] = currentSet;
}
}
}
/**
* Revert the currentset of each customizable toolbar to the value
* that we cached when first opening the dialog and remove toolbars
* that were added.
*/
function reverToPreviousState()
{
updateIconSize(gPreviousIconSize);
updateToolbarMode(gPreviousMode);
if (!gToolboxChanged)
return;
var currentIndex = 0;
for (var i = 0; i < gToolbox.childNodes.length; ++i) {
var toolbar = gToolbox.childNodes[i];
if (isCustomizableToolbar(toolbar)) {
if (toolbar.id in gPreviousSets) {
// Restore the currentset of previously existing toolbars.
toolbar.currentSet = gPreviousSets[toolbar.id];
} else {
// Remove toolbars that have been added.
gToolbox.removeChild(toolbar);
}
}
}
// Add back toolbars that have been removed.
for (var toolbarId in gPreviousSets) {
var toolbar = gToolboxDocument.getElementById(toolbarId);
if (!toolbar)
gToolbox.appendCustomToolbar("", gPreviousSets[toolbarId]);
}
}
/**
* Persist the current set of buttons in all customizable toolbars to
* localstore.
*/
function persistCurrentSets()
{
if (!gToolboxChanged)
return;
var customCount = 0;
for (var i = 0; i < gToolbox.childNodes.length; ++i) {
// Look for customizable toolbars that need to be persisted.
var toolbar = gToolbox.childNodes[i];
if (isCustomizableToolbar(toolbar)) {
// Calculate currentset and store it in the attribute.
var currentSet = toolbar.currentSet;
toolbar.setAttribute("currentset", currentSet);
var customIndex = toolbar.hasAttribute("customindex");
if (customIndex) {
if (!toolbar.firstChild) {
// Remove custom toolbars whose contents have been removed.
gToolbox.removeChild(toolbar);
--i;
} else {
// Persist custom toolbar info on the <toolbarset/>
gToolbox.toolbarset.setAttribute("toolbar"+(++customCount),
toolbar.toolbarName + ":" + currentSet);
gToolboxDocument.persist(gToolbox.toolbarset.id, "toolbar"+customCount);
}
}
if (!customIndex) {
// Persist the currentset attribute directly on hardcoded toolbars.
gToolboxDocument.persist(toolbar.id, "currentset");
}
}
}
// Remove toolbarX attributes for removed toolbars.
while (gToolbox.toolbarset.hasAttribute("toolbar"+(++customCount))) {
dump(customCount + " gone\n");
gToolbox.toolbarset.removeAttribute("toolbar"+customCount);
gToolboxDocument.persist(gToolbox.toolbarset.id, "toolbar"+customCount);
}
}
/**
* Wraps all items in all customizable toolbars in a toolbox.
*/
function wrapToolbarItems()
{
for (var i = 0; i < gToolbox.childNodes.length; ++i) {
var toolbar = gToolbox.childNodes[i];
if (isCustomizableToolbar(toolbar)) {
for (var k = 0; k < toolbar.childNodes.length; ++k) {
var item = toolbar.childNodes[k];
if (isToolbarItem(item)) {
var nextSibling = item.nextSibling;
var wrapper = wrapToolbarItem(item);
if (nextSibling)
toolbar.insertBefore(wrapper, nextSibling);
else
toolbar.appendChild(wrapper);
}
}
}
}
}
/**
* Unwraps all items in all customizable toolbars in a toolbox.
*/
function unwrapToolbarItems()
{
var paletteItems = gToolbox.getElementsByTagName("toolbarpaletteitem");
for (var i = 0; i < paletteItems.length; ++i) {
var paletteItem = paletteItems[i];
var toolbarItem = paletteItem.firstChild;
if (paletteItem.hasAttribute("itemdisabled"))
toolbarItem.disabled = true;
if (paletteItem.hasAttribute("itemcommand"))
toolbarItem.setAttribute("command", paletteItem.getAttribute("itemcommand"));
paletteItem.removeChild(toolbarItem);
paletteItem.parentNode.replaceChild(toolbarItem, paletteItem);
}
}
/**
* Creates a wrapper that can be used to contain a toolbaritem and prevent
* it from receiving UI events.
*/
function createWrapper(aId)
{
var wrapper = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"toolbarpaletteitem");
wrapper.id = "wrapper-"+aId;
return wrapper;
}
/**
* Wraps an item that has been cloned from a template and adds
* it to the end of a row in the palette.
*/
function wrapPaletteItem(aPaletteItem, aCurrentRow, aSpacer)
{
var wrapper = createWrapper(aPaletteItem.id);
if (aPaletteItem.localName == "toolbarseparator") {
wrapper.setAttribute("type", "separator");
} else if (aPaletteItem.localName == "spacer") {
wrapper.setAttribute("type", "spacer");
} else {
wrapper.setAttribute("align", "center");
}
wrapper.setAttribute("flex", 1);
wrapper.setAttribute("pack", "center");
wrapper.setAttribute("minheight", "0");
wrapper.setAttribute("minwidth", "0");
wrapper.appendChild(aPaletteItem);
// XXX We need to call this AFTER the palette item has been appended
// to the wrapper or else we crash dropping certain buttons on the
// palette due to removal of the command and disabled attributes - JRH
cleanUpItemForPalette(aPaletteItem, wrapper);
if (aSpacer)
aCurrentRow.insertBefore(wrapper, aSpacer);
else
aCurrentRow.appendChild(wrapper);
}
/**
* Wraps an item that is currently on a toolbar and replaces the item
* with the wrapper.
*/
function wrapToolbarItem(aToolbarItem)
{
var wrapper = createWrapper(aToolbarItem.id);
cleanupItemForToolbar(aToolbarItem, wrapper);
wrapper.flex = aToolbarItem.flex;
if (aToolbarItem.parentNode)
aToolbarItem.parentNode.removeChild(aToolbarItem);
wrapper.appendChild(aToolbarItem);
return wrapper;
}
/**
* Get the list of ids for the current set of items on each toolbar.
*/
function getCurrentItemIds()
{
var currentItems = {};
for (var i = 0; i < gToolbox.childNodes.length; ++i) {
var toolbar = gToolbox.childNodes[i];
if (isCustomizableToolbar(toolbar)) {
var currentSet = toolbar.getAttribute("currentset");
if (currentSet == "__empty")
continue;
else if (!currentSet)
currentSet = toolbar.getAttribute("defaultset");
var ids = currentSet.split(",");
for (var k = 0; k < ids.length; ++k)
currentItems[ids[k]] = 1;
}
}
return currentItems;
}
/**
* Builds the palette of draggable items that are not yet in a toolbar.
*/
function buildPalette()
{
// Empty the palette first.
var paletteBox = document.getElementById("palette-box");
while (paletteBox.firstChild)
paletteBox.removeChild(paletteBox.firstChild);
var currentRow = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"hbox");
currentRow.setAttribute("class", "paletteRow");
// Add the toolbar separator item.
var templateNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"toolbarseparator");
templateNode.id = "separator";
wrapPaletteItem(templateNode, currentRow, null);
// Add the toolbar spacer item.
templateNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"spacer");
templateNode.id = "spacer";
templateNode.flex = 1;
wrapPaletteItem(templateNode, currentRow, null);
var rowSlot = 2;
var currentItems = getCurrentItemIds();
templateNode = gToolbox.palette.firstChild;
while (templateNode) {
// Check if the item is already in a toolbar before adding it to the palette.
if (!(templateNode.id in currentItems)) {
var paletteItem = templateNode.cloneNode(true);
if (rowSlot == kRowMax) {
// Append the old row.
paletteBox.appendChild(currentRow);
// Make a new row.
currentRow = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"hbox");
currentRow.setAttribute("class", "paletteRow");
rowSlot = 0;
}
++rowSlot;
wrapPaletteItem(paletteItem, currentRow, null);
}
templateNode = templateNode.nextSibling;
}
if (currentRow) {
fillRowWithFlex(currentRow);
paletteBox.appendChild(currentRow);
}
}
/**
* Creates a new palette item for a cloned template node and
* adds it to the last slot in the palette.
*/
function appendPaletteItem(aItem)
{
var paletteBox = document.getElementById("palette-box");
var lastRow = paletteBox.lastChild;
var lastSpacer = lastRow.lastChild;
if (lastSpacer.localName != "spacer") {
// The current row is full, so we have to create a new row.
lastRow = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"hbox");
lastRow.setAttribute("class", "paletteRow");
paletteBox.appendChild(lastRow);
wrapPaletteItem(aItem, lastRow, null);
fillRowWithFlex(lastRow);
} else {
// Decrement the flex of the last spacer or remove it entirely.
var flex = lastSpacer.getAttribute("flex");
if (flex == 1) {
lastRow.removeChild(lastSpacer);
lastSpacer = null;
} else
lastSpacer.setAttribute("flex", --flex);
// Insert the wrapper where the last spacer was.
wrapPaletteItem(aItem, lastRow, lastSpacer);
}
}
function fillRowWithFlex(aRow)
{
var remainingFlex = kRowMax - aRow.childNodes.length;
if (remainingFlex > 0) {
var spacer = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"spacer");
spacer.setAttribute("flex", remainingFlex);
aRow.appendChild(spacer);
}
}
/**
* Makes sure that an item that has been cloned from a template
* is stripped of all properties that may adversely affect it's
* appearance in the palette.
*/
function cleanUpItemForPalette(aItem, aWrapper)
{
// Mark special types of palette items so we can style them.
if (aItem.localName == "toolbarseparator") {
aWrapper.setAttribute("type", "separator");
} else if (aItem.localName == "spacer") {
aWrapper.setAttribute("type", "spacer");
} else if (aItem.firstChild && aItem.firstChild.localName == "bookmarks-toolbar") {
aWrapper.setAttribute("type", "bookmarks");
}
// Remove attributes that screw up our appearance.
aItem.removeAttribute("command");
aItem.removeAttribute("observes");
aItem.removeAttribute("disabled");
aItem.removeAttribute("type");
if (aItem.localName == "toolbaritem" && aItem.firstChild) {
aItem.firstChild.removeAttribute("observes");
// So the throbber doesn't throb in the dialog,
// cute as that may be...
aItem.firstChild.removeAttribute("busy");
}
}
/**
* Makes sure that an item that has been cloned from a template
* is stripped of all properties that may adversely affect it's
* appearance in the toolbar. Store critical properties on the
* wrapper so they can be put back on the item when we're done.
*/
function cleanupItemForToolbar(aItem, aWrapper)
{
if (aItem.localName == "toolbarseparator") {
aWrapper.setAttribute("type", "separator");
} else if (aItem.localName == "spacer") {
aWrapper.setAttribute("type", "spacer");
}
if (aItem.hasAttribute("command")) {
aWrapper.setAttribute("itemcommand", aItem.getAttribute("command"));
aItem.removeAttribute("command");
}
if (aItem.disabled) {
aWrapper.setAttribute("itemdisabled", "true");
aItem.disabled = false;
}
}
function setDragActive(aItem, aValue)
{
var node = aItem;
var value = "left";
if (aItem.localName == "toolbar") {
node = aItem.lastChild;
value = "right";
}
if (!node)
return;
if (aValue) {
if (!node.hasAttribute("dragover"))
node.setAttribute("dragover", value);
} else {
node.removeAttribute("dragover");
}
}
function addNewToolbar()
{
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
var stringBundle = document.getElementById("stringBundle");
var message = stringBundle.getString("enterToolbarName");
var title = stringBundle.getString("enterToolbarTitle");
var name = {};
while (1) {
if (!promptService.prompt(window, title, message, name, null, {})) {
return;
} else {
// Check for an existing toolbar with the same name and prompt again
// if a conflict is found
var nameToId = "__customToolbar_" + name.value.replace(" ", "");
var existingToolbar = gToolboxDocument.getElementById(nameToId);
if (existingToolbar) {
message = stringBundle.getFormattedString("enterToolbarDup", [name.value]);
} else {
break;
}
}
}
gToolbox.appendCustomToolbar(name.value, "");
gToolboxChanged = true;
}
/**
* Restore the default set of buttons to fixed toolbars,
* remove all custom toolbars, and rebuild the palette.
*/
function restoreDefaultSet()
{
// Restore the defaultset for fixed toolbars.
var toolbar = gToolbox.firstChild;
while (toolbar) {
if (isCustomizableToolbar(toolbar)) {
if (!toolbar.hasAttribute("customindex")) {
var defaultSet = toolbar.getAttribute("defaultset");
if (defaultSet)
toolbar.currentSet = defaultSet;
}
}
toolbar = toolbar.nextSibling;
}
// Remove all of the customized toolbars.
var child = gToolbox.lastChild;
while (child) {
if (child.hasAttribute("customindex")) {
var thisChild = child;
child = child.previousSibling;
gToolbox.removeChild(thisChild);
} else {
child = child.previousSibling;
}
}
// Now re-wrap the items on the toolbar.
wrapToolbarItems();
// Now rebuild the palette.
buildPalette();
gToolboxChanged = true;
}
function updateIconSize(aUseSmallIcons)
{
var val = aUseSmallIcons ? "small" : null;
setAttribute(gToolbox, "iconsize", val);
gToolboxDocument.persist(gToolbox.id, "iconsize");
for (var i = 0; i < gToolbox.childNodes.length; ++i) {
var toolbar = gToolbox.childNodes[i];
if (isCustomizableToolbar(toolbar)) {
setAttribute(toolbar, "iconsize", val);
gToolboxDocument.persist(toolbar.id, "iconsize");
}
}
}
function updateToolbarMode(aModeValue)
{
setAttribute(gToolbox, "mode", aModeValue);
gToolboxDocument.persist(gToolbox.id, "mode");
for (var i = 0; i < gToolbox.childNodes.length; ++i) {
var toolbar = gToolbox.childNodes[i];
if (isCustomizableToolbar(toolbar)) {
setAttribute(toolbar, "mode", aModeValue);
gToolboxDocument.persist(toolbar.id, "mode");
}
}
var iconSizeCheckbox = document.getElementById("smallicons");
if (aModeValue == "text") {
iconSizeCheckbox.disabled = true;
iconSizeCheckbox.checked = false;
updateIconSize(false);
}
else {
iconSizeCheckbox.disabled = false;
}
}
function setAttribute(aElt, aAttr, aVal)
{
if (aVal)
aElt.setAttribute(aAttr, aVal);
else
aElt.removeAttribute(aAttr);
}
function isCustomizableToolbar(aElt)
{
return aElt.localName == "toolbar" &&
aElt.getAttribute("customizable") == "true";
}
function isToolbarItem(aElt) {
return aElt.localName == "toolbarbutton" ||
aElt.localName == "toolbaritem" ||
aElt.localName == "toolbarseparator" ||
aElt.localName == "spacer";
}
///////////////////////////////////////////////////////////////////////////
//// Drag and Drop observers
function onToolbarDragGesture(aEvent)
{
nsDragAndDrop.startDrag(aEvent, dragStartObserver);
}
function onToolbarDragOver(aEvent)
{
nsDragAndDrop.dragOver(aEvent, toolbarDNDObserver);
}
function onToolbarDragDrop(aEvent)
{
nsDragAndDrop.drop(aEvent, toolbarDNDObserver);
}
function onToolbarDragExit(aEvent)
{
if (gCurrentDragOverItem)
setDragActive(gCurrentDragOverItem, false);
}
var dragStartObserver =
{
onDragStart: function (aEvent, aXferData, aDragAction) {
var documentId = gToolboxDocument.documentElement.id;
var item = aEvent.target;
while (item && item.localName != "toolbarpaletteitem")
item = item.parentNode;
item.setAttribute("dragactive", "true");
aXferData.data = new TransferDataSet();
var data = new TransferData();
data.addDataForFlavour("text/toolbarwrapper-id/"+documentId, item.firstChild.id);
aXferData.data.push(data);
}
}
var toolbarDNDObserver =
{
onDragOver: function (aEvent, aFlavour, aDragSession)
{
var toolbar = aEvent.target;
while (toolbar && toolbar.localName != "toolbar")
toolbar = toolbar.parentNode;
var previousDragItem = gCurrentDragOverItem;
// Make sure we are dragging over a customizable toolbar.
if (!isCustomizableToolbar(toolbar)) {
gCurrentDragOverItem = null;
return;
}
if (aEvent.target.localName == "toolbar") {
gCurrentDragOverItem = aEvent.target;
} else {
var dropTargetWidth = aEvent.target.boxObject.width;
var dropTargetX = aEvent.target.boxObject.x;
gCurrentDragOverItem = null;
if (aEvent.clientX > (dropTargetX + (dropTargetWidth / 2))) {
gCurrentDragOverItem = aEvent.target.nextSibling;
if (!gCurrentDragOverItem)
gCurrentDragOverItem = toolbar;
} else
gCurrentDragOverItem = aEvent.target;
}
if (previousDragItem && gCurrentDragOverItem != previousDragItem) {
setDragActive(previousDragItem, false);
}
setDragActive(gCurrentDragOverItem, true);
aDragSession.canDrop = true;
},
onDrop: function (aEvent, aXferData, aDragSession)
{
if (!gCurrentDragOverItem)
return;
setDragActive(gCurrentDragOverItem, false);
var draggedItemId = aXferData.data;
if (gCurrentDragOverItem.id == draggedItemId)
return;
var toolbar = aEvent.target;
while (toolbar.localName != "toolbar")
toolbar = toolbar.parentNode;
var draggedPaletteWrapper = document.getElementById("wrapper-"+draggedItemId);
if (!draggedPaletteWrapper) {
// The wrapper has been dragged from the toolbar.
// Get the wrapper from the toolbar document and make sure that
// it isn't being dropped on itself.
var wrapper = gToolboxDocument.getElementById("wrapper-"+draggedItemId);
if (wrapper == gCurrentDragOverItem)
return;
// Remove the item from it's place in the toolbar.
wrapper.parentNode.removeChild(wrapper);
// Determine which toolbar we are dropping on.
var dropToolbar = null;
if (gCurrentDragOverItem.localName == "toolbar")
dropToolbar = gCurrentDragOverItem;
else
dropToolbar = gCurrentDragOverItem.parentNode;
// Insert the item into the toolbar.
if (gCurrentDragOverItem != dropToolbar)
dropToolbar.insertBefore(wrapper, gCurrentDragOverItem);
else
dropToolbar.appendChild(wrapper);
} else {
// The item has been dragged from the palette
// Create a new wrapper for the item. We don't know the id yet.
var wrapper = createWrapper("");
// Ask the toolbar to clone the item's template, place it inside the wrapper, and insert it in the toolbar.
var newItem = toolbar.insertItem(draggedItemId, gCurrentDragOverItem == toolbar ? null : gCurrentDragOverItem, wrapper);
// Prepare the item and wrapper to look good on the toolbar.
cleanupItemForToolbar(newItem, wrapper);
wrapper.id = "wrapper-"+newItem.id;
wrapper.flex = newItem.flex;
// Remove the wrapper from the palette.
var currentRow = draggedPaletteWrapper.parentNode;
if (draggedItemId != "separator" &&
draggedItemId != "spacer")
{
currentRow.removeChild(draggedPaletteWrapper);
while (currentRow) {
// Pull the first child of the next row up
// into this row.
var nextRow = currentRow.nextSibling;
if (!nextRow) {
var last = currentRow.lastChild;
var first = currentRow.firstChild;
if (first == last) {
// Kill the row.
currentRow.parentNode.removeChild(currentRow);
break;
}
if (last.localName == "spacer") {
var flex = last.getAttribute("flex");
last.setAttribute("flex", ++flex);
// Reflow doesn't happen for some reason. Trigger it with a hide/show. ICK! -dwh
last.hidden = true;
last.hidden = false;
break;
} else {
// Make a spacer and give it a flex of 1.
var spacer = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"spacer");
spacer.setAttribute("flex", "1");
currentRow.appendChild(spacer);
}
break;
}
currentRow.appendChild(nextRow.firstChild);
currentRow = currentRow.nextSibling;
}
}
}
gToolboxChanged = true;
gCurrentDragOverItem = null;
},
_flavourSet: null,
getSupportedFlavours: function ()
{
if (!this._flavourSet) {
this._flavourSet = new FlavourSet();
var documentId = gToolboxDocument.documentElement.id;
this._flavourSet.appendFlavour("text/toolbarwrapper-id/"+documentId);
}
return this._flavourSet;
}
}
var paletteDNDObserver =
{
onDragOver: function (aEvent, aFlavour, aDragSession)
{
aDragSession.canDrop = true;
},
onDrop: function(aEvent, aXferData, aDragSession)
{
var itemId = aXferData.data;
var wrapper = gToolboxDocument.getElementById("wrapper-"+itemId);
if (wrapper) {
// The item was dragged out of the toolbar.
wrapper.parentNode.removeChild(wrapper);
var wrapperType = wrapper.getAttribute("type");
if (wrapperType != "separator" && wrapperType != "spacer") {
// Find the template node in the toolbox palette
var templateNode = gToolbox.palette.firstChild;
while (templateNode) {
if (templateNode.id == itemId)
break;
templateNode = templateNode.nextSibling;
}
if (!templateNode)
return;
// Clone the template and add it to our palette.
var paletteItem = templateNode.cloneNode(true);
appendPaletteItem(paletteItem);
}
}
gToolboxChanged = true;
},
_flavourSet: null,
getSupportedFlavours: function ()
{
if (!this._flavourSet) {
this._flavourSet = new FlavourSet();
var documentId = gToolboxDocument.documentElement.id;
this._flavourSet.appendFlavour("text/toolbarwrapper-id/"+documentId);
}
return this._flavourSet;
}
}

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

@ -0,0 +1,75 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
Contributor(s):
David Hyatt (hyatt@apple.com)
Blake Ross (blaker@netscape.com)
-->
<!DOCTYPE dialog [
<!ENTITY % customizeToolbarDTD SYSTEM "chrome://global/locale/customizeToolbar.dtd">
%customizeToolbarDTD;
]>
<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://global/content/customizeToolbar.css" type="text/css"?>
<?xml-stylesheet href="chrome://global/skin/customizeToolbar.css" type="text/css"?>
<dialog id="CustomizeToolbarWindow"
onload="onLoad();"
ondialogaccept="onAccept();"
ondialogcancel="onCancel();"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="chrome://global/content/customizeToolbar.js"/>
<script type="application/x-javascript" src="chrome://global/content/nsDragAndDrop.js"/>
<script type="application/x-javascript" src="chrome://global/content/nsTransferable.js"/>
<stringbundle id="stringBundle" src="chrome://global/locale/customizeToolbar.properties"/>
<description>
&instructions.description;
</description>
<vbox flex="1" id="palette-box"
ondraggesture="gDraggingFromPalette = true; nsDragAndDrop.startDrag(event, dragStartObserver);"
ondragover="nsDragAndDrop.dragOver(event, paletteDNDObserver);"
ondragdrop="nsDragAndDrop.drop(event, paletteDNDObserver);"/>
<box align="center">
<label value="&show.label;"/>
<menulist id="modelist" value="icons" oncommand="updateToolbarMode(this.value);">
<menupopup>
<menuitem value="full" label="&iconsAndText.label;"/>
<menuitem value="icons" label="&icons.label;"/>
<menuitem value="text" label="&text.label;"/>
</menupopup>
</menulist>
<checkbox id="smallicons" oncommand="updateIconSize(this.checked);" label="&useSmallIcons.label;"/>
<button label="&addNewToolbar.label;" oncommand="addNewToolbar();"/>
<button label="&restoreDefaultSet.label;" oncommand="restoreDefaultSet();"/>
</box>
<separator class="groove"/>
</dialog>

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

@ -11,96 +11,212 @@
</resources>
</binding>
<binding id="toolbar" extends="chrome://global/content/widgets/toolbar.xml#toolbar-base">
<binding id="toolbox" extends="chrome://global/content/widgets/toolbar.xml#toolbar-base">
<implementation>
<field name="palette">
null
</field>
<field name="afterPalette">
<field name="toolbarset">
null
</field>
<field name="toolbarChanged">
null
<field name="customToolbarCount">
0
</field>
<method name="rebuild">
<body>
<![CDATA[
while (this.firstChild != this.afterPalette) {
this.removeChild(this.firstChild);
<constructor>
<![CDATA[
// Look to see if there is a toolbarset.
this.toolbarset = this.firstChild;
while (this.toolbarset && this.toolbarset.localName != "toolbarset")
this.toolbarset = toolbarset.nextSibling;
if (this.toolbarset) {
// Create each toolbar described by the toolbarset.
var index = 0;
while (toolbarset.hasAttribute("toolbar"+(++index))) {
var toolbarInfo = toolbarset.getAttribute("toolbar"+index);
var infoSplit = toolbarInfo.split(":");
this.appendCustomToolbar(infoSplit[0], infoSplit[1]);
}
this.buildItemsFromPalette();
this.toolbarChanged();
}
]]>
</constructor>
<method name="appendCustomToolbar">
<parameter name="aName"/>
<parameter name="aCurrentSet"/>
<body>
<![CDATA[
var toolbar = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"toolbar");
toolbar.id = "__customToolbar_" + aName.replace(" ", "");
toolbar.setAttribute("customizable", "true");
toolbar.setAttribute("customindex", ++this.customToolbarCount);
toolbar.setAttribute("toolbarname", aName);
toolbar.setAttribute("currentset", aCurrentSet);
toolbar.setAttribute("mode", this.getAttribute("mode"));
toolbar.setAttribute("iconsize", this.getAttribute("iconsize"));
toolbar.setAttribute("context", this.toolbarset.getAttribute("context"));
this.insertBefore(toolbar, this.toolbarset);
return toolbar;
]]>
</body>
</method>
<method name="buildItemsFromPalette">
<body>
<![CDATA[
var currentSet = this.getAttribute("currentset");
if (!currentSet)
currentSet = this.getAttribute("defaultset");
if (!currentSet)
return;
var node = this.palette ? this.palette : this.firstChild;
if (!this.palette) {
while (node) {
if (node.localName == "toolbarpalette")
break;
node = node.nextSibling;
}
if (!node)
return;
this.afterPalette = node.nextSibling;
this.palette = node;
this.removeChild(node);
</implementation>
</binding>
<binding id="toolbar" extends="chrome://global/content/widgets/toolbar.xml#toolbar-base">
<implementation>
<field name="lastPermanentChild">
null
</field>
<property name="toolbarName"
onget="return this.getAttribute('toolbarname');"
onset="this.setAttribute('toolbarname', val); return val;"/>
<constructor>
<![CDATA[
this.lastPermanentChild = this.firstChild;
// Searching for the toolbox palette in the toolbar binding because
// toolbars are constructed first.
var toolbox = this.parentNode;
if (!toolbox.palette) {
// Look to see if there is a toolbarpalette.
var node = toolbox.firstChild;
while (node) {
if (node.localName == "toolbarpalette")
break;
node = node.nextSibling;
}
var items = currentSet.split(",");
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (!item) continue;
if (!node)
return;
if (item == "separator") {
var sep = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"toolbarseparator");
sep.id = "separator";
this.insertBefore(sep, this.afterPalette);
continue;
// Hold on to the palette but remove it from the document.
toolbox.palette = node;
toolbox.removeChild(node);
}
// Build up our contents from the palette.
var currentSet = this.getAttribute("currentset");
if (!currentSet)
currentSet = this.getAttribute("defaultset");
if (currentSet)
this.currentSet = currentSet;
]]>
</constructor>
<property name="currentSet">
<getter>
<![CDATA[
var node = this.firstChild;
var currentSet = "";
while (node) {
if (node.id &&
node.localName == "toolbaritem" ||
node.localName == "toolbarbutton" ||
node.localName == "toolbarseparator" ||
node.localName == "spacer")
{
if (currentSet)
currentSet += ",";
if (node.localName == "toolbarseparator")
currentSet += "separator";
else if (node.localName == "spacer")
currentSet += "spacer";
else
currentSet += node.id;
}
node = node.nextSibling;
}
return currentSet ? currentSet : "__empty";
]]>
</getter>
<setter>
<![CDATA[
// Remove all items before the last permanent child.
if (this.lastPermanentChild) {
while (this.lastPermanentChild.previousSibling)
this.removeChild(this.lastPermanentChild.previousSibling);
} else {
while (this.lastChild)
this.removeChild(this.lastChild);
}
if (val == "__empty")
return;
// Attempt to locate the item within the palette's list of children.
var paletteItem = node.firstChild;
if (val) {
var itemIds = val.split(",");
for (var i = 0; i < itemIds.length; i++)
this.insertItem(itemIds[i], null);
}
]]>
</setter>
</property>
<method name="insertItem">
<parameter name="aId"/>
<parameter name="aBeforeElt"/>
<parameter name="aWrapper"/>
<body>
<![CDATA[
var newItem = null;
// Create special cases of palette items.
if (aId == "separator") {
newItem = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"toolbarseparator");
var uniqueId = (new Date()).getTime();
newItem.id = "separator" + uniqueId;
} else if (aId == "spacer") {
newItem = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"spacer");
var uniqueId = (new Date()).getTime();
newItem.flex = 1;
newItem.id = "spacer" + uniqueId;
} else {
// Attempt to locate an item with a matching id within palette.
var paletteItem = this.parentNode.palette.firstChild;
while (paletteItem) {
var paletteID = paletteItem.getAttribute("id");
if (paletteID == item) {
var newItem = paletteItem.cloneNode(true);
newItem.hidden = true;
this.insertBefore(newItem, this.afterPalette);
newItem.hidden = false;
var paletteId = paletteItem.id;
if (paletteId == aId) {
newItem = paletteItem.cloneNode(true);
break;
}
paletteItem = paletteItem.nextSibling;
}
}
var insertItem = newItem;
// Wrap the item in another node if so inclined.
if (aWrapper) {
aWrapper.appendChild(newItem);
insertItem = aWrapper;
}
// Insert the palette item into the toolbar.
if (aBeforeElt || this.lastPermanentChild)
this.insertBefore(insertItem, aBeforeElt ? aBeforeElt : this.lastPermanentChild);
else
this.appendChild(insertItem);
return newItem;
]]>
</body>
</method>
<constructor>
<![CDATA[
this.buildItemsFromPalette();
]]>
</constructor>
</method>
</implementation>
</binding>
<binding id="toolbox" extends="chrome://global/content/widgets/toolbar.xml#toolbar-base"/>
<binding id="menubar" extends="xul:menubar">
<resources>
<stylesheet src="chrome://global/skin/toolbar.css"/>
@ -121,6 +237,7 @@
<binding id="toolbarseparator" extends="chrome://global/content/widgets/toolbar.xml#toolbar-base"/>
<binding id="toolbarpaletteitem" extends="xul:button"/>
<binding id="toolbarpaletteitem" extends="chrome://global/content/widgets/toolbar.xml#toolbar-base" display="xul:button"/>
</bindings>

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

@ -51,7 +51,7 @@ data,
xbl|children,
commands, commandset, command,
broadcasterset, broadcaster, observes,
keyset, key, toolbarpalette,
keyset, key, toolbarpalette, toolbarset,
template, rule, conditions, action,
bindings, binding, content, member, triple,
treechildren, treeitem, treeseparator, treerow, treecell {

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

@ -6,6 +6,9 @@ toolkit.jar:
+ content/global/finddialog.xul (content/finddialog.xul)
+ content/global/finddialog.js (content/finddialog.js)
content/global/charset.js (content/charset.js)
content/global/customizeToolbar.xul (content/customizeToolbar.xul)
content/global/customizeToolbar.js (content/customizeToolbar.js)
content/global/customizeToolbar.css (content/customizeToolbar.css)
+ content/global/viewZoomOverlay.js (content/viewZoomOverlay.js)
+ content/global/widgets/tabbrowser.xml (content/widgets/tabbrowser.xml)
+ content/global/widgets/tabbox.xml (content/widgets/tabbox.xml)
@ -18,3 +21,5 @@ en-US.jar:
+ locale/en-US/global/brand.dtd (locale/brand.dtd)
+ locale/en-US/global/brand.properties (locale/brand.properties)
+ locale/en-US/global/about.xhtml (locale/about.xhtml)
+ locale/en-US/global/customizeToolbar.dtd (locale/customizeToolbar.dtd)
+ locale/en-US/global/customizeToolbar.properties (locale/customizeToolbar.properties)

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

@ -0,0 +1,8 @@
<!ENTITY instructions.description "Drag an item into the toolbars above to add it. Drag an item from the toolbars into the space below to remove it.">
<!ENTITY show.label "Show:">
<!ENTITY iconsAndText.label "Icons and Text">
<!ENTITY icons.label "Icons">
<!ENTITY text.label "Text">
<!ENTITY useSmallIcons.label "Use Small Icons">
<!ENTITY restoreDefaultSet.label "Restore Default Set">
<!ENTITY addNewToolbar.label "Add New Toolbar">

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

@ -0,0 +1,3 @@
enterToolbarTitle=New Toolbar
enterToolbarName=Enter a name for this toolbar:
enterToolbarDup=There is already a toolbar with the name "%S". Please enter a different name.

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

@ -107,3 +107,9 @@ textbox {
.autocomplete-treebody:-moz-tree-cell-text(menuactive) {
color: HighlightText !important;
}
/* ::::: textboxes inside toolbarpaletteitems ::::: */
toolbarpaletteitem > toolbaritem > textbox > hbox > hbox > html|*.textbox-input {
visibility: hidden;
}

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

@ -0,0 +1,24 @@
/*
The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Blake Ross.
Portions created by Blake Ross are
Copyright (C) 2002 Blake Ross. All
Rights Reserved.
Contributor(s):
Blake Ross (blaker@netscape.com)
Joe Hewitt (hewitt@netscape.com)
*/

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

@ -47,6 +47,10 @@ menulist > menupopup,
-moz-binding: url("chrome://global/content/bindings/menulist.xml#menulist-compact");
}
toolbarpaletteitem[type="spacer"] {
-moz-binding: url("chrome://global/skin/globalBindings.xml#toolbarpaletteitem-spacer");
}
/* ::::: root elements ::::: */
window,

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

@ -20,4 +20,12 @@
</content>
</binding>
<binding id="toolbarpaletteitem-spacer" extends="chrome://global/content/widgets/toolbar.xml#toolbarpaletteitem">
<content>
<xul:spacer class="spacer-left"/>
<children/>
<xul:spacer class="spacer-right"/>
</content>
</binding>
</bindings>

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

@ -3,6 +3,7 @@ classic.jar:
+ skin/classic/global/browser.css
+ skin/classic/global/checkbox.css
+ skin/classic/global/colorpicker.css
+ skin/classic/global/customizeToolbar.css
+ skin/classic/global/console.css
+ skin/classic/global/contents.rdf
+ skin/classic/global/dialog.css
@ -52,3 +53,6 @@ classic.jar:
+ skin/classic/global/tree/twisty-open.gif (tree/twisty-open.gif)
+ skin/classic/global/tree/twisty-clsd.gif (tree/twisty-clsd.gif)
+ skin/classic/global/progressmeter/progressmeter-busy.gif (progressmeter/progressmeter-busy.gif)
+ skin/classic/global/toolbar/spacer-lft.gif (toolbar/spacer-lft.gif)
+ skin/classic/global/toolbar/spacer-mid.gif (toolbar/spacer-mid.gif)
+ skin/classic/global/toolbar/spacer-rit.gif (toolbar/spacer-rit.gif)

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

@ -1,83 +0,0 @@
/*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Mozilla Communicator client code, released
* March 31, 1998.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-2001 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Joe Hewitt (hewitt@netscape.com)
*/
/* ===== textbox.css ==================================================
== Styles used by the XUL textbox element.
======================================================================= */
@import url("chrome://global/content/autocomplete.css");
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
@namespace html url("http://www.w3.org/1999/xhtml");
/* ::::: textbox ::::: */
textbox
{
-moz-appearance: textfield;
cursor: text;
margin: 2px 4px;
border: 2px solid;
-moz-border-top-colors: ThreeDShadow ThreeDDarkShadow;
-moz-border-right-colors: ThreeDHighlight ThreeDLightShadow;
-moz-border-bottom-colors: ThreeDHighlight ThreeDLightShadow;
-moz-border-left-colors: ThreeDShadow ThreeDDarkShadow;
padding: 1px 0px 1px 2px;
background-color: -moz-Field;
color: -moz-FieldText;
}
html|*.textbox-input,
html|*.textbox-textarea {
margin: 0px !important;
border: none !important;
padding: 0px !important;
background-color: inherit;
color: inherit;
font: inherit;
}
/* ..... readonly state ..... */
textbox[readonly="true"] {
background-color: -moz-Dialog;
color: -moz-DialogText;
}
/* ..... disabled state ..... */
textbox[disabled="true"] {
cursor: default;
background-color: -moz-Dialog;
color: GrayText;
}
/* ::::: plain textbox ::::: */
textbox.plain {
-moz-appearance: none !important;
padding: 0px !important;
margin: 0px !important;
border: none !important;
}

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

@ -42,6 +42,7 @@ toolbox {
toolbar,
menubar {
min-width: 1px;
min-height: 20px;
border-left: 1px solid ThreeDHighlight;
border-top: 1px solid ThreeDHighlight;
border-right: 1px solid ThreeDShadow;
@ -57,3 +58,32 @@ toolbarseparator {
width : 2px;
}
/* ::::: drag and drop feedback ::::: */
toolbarpaletteitem {
margin-left: -2px;
border-left: 2px solid transparent;
}
toolbarpaletteitem[dragover="left"] {
border-left: 2px solid black;
}
toolbarpaletteitem[dragover="right"] {
border-right: 2px solid black;
}
toolbarpaletteitem[type="spacer"] {
background: url("chrome://global/skin/toolbar/spacer-mid.gif") repeat-x center;
}
.spacer-left {
width: 8px;
background: url("chrome://global/skin/toolbar/spacer-lft.gif") no-repeat center;
}
.spacer-right {
width: 8px;
background: url("chrome://global/skin/toolbar/spacer-rit.gif") no-repeat center;
}

Двоичные данные
toolkit/skin/win/toolbar/spacer-mid.gif Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 52 B