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 /** 27 * @constructor 28 * @extends {TreeElement} 29 */ 30 WebInspector.SidebarSectionTreeElement = function(title, representedObject, hasChildren) 31 { 32 TreeElement.call(this, title.escapeHTML(), representedObject || {}, hasChildren); 33 this.expand(); 34 } 35 36 WebInspector.SidebarSectionTreeElement.prototype = { 37 selectable: false, 38 39 collapse: function() 40 { 41 // Should not collapse as it is not selectable. 42 }, 43 44 get smallChildren() 45 { 46 return this._smallChildren; 47 }, 48 49 set smallChildren(x) 50 { 51 if (this._smallChildren === x) 52 return; 53 54 this._smallChildren = x; 55 56 this._childrenListNode.classList.toggle("small", this._smallChildren); 57 }, 58 59 onattach: function() 60 { 61 this._listItemNode.classList.add("sidebar-tree-section"); 62 }, 63 64 onreveal: function() 65 { 66 if (this.listItemElement) 67 this.listItemElement.scrollIntoViewIfNeeded(false); 68 }, 69 70 __proto__: TreeElement.prototype 71 } 72 73 /** 74 * @constructor 75 * @extends {TreeElement} 76 * @param {string} className 77 * @param {string} title 78 * @param {string=} subtitle 79 * @param {?Object=} representedObject 80 * @param {boolean=} hasChildren 81 */ 82 WebInspector.SidebarTreeElement = function(className, title, subtitle, representedObject, hasChildren) 83 { 84 TreeElement.call(this, "", representedObject, hasChildren); 85 86 if (hasChildren) { 87 this.disclosureButton = document.createElement("button"); 88 this.disclosureButton.className = "disclosure-button"; 89 } 90 91 this.iconElement = document.createElementWithClass("div", "icon"); 92 this.statusElement = document.createElementWithClass("div", "status"); 93 this.titlesElement = document.createElementWithClass("div", "titles"); 94 95 this.titleContainer = this.titlesElement.createChild("span", "title-container"); 96 this.titleElement = this.titleContainer.createChild("span", "title"); 97 98 this.subtitleElement = this.titlesElement.createChild("span", "subtitle"); 99 100 this.className = className; 101 this.mainTitle = title; 102 this.subtitle = subtitle; 103 } 104 105 WebInspector.SidebarTreeElement.prototype = { 106 get small() 107 { 108 return this._small; 109 }, 110 111 set small(x) 112 { 113 this._small = x; 114 if (this._listItemNode) 115 this._listItemNode.classList.toggle("small", this._small); 116 }, 117 118 get mainTitle() 119 { 120 return this._mainTitle; 121 }, 122 123 set mainTitle(x) 124 { 125 this._mainTitle = x; 126 this.refreshTitles(); 127 }, 128 129 get subtitle() 130 { 131 return this._subtitle; 132 }, 133 134 set subtitle(x) 135 { 136 this._subtitle = x; 137 this.refreshTitles(); 138 }, 139 140 set wait(x) 141 { 142 this._listItemNode.classList.toggle("wait", x); 143 }, 144 145 refreshTitles: function() 146 { 147 var mainTitle = this.mainTitle; 148 if (this.titleElement.textContent !== mainTitle) 149 this.titleElement.textContent = mainTitle; 150 151 var subtitle = this.subtitle; 152 if (subtitle) { 153 if (this.subtitleElement.textContent !== subtitle) 154 this.subtitleElement.textContent = subtitle; 155 this.titlesElement.classList.remove("no-subtitle"); 156 } else { 157 this.subtitleElement.textContent = ""; 158 this.titlesElement.classList.add("no-subtitle"); 159 } 160 }, 161 162 /** 163 * @return {boolean} 164 */ 165 isEventWithinDisclosureTriangle: function(event) 166 { 167 return event.target === this.disclosureButton; 168 }, 169 170 onattach: function() 171 { 172 this._listItemNode.classList.add("sidebar-tree-item"); 173 174 if (this.className) 175 this._listItemNode.classList.add(this.className); 176 177 if (this.small) 178 this._listItemNode.classList.add("small"); 179 180 if (this.hasChildren && this.disclosureButton) 181 this._listItemNode.appendChild(this.disclosureButton); 182 183 this._listItemNode.appendChild(this.iconElement); 184 this._listItemNode.appendChild(this.statusElement); 185 this._listItemNode.appendChild(this.titlesElement); 186 }, 187 188 onreveal: function() 189 { 190 if (this._listItemNode) 191 this._listItemNode.scrollIntoViewIfNeeded(false); 192 }, 193 194 __proto__: TreeElement.prototype 195 } 196