1/*
2 * Copyright (C) 2007 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 *
8 * 1.  Redistributions of source code must retain the above copyright
9 *     notice, this list of conditions and the following disclaimer.
10 * 2.  Redistributions in binary form must reproduce the above copyright
11 *     notice, this list of conditions and the following disclaimer in the
12 *     documentation and/or other materials provided with the distribution.
13 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 *     its contributors may be used to endorse or promote products derived
15 *     from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/**
30 * @constructor
31 * @extends {WebInspector.View}
32 */
33WebInspector.SidebarPane = function(title)
34{
35    WebInspector.View.call(this);
36    this.setMinimumSize(25, 0);
37    this.element.className = "sidebar-pane"; // Override
38
39    this.titleElement = document.createElement("div");
40    this.titleElement.className = "sidebar-pane-toolbar";
41
42    this.bodyElement = this.element.createChild("div", "body");
43
44    this._title = title;
45
46    this._expandCallback = null;
47}
48
49WebInspector.SidebarPane.EventTypes = {
50    wasShown: "wasShown"
51}
52
53WebInspector.SidebarPane.prototype = {
54    /**
55     * @return {string}
56     */
57    title: function()
58    {
59        return this._title;
60    },
61
62    /**
63     * @param {function()} callback
64     */
65    prepareContent: function(callback)
66    {
67        if (callback)
68            callback();
69    },
70
71    expand: function()
72    {
73        this.prepareContent(this.onContentReady.bind(this));
74    },
75
76    onContentReady: function()
77    {
78        if (this._expandCallback)
79            this._expandCallback();
80        else
81            this._expandPending = true;
82    },
83
84    /**
85     * @param {function()} callback
86     */
87    setExpandCallback: function(callback)
88    {
89        this._expandCallback = callback;
90        if (this._expandPending) {
91            delete this._expandPending;
92            this._expandCallback();
93        }
94    },
95
96    wasShown: function()
97    {
98        WebInspector.View.prototype.wasShown.call(this);
99        this.dispatchEventToListeners(WebInspector.SidebarPane.EventTypes.wasShown);
100    },
101
102    __proto__: WebInspector.View.prototype
103}
104
105/**
106 * @constructor
107 * @param {!Element} container
108 * @param {!WebInspector.SidebarPane} pane
109 */
110WebInspector.SidebarPaneTitle = function(container, pane)
111{
112    this._pane = pane;
113
114    this.element = container.createChild("div", "sidebar-pane-title");
115    this.element.textContent = pane.title();
116    this.element.tabIndex = 0;
117    this.element.addEventListener("click", this._toggleExpanded.bind(this), false);
118    this.element.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);
119    this.element.appendChild(this._pane.titleElement);
120
121    this._pane.setExpandCallback(this._expand.bind(this));
122}
123
124WebInspector.SidebarPaneTitle.prototype = {
125
126    _expand: function()
127    {
128        this.element.classList.add("expanded");
129        this._pane.show(this.element.parentElement, /** @type {?Element} */ (this.element.nextSibling));
130    },
131
132    _collapse: function()
133    {
134        this.element.classList.remove("expanded");
135        if (this._pane.element.parentNode == this.element.parentNode)
136            this._pane.detach();
137    },
138
139    _toggleExpanded: function()
140    {
141        if (this.element.classList.contains("expanded"))
142            this._collapse();
143        else
144            this._pane.expand();
145    },
146
147    /**
148     * @param {?Event} event
149     */
150    _onTitleKeyDown: function(event)
151    {
152        if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.Keys.Space.code)
153            this._toggleExpanded();
154    }
155}
156
157/**
158 * @constructor
159 * @extends {WebInspector.View}
160 */
161WebInspector.SidebarPaneStack = function()
162{
163    WebInspector.View.call(this);
164    this.setMinimumSize(25, 0);
165    this.element.className = "sidebar-pane-stack"; // Override
166    this.registerRequiredCSS("sidebarPane.css");
167}
168
169WebInspector.SidebarPaneStack.prototype = {
170    /**
171     * @param {!WebInspector.SidebarPane} pane
172     */
173    addPane: function(pane)
174    {
175        new WebInspector.SidebarPaneTitle(this.element, pane);
176    },
177
178    __proto__: WebInspector.View.prototype
179}
180
181/**
182 * @constructor
183 * @extends {WebInspector.TabbedPane}
184 */
185WebInspector.SidebarTabbedPane = function()
186{
187    WebInspector.TabbedPane.call(this);
188    this.setRetainTabOrder(true);
189    this.element.classList.add("sidebar-tabbed-pane");
190    this.registerRequiredCSS("sidebarPane.css");
191}
192
193WebInspector.SidebarTabbedPane.prototype = {
194    /**
195     * @param {!WebInspector.SidebarPane} pane
196     */
197    addPane: function(pane)
198    {
199        var title = pane.title();
200        this.appendTab(title, title, pane);
201        pane.element.appendChild(pane.titleElement);
202        pane.setExpandCallback(this.selectTab.bind(this, title));
203
204    },
205
206    __proto__: WebInspector.TabbedPane.prototype
207}
208