821f6323599339fb9e85b7101b83dd921478377e
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Views / SidebarPanel.js
1 /*
2  * Copyright (C) 2013, 2015 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 WI.SidebarPanel = class SidebarPanel extends WI.View
27 {
28     constructor(identifier, displayName)
29     {
30         super();
31
32         this._identifier = identifier;
33         this._displayName = displayName;
34         this._selected = false;
35
36         this._savedScrollPosition = 0;
37
38         this.element.classList.add("panel", identifier);
39
40         this.element.setAttribute("role", "group");
41         this.element.setAttribute("aria-label", displayName);
42
43         this._contentView = new WI.View;
44         this._contentView.element.classList.add("content");
45         this.addSubview(this._contentView);
46     }
47
48     // Public
49
50     get identifier()
51     {
52         return this._identifier;
53     }
54
55     get contentView()
56     {
57         return this._contentView;
58     }
59
60     get displayName()
61     {
62         return this._displayName;
63     }
64
65     get visible()
66     {
67         return this.selected && this.parentSidebar && !this.parentSidebar.collapsed;
68     }
69
70     get selected()
71     {
72         return this._selected;
73     }
74
75     set selected(flag)
76     {
77         if (flag === this._selected)
78             return;
79
80         this._selected = flag || false;
81         this.element.classList.toggle("selected", this._selected);
82     }
83
84     get parentSidebar()
85     {
86         return this.parentView;
87     }
88
89     get minimumWidth()
90     {
91         // Implemented by subclasses.
92         return 0;
93     }
94
95     show()
96     {
97         if (!this.parentSidebar)
98             return;
99
100         this.parentSidebar.collapsed = false;
101         this.parentSidebar.selectedSidebarPanel = this;
102     }
103
104     hide()
105     {
106         if (!this.parentSidebar)
107             return;
108
109         this.parentSidebar.collapsed = true;
110         this.parentSidebar.selectedSidebarPanel = null;
111     }
112
113     added()
114     {
115         console.assert(this.parentSidebar);
116
117         // Implemented by subclasses.
118     }
119
120     removed()
121     {
122         console.assert(!this.parentSidebar);
123
124         // Implemented by subclasses.
125     }
126
127     shown()
128     {
129         this._contentView.element.scrollTop = this._savedScrollPosition;
130
131         // FIXME: remove once <https://webkit.org/b/150741> is fixed.
132         this.updateLayoutIfNeeded();
133
134         // Implemented by subclasses.
135     }
136
137     hidden()
138     {
139         this._savedScrollPosition = this._contentView.element.scrollTop;
140
141         // Implemented by subclasses.
142     }
143
144     visibilityDidChange()
145     {
146         // Implemented by subclasses.
147     }
148 };