blob: 643fdb4f271fec2b7a2ddce568264140287f3c4b [file] [log] [blame]
/*
* Copyright (C) 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
WebInspector.Toolbar = function(element, navigationItems) {
WebInspector.NavigationBar.call(this, element, navigationItems, "toolbar");
this.displayMode = WebInspector.Toolbar.DisplayMode.IconAndLabelVertical;
this.sizeMode = WebInspector.Toolbar.SizeMode.Normal;
this._controlSectionElement = document.createElement("div");
this._controlSectionElement.className = WebInspector.Toolbar.ControlSectionStyleClassName;
this._element.appendChild(this._controlSectionElement);
this._leftSectionElement = document.createElement("div");
this._leftSectionElement.className = WebInspector.Toolbar.ItemSectionStyleClassName + " " + WebInspector.Toolbar.LeftItemSectionStyleClassName;
this._leftSectionElement.setAttribute("role", "tablist");
this._element.appendChild(this._leftSectionElement);
this._centerSectionElement = document.createElement("div");
this._centerSectionElement.className = WebInspector.Toolbar.ItemSectionStyleClassName + " " + WebInspector.Toolbar.CenterItemSectionStyleClassName;
this._element.appendChild(this._centerSectionElement);
this._rightSectionElement = document.createElement("div");
this._rightSectionElement.className = WebInspector.Toolbar.ItemSectionStyleClassName + " " + WebInspector.Toolbar.RightItemSectionStyleClassName;
this._rightSectionElement.setAttribute("role", "tablist");
this._element.appendChild(this._rightSectionElement);
this._element.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), false);
};
WebInspector.Object.addConstructorFunctions(WebInspector.Toolbar);
WebInspector.Toolbar.StyleClassName = "toolbar";
WebInspector.Toolbar.ControlSectionStyleClassName = "control-section";
WebInspector.Toolbar.ItemSectionStyleClassName = "item-section";
WebInspector.Toolbar.LeftItemSectionStyleClassName = "left";
WebInspector.Toolbar.CenterItemSectionStyleClassName = "center";
WebInspector.Toolbar.RightItemSectionStyleClassName = "right";
WebInspector.Toolbar.TotalSectionMargins = 12 * 3;
WebInspector.Toolbar.Event = {
DisplayModeDidChange: "toolbar-display-mode-did-change",
SizeModeDidChange: "toolbar-size-mode-did-change"
};
WebInspector.Toolbar.Section = {
Control: "control",
Left: "left",
Center: "center",
Right: "right"
};
WebInspector.Toolbar.DisplayMode = {
IconAndLabelVertical: "icon-and-label-vertical",
IconAndLabelHorizontal: "icon-and-label-horizontal",
IconOnly: "icon-only",
LabelOnly: "label-only"
};
WebInspector.Toolbar.SizeMode = {
Normal: "normal-size",
Small: "small-size"
};
WebInspector.Toolbar.prototype = {
constructor: WebInspector.Toolbar,
// Public
get displayMode()
{
return this._displayMode;
},
set displayMode(mode)
{
if (mode === this._displayMode)
return;
if (this._displayMode)
this._element.classList.remove(this._displayMode);
// Revert the forced icon-only mode if it was applied.
if (this._displayMode === WebInspector.Toolbar.DisplayMode.IconAndLabelHorizontal)
this._element.classList.remove(WebInspector.Toolbar.DisplayMode.IconOnly);
this._displayMode = mode;
this._element.classList.add(mode);
this.updateLayout();
this.dispatchEventToListeners(WebInspector.Toolbar.Event.DisplayModeDidChange);
},
get sizeMode()
{
return this._sizeMode;
},
set sizeMode(mode)
{
if (mode === this._sizeMode)
return;
if (this._sizeMode)
this._element.classList.remove(this._sizeMode);
this._sizeMode = mode;
this._element.classList.add(mode);
this.updateLayout();
this.dispatchEventToListeners(WebInspector.Toolbar.Event.SizeModeDidChange);
},
customUpdateLayout: function()
{
// Bail early if our sections are not created yet. This means we are being called during construction.
if (!this._leftSectionElement || !this._centerSectionElement || !this._rightSectionElement)
return;
// Remove the collapsed style class to test if the items can fit at full width.
this._element.classList.remove(WebInspector.NavigationBar.CollapsedStyleClassName);
// Revert the forced icon-only mode if it was applied.
if (this._displayMode === WebInspector.Toolbar.DisplayMode.IconAndLabelHorizontal) {
this._element.classList.remove(WebInspector.Toolbar.DisplayMode.IconOnly);
this._element.classList.add(WebInspector.Toolbar.DisplayMode.IconAndLabelHorizontal);
}
function isOverflowingToolbar()
{
var controlSectionWidth = this._controlSectionElement.offsetWidth;
var leftSectionWidth = this._leftSectionElement.offsetWidth;
var rightSectionWidth = this._rightSectionElement.offsetWidth;
var centerSectionWidth = this._centerSectionElement.offsetWidth;
// Add one to the actual toolbar width to allow some slop. This wasn't needed when sub-pixel layout was on,
// but that was disabled in: http://webkit.org/b/149209
var toolbarWidth = this.element.offsetWidth + 1;
return controlSectionWidth + leftSectionWidth + centerSectionWidth + rightSectionWidth + WebInspector.Toolbar.TotalSectionMargins > toolbarWidth;
}
// Only the horizontal display mode supports collapsing labels.
// If any sections are overflowing the toolbar then force the display mode to be icon only.
if (this._displayMode === WebInspector.Toolbar.DisplayMode.IconAndLabelHorizontal && isOverflowingToolbar.call(this)) {
this._element.classList.remove(WebInspector.Toolbar.DisplayMode.IconAndLabelHorizontal);
this._element.classList.add(WebInspector.Toolbar.DisplayMode.IconOnly);
}
if (!isOverflowingToolbar.call(this))
return;
this._element.classList.add(WebInspector.NavigationBar.CollapsedStyleClassName);
},
addToolbarItem: function(toolbarItem, sectionIdentifier)
{
var sectionElement;
switch (sectionIdentifier) {
case WebInspector.Toolbar.Section.Control:
sectionElement = this._controlSectionElement;
break;
case WebInspector.Toolbar.Section.Left:
sectionElement = this._leftSectionElement;
break;
default:
case WebInspector.Toolbar.Section.Center:
sectionElement = this._centerSectionElement;
break;
case WebInspector.Toolbar.Section.Right:
sectionElement = this._rightSectionElement;
break;
}
console.assert(sectionElement);
this.addNavigationItem(toolbarItem, sectionElement);
},
// Private
_handleContextMenuEvent: function(event)
{
var contextMenu = new WebInspector.ContextMenu(event);
contextMenu.appendCheckboxItem(WebInspector.UIString("Icon and Text (Vertical)"), this._changeDisplayMode.bind(this, WebInspector.Toolbar.DisplayMode.IconAndLabelVertical), this._displayMode === WebInspector.Toolbar.DisplayMode.IconAndLabelVertical);
contextMenu.appendCheckboxItem(WebInspector.UIString("Icon and Text (Horizontal)"), this._changeDisplayMode.bind(this, WebInspector.Toolbar.DisplayMode.IconAndLabelHorizontal), this._displayMode === WebInspector.Toolbar.DisplayMode.IconAndLabelHorizontal);
contextMenu.appendCheckboxItem(WebInspector.UIString("Icon Only"), this._changeDisplayMode.bind(this, WebInspector.Toolbar.DisplayMode.IconOnly), this._displayMode === WebInspector.Toolbar.DisplayMode.IconOnly);
contextMenu.appendCheckboxItem(WebInspector.UIString("Text Only"), this._changeDisplayMode.bind(this, WebInspector.Toolbar.DisplayMode.LabelOnly), this._displayMode === WebInspector.Toolbar.DisplayMode.LabelOnly);
if (this._displayMode !== WebInspector.Toolbar.DisplayMode.LabelOnly) {
contextMenu.appendSeparator();
contextMenu.appendCheckboxItem(WebInspector.UIString("Small Icons"), this._toggleSmallIcons.bind(this), this._sizeMode === WebInspector.Toolbar.SizeMode.Small);
}
contextMenu.show();
},
_changeDisplayMode: function(displayMode)
{
this.displayMode = displayMode;
},
_toggleSmallIcons: function()
{
this.sizeMode = this._sizeMode === WebInspector.Toolbar.SizeMode.Normal ? WebInspector.Toolbar.SizeMode.Small : WebInspector.Toolbar.SizeMode.Normal;
}
};
WebInspector.Toolbar.prototype.__proto__ = WebInspector.NavigationBar.prototype;