summaryrefslogtreecommitdiff
path: root/Source/WebInspectorUI/UserInterface/CSSStyleDeclarationSection.js
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebInspectorUI/UserInterface/CSSStyleDeclarationSection.js')
-rw-r--r--Source/WebInspectorUI/UserInterface/CSSStyleDeclarationSection.js261
1 files changed, 261 insertions, 0 deletions
diff --git a/Source/WebInspectorUI/UserInterface/CSSStyleDeclarationSection.js b/Source/WebInspectorUI/UserInterface/CSSStyleDeclarationSection.js
new file mode 100644
index 000000000..52569255a
--- /dev/null
+++ b/Source/WebInspectorUI/UserInterface/CSSStyleDeclarationSection.js
@@ -0,0 +1,261 @@
+/*
+ * 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.pdf", 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;