2011-02-02 Mikhail Naganov <mnaganov@chromium.org>
[WebKit-https.git] / Source / WebCore / inspector / front-end / SidebarTreeElement.js
1 /*
2  * Copyright (C) 2008 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WebInspector.SidebarSectionTreeElement = function(title, representedObject, hasChildren)
27 {
28     TreeElement.call(this, title.escapeHTML(), representedObject || {}, hasChildren);
29 }
30
31 WebInspector.SidebarSectionTreeElement.prototype = {
32     selectable: false,
33
34     get smallChildren()
35     {
36         return this._smallChildren;
37     },
38
39     set smallChildren(x)
40     {
41         if (this._smallChildren === x)
42             return;
43
44         this._smallChildren = x;
45
46         if (this._smallChildren)
47             this._childrenListNode.addStyleClass("small");
48         else
49             this._childrenListNode.removeStyleClass("small");
50     },
51
52     onattach: function()
53     {
54         this._listItemNode.addStyleClass("sidebar-tree-section");
55     },
56
57     onreveal: function()
58     {
59         if (this.listItemElement)
60             this.listItemElement.scrollIntoViewIfNeeded(false);
61     }
62 }
63
64 WebInspector.SidebarSectionTreeElement.prototype.__proto__ = TreeElement.prototype;
65
66 WebInspector.SidebarTreeElement = function(className, title, subtitle, representedObject, hasChildren)
67 {
68     TreeElement.call(this, "", representedObject || {}, hasChildren);
69
70     if (hasChildren) {
71         this.disclosureButton = document.createElement("button");
72         this.disclosureButton.className = "disclosure-button";
73     }
74
75     if (!this.iconElement) {
76         this.iconElement = document.createElement("img");
77         this.iconElement.className = "icon";
78     }
79
80     this.statusElement = document.createElement("div");
81     this.statusElement.className = "status";
82
83     this.titlesElement = document.createElement("div");
84     this.titlesElement.className = "titles";
85
86     this.titleElement = document.createElement("span");
87     this.titleElement.className = "title";
88     this.titlesElement.appendChild(this.titleElement);
89
90     this.subtitleElement = document.createElement("span");
91     this.subtitleElement.className = "subtitle";
92     this.titlesElement.appendChild(this.subtitleElement);
93
94     this.className = className;
95     this.mainTitle = title;
96     this.subtitle = subtitle;
97 }
98
99 WebInspector.SidebarTreeElement.prototype = {
100     get small()
101     {
102         return this._small;
103     },
104
105     set small(x)
106     {
107         this._small = x;
108
109         if (this._listItemNode) {
110             if (this._small)
111                 this._listItemNode.addStyleClass("small");
112             else
113                 this._listItemNode.removeStyleClass("small");
114         }
115     },
116
117     get mainTitle()
118     {
119         return this._mainTitle;
120     },
121
122     set mainTitle(x)
123     {
124         this._mainTitle = x;
125         this.refreshTitles();
126     },
127
128     get subtitle()
129     {
130         return this._subtitle;
131     },
132
133     set subtitle(x)
134     {
135         this._subtitle = x;
136         this.refreshTitles();
137     },
138
139     get bubbleText()
140     {
141         return this._bubbleText;
142     },
143
144     set bubbleText(x)
145     {
146         if (!this.bubbleElement) {
147             this.bubbleElement = document.createElement("div");
148             this.bubbleElement.className = "bubble";
149             this.statusElement.appendChild(this.bubbleElement);
150         }
151
152         this._bubbleText = x;
153         this.bubbleElement.textContent = x;
154     },
155
156     refreshTitles: function()
157     {
158         var mainTitle = this.mainTitle;
159         if (this.titleElement.textContent !== mainTitle)
160             this.titleElement.textContent = mainTitle;
161
162         var subtitle = this.subtitle;
163         if (subtitle) {
164             if (this.subtitleElement.textContent !== subtitle)
165                 this.subtitleElement.textContent = subtitle;
166             this.titlesElement.removeStyleClass("no-subtitle");
167         } else {
168             this.subtitleElement.textContent = "";
169             this.titlesElement.addStyleClass("no-subtitle");
170         }
171     },
172
173     isEventWithinDisclosureTriangle: function(event)
174     {
175         return event.target === this.disclosureButton;
176     },
177
178     onattach: function()
179     {
180         this._listItemNode.addStyleClass("sidebar-tree-item");
181
182         if (this.className)
183             this._listItemNode.addStyleClass(this.className);
184
185         if (this.small)
186             this._listItemNode.addStyleClass("small");
187
188         if (this.hasChildren && this.disclosureButton)
189             this._listItemNode.appendChild(this.disclosureButton);
190
191         this._listItemNode.appendChild(this.iconElement);
192         this._listItemNode.appendChild(this.statusElement);
193         this._listItemNode.appendChild(this.titlesElement);
194     },
195
196     onreveal: function()
197     {
198         if (this._listItemNode)
199             this._listItemNode.scrollIntoViewIfNeeded(false);
200     }
201 }
202
203 WebInspector.SidebarTreeElement.prototype.__proto__ = TreeElement.prototype;