OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
11 * copyright notice, this list of conditions and the following disclaimer | 11 * copyright notice, this list of conditions and the following disclaimer |
12 * in the documentation and/or other materials provided with the | 12 * in the documentation and/or other materials provided with the |
13 * distribution. | 13 * distribution. |
14 * * Neither the name of Google Inc. nor the names of its | 14 * * Neither the name of Google Inc. nor the names of its |
15 * contributors may be used to endorse or promote products derived from | 15 * contributors may be used to endorse or promote products derived from |
16 * this software without specific prior written permission. | 16 * this software without specific prior written permission. |
17 * | 17 * |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 /** |
31 /** | 31 * @unrestricted |
32 * @constructor | 32 */ |
33 * @param {string} className | 33 WebInspector.Toolbar = class { |
34 * @param {!Element=} parentElement | 34 /** |
35 */ | 35 * @param {string} className |
36 WebInspector.Toolbar = function(className, parentElement) | 36 * @param {!Element=} parentElement |
37 { | 37 */ |
| 38 constructor(className, parentElement) { |
38 /** @type {!Array.<!WebInspector.ToolbarItem>} */ | 39 /** @type {!Array.<!WebInspector.ToolbarItem>} */ |
39 this._items = []; | 40 this._items = []; |
40 this._reverse = false; | 41 this._reverse = false; |
41 this.element = parentElement ? parentElement.createChild("div") : createElem
ent("div"); | 42 this.element = parentElement ? parentElement.createChild('div') : createElem
ent('div'); |
42 this.element.className = className; | 43 this.element.className = className; |
43 this.element.classList.add("toolbar"); | 44 this.element.classList.add('toolbar'); |
44 this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element,
"ui/toolbar.css"); | 45 this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element,
'ui/toolbar.css'); |
45 this._contentElement = this._shadowRoot.createChild("div", "toolbar-shadow")
; | 46 this._contentElement = this._shadowRoot.createChild('div', 'toolbar-shadow')
; |
46 this._insertionPoint = this._contentElement.createChild("content"); | 47 this._insertionPoint = this._contentElement.createChild('content'); |
47 }; | 48 } |
48 | 49 |
49 WebInspector.Toolbar.prototype = { | 50 /** |
50 /** | 51 * @param {!WebInspector.Action} action |
51 * @param {boolean=} reverse | 52 * @param {!Array<!WebInspector.ToolbarButton>=} toggledOptions |
52 */ | 53 * @param {!Array<!WebInspector.ToolbarButton>=} untoggledOptions |
53 makeWrappable: function(reverse) | 54 * @return {!WebInspector.ToolbarItem} |
54 { | 55 */ |
55 this._contentElement.classList.add("wrappable"); | 56 static createActionButton(action, toggledOptions, untoggledOptions) { |
56 this._reverse = !!reverse; | |
57 if (reverse) | |
58 this._contentElement.classList.add("wrappable-reverse"); | |
59 }, | |
60 | |
61 makeVertical: function() | |
62 { | |
63 this._contentElement.classList.add("vertical"); | |
64 }, | |
65 | |
66 makeBlueOnHover: function() | |
67 { | |
68 this._contentElement.classList.add("toolbar-blue-on-hover"); | |
69 }, | |
70 | |
71 makeToggledGray: function() | |
72 { | |
73 this._contentElement.classList.add("toolbar-toggled-gray"); | |
74 }, | |
75 | |
76 renderAsLinks: function() | |
77 { | |
78 this._contentElement.classList.add("toolbar-render-as-links"); | |
79 }, | |
80 | |
81 /** | |
82 * @param {boolean} enabled | |
83 */ | |
84 setEnabled: function(enabled) | |
85 { | |
86 for (var item of this._items) | |
87 item.setEnabled(enabled); | |
88 }, | |
89 | |
90 /** | |
91 * @param {!WebInspector.ToolbarItem} item | |
92 */ | |
93 appendToolbarItem: function(item) | |
94 { | |
95 this._items.push(item); | |
96 item._toolbar = this; | |
97 if (this._reverse) | |
98 this._contentElement.insertBefore(item.element, this._insertionPoint
.nextSibling); | |
99 else | |
100 this._contentElement.insertBefore(item.element, this._insertionPoint
); | |
101 this._hideSeparatorDupes(); | |
102 }, | |
103 | |
104 appendSeparator: function() | |
105 { | |
106 this.appendToolbarItem(new WebInspector.ToolbarSeparator()); | |
107 }, | |
108 | |
109 appendSpacer: function() | |
110 { | |
111 this.appendToolbarItem(new WebInspector.ToolbarSeparator(true)); | |
112 }, | |
113 | |
114 /** | |
115 * @param {string} text | |
116 */ | |
117 appendText: function(text) | |
118 { | |
119 this.appendToolbarItem(new WebInspector.ToolbarText(text)); | |
120 }, | |
121 | |
122 removeToolbarItems: function() | |
123 { | |
124 for (var item of this._items) | |
125 delete item._toolbar; | |
126 this._items = []; | |
127 this._contentElement.removeChildren(); | |
128 this._insertionPoint = this._contentElement.createChild("content"); | |
129 }, | |
130 | |
131 /** | |
132 * @param {string} color | |
133 */ | |
134 setColor: function(color) | |
135 { | |
136 var style = createElement("style"); | |
137 style.textContent = ".toolbar-glyph { background-color: " + color + " !i
mportant }"; | |
138 this._shadowRoot.appendChild(style); | |
139 }, | |
140 | |
141 /** | |
142 * @param {string} color | |
143 */ | |
144 setToggledColor: function(color) | |
145 { | |
146 var style = createElement("style"); | |
147 style.textContent = ".toolbar-button.toolbar-state-on .toolbar-glyph { b
ackground-color: " + color + " !important }"; | |
148 this._shadowRoot.appendChild(style); | |
149 }, | |
150 | |
151 _hideSeparatorDupes: function() | |
152 { | |
153 if (!this._items.length) | |
154 return; | |
155 // Don't hide first and last separators if they were added explicitly. | |
156 var previousIsSeparator = false; | |
157 var lastSeparator; | |
158 var nonSeparatorVisible = false; | |
159 for (var i = 0; i < this._items.length; ++i) { | |
160 if (this._items[i] instanceof WebInspector.ToolbarSeparator) { | |
161 this._items[i].setVisible(!previousIsSeparator); | |
162 previousIsSeparator = true; | |
163 lastSeparator = this._items[i]; | |
164 continue; | |
165 } | |
166 if (this._items[i].visible()) { | |
167 previousIsSeparator = false; | |
168 lastSeparator = null; | |
169 nonSeparatorVisible = true; | |
170 } | |
171 } | |
172 if (lastSeparator && lastSeparator !== this._items.peekLast()) | |
173 lastSeparator.setVisible(false); | |
174 | |
175 this.element.classList.toggle("hidden", !!lastSeparator && lastSeparator
.visible() && !nonSeparatorVisible); | |
176 }, | |
177 | |
178 /** | |
179 * @param {string} location | |
180 */ | |
181 appendLocationItems: function(location) | |
182 { | |
183 var extensions = self.runtime.extensions(WebInspector.ToolbarItem.Provid
er); | |
184 var promises = []; | |
185 for (var i = 0; i < extensions.length; ++i) { | |
186 if (extensions[i].descriptor()["location"] === location) | |
187 promises.push(resolveItem(extensions[i])); | |
188 } | |
189 Promise.all(promises).then(appendItemsInOrder.bind(this)); | |
190 | |
191 /** | |
192 * @param {!Runtime.Extension} extension | |
193 * @return {!Promise.<?WebInspector.ToolbarItem>} | |
194 */ | |
195 function resolveItem(extension) | |
196 { | |
197 var descriptor = extension.descriptor(); | |
198 if (descriptor["separator"]) | |
199 return Promise.resolve(/** @type {?WebInspector.ToolbarItem} */(
new WebInspector.ToolbarSeparator())); | |
200 if (descriptor["actionId"]) | |
201 return Promise.resolve(WebInspector.Toolbar.createActionButtonFo
rId(descriptor["actionId"])); | |
202 return extension.instance().then(fetchItemFromProvider); | |
203 | |
204 /** | |
205 * @param {!Object} provider | |
206 */ | |
207 function fetchItemFromProvider(provider) | |
208 { | |
209 return /** @type {!WebInspector.ToolbarItem.Provider} */ (provid
er).item(); | |
210 } | |
211 } | |
212 | |
213 /** | |
214 * @param {!Array.<?WebInspector.ToolbarItem>} items | |
215 * @this {WebInspector.Toolbar} | |
216 */ | |
217 function appendItemsInOrder(items) | |
218 { | |
219 for (var i = 0; i < items.length; ++i) { | |
220 var item = items[i]; | |
221 if (item) | |
222 this.appendToolbarItem(item); | |
223 } | |
224 } | |
225 } | |
226 }; | |
227 | |
228 /** | |
229 * @constructor | |
230 * @extends {WebInspector.Object} | |
231 * @param {!Element} element | |
232 */ | |
233 WebInspector.ToolbarItem = function(element) | |
234 { | |
235 this.element = element; | |
236 this.element.classList.add("toolbar-item"); | |
237 this._visible = true; | |
238 this._enabled = true; | |
239 this.element.addEventListener("mouseenter", this._mouseEnter.bind(this), fal
se); | |
240 this.element.addEventListener("mouseleave", this._mouseLeave.bind(this), fal
se); | |
241 }; | |
242 | |
243 WebInspector.ToolbarItem.prototype = { | |
244 /** | |
245 * @param {string} title | |
246 */ | |
247 setTitle: function(title) | |
248 { | |
249 if (this._title === title) | |
250 return; | |
251 this._title = title; | |
252 WebInspector.Tooltip.install(this.element, title); | |
253 }, | |
254 | |
255 _mouseEnter: function() | |
256 { | |
257 this.element.classList.add("hover"); | |
258 }, | |
259 | |
260 _mouseLeave: function() | |
261 { | |
262 this.element.classList.remove("hover"); | |
263 }, | |
264 | |
265 /** | |
266 * @param {boolean} value | |
267 */ | |
268 setEnabled: function(value) | |
269 { | |
270 if (this._enabled === value) | |
271 return; | |
272 this._enabled = value; | |
273 this._applyEnabledState(); | |
274 }, | |
275 | |
276 _applyEnabledState: function() | |
277 { | |
278 this.element.disabled = !this._enabled; | |
279 }, | |
280 | |
281 /** | |
282 * @return {boolean} x | |
283 */ | |
284 visible: function() | |
285 { | |
286 return this._visible; | |
287 }, | |
288 | |
289 /** | |
290 * @param {boolean} x | |
291 */ | |
292 setVisible: function(x) | |
293 { | |
294 if (this._visible === x) | |
295 return; | |
296 this.element.classList.toggle("hidden", !x); | |
297 this._visible = x; | |
298 if (this._toolbar && !(this instanceof WebInspector.ToolbarSeparator)) | |
299 this._toolbar._hideSeparatorDupes(); | |
300 }, | |
301 | |
302 __proto__: WebInspector.Object.prototype | |
303 }; | |
304 | |
305 /** | |
306 * @constructor | |
307 * @extends {WebInspector.ToolbarItem} | |
308 * @param {string=} text | |
309 */ | |
310 WebInspector.ToolbarText = function(text) | |
311 { | |
312 WebInspector.ToolbarItem.call(this, createElementWithClass("div", "toolbar-t
ext")); | |
313 this.element.classList.add("toolbar-text"); | |
314 this.setText(text || ""); | |
315 }; | |
316 | |
317 WebInspector.ToolbarText.prototype = { | |
318 /** | |
319 * @param {string} text | |
320 */ | |
321 setText: function(text) | |
322 { | |
323 this.element.textContent = text; | |
324 }, | |
325 | |
326 __proto__: WebInspector.ToolbarItem.prototype | |
327 }; | |
328 | |
329 /** | |
330 * @constructor | |
331 * @extends {WebInspector.ToolbarItem} | |
332 * @param {string} title | |
333 * @param {string=} glyph | |
334 * @param {string=} text | |
335 */ | |
336 WebInspector.ToolbarButton = function(title, glyph, text) | |
337 { | |
338 WebInspector.ToolbarItem.call(this, createElementWithClass("button", "toolba
r-button")); | |
339 this.element.addEventListener("click", this._clicked.bind(this), false); | |
340 this.element.addEventListener("mousedown", this._mouseDown.bind(this), false
); | |
341 this.element.addEventListener("mouseup", this._mouseUp.bind(this), false); | |
342 | |
343 this._glyphElement = this.element.createChild("div", "toolbar-glyph hidden")
; | |
344 this._textElement = this.element.createChild("div", "toolbar-text hidden"); | |
345 | |
346 this.setTitle(title); | |
347 if (glyph) | |
348 this.setGlyph(glyph); | |
349 this.setText(text || ""); | |
350 this._state = ""; | |
351 this._title = ""; | |
352 }; | |
353 | |
354 WebInspector.ToolbarButton.prototype = { | |
355 /** | |
356 * @param {string} text | |
357 */ | |
358 setText: function(text) | |
359 { | |
360 if (this._text === text) | |
361 return; | |
362 this._textElement.textContent = text; | |
363 this._textElement.classList.toggle("hidden", !text); | |
364 this._text = text; | |
365 }, | |
366 | |
367 /** | |
368 * @param {string} glyph | |
369 */ | |
370 setGlyph: function(glyph) | |
371 { | |
372 if (this._glyph === glyph) | |
373 return; | |
374 if (this._glyph) | |
375 this._glyphElement.classList.remove(this._glyph); | |
376 if (glyph) | |
377 this._glyphElement.classList.add(glyph); | |
378 this._glyphElement.classList.toggle("hidden", !glyph); | |
379 this.element.classList.toggle("toolbar-has-glyph", !!glyph); | |
380 this._glyph = glyph; | |
381 }, | |
382 | |
383 /** | |
384 * @param {string} iconURL | |
385 */ | |
386 setBackgroundImage: function(iconURL) | |
387 { | |
388 this.element.style.backgroundImage = "url(" + iconURL + ")"; | |
389 }, | |
390 | |
391 /** | |
392 * @return {string} | |
393 */ | |
394 state: function() | |
395 { | |
396 return this._state; | |
397 }, | |
398 | |
399 /** | |
400 * @param {string} state | |
401 */ | |
402 setState: function(state) | |
403 { | |
404 if (this._state === state) | |
405 return; | |
406 this.element.classList.remove("toolbar-state-" + this._state); | |
407 this.element.classList.add("toolbar-state-" + state); | |
408 this._state = state; | |
409 }, | |
410 | |
411 /** | |
412 * @param {number=} width | |
413 */ | |
414 turnIntoSelect: function(width) | |
415 { | |
416 this.element.classList.add("toolbar-has-dropdown"); | |
417 this.element.createChild("div", "toolbar-dropdown-arrow"); | |
418 if (width) | |
419 this.element.style.width = width + "px"; | |
420 }, | |
421 | |
422 /** | |
423 * @param {!Event} event | |
424 */ | |
425 _clicked: function(event) | |
426 { | |
427 var defaultPrevented = this.dispatchEventToListeners("click", event); | |
428 event.consume(defaultPrevented); | |
429 }, | |
430 | |
431 /** | |
432 * @param {!Event} event | |
433 */ | |
434 _mouseDown: function(event) | |
435 { | |
436 this.dispatchEventToListeners("mousedown", event); | |
437 }, | |
438 | |
439 /** | |
440 * @param {!Event} event | |
441 */ | |
442 _mouseUp: function(event) | |
443 { | |
444 this.dispatchEventToListeners("mouseup", event); | |
445 }, | |
446 | |
447 __proto__: WebInspector.ToolbarItem.prototype | |
448 }; | |
449 | |
450 /** | |
451 * @constructor | |
452 * @extends {WebInspector.ToolbarItem} | |
453 * @param {string=} placeholder | |
454 * @param {number=} growFactor | |
455 */ | |
456 WebInspector.ToolbarInput = function(placeholder, growFactor) | |
457 { | |
458 WebInspector.ToolbarItem.call(this, createElementWithClass("input", "toolbar
-item")); | |
459 this.element.addEventListener("input", this._onChangeCallback.bind(this), fa
lse); | |
460 if (growFactor) | |
461 this.element.style.flexGrow = growFactor; | |
462 if (placeholder) | |
463 this.element.setAttribute("placeholder", placeholder); | |
464 this._value = ""; | |
465 }; | |
466 | |
467 WebInspector.ToolbarInput.Event = { | |
468 TextChanged: "TextChanged" | |
469 }; | |
470 | |
471 WebInspector.ToolbarInput.prototype = { | |
472 /** | |
473 * @param {string} value | |
474 */ | |
475 setValue: function(value) | |
476 { | |
477 this._value = value; | |
478 this.element.value = value; | |
479 }, | |
480 | |
481 /** | |
482 * @return {string} | |
483 */ | |
484 value: function() | |
485 { | |
486 return this.element.value; | |
487 }, | |
488 | |
489 _onChangeCallback: function() | |
490 { | |
491 this.dispatchEventToListeners(WebInspector.ToolbarInput.Event.TextChange
d, this.element.value); | |
492 }, | |
493 | |
494 __proto__: WebInspector.ToolbarItem.prototype | |
495 }; | |
496 | |
497 /** | |
498 * @constructor | |
499 * @extends {WebInspector.ToolbarButton} | |
500 * @param {string} title | |
501 * @param {string=} glyph | |
502 * @param {string=} text | |
503 */ | |
504 WebInspector.ToolbarToggle = function(title, glyph, text) | |
505 { | |
506 WebInspector.ToolbarButton.call(this, title, glyph, text); | |
507 this._toggled = false; | |
508 this.setState("off"); | |
509 }; | |
510 | |
511 WebInspector.ToolbarToggle.prototype = { | |
512 /** | |
513 * @return {boolean} | |
514 */ | |
515 toggled: function() | |
516 { | |
517 return this._toggled; | |
518 }, | |
519 | |
520 /** | |
521 * @param {boolean} toggled | |
522 */ | |
523 setToggled: function(toggled) | |
524 { | |
525 if (this._toggled === toggled) | |
526 return; | |
527 this._toggled = toggled; | |
528 this.setState(toggled ? "on" : "off"); | |
529 }, | |
530 | |
531 __proto__: WebInspector.ToolbarButton.prototype | |
532 }; | |
533 | |
534 /** | |
535 * @param {!WebInspector.Action} action | |
536 * @param {!Array<!WebInspector.ToolbarButton>=} toggledOptions | |
537 * @param {!Array<!WebInspector.ToolbarButton>=} untoggledOptions | |
538 * @return {!WebInspector.ToolbarItem} | |
539 */ | |
540 WebInspector.Toolbar.createActionButton = function(action, toggledOptions, untog
gledOptions) | |
541 { | |
542 var button = new WebInspector.ToolbarToggle(action.title(), action.icon()); | 57 var button = new WebInspector.ToolbarToggle(action.title(), action.icon()); |
543 button.addEventListener("click", action.execute, action); | 58 button.addEventListener('click', action.execute, action); |
544 action.addEventListener(WebInspector.Action.Events.Enabled, enabledChanged); | 59 action.addEventListener(WebInspector.Action.Events.Enabled, enabledChanged); |
545 action.addEventListener(WebInspector.Action.Events.Toggled, toggled); | 60 action.addEventListener(WebInspector.Action.Events.Toggled, toggled); |
546 /** @type {?WebInspector.LongClickController} */ | 61 /** @type {?WebInspector.LongClickController} */ |
547 var longClickController = null; | 62 var longClickController = null; |
548 /** @type {?Array<!WebInspector.ToolbarButton>} */ | 63 /** @type {?Array<!WebInspector.ToolbarButton>} */ |
549 var longClickButtons = null; | 64 var longClickButtons = null; |
550 /** @type {?Element} */ | 65 /** @type {?Element} */ |
551 var longClickGlyph = null; | 66 var longClickGlyph = null; |
552 toggled(); | 67 toggled(); |
553 return button; | 68 return button; |
554 | 69 |
555 /** | 70 /** |
556 * @param {!WebInspector.Event} event | 71 * @param {!WebInspector.Event} event |
557 */ | 72 */ |
558 function enabledChanged(event) | 73 function enabledChanged(event) { |
559 { | 74 button.setEnabled(/** @type {boolean} */ (event.data)); |
560 button.setEnabled(/** @type {boolean} */ (event.data)); | |
561 } | 75 } |
562 | 76 |
563 function toggled() | 77 function toggled() { |
564 { | 78 button.setToggled(action.toggled()); |
565 button.setToggled(action.toggled()); | 79 if (action.title()) |
566 if (action.title()) | 80 WebInspector.Tooltip.install(button.element, action.title(), action.id()
); |
567 WebInspector.Tooltip.install(button.element, action.title(), action.
id()); | 81 updateOptions(); |
568 updateOptions(); | |
569 } | 82 } |
570 | 83 |
571 function updateOptions() | 84 function updateOptions() { |
572 { | 85 var buttons = action.toggled() ? (toggledOptions || null) : (untoggledOpti
ons || null); |
573 var buttons = action.toggled() ? (toggledOptions || null) : (untoggledOp
tions || null); | 86 |
574 | 87 if (buttons && buttons.length) { |
575 if (buttons && buttons.length) { | 88 if (!longClickController) { |
576 if (!longClickController) { | 89 longClickController = new WebInspector.LongClickController(button.elem
ent, showOptions); |
577 longClickController = new WebInspector.LongClickController(butto
n.element, showOptions); | 90 longClickGlyph = button.element.createChild('div', 'long-click-glyph t
oolbar-button-theme'); |
578 longClickGlyph = button.element.createChild("div", "long-click-g
lyph toolbar-button-theme"); | 91 longClickButtons = buttons; |
579 longClickButtons = buttons; | |
580 } | |
581 } else { | |
582 if (longClickController) { | |
583 longClickController.dispose(); | |
584 longClickController = null; | |
585 longClickGlyph.remove(); | |
586 longClickGlyph = null; | |
587 longClickButtons = null; | |
588 } | |
589 } | 92 } |
| 93 } else { |
| 94 if (longClickController) { |
| 95 longClickController.dispose(); |
| 96 longClickController = null; |
| 97 longClickGlyph.remove(); |
| 98 longClickGlyph = null; |
| 99 longClickButtons = null; |
| 100 } |
| 101 } |
590 } | 102 } |
591 | 103 |
592 function showOptions() | 104 function showOptions() { |
593 { | 105 var buttons = longClickButtons.slice(); |
594 var buttons = longClickButtons.slice(); | 106 var mainButtonClone = new WebInspector.ToolbarToggle(action.title(), actio
n.icon()); |
595 var mainButtonClone = new WebInspector.ToolbarToggle(action.title(), act
ion.icon()); | 107 mainButtonClone.addEventListener('click', clicked); |
596 mainButtonClone.addEventListener("click", clicked); | 108 |
597 | 109 /** |
598 /** | 110 * @param {!WebInspector.Event} event |
599 * @param {!WebInspector.Event} event | 111 */ |
600 */ | 112 function clicked(event) { |
601 function clicked(event) | 113 button._clicked(/** @type {!Event} */ (event.data)); |
602 { | 114 } |
603 button._clicked(/** @type {!Event} */ (event.data)); | 115 |
| 116 mainButtonClone.setToggled(action.toggled()); |
| 117 buttons.push(mainButtonClone); |
| 118 |
| 119 var document = button.element.ownerDocument; |
| 120 document.documentElement.addEventListener('mouseup', mouseUp, false); |
| 121 |
| 122 var optionsGlassPane = new WebInspector.GlassPane(document); |
| 123 var optionsBar = new WebInspector.Toolbar('fill', optionsGlassPane.element
); |
| 124 optionsBar._contentElement.classList.add('floating'); |
| 125 const buttonHeight = 26; |
| 126 |
| 127 var hostButtonPosition = button.element.totalOffset(); |
| 128 |
| 129 var topNotBottom = hostButtonPosition.top + buttonHeight * buttons.length
< document.documentElement.offsetHeight; |
| 130 |
| 131 if (topNotBottom) |
| 132 buttons = buttons.reverse(); |
| 133 |
| 134 optionsBar.element.style.height = (buttonHeight * buttons.length) + 'px'; |
| 135 if (topNotBottom) |
| 136 optionsBar.element.style.top = (hostButtonPosition.top + 1) + 'px'; |
| 137 else |
| 138 optionsBar.element.style.top = (hostButtonPosition.top - (buttonHeight *
(buttons.length - 1))) + 'px'; |
| 139 optionsBar.element.style.left = (hostButtonPosition.left + 1) + 'px'; |
| 140 |
| 141 for (var i = 0; i < buttons.length; ++i) { |
| 142 buttons[i].element.addEventListener('mousemove', mouseOver, false); |
| 143 buttons[i].element.addEventListener('mouseout', mouseOut, false); |
| 144 optionsBar.appendToolbarItem(buttons[i]); |
| 145 } |
| 146 var hostButtonIndex = topNotBottom ? 0 : buttons.length - 1; |
| 147 buttons[hostButtonIndex].element.classList.add('emulate-active'); |
| 148 |
| 149 function mouseOver(e) { |
| 150 if (e.which !== 1) |
| 151 return; |
| 152 var buttonElement = e.target.enclosingNodeOrSelfWithClass('toolbar-item'
); |
| 153 buttonElement.classList.add('emulate-active'); |
| 154 } |
| 155 |
| 156 function mouseOut(e) { |
| 157 if (e.which !== 1) |
| 158 return; |
| 159 var buttonElement = e.target.enclosingNodeOrSelfWithClass('toolbar-item'
); |
| 160 buttonElement.classList.remove('emulate-active'); |
| 161 } |
| 162 |
| 163 function mouseUp(e) { |
| 164 if (e.which !== 1) |
| 165 return; |
| 166 optionsGlassPane.dispose(); |
| 167 document.documentElement.removeEventListener('mouseup', mouseUp, false); |
| 168 |
| 169 for (var i = 0; i < buttons.length; ++i) { |
| 170 if (buttons[i].element.classList.contains('emulate-active')) { |
| 171 buttons[i].element.classList.remove('emulate-active'); |
| 172 buttons[i]._clicked(e); |
| 173 break; |
| 174 } |
604 } | 175 } |
605 | 176 } |
606 mainButtonClone.setToggled(action.toggled()); | |
607 buttons.push(mainButtonClone); | |
608 | |
609 var document = button.element.ownerDocument; | |
610 document.documentElement.addEventListener("mouseup", mouseUp, false); | |
611 | |
612 var optionsGlassPane = new WebInspector.GlassPane(document); | |
613 var optionsBar = new WebInspector.Toolbar("fill", optionsGlassPane.eleme
nt); | |
614 optionsBar._contentElement.classList.add("floating"); | |
615 const buttonHeight = 26; | |
616 | |
617 var hostButtonPosition = button.element.totalOffset(); | |
618 | |
619 var topNotBottom = hostButtonPosition.top + buttonHeight * buttons.lengt
h < document.documentElement.offsetHeight; | |
620 | |
621 if (topNotBottom) | |
622 buttons = buttons.reverse(); | |
623 | |
624 optionsBar.element.style.height = (buttonHeight * buttons.length) + "px"
; | |
625 if (topNotBottom) | |
626 optionsBar.element.style.top = (hostButtonPosition.top + 1) + "px"; | |
627 else | |
628 optionsBar.element.style.top = (hostButtonPosition.top - (buttonHeig
ht * (buttons.length - 1))) + "px"; | |
629 optionsBar.element.style.left = (hostButtonPosition.left + 1) + "px"; | |
630 | |
631 for (var i = 0; i < buttons.length; ++i) { | |
632 buttons[i].element.addEventListener("mousemove", mouseOver, false); | |
633 buttons[i].element.addEventListener("mouseout", mouseOut, false); | |
634 optionsBar.appendToolbarItem(buttons[i]); | |
635 } | |
636 var hostButtonIndex = topNotBottom ? 0 : buttons.length - 1; | |
637 buttons[hostButtonIndex].element.classList.add("emulate-active"); | |
638 | |
639 function mouseOver(e) | |
640 { | |
641 if (e.which !== 1) | |
642 return; | |
643 var buttonElement = e.target.enclosingNodeOrSelfWithClass("toolbar-i
tem"); | |
644 buttonElement.classList.add("emulate-active"); | |
645 } | |
646 | |
647 function mouseOut(e) | |
648 { | |
649 if (e.which !== 1) | |
650 return; | |
651 var buttonElement = e.target.enclosingNodeOrSelfWithClass("toolbar-i
tem"); | |
652 buttonElement.classList.remove("emulate-active"); | |
653 } | |
654 | |
655 function mouseUp(e) | |
656 { | |
657 if (e.which !== 1) | |
658 return; | |
659 optionsGlassPane.dispose(); | |
660 document.documentElement.removeEventListener("mouseup", mouseUp, fal
se); | |
661 | |
662 for (var i = 0; i < buttons.length; ++i) { | |
663 if (buttons[i].element.classList.contains("emulate-active")) { | |
664 buttons[i].element.classList.remove("emulate-active"); | |
665 buttons[i]._clicked(e); | |
666 break; | |
667 } | |
668 } | |
669 } | |
670 } | 177 } |
671 }; | 178 } |
672 | 179 |
673 /** | 180 /** |
674 * @param {string} actionId | 181 * @param {string} actionId |
675 * @return {?WebInspector.ToolbarItem} | 182 * @return {?WebInspector.ToolbarItem} |
676 */ | 183 */ |
677 WebInspector.Toolbar.createActionButtonForId = function(actionId) | 184 static createActionButtonForId(actionId) { |
678 { | |
679 var action = WebInspector.actionRegistry.action(actionId); | 185 var action = WebInspector.actionRegistry.action(actionId); |
680 return /** @type {?WebInspector.ToolbarItem} */(action ? WebInspector.Toolba
r.createActionButton(action) : null); | 186 return /** @type {?WebInspector.ToolbarItem} */ (action ? WebInspector.Toolb
ar.createActionButton(action) : null); |
681 }; | 187 } |
682 | 188 |
683 /** | 189 /** |
684 * @constructor | 190 * @param {boolean=} reverse |
685 * @extends {WebInspector.ToolbarButton} | 191 */ |
686 * @param {function(!WebInspector.ContextMenu)} contextMenuHandler | 192 makeWrappable(reverse) { |
687 * @param {boolean=} useSoftMenu | 193 this._contentElement.classList.add('wrappable'); |
688 */ | 194 this._reverse = !!reverse; |
689 WebInspector.ToolbarMenuButton = function(contextMenuHandler, useSoftMenu) | 195 if (reverse) |
690 { | 196 this._contentElement.classList.add('wrappable-reverse'); |
691 WebInspector.ToolbarButton.call(this, "", "menu-toolbar-item"); | 197 } |
| 198 |
| 199 makeVertical() { |
| 200 this._contentElement.classList.add('vertical'); |
| 201 } |
| 202 |
| 203 makeBlueOnHover() { |
| 204 this._contentElement.classList.add('toolbar-blue-on-hover'); |
| 205 } |
| 206 |
| 207 makeToggledGray() { |
| 208 this._contentElement.classList.add('toolbar-toggled-gray'); |
| 209 } |
| 210 |
| 211 renderAsLinks() { |
| 212 this._contentElement.classList.add('toolbar-render-as-links'); |
| 213 } |
| 214 |
| 215 /** |
| 216 * @param {boolean} enabled |
| 217 */ |
| 218 setEnabled(enabled) { |
| 219 for (var item of this._items) |
| 220 item.setEnabled(enabled); |
| 221 } |
| 222 |
| 223 /** |
| 224 * @param {!WebInspector.ToolbarItem} item |
| 225 */ |
| 226 appendToolbarItem(item) { |
| 227 this._items.push(item); |
| 228 item._toolbar = this; |
| 229 if (this._reverse) |
| 230 this._contentElement.insertBefore(item.element, this._insertionPoint.nextS
ibling); |
| 231 else |
| 232 this._contentElement.insertBefore(item.element, this._insertionPoint); |
| 233 this._hideSeparatorDupes(); |
| 234 } |
| 235 |
| 236 appendSeparator() { |
| 237 this.appendToolbarItem(new WebInspector.ToolbarSeparator()); |
| 238 } |
| 239 |
| 240 appendSpacer() { |
| 241 this.appendToolbarItem(new WebInspector.ToolbarSeparator(true)); |
| 242 } |
| 243 |
| 244 /** |
| 245 * @param {string} text |
| 246 */ |
| 247 appendText(text) { |
| 248 this.appendToolbarItem(new WebInspector.ToolbarText(text)); |
| 249 } |
| 250 |
| 251 removeToolbarItems() { |
| 252 for (var item of this._items) |
| 253 delete item._toolbar; |
| 254 this._items = []; |
| 255 this._contentElement.removeChildren(); |
| 256 this._insertionPoint = this._contentElement.createChild('content'); |
| 257 } |
| 258 |
| 259 /** |
| 260 * @param {string} color |
| 261 */ |
| 262 setColor(color) { |
| 263 var style = createElement('style'); |
| 264 style.textContent = '.toolbar-glyph { background-color: ' + color + ' !impor
tant }'; |
| 265 this._shadowRoot.appendChild(style); |
| 266 } |
| 267 |
| 268 /** |
| 269 * @param {string} color |
| 270 */ |
| 271 setToggledColor(color) { |
| 272 var style = createElement('style'); |
| 273 style.textContent = |
| 274 '.toolbar-button.toolbar-state-on .toolbar-glyph { background-color: ' +
color + ' !important }'; |
| 275 this._shadowRoot.appendChild(style); |
| 276 } |
| 277 |
| 278 _hideSeparatorDupes() { |
| 279 if (!this._items.length) |
| 280 return; |
| 281 // Don't hide first and last separators if they were added explicitly. |
| 282 var previousIsSeparator = false; |
| 283 var lastSeparator; |
| 284 var nonSeparatorVisible = false; |
| 285 for (var i = 0; i < this._items.length; ++i) { |
| 286 if (this._items[i] instanceof WebInspector.ToolbarSeparator) { |
| 287 this._items[i].setVisible(!previousIsSeparator); |
| 288 previousIsSeparator = true; |
| 289 lastSeparator = this._items[i]; |
| 290 continue; |
| 291 } |
| 292 if (this._items[i].visible()) { |
| 293 previousIsSeparator = false; |
| 294 lastSeparator = null; |
| 295 nonSeparatorVisible = true; |
| 296 } |
| 297 } |
| 298 if (lastSeparator && lastSeparator !== this._items.peekLast()) |
| 299 lastSeparator.setVisible(false); |
| 300 |
| 301 this.element.classList.toggle('hidden', !!lastSeparator && lastSeparator.vis
ible() && !nonSeparatorVisible); |
| 302 } |
| 303 |
| 304 /** |
| 305 * @param {string} location |
| 306 */ |
| 307 appendLocationItems(location) { |
| 308 var extensions = self.runtime.extensions(WebInspector.ToolbarItem.Provider); |
| 309 var promises = []; |
| 310 for (var i = 0; i < extensions.length; ++i) { |
| 311 if (extensions[i].descriptor()['location'] === location) |
| 312 promises.push(resolveItem(extensions[i])); |
| 313 } |
| 314 Promise.all(promises).then(appendItemsInOrder.bind(this)); |
| 315 |
| 316 /** |
| 317 * @param {!Runtime.Extension} extension |
| 318 * @return {!Promise.<?WebInspector.ToolbarItem>} |
| 319 */ |
| 320 function resolveItem(extension) { |
| 321 var descriptor = extension.descriptor(); |
| 322 if (descriptor['separator']) |
| 323 return Promise.resolve(/** @type {?WebInspector.ToolbarItem} */ (new Web
Inspector.ToolbarSeparator())); |
| 324 if (descriptor['actionId']) |
| 325 return Promise.resolve(WebInspector.Toolbar.createActionButtonForId(desc
riptor['actionId'])); |
| 326 return extension.instance().then(fetchItemFromProvider); |
| 327 |
| 328 /** |
| 329 * @param {!Object} provider |
| 330 */ |
| 331 function fetchItemFromProvider(provider) { |
| 332 return /** @type {!WebInspector.ToolbarItem.Provider} */ (provider).item
(); |
| 333 } |
| 334 } |
| 335 |
| 336 /** |
| 337 * @param {!Array.<?WebInspector.ToolbarItem>} items |
| 338 * @this {WebInspector.Toolbar} |
| 339 */ |
| 340 function appendItemsInOrder(items) { |
| 341 for (var i = 0; i < items.length; ++i) { |
| 342 var item = items[i]; |
| 343 if (item) |
| 344 this.appendToolbarItem(item); |
| 345 } |
| 346 } |
| 347 } |
| 348 }; |
| 349 |
| 350 /** |
| 351 * @unrestricted |
| 352 */ |
| 353 WebInspector.ToolbarItem = class extends WebInspector.Object { |
| 354 /** |
| 355 * @param {!Element} element |
| 356 */ |
| 357 constructor(element) { |
| 358 super(); |
| 359 this.element = element; |
| 360 this.element.classList.add('toolbar-item'); |
| 361 this._visible = true; |
| 362 this._enabled = true; |
| 363 this.element.addEventListener('mouseenter', this._mouseEnter.bind(this), fal
se); |
| 364 this.element.addEventListener('mouseleave', this._mouseLeave.bind(this), fal
se); |
| 365 } |
| 366 |
| 367 /** |
| 368 * @param {string} title |
| 369 */ |
| 370 setTitle(title) { |
| 371 if (this._title === title) |
| 372 return; |
| 373 this._title = title; |
| 374 WebInspector.Tooltip.install(this.element, title); |
| 375 } |
| 376 |
| 377 _mouseEnter() { |
| 378 this.element.classList.add('hover'); |
| 379 } |
| 380 |
| 381 _mouseLeave() { |
| 382 this.element.classList.remove('hover'); |
| 383 } |
| 384 |
| 385 /** |
| 386 * @param {boolean} value |
| 387 */ |
| 388 setEnabled(value) { |
| 389 if (this._enabled === value) |
| 390 return; |
| 391 this._enabled = value; |
| 392 this._applyEnabledState(); |
| 393 } |
| 394 |
| 395 _applyEnabledState() { |
| 396 this.element.disabled = !this._enabled; |
| 397 } |
| 398 |
| 399 /** |
| 400 * @return {boolean} x |
| 401 */ |
| 402 visible() { |
| 403 return this._visible; |
| 404 } |
| 405 |
| 406 /** |
| 407 * @param {boolean} x |
| 408 */ |
| 409 setVisible(x) { |
| 410 if (this._visible === x) |
| 411 return; |
| 412 this.element.classList.toggle('hidden', !x); |
| 413 this._visible = x; |
| 414 if (this._toolbar && !(this instanceof WebInspector.ToolbarSeparator)) |
| 415 this._toolbar._hideSeparatorDupes(); |
| 416 } |
| 417 }; |
| 418 |
| 419 /** |
| 420 * @unrestricted |
| 421 */ |
| 422 WebInspector.ToolbarText = class extends WebInspector.ToolbarItem { |
| 423 /** |
| 424 * @param {string=} text |
| 425 */ |
| 426 constructor(text) { |
| 427 super(createElementWithClass('div', 'toolbar-text')); |
| 428 this.element.classList.add('toolbar-text'); |
| 429 this.setText(text || ''); |
| 430 } |
| 431 |
| 432 /** |
| 433 * @param {string} text |
| 434 */ |
| 435 setText(text) { |
| 436 this.element.textContent = text; |
| 437 } |
| 438 }; |
| 439 |
| 440 /** |
| 441 * @unrestricted |
| 442 */ |
| 443 WebInspector.ToolbarButton = class extends WebInspector.ToolbarItem { |
| 444 /** |
| 445 * @param {string} title |
| 446 * @param {string=} glyph |
| 447 * @param {string=} text |
| 448 */ |
| 449 constructor(title, glyph, text) { |
| 450 super(createElementWithClass('button', 'toolbar-button')); |
| 451 this.element.addEventListener('click', this._clicked.bind(this), false); |
| 452 this.element.addEventListener('mousedown', this._mouseDown.bind(this), false
); |
| 453 this.element.addEventListener('mouseup', this._mouseUp.bind(this), false); |
| 454 |
| 455 this._glyphElement = this.element.createChild('div', 'toolbar-glyph hidden')
; |
| 456 this._textElement = this.element.createChild('div', 'toolbar-text hidden'); |
| 457 |
| 458 this.setTitle(title); |
| 459 if (glyph) |
| 460 this.setGlyph(glyph); |
| 461 this.setText(text || ''); |
| 462 this._state = ''; |
| 463 this._title = ''; |
| 464 } |
| 465 |
| 466 /** |
| 467 * @param {string} text |
| 468 */ |
| 469 setText(text) { |
| 470 if (this._text === text) |
| 471 return; |
| 472 this._textElement.textContent = text; |
| 473 this._textElement.classList.toggle('hidden', !text); |
| 474 this._text = text; |
| 475 } |
| 476 |
| 477 /** |
| 478 * @param {string} glyph |
| 479 */ |
| 480 setGlyph(glyph) { |
| 481 if (this._glyph === glyph) |
| 482 return; |
| 483 if (this._glyph) |
| 484 this._glyphElement.classList.remove(this._glyph); |
| 485 if (glyph) |
| 486 this._glyphElement.classList.add(glyph); |
| 487 this._glyphElement.classList.toggle('hidden', !glyph); |
| 488 this.element.classList.toggle('toolbar-has-glyph', !!glyph); |
| 489 this._glyph = glyph; |
| 490 } |
| 491 |
| 492 /** |
| 493 * @param {string} iconURL |
| 494 */ |
| 495 setBackgroundImage(iconURL) { |
| 496 this.element.style.backgroundImage = 'url(' + iconURL + ')'; |
| 497 } |
| 498 |
| 499 /** |
| 500 * @return {string} |
| 501 */ |
| 502 state() { |
| 503 return this._state; |
| 504 } |
| 505 |
| 506 /** |
| 507 * @param {string} state |
| 508 */ |
| 509 setState(state) { |
| 510 if (this._state === state) |
| 511 return; |
| 512 this.element.classList.remove('toolbar-state-' + this._state); |
| 513 this.element.classList.add('toolbar-state-' + state); |
| 514 this._state = state; |
| 515 } |
| 516 |
| 517 /** |
| 518 * @param {number=} width |
| 519 */ |
| 520 turnIntoSelect(width) { |
| 521 this.element.classList.add('toolbar-has-dropdown'); |
| 522 this.element.createChild('div', 'toolbar-dropdown-arrow'); |
| 523 if (width) |
| 524 this.element.style.width = width + 'px'; |
| 525 } |
| 526 |
| 527 /** |
| 528 * @param {!Event} event |
| 529 */ |
| 530 _clicked(event) { |
| 531 var defaultPrevented = this.dispatchEventToListeners('click', event); |
| 532 event.consume(defaultPrevented); |
| 533 } |
| 534 |
| 535 /** |
| 536 * @param {!Event} event |
| 537 */ |
| 538 _mouseDown(event) { |
| 539 this.dispatchEventToListeners('mousedown', event); |
| 540 } |
| 541 |
| 542 /** |
| 543 * @param {!Event} event |
| 544 */ |
| 545 _mouseUp(event) { |
| 546 this.dispatchEventToListeners('mouseup', event); |
| 547 } |
| 548 }; |
| 549 |
| 550 /** |
| 551 * @unrestricted |
| 552 */ |
| 553 WebInspector.ToolbarInput = class extends WebInspector.ToolbarItem { |
| 554 /** |
| 555 * @param {string=} placeholder |
| 556 * @param {number=} growFactor |
| 557 */ |
| 558 constructor(placeholder, growFactor) { |
| 559 super(createElementWithClass('input', 'toolbar-item')); |
| 560 this.element.addEventListener('input', this._onChangeCallback.bind(this), fa
lse); |
| 561 if (growFactor) |
| 562 this.element.style.flexGrow = growFactor; |
| 563 if (placeholder) |
| 564 this.element.setAttribute('placeholder', placeholder); |
| 565 this._value = ''; |
| 566 } |
| 567 |
| 568 /** |
| 569 * @param {string} value |
| 570 */ |
| 571 setValue(value) { |
| 572 this._value = value; |
| 573 this.element.value = value; |
| 574 } |
| 575 |
| 576 /** |
| 577 * @return {string} |
| 578 */ |
| 579 value() { |
| 580 return this.element.value; |
| 581 } |
| 582 |
| 583 _onChangeCallback() { |
| 584 this.dispatchEventToListeners(WebInspector.ToolbarInput.Event.TextChanged, t
his.element.value); |
| 585 } |
| 586 }; |
| 587 |
| 588 WebInspector.ToolbarInput.Event = { |
| 589 TextChanged: 'TextChanged' |
| 590 }; |
| 591 |
| 592 /** |
| 593 * @unrestricted |
| 594 */ |
| 595 WebInspector.ToolbarToggle = class extends WebInspector.ToolbarButton { |
| 596 /** |
| 597 * @param {string} title |
| 598 * @param {string=} glyph |
| 599 * @param {string=} text |
| 600 */ |
| 601 constructor(title, glyph, text) { |
| 602 super(title, glyph, text); |
| 603 this._toggled = false; |
| 604 this.setState('off'); |
| 605 } |
| 606 |
| 607 /** |
| 608 * @return {boolean} |
| 609 */ |
| 610 toggled() { |
| 611 return this._toggled; |
| 612 } |
| 613 |
| 614 /** |
| 615 * @param {boolean} toggled |
| 616 */ |
| 617 setToggled(toggled) { |
| 618 if (this._toggled === toggled) |
| 619 return; |
| 620 this._toggled = toggled; |
| 621 this.setState(toggled ? 'on' : 'off'); |
| 622 } |
| 623 }; |
| 624 |
| 625 |
| 626 /** |
| 627 * @unrestricted |
| 628 */ |
| 629 WebInspector.ToolbarMenuButton = class extends WebInspector.ToolbarButton { |
| 630 /** |
| 631 * @param {function(!WebInspector.ContextMenu)} contextMenuHandler |
| 632 * @param {boolean=} useSoftMenu |
| 633 */ |
| 634 constructor(contextMenuHandler, useSoftMenu) { |
| 635 super('', 'menu-toolbar-item'); |
692 this._contextMenuHandler = contextMenuHandler; | 636 this._contextMenuHandler = contextMenuHandler; |
693 this._useSoftMenu = !!useSoftMenu; | 637 this._useSoftMenu = !!useSoftMenu; |
694 }; | 638 } |
695 | 639 |
696 WebInspector.ToolbarMenuButton.prototype = { | 640 /** |
697 /** | 641 * @override |
698 * @override | 642 * @param {!Event} event |
699 * @param {!Event} event | 643 */ |
700 */ | 644 _mouseDown(event) { |
701 _mouseDown: function(event) | 645 if (event.buttons !== 1) { |
702 { | 646 super._mouseDown(event); |
703 if (event.buttons !== 1) { | 647 return; |
704 WebInspector.ToolbarButton.prototype._mouseDown.call(this, event); | 648 } |
705 return; | 649 |
706 } | 650 if (!this._triggerTimeout) |
707 | 651 this._triggerTimeout = setTimeout(this._trigger.bind(this, event), 200); |
708 if (!this._triggerTimeout) | 652 } |
709 this._triggerTimeout = setTimeout(this._trigger.bind(this, event), 2
00); | 653 |
710 }, | 654 /** |
711 | 655 * @param {!Event} event |
712 /** | 656 */ |
713 * @param {!Event} event | 657 _trigger(event) { |
714 */ | 658 delete this._triggerTimeout; |
715 _trigger: function(event) | 659 var contextMenu = new WebInspector.ContextMenu( |
716 { | 660 event, this._useSoftMenu, this.element.totalOffsetLeft(), |
717 delete this._triggerTimeout; | 661 this.element.totalOffsetTop() + this.element.offsetHeight); |
718 var contextMenu = new WebInspector.ContextMenu(event, | 662 this._contextMenuHandler(contextMenu); |
719 this._useSoftMenu, | 663 contextMenu.show(); |
720 this.element.totalOffsetLeft(), | 664 } |
721 this.element.totalOffsetTop() + this.element.offsetHeight); | 665 |
722 this._contextMenuHandler(contextMenu); | 666 /** |
723 contextMenu.show(); | 667 * @override |
724 }, | 668 * @param {!Event} event |
725 | 669 */ |
726 /** | 670 _clicked(event) { |
727 * @override | 671 if (!this._triggerTimeout) |
728 * @param {!Event} event | 672 return; |
729 */ | 673 clearTimeout(this._triggerTimeout); |
730 _clicked: function(event) | 674 this._trigger(event); |
731 { | 675 } |
732 if (!this._triggerTimeout) | 676 }; |
733 return; | 677 |
734 clearTimeout(this._triggerTimeout); | 678 /** |
735 this._trigger(event); | 679 * @unrestricted |
736 }, | 680 */ |
737 | 681 WebInspector.ToolbarSettingToggle = class extends WebInspector.ToolbarToggle { |
738 __proto__: WebInspector.ToolbarButton.prototype | 682 /** |
739 }; | 683 * @param {!WebInspector.Setting} setting |
740 | 684 * @param {string} glyph |
741 /** | 685 * @param {string} title |
742 * @constructor | 686 * @param {string=} toggledTitle |
743 * @extends {WebInspector.ToolbarToggle} | 687 */ |
744 * @param {!WebInspector.Setting} setting | 688 constructor(setting, glyph, title, toggledTitle) { |
745 * @param {string} glyph | 689 super(title, glyph); |
746 * @param {string} title | |
747 * @param {string=} toggledTitle | |
748 */ | |
749 WebInspector.ToolbarSettingToggle = function(setting, glyph, title, toggledTitle
) | |
750 { | |
751 WebInspector.ToolbarToggle.call(this, title, glyph); | |
752 this._defaultTitle = title; | 690 this._defaultTitle = title; |
753 this._toggledTitle = toggledTitle || title; | 691 this._toggledTitle = toggledTitle || title; |
754 this._setting = setting; | 692 this._setting = setting; |
755 this._settingChanged(); | 693 this._settingChanged(); |
756 this._setting.addChangeListener(this._settingChanged, this); | 694 this._setting.addChangeListener(this._settingChanged, this); |
757 }; | 695 } |
758 | 696 |
759 WebInspector.ToolbarSettingToggle.prototype = { | 697 _settingChanged() { |
760 _settingChanged: function() | 698 var toggled = this._setting.get(); |
761 { | 699 this.setToggled(toggled); |
762 var toggled = this._setting.get(); | 700 this.setTitle(toggled ? this._toggledTitle : this._defaultTitle); |
763 this.setToggled(toggled); | 701 } |
764 this.setTitle(toggled ? this._toggledTitle : this._defaultTitle); | 702 |
765 }, | 703 /** |
766 | 704 * @override |
767 /** | 705 * @param {!Event} event |
768 * @override | 706 */ |
769 * @param {!Event} event | 707 _clicked(event) { |
770 */ | 708 this._setting.set(!this.toggled()); |
771 _clicked: function(event) | 709 super._clicked(event); |
772 { | 710 } |
773 this._setting.set(!this.toggled()); | 711 }; |
774 WebInspector.ToolbarToggle.prototype._clicked.call(this, event); | 712 |
775 }, | 713 /** |
776 | 714 * @unrestricted |
777 __proto__: WebInspector.ToolbarToggle.prototype | 715 */ |
778 }; | 716 WebInspector.ToolbarSeparator = class extends WebInspector.ToolbarItem { |
779 | 717 /** |
780 /** | 718 * @param {boolean=} spacer |
781 * @constructor | 719 */ |
782 * @extends {WebInspector.ToolbarItem} | 720 constructor(spacer) { |
783 * @param {boolean=} spacer | 721 super(createElementWithClass('div', spacer ? 'toolbar-spacer' : 'toolbar-div
ider')); |
784 */ | 722 } |
785 WebInspector.ToolbarSeparator = function(spacer) | |
786 { | |
787 WebInspector.ToolbarItem.call(this, createElementWithClass("div", spacer ? "
toolbar-spacer" : "toolbar-divider")); | |
788 }; | |
789 | |
790 WebInspector.ToolbarSeparator.prototype = { | |
791 __proto__: WebInspector.ToolbarItem.prototype | |
792 }; | 723 }; |
793 | 724 |
794 /** | 725 /** |
795 * @interface | 726 * @interface |
796 */ | 727 */ |
797 WebInspector.ToolbarItem.Provider = function() | 728 WebInspector.ToolbarItem.Provider = function() {}; |
798 { | |
799 }; | |
800 | 729 |
801 WebInspector.ToolbarItem.Provider.prototype = { | 730 WebInspector.ToolbarItem.Provider.prototype = { |
802 /** | 731 /** |
803 * @return {?WebInspector.ToolbarItem} | 732 * @return {?WebInspector.ToolbarItem} |
804 */ | 733 */ |
805 item: function() {} | 734 item: function() {} |
806 }; | 735 }; |
807 | 736 |
808 /** | 737 /** |
809 * @interface | 738 * @interface |
810 */ | 739 */ |
811 WebInspector.ToolbarItem.ItemsProvider = function() | 740 WebInspector.ToolbarItem.ItemsProvider = function() {}; |
812 { | |
813 }; | |
814 | 741 |
815 WebInspector.ToolbarItem.ItemsProvider.prototype = { | 742 WebInspector.ToolbarItem.ItemsProvider.prototype = { |
816 /** | 743 /** |
817 * @return {!Array<!WebInspector.ToolbarItem>} | 744 * @return {!Array<!WebInspector.ToolbarItem>} |
818 */ | 745 */ |
819 toolbarItems: function() {} | 746 toolbarItems: function() {} |
820 }; | 747 }; |
821 | 748 |
822 /** | 749 /** |
823 * @constructor | 750 * @unrestricted |
824 * @extends {WebInspector.ToolbarItem} | 751 */ |
825 * @param {?function(!Event)} changeHandler | 752 WebInspector.ToolbarComboBox = class extends WebInspector.ToolbarItem { |
826 * @param {string=} className | 753 /** |
827 */ | 754 * @param {?function(!Event)} changeHandler |
828 WebInspector.ToolbarComboBox = function(changeHandler, className) | 755 * @param {string=} className |
829 { | 756 */ |
830 WebInspector.ToolbarItem.call(this, createElementWithClass("span", "toolbar-
select-container")); | 757 constructor(changeHandler, className) { |
831 | 758 super(createElementWithClass('span', 'toolbar-select-container')); |
832 this._selectElement = this.element.createChild("select", "toolbar-item"); | 759 |
833 this.element.createChild("div", "toolbar-dropdown-arrow"); | 760 this._selectElement = this.element.createChild('select', 'toolbar-item'); |
| 761 this.element.createChild('div', 'toolbar-dropdown-arrow'); |
834 if (changeHandler) | 762 if (changeHandler) |
835 this._selectElement.addEventListener("change", changeHandler, false); | 763 this._selectElement.addEventListener('change', changeHandler, false); |
836 if (className) | 764 if (className) |
837 this._selectElement.classList.add(className); | 765 this._selectElement.classList.add(className); |
838 }; | 766 } |
839 | 767 |
840 WebInspector.ToolbarComboBox.prototype = { | 768 /** |
841 /** | 769 * @return {!HTMLSelectElement} |
842 * @return {!HTMLSelectElement} | 770 */ |
843 */ | 771 selectElement() { |
844 selectElement: function() | 772 return /** @type {!HTMLSelectElement} */ (this._selectElement); |
845 { | 773 } |
846 return /** @type {!HTMLSelectElement} */ (this._selectElement); | 774 |
847 }, | 775 /** |
848 | 776 * @return {number} |
849 /** | 777 */ |
850 * @return {number} | 778 size() { |
851 */ | 779 return this._selectElement.childElementCount; |
852 size: function() | 780 } |
853 { | 781 |
854 return this._selectElement.childElementCount; | 782 /** |
855 }, | 783 * @return {!Array.<!Element>} |
856 | 784 */ |
857 /** | 785 options() { |
858 * @return {!Array.<!Element>} | 786 return Array.prototype.slice.call(this._selectElement.children, 0); |
859 */ | 787 } |
860 options: function() | 788 |
861 { | 789 /** |
862 return Array.prototype.slice.call(this._selectElement.children, 0); | 790 * @param {!Element} option |
863 }, | 791 */ |
864 | 792 addOption(option) { |
865 /** | 793 this._selectElement.appendChild(option); |
866 * @param {!Element} option | 794 } |
867 */ | 795 |
868 addOption: function(option) | 796 /** |
869 { | 797 * @param {string} label |
870 this._selectElement.appendChild(option); | 798 * @param {string=} title |
871 }, | 799 * @param {string=} value |
872 | 800 * @return {!Element} |
873 /** | 801 */ |
874 * @param {string} label | 802 createOption(label, title, value) { |
875 * @param {string=} title | 803 var option = this._selectElement.createChild('option'); |
876 * @param {string=} value | 804 option.text = label; |
877 * @return {!Element} | 805 if (title) |
878 */ | 806 option.title = title; |
879 createOption: function(label, title, value) | 807 if (typeof value !== 'undefined') |
880 { | 808 option.value = value; |
881 var option = this._selectElement.createChild("option"); | 809 return option; |
882 option.text = label; | 810 } |
883 if (title) | 811 |
884 option.title = title; | 812 /** |
885 if (typeof value !== "undefined") | 813 * @override |
886 option.value = value; | 814 */ |
887 return option; | 815 _applyEnabledState() { |
888 }, | 816 this._selectElement.disabled = !this._enabled; |
889 | 817 } |
890 /** | 818 |
891 * @override | 819 /** |
892 */ | 820 * @param {!Element} option |
893 _applyEnabledState: function() | 821 */ |
894 { | 822 removeOption(option) { |
895 this._selectElement.disabled = !this._enabled; | 823 this._selectElement.removeChild(option); |
896 }, | 824 } |
897 | 825 |
898 /** | 826 removeOptions() { |
899 * @param {!Element} option | 827 this._selectElement.removeChildren(); |
900 */ | 828 } |
901 removeOption: function(option) | 829 |
902 { | 830 /** |
903 this._selectElement.removeChild(option); | 831 * @return {?Element} |
904 }, | 832 */ |
905 | 833 selectedOption() { |
906 removeOptions: function() | 834 if (this._selectElement.selectedIndex >= 0) |
907 { | 835 return this._selectElement[this._selectElement.selectedIndex]; |
908 this._selectElement.removeChildren(); | 836 return null; |
909 }, | 837 } |
910 | 838 |
911 /** | 839 /** |
912 * @return {?Element} | 840 * @param {!Element} option |
913 */ | 841 */ |
914 selectedOption: function() | 842 select(option) { |
915 { | 843 this._selectElement.selectedIndex = Array.prototype.indexOf.call(/** @type {
?} */ (this._selectElement), option); |
916 if (this._selectElement.selectedIndex >= 0) | 844 } |
917 return this._selectElement[this._selectElement.selectedIndex]; | 845 |
918 return null; | 846 /** |
919 }, | 847 * @param {number} index |
920 | 848 */ |
921 /** | 849 setSelectedIndex(index) { |
922 * @param {!Element} option | 850 this._selectElement.selectedIndex = index; |
923 */ | 851 } |
924 select: function(option) | 852 |
925 { | 853 /** |
926 this._selectElement.selectedIndex = Array.prototype.indexOf.call(/** @ty
pe {?} */ (this._selectElement), option); | 854 * @return {number} |
927 }, | 855 */ |
928 | 856 selectedIndex() { |
929 /** | 857 return this._selectElement.selectedIndex; |
930 * @param {number} index | 858 } |
931 */ | 859 |
932 setSelectedIndex: function(index) | 860 /** |
933 { | 861 * @param {number} width |
934 this._selectElement.selectedIndex = index; | 862 */ |
935 }, | 863 setMaxWidth(width) { |
936 | 864 this._selectElement.style.maxWidth = width + 'px'; |
937 /** | 865 } |
938 * @return {number} | 866 }; |
939 */ | 867 |
940 selectedIndex: function() | 868 /** |
941 { | 869 * @unrestricted |
942 return this._selectElement.selectedIndex; | 870 */ |
943 }, | 871 WebInspector.ToolbarCheckbox = class extends WebInspector.ToolbarItem { |
944 | 872 /** |
945 /** | 873 * @param {string} text |
946 * @param {number} width | 874 * @param {string=} title |
947 */ | 875 * @param {!WebInspector.Setting=} setting |
948 setMaxWidth: function(width) | 876 * @param {function()=} listener |
949 { | 877 */ |
950 this._selectElement.style.maxWidth = width + "px"; | 878 constructor(text, title, setting, listener) { |
951 }, | 879 super(createCheckboxLabel(text)); |
952 | 880 this.element.classList.add('checkbox'); |
953 __proto__: WebInspector.ToolbarItem.prototype | |
954 }; | |
955 | |
956 /** | |
957 * @constructor | |
958 * @extends {WebInspector.ToolbarItem} | |
959 * @param {string} text | |
960 * @param {string=} title | |
961 * @param {!WebInspector.Setting=} setting | |
962 * @param {function()=} listener | |
963 */ | |
964 WebInspector.ToolbarCheckbox = function(text, title, setting, listener) | |
965 { | |
966 WebInspector.ToolbarItem.call(this, createCheckboxLabel(text)); | |
967 this.element.classList.add("checkbox"); | |
968 this.inputElement = this.element.checkboxElement; | 881 this.inputElement = this.element.checkboxElement; |
969 if (title) | 882 if (title) |
970 this.element.title = title; | 883 this.element.title = title; |
971 if (setting) | 884 if (setting) |
972 WebInspector.SettingsUI.bindCheckbox(this.inputElement, setting); | 885 WebInspector.SettingsUI.bindCheckbox(this.inputElement, setting); |
973 if (listener) | 886 if (listener) |
974 this.inputElement.addEventListener("click", listener, false); | 887 this.inputElement.addEventListener('click', listener, false); |
975 }; | 888 } |
976 | 889 |
977 WebInspector.ToolbarCheckbox.prototype = { | 890 /** |
978 /** | 891 * @return {boolean} |
979 * @return {boolean} | 892 */ |
980 */ | 893 checked() { |
981 checked: function() | 894 return this.inputElement.checked; |
982 { | 895 } |
983 return this.inputElement.checked; | 896 |
984 }, | 897 /** |
985 | 898 * @param {boolean} value |
986 /** | 899 */ |
987 * @param {boolean} value | 900 setChecked(value) { |
988 */ | 901 this.inputElement.checked = value; |
989 setChecked: function(value) | 902 } |
990 { | 903 }; |
991 this.inputElement.checked = value; | |
992 }, | |
993 | |
994 __proto__: WebInspector.ToolbarItem.prototype | |
995 }; | |
996 | |
OLD | NEW |