| /* |
| * 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.CSSStyleDetailsSidebarPanel = function() |
| { |
| WebInspector.DOMDetailsSidebarPanel.call(this, "css-style", WebInspector.UIString("Styles"), WebInspector.UIString("Style"), "Images/NavigationItemBrushAndRuler.svg", "4"); |
| |
| this._selectedPanel = null; |
| |
| this._navigationBar = new WebInspector.NavigationBar(null, null, "tablist"); |
| this._navigationBar.addEventListener(WebInspector.NavigationBar.Event.NavigationItemSelected, this._navigationItemSelected, this); |
| this.element.appendChild(this._navigationBar.element); |
| |
| this._contentElement = document.createElement("div"); |
| this._contentElement.className = WebInspector.CSSStyleDetailsSidebarPanel.ContentStyleClassName; |
| |
| this._forcedPseudoClassCheckboxes = {}; |
| |
| if (WebInspector.cssStyleManager.canForcePseudoClasses()) { |
| this._forcedPseudoClassContainer = document.createElement("div"); |
| this._forcedPseudoClassContainer.className = WebInspector.CSSStyleDetailsSidebarPanel.PseudoClassesElementStyleClassName; |
| |
| var groupElement = null; |
| |
| WebInspector.CSSStyleManager.ForceablePseudoClasses.forEach(function(pseudoClass) { |
| // We don't localize the label since it is a CSS pseudo-class from the CSS standard. |
| var label = pseudoClass.capitalize(); |
| |
| var labelElement = document.createElement("label"); |
| |
| var checkboxElement = document.createElement("input"); |
| checkboxElement.addEventListener("change", this._forcedPseudoClassCheckboxChanged.bind(this, pseudoClass)); |
| checkboxElement.type = "checkbox"; |
| |
| this._forcedPseudoClassCheckboxes[pseudoClass] = checkboxElement; |
| |
| labelElement.appendChild(checkboxElement); |
| labelElement.appendChild(document.createTextNode(label)); |
| |
| if (!groupElement || groupElement.children.length === 2) { |
| groupElement = document.createElement("div"); |
| groupElement.className = WebInspector.CSSStyleDetailsSidebarPanel.PseudoClassesGroupElementStyleClassName; |
| this._forcedPseudoClassContainer.appendChild(groupElement); |
| } |
| |
| groupElement.appendChild(labelElement); |
| }.bind(this)); |
| |
| this._contentElement.appendChild(this._forcedPseudoClassContainer); |
| } |
| |
| this.element.appendChild(this._contentElement); |
| |
| this._computedStyleDetailsPanel = new WebInspector.ComputedStyleDetailsPanel; |
| this._rulesStyleDetailsPanel = new WebInspector.RulesStyleDetailsPanel; |
| this._metricsStyleDetailsPanel = new WebInspector.MetricsStyleDetailsPanel; |
| |
| this._panels = [this._computedStyleDetailsPanel, this._rulesStyleDetailsPanel, this._metricsStyleDetailsPanel]; |
| |
| this._navigationBar.addNavigationItem(this._computedStyleDetailsPanel.navigationItem); |
| this._navigationBar.addNavigationItem(this._rulesStyleDetailsPanel.navigationItem); |
| this._navigationBar.addNavigationItem(this._metricsStyleDetailsPanel.navigationItem); |
| |
| this._lastSelectedSectionSetting = new WebInspector.Setting("last-selected-style-details-panel", this._rulesStyleDetailsPanel.navigationItem.identifier); |
| |
| // This will cause the selected panel to be set in _navigationItemSelected. |
| this._navigationBar.selectedNavigationItem = this._lastSelectedSectionSetting.value; |
| }; |
| |
| WebInspector.CSSStyleDetailsSidebarPanel.ContentStyleClassName = "content"; |
| WebInspector.CSSStyleDetailsSidebarPanel.PseudoClassesElementStyleClassName = "pseudo-classes"; |
| WebInspector.CSSStyleDetailsSidebarPanel.PseudoClassesGroupElementStyleClassName = "group"; |
| WebInspector.CSSStyleDetailsSidebarPanel.NoForcedPseudoClassesScrollOffset = 38; // Default height of the forced pseudo classes container. Updated in widthDidChange. |
| |
| WebInspector.CSSStyleDetailsSidebarPanel.prototype = { |
| constructor: WebInspector.CSSStyleDetailsSidebarPanel, |
| |
| // Public |
| |
| supportsDOMNode: function(nodeToInspect) |
| { |
| return nodeToInspect.nodeType() === Node.ELEMENT_NODE; |
| }, |
| |
| refresh: function() |
| { |
| var domNode = this.domNode; |
| if (!domNode) |
| return; |
| |
| this._contentElement.scrollTop = this._initialScrollOffset; |
| |
| for (var i = 0; i < this._panels.length; ++i) { |
| delete this._panels[i].element._savedScrollTop; |
| this._panels[i].markAsNeedsRefresh(domNode); |
| } |
| |
| this._updatePseudoClassCheckboxes(); |
| }, |
| |
| visibilityDidChange: function() |
| { |
| WebInspector.SidebarPanel.prototype.visibilityDidChange.call(this); |
| |
| if (!this._selectedPanel) |
| return; |
| |
| if (!this.visible) { |
| this._selectedPanel.hidden(); |
| return; |
| } |
| |
| this._navigationBar.updateLayout(); |
| |
| this._updateNoForcedPseudoClassesScrollOffset(); |
| |
| this._selectedPanel.shown(); |
| this._selectedPanel.markAsNeedsRefresh(this.domNode); |
| }, |
| |
| widthDidChange: function() |
| { |
| this._updateNoForcedPseudoClassesScrollOffset(); |
| |
| if (this._selectedPanel) |
| this._selectedPanel.widthDidChange(); |
| }, |
| |
| // Protected |
| |
| addEventListeners: function() |
| { |
| this.domNode.addEventListener(WebInspector.DOMNode.Event.EnabledPseudoClassesChanged, this._updatePseudoClassCheckboxes, this); |
| }, |
| |
| removeEventListeners: function() |
| { |
| this.domNode.removeEventListener(null, null, this); |
| }, |
| |
| // Private |
| |
| get _initialScrollOffset() |
| { |
| if (!WebInspector.cssStyleManager.canForcePseudoClasses()) |
| return 0; |
| return this.domNode && this.domNode.enabledPseudoClasses.length ? 0 : WebInspector.CSSStyleDetailsSidebarPanel.NoForcedPseudoClassesScrollOffset; |
| }, |
| |
| _updateNoForcedPseudoClassesScrollOffset: function() |
| { |
| if (this._forcedPseudoClassContainer) |
| WebInspector.CSSStyleDetailsSidebarPanel.NoForcedPseudoClassesScrollOffset = this._forcedPseudoClassContainer.offsetHeight; |
| }, |
| |
| _navigationItemSelected: function(event) |
| { |
| console.assert(event.target.selectedNavigationItem); |
| if (!event.target.selectedNavigationItem) |
| return; |
| |
| var selectedNavigationItem = event.target.selectedNavigationItem; |
| |
| var selectedPanel = null; |
| for (var i = 0; i < this._panels.length; ++i) { |
| if (this._panels[i].navigationItem !== selectedNavigationItem) |
| continue; |
| selectedPanel = this._panels[i]; |
| break; |
| } |
| |
| console.assert(selectedPanel); |
| |
| if (this._selectedPanel) { |
| this._selectedPanel.hidden(); |
| this._selectedPanel.element._savedScrollTop = this._contentElement.scrollTop; |
| this._selectedPanel.element.remove(); |
| } |
| |
| this._selectedPanel = selectedPanel; |
| |
| if (this._selectedPanel) { |
| this._contentElement.appendChild(this._selectedPanel.element); |
| |
| if (typeof this._selectedPanel.element._savedScrollTop === "number") |
| this._contentElement.scrollTop = this._selectedPanel.element._savedScrollTop; |
| else |
| this._contentElement.scrollTop = this._initialScrollOffset; |
| |
| this._selectedPanel.shown(); |
| } |
| |
| this._lastSelectedSectionSetting.value = selectedNavigationItem.identifier; |
| }, |
| |
| _forcedPseudoClassCheckboxChanged: function(pseudoClass, event) |
| { |
| if (!this.domNode) |
| return; |
| |
| this.domNode.setPseudoClassEnabled(pseudoClass, event.target.checked); |
| }, |
| |
| _updatePseudoClassCheckboxes: function() |
| { |
| if (!this.domNode) |
| return; |
| |
| var enabledPseudoClasses = this.domNode.enabledPseudoClasses; |
| |
| for (var pseudoClass in this._forcedPseudoClassCheckboxes) { |
| var checkboxElement = this._forcedPseudoClassCheckboxes[pseudoClass]; |
| checkboxElement.checked = enabledPseudoClasses.contains(pseudoClass); |
| } |
| } |
| }; |
| |
| WebInspector.CSSStyleDetailsSidebarPanel.prototype.__proto__ = WebInspector.DOMDetailsSidebarPanel.prototype; |