blob: af0d9c50573a4c656732481624fccdce270d4dce [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.CSSStyleDeclarationSection = function(style)
{
WebInspector.Object.call(this);
console.assert(style);
this._style = style || null;
this._element = document.createElement("div");
this._element.className = WebInspector.CSSStyleDeclarationSection.StyleClassName;
this._headerElement = document.createElement("div");
this._headerElement.className = WebInspector.CSSStyleDeclarationSection.HeaderElementStyleClassName;
this._iconElement = document.createElement("img");
this._iconElement.className = WebInspector.CSSStyleDeclarationSection.IconElementStyleClassName;
this._headerElement.appendChild(this._iconElement);
this._selectorElement = document.createElement("span");
this._selectorElement.className = WebInspector.CSSStyleDeclarationSection.SelectorElementStyleClassName;
this._selectorElement.setAttribute("spellcheck", "false");
this._headerElement.appendChild(this._selectorElement);
this._originElement = document.createElement("span");
this._originElement.className = WebInspector.CSSStyleDeclarationSection.OriginElementStyleClassName;
this._headerElement.appendChild(this._originElement);
this._propertiesElement = document.createElement("div");
this._propertiesElement.className = WebInspector.CSSStyleDeclarationSection.PropertiesElementStyleClassName;
this._propertiesTextEditor = new WebInspector.CSSStyleDeclarationTextEditor(this, style);
this._propertiesElement.appendChild(this._propertiesTextEditor.element);
this._element.appendChild(this._headerElement);
this._element.appendChild(this._propertiesElement);
var iconClassName;
switch (style.type) {
case WebInspector.CSSStyleDeclaration.Type.Rule:
console.assert(style.ownerRule);
if (style.inherited)
iconClassName = WebInspector.CSSStyleDeclarationSection.InheritedStyleRuleIconStyleClassName;
else if (style.ownerRule.type === WebInspector.CSSRule.Type.Author)
iconClassName = WebInspector.CSSStyleDeclarationSection.AuthorStyleRuleIconStyleClassName;
else if (style.ownerRule.type === WebInspector.CSSRule.Type.User)
iconClassName = WebInspector.CSSStyleDeclarationSection.UserStyleRuleIconStyleClassName;
else if (style.ownerRule.type === WebInspector.CSSRule.Type.UserAgent)
iconClassName = WebInspector.CSSStyleDeclarationSection.UserAgentStyleRuleIconStyleClassName;
else if (style.ownerRule.type === WebInspector.CSSRule.Type.Inspector)
iconClassName = WebInspector.CSSStyleDeclarationSection.InspectorStyleRuleIconStyleClassName;
break;
case WebInspector.CSSStyleDeclaration.Type.Inline:
case WebInspector.CSSStyleDeclaration.Type.Attribute:
if (style.inherited)
iconClassName = WebInspector.CSSStyleDeclarationSection.InheritedElementStyleRuleIconStyleClassName;
else
iconClassName = WebInspector.DOMTreeElementPathComponent.DOMElementIconStyleClassName;
break;
}
console.assert(iconClassName);
this._element.classList.add(iconClassName);
if (!style.editable)
this._element.classList.add(WebInspector.CSSStyleDeclarationSection.LockedStyleClassName);
else if (style.ownerRule) {
this._commitSelectorKeyboardShortcut = new WebInspector.KeyboardShortcut(null, WebInspector.KeyboardShortcut.Key.Enter, this._commitSelector.bind(this), this._selectorElement);
this._selectorElement.addEventListener("blur", this._commitSelector.bind(this));
} else
this._element.classList.add(WebInspector.CSSStyleDeclarationSection.SelectorLockedStyleClassName);
if (!WebInspector.CSSStyleDeclarationSection._generatedLockImages) {
WebInspector.CSSStyleDeclarationSection._generatedLockImages = true;
var specifications = {"style-lock-normal": {fillColor: [0, 0, 0, 0.5]}};
generateColoredImagesForCSS("Images/Locked.svg", specifications, 8, 10);
}
this.refresh();
};
WebInspector.CSSStyleDeclarationSection.StyleClassName = "style-declaration-section";
WebInspector.CSSStyleDeclarationSection.LockedStyleClassName = "locked";
WebInspector.CSSStyleDeclarationSection.SelectorLockedStyleClassName = "selector-locked";
WebInspector.CSSStyleDeclarationSection.LastInGroupStyleClassName = "last-in-group";
WebInspector.CSSStyleDeclarationSection.HeaderElementStyleClassName = "header";
WebInspector.CSSStyleDeclarationSection.IconElementStyleClassName = "icon";
WebInspector.CSSStyleDeclarationSection.SelectorElementStyleClassName = "selector";
WebInspector.CSSStyleDeclarationSection.OriginElementStyleClassName = "origin";
WebInspector.CSSStyleDeclarationSection.PropertiesElementStyleClassName = "properties";
WebInspector.CSSStyleDeclarationSection.MatchedSelectorElementStyleClassName = "matched";
WebInspector.CSSStyleDeclarationSection.AuthorStyleRuleIconStyleClassName = "author-style-rule-icon";
WebInspector.CSSStyleDeclarationSection.UserStyleRuleIconStyleClassName = "user-style-rule-icon";
WebInspector.CSSStyleDeclarationSection.UserAgentStyleRuleIconStyleClassName = "user-agent-style-rule-icon";
WebInspector.CSSStyleDeclarationSection.InspectorStyleRuleIconStyleClassName = "inspector-style-rule-icon";
WebInspector.CSSStyleDeclarationSection.InheritedStyleRuleIconStyleClassName = "inherited-style-rule-icon";
WebInspector.CSSStyleDeclarationSection.InheritedElementStyleRuleIconStyleClassName = "inherited-element-style-rule-icon";
WebInspector.CSSStyleDeclarationSection.prototype = {
constructor: WebInspector.CSSStyleDeclarationSection,
// Public
get element()
{
return this._element;
},
get style()
{
return this._style;
},
get lastInGroup()
{
return this._element.classList.contains(WebInspector.CSSStyleDeclarationSection.LastInGroupStyleClassName);
},
set lastInGroup(last)
{
if (last)
this._element.classList.add(WebInspector.CSSStyleDeclarationSection.LastInGroupStyleClassName);
else
this._element.classList.remove(WebInspector.CSSStyleDeclarationSection.LastInGroupStyleClassName);
},
get focused()
{
return this._propertiesTextEditor.focused;
},
focus: function()
{
this._propertiesTextEditor.focus();
},
refresh: function()
{
this._selectorElement.removeChildren();
this._originElement.removeChildren();
this._originElement.appendChild(document.createTextNode(" \u2014 "));
function appendSelector(selectorText, matched)
{
var selectorElement = document.createElement("span");
if (matched)
selectorElement.className = WebInspector.CSSStyleDeclarationSection.MatchedSelectorElementStyleClassName;
selectorElement.textContent = selectorText;
this._selectorElement.appendChild(selectorElement);
}
switch (this._style.type) {
case WebInspector.CSSStyleDeclaration.Type.Rule:
console.assert(this._style.ownerRule);
var selectors = this._style.ownerRule.selectors;
var matchedSelectorIndices = this._style.ownerRule.matchedSelectorIndices;
if (selectors.length && matchedSelectorIndices.length) {
for (var i = 0; i < selectors.length; ++i) {
appendSelector.call(this, selectors[i], matchedSelectorIndices.contains(i));
if (i < selectors.length - 1)
this._selectorElement.appendChild(document.createTextNode(", "));
}
} else
appendSelector.call(this, this._style.ownerRule.selectorText, true);
if (this._style.ownerRule.sourceCodeLocation) {
var sourceCodeLink = WebInspector.createSourceCodeLocationLink(this._style.ownerRule.sourceCodeLocation, true);
this._originElement.appendChild(sourceCodeLink);
} else {
var originString;
switch (this._style.ownerRule.type) {
case WebInspector.CSSRule.Type.Author:
originString = WebInspector.UIString("Author Stylesheet");
break;
case WebInspector.CSSRule.Type.User:
originString = WebInspector.UIString("User Stylesheet");
break;
case WebInspector.CSSRule.Type.UserAgent:
originString = WebInspector.UIString("User Agent Stylesheet");
break;
case WebInspector.CSSRule.Type.Inspector:
originString = WebInspector.UIString("Web Inspector");
break;
}
console.assert(originString);
if (originString)
this._originElement.appendChild(document.createTextNode(originString));
}
break;
case WebInspector.CSSStyleDeclaration.Type.Inline:
appendSelector.call(this, WebInspector.displayNameForNode(this._style.node), true);
this._originElement.appendChild(document.createTextNode(WebInspector.UIString("Style Attribute")));
break;
case WebInspector.CSSStyleDeclaration.Type.Attribute:
appendSelector.call(this, WebInspector.displayNameForNode(this._style.node), true);
this._originElement.appendChild(document.createTextNode(WebInspector.UIString("HTML Attributes")));
break;
}
},
updateLayout: function()
{
this._propertiesTextEditor.updateLayout();
},
// Private
_commitSelector: function(mutations)
{
console.assert(this._style.ownerRule);
if (!this._style.ownerRule)
return;
var newSelectorText = this._selectorElement.textContent.trim();
if (!newSelectorText) {
// Revert to the current selector (by doing a refresh) since the new selector is empty.
this.refresh();
return;
}
this._style.ownerRule.selectorText = newSelectorText;
}
};
WebInspector.CSSStyleDeclarationSection.prototype.__proto__ = WebInspector.StyleDetailsPanel.prototype;