1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5/** 6 * @constructor 7 * @extends {WebInspector.Object} 8 */ 9WebInspector.ResizerWidget = function() 10{ 11 WebInspector.Object.call(this); 12 13 this._isEnabled = true; 14 this._isVertical = true; 15 this._elements = []; 16 this._installDragOnMouseDownBound = this._installDragOnMouseDown.bind(this); 17}; 18 19WebInspector.ResizerWidget.Events = { 20 ResizeStart: "ResizeStart", 21 ResizeUpdate: "ResizeUpdate", 22 ResizeEnd: "ResizeEnd" 23}; 24 25WebInspector.ResizerWidget.prototype = { 26 /** 27 * @return {boolean} 28 */ 29 isEnabled: function() 30 { 31 return this._isEnabled; 32 }, 33 34 /** 35 * @param {boolean} enabled 36 */ 37 setEnabled: function(enabled) 38 { 39 this._isEnabled = enabled; 40 this._updateElementsClass(); 41 }, 42 43 /** 44 * @return {boolean} 45 */ 46 isVertical: function() 47 { 48 return this._isVertical; 49 }, 50 51 /** 52 * Vertical widget resizes height (along y-axis). 53 * @param {boolean} vertical 54 */ 55 setVertical: function(vertical) 56 { 57 this._isVertical = vertical; 58 this._updateElementsClass(); 59 }, 60 61 /** 62 * @return {!Array.<!Element>} 63 */ 64 elements: function() 65 { 66 return this._elements.slice(); 67 }, 68 69 /** 70 * @param {!Element} element 71 */ 72 addElement: function(element) 73 { 74 if (this._elements.indexOf(element) !== -1) 75 return; 76 77 this._elements.push(element); 78 element.addEventListener("mousedown", this._installDragOnMouseDownBound, false); 79 element.classList.toggle("ns-resizer-widget", this._isVertical && this._isEnabled); 80 element.classList.toggle("ew-resizer-widget", !this._isVertical && this._isEnabled); 81 }, 82 83 /** 84 * @param {!Element} element 85 */ 86 removeElement: function(element) 87 { 88 if (this._elements.indexOf(element) === -1) 89 return; 90 91 this._elements.remove(element); 92 element.removeEventListener("mousedown", this._installDragOnMouseDownBound, false); 93 element.classList.remove("ns-resizer-widget"); 94 element.classList.remove("ew-resizer-widget"); 95 }, 96 97 _updateElementsClass: function() 98 { 99 for (var i = 0; i < this._elements.length; ++i) { 100 this._elements[i].classList.toggle("ns-resizer-widget", this._isVertical && this._isEnabled); 101 this._elements[i].classList.toggle("ew-resizer-widget", !this._isVertical && this._isEnabled); 102 } 103 }, 104 105 /** 106 * @param {?Event} event 107 */ 108 _installDragOnMouseDown: function(event) 109 { 110 // Only handle drags of the nodes specified. 111 if (this._elements.indexOf(event.target) === -1) 112 return false; 113 WebInspector.elementDragStart(this._dragStart.bind(this), this._drag.bind(this), this._dragEnd.bind(this), this._isVertical ? "ns-resize" : "ew-resize", event); 114 }, 115 116 /** 117 * @param {!MouseEvent} event 118 * @return {boolean} 119 */ 120 _dragStart: function(event) 121 { 122 if (!this._isEnabled) 123 return false; 124 this._startPosition = this._isVertical ? event.pageY : event.pageX; 125 this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeStart, { startPosition: this._startPosition, currentPosition: this._startPosition }); 126 return true; 127 }, 128 129 /** 130 * @param {!MouseEvent} event 131 * @return {boolean} 132 */ 133 _drag: function(event) 134 { 135 if (!this._isEnabled) { 136 this._dragEnd(event); 137 return true; // Cancel drag. 138 } 139 140 var position = this._isVertical ? event.pageY : event.pageX; 141 this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeUpdate, { startPosition: this._startPosition, currentPosition: position, shiftKey: event.shiftKey }); 142 event.preventDefault(); 143 return false; // Continue drag. 144 }, 145 146 /** 147 * @param {!MouseEvent} event 148 */ 149 _dragEnd: function(event) 150 { 151 this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeEnd); 152 delete this._startPosition; 153 }, 154 155 __proto__: WebInspector.Object.prototype 156}; 157