Web Inspector: Layer summary should be bottom sticky
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Views / SidebarPanel.js
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WebInspector.SidebarPanel = function(identifier, displayName, showToolTip, hideToolTip, image, element, role, label)
27 {
28     WebInspector.Object.call(this);
29
30     this._identifier = identifier;
31
32     this._toolbarItem = new WebInspector.ActivateButtonToolbarItem(identifier, showToolTip, hideToolTip, displayName, image, null, "tab");
33     this._toolbarItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this.toggle, this);
34     this._toolbarItem.enabled = false;
35
36     this._element = element || document.createElement("div");
37     this._element.classList.add(WebInspector.SidebarPanel.StyleClassName);
38     this._element.classList.add(identifier);
39
40     this._element.setAttribute("role", role || "group");
41     this._element.setAttribute("aria-label", label || displayName);
42
43     this._contentElement = document.createElement("div");
44     this._contentElement.className = WebInspector.SidebarPanel.ContentElementStyleClassName;
45     this._element.appendChild(this._contentElement);
46 };
47
48 WebInspector.SidebarPanel.StyleClassName = "panel";
49 WebInspector.SidebarPanel.SelectedStyleClassName = "selected";
50 WebInspector.SidebarPanel.ContentElementStyleClassName = "content";
51
52 WebInspector.SidebarPanel.prototype = {
53     constructor: WebInspector.SidebarPanel,
54     __proto__: WebInspector.Object.prototype,
55
56     // Public
57
58     get identifier()
59     {
60         return this._identifier;
61     },
62
63     get toolbarItem()
64     {
65         return this._toolbarItem;
66     },
67
68     get element()
69     {
70         return this._element;
71     },
72
73     get contentElement()
74     {
75         return this._contentElement;
76     },
77
78     get visible()
79     {
80         return this.selected && this._parentSidebar && !this._parentSidebar.collapsed;
81     },
82
83     get selected()
84     {
85         return this._element.classList.contains(WebInspector.SidebarPanel.SelectedStyleClassName);
86     },
87
88     set selected(flag)
89     {
90         if (flag)
91             this._element.classList.add(WebInspector.SidebarPanel.SelectedStyleClassName);
92         else
93             this._element.classList.remove(WebInspector.SidebarPanel.SelectedStyleClassName);
94     },
95
96     get parentSidebar()
97     {
98         return this._parentSidebar;
99     },
100
101     show: function()
102     {
103         if (!this._parentSidebar)
104             return;
105
106         this._parentSidebar.collapsed = false;
107         this._parentSidebar.selectedSidebarPanel = this;
108     },
109
110     hide: function()
111     {
112         if (!this._parentSidebar)
113             return;
114
115         this._parentSidebar.collapsed = true;
116         this._parentSidebar.selectedSidebarPanel = null;
117     },
118
119     toggle: function()
120     {
121         if (this.visible)
122             this.hide();
123         else
124             this.show();
125     },
126
127     added: function()
128     {
129         console.assert(this._parentSidebar);
130         this._toolbarItem.enabled = true;
131         this._toolbarItem.activated = this.visible;
132     },
133
134     removed: function()
135     {
136         console.assert(!this._parentSidebar);
137         this._toolbarItem.enabled = false;
138         this._toolbarItem.activated = false;
139     },
140
141     willRemove: function()
142     {
143         // Implemented by subclasses.
144     },
145
146     shown: function()
147     {
148         // Implemented by subclasses.
149     },
150
151     hidden: function()
152     {
153         // Implemented by subclasses.
154     },
155
156     widthDidChange: function()
157     {
158         // Implemented by subclasses.
159     },
160
161     visibilityDidChange: function()
162     {
163         this._toolbarItem.activated = this.visible;
164     }
165 };