blob: 525547f7d32e5443ca3caba2ae293d7cc2d821d6 [file] [log] [blame]
Blink Reformat4c46d092018-04-07 15:32:371// 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.
Paul Lewis9950e182019-12-16 16:06:074
Paul Lewis17e384e2020-01-08 15:46:515import * as Common from '../common/common.js';
Paul Lewis9950e182019-12-16 16:06:076import {elementDragStart} from './UIUtils.js';
7
Blink Reformat4c46d092018-04-07 15:32:378/**
9 * @unrestricted
10 */
Paul Lewis17e384e2020-01-08 15:46:5111export class ResizerWidget extends Common.ObjectWrapper.ObjectWrapper {
Blink Reformat4c46d092018-04-07 15:32:3712 constructor() {
13 super();
14
15 this._isEnabled = true;
Simon Zünd3141f412020-08-12 09:52:5116 /** @type {!Set<!HTMLElement>} */
Simon Zünd5bbcd5c2020-03-02 09:09:2117 this._elements = new Set();
Blink Reformat4c46d092018-04-07 15:32:3718 this._installDragOnMouseDownBound = this._installDragOnMouseDown.bind(this);
19 this._cursor = 'nwse-resize';
20 }
21
22 /**
23 * @return {boolean}
24 */
25 isEnabled() {
26 return this._isEnabled;
27 }
28
29 /**
30 * @param {boolean} enabled
31 */
32 setEnabled(enabled) {
33 this._isEnabled = enabled;
34 this.updateElementCursors();
35 }
36
37 /**
38 * @return {!Array.<!Element>}
39 */
40 elements() {
Simon Zünd5bbcd5c2020-03-02 09:09:2141 return [...this._elements];
Blink Reformat4c46d092018-04-07 15:32:3742 }
43
44 /**
Simon Zünd3141f412020-08-12 09:52:5145 * @param {!HTMLElement} element
Blink Reformat4c46d092018-04-07 15:32:3746 */
47 addElement(element) {
Simon Zünd5bbcd5c2020-03-02 09:09:2148 if (!this._elements.has(element)) {
49 this._elements.add(element);
50 element.addEventListener('mousedown', this._installDragOnMouseDownBound, false);
51 this._updateElementCursor(element);
Tim van der Lippe1d6e57a2019-09-30 11:55:3452 }
Blink Reformat4c46d092018-04-07 15:32:3753 }
54
55 /**
Simon Zünd3141f412020-08-12 09:52:5156 * @param {!HTMLElement} element
Blink Reformat4c46d092018-04-07 15:32:3757 */
58 removeElement(element) {
Simon Zünd5bbcd5c2020-03-02 09:09:2159 if (this._elements.has(element)) {
60 this._elements.delete(element);
61 element.removeEventListener('mousedown', this._installDragOnMouseDownBound, false);
62 element.style.removeProperty('cursor');
Tim van der Lippe1d6e57a2019-09-30 11:55:3463 }
Blink Reformat4c46d092018-04-07 15:32:3764 }
65
66 updateElementCursors() {
67 this._elements.forEach(this._updateElementCursor.bind(this));
68 }
69
70 /**
Simon Zünd3141f412020-08-12 09:52:5171 * @param {!HTMLElement} element
Blink Reformat4c46d092018-04-07 15:32:3772 */
73 _updateElementCursor(element) {
Tim van der Lippe1d6e57a2019-09-30 11:55:3474 if (this._isEnabled) {
Blink Reformat4c46d092018-04-07 15:32:3775 element.style.setProperty('cursor', this.cursor());
Tim van der Lippe1d6e57a2019-09-30 11:55:3476 } else {
Blink Reformat4c46d092018-04-07 15:32:3777 element.style.removeProperty('cursor');
Tim van der Lippe1d6e57a2019-09-30 11:55:3478 }
Blink Reformat4c46d092018-04-07 15:32:3779 }
80
81 /**
82 * @return {string}
83 */
84 cursor() {
85 return this._cursor;
86 }
87
88 /**
89 * @param {string} cursor
90 */
91 setCursor(cursor) {
92 this._cursor = cursor;
93 this.updateElementCursors();
94 }
95
96 /**
97 * @param {!Event} event
98 */
99 _installDragOnMouseDown(event) {
Simon Zünd3141f412020-08-12 09:52:51100 const element = /** @type {!HTMLElement} */ (event.target);
Blink Reformat4c46d092018-04-07 15:32:37101 // Only handle drags of the nodes specified.
Simon Zünd5bbcd5c2020-03-02 09:09:21102 if (!this._elements.has(element)) {
Blink Reformat4c46d092018-04-07 15:32:37103 return false;
Tim van der Lippe1d6e57a2019-09-30 11:55:34104 }
Tim van der Lippe403a88d2020-05-13 11:51:32105 elementDragStart(element, this._dragStart.bind(this), event => {
106 this._drag(event);
107 }, this._dragEnd.bind(this), this.cursor(), event);
Simon Zünd3141f412020-08-12 09:52:51108 return undefined;
Blink Reformat4c46d092018-04-07 15:32:37109 }
110
111 /**
112 * @param {!MouseEvent} event
113 * @return {boolean}
114 */
115 _dragStart(event) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34116 if (!this._isEnabled) {
Blink Reformat4c46d092018-04-07 15:32:37117 return false;
Tim van der Lippe1d6e57a2019-09-30 11:55:34118 }
Blink Reformat4c46d092018-04-07 15:32:37119 this._startX = event.pageX;
120 this._startY = event.pageY;
121 this.sendDragStart(this._startX, this._startY);
122 return true;
123 }
124
125 /**
126 * @param {number} x
127 * @param {number} y
128 */
129 sendDragStart(x, y) {
Tim van der Lippe0830b3d2019-10-03 13:20:07130 this.dispatchEventToListeners(Events.ResizeStart, {startX: x, currentX: x, startY: y, currentY: y});
Blink Reformat4c46d092018-04-07 15:32:37131 }
132
133 /**
134 * @param {!MouseEvent} event
135 * @return {boolean}
136 */
137 _drag(event) {
138 if (!this._isEnabled) {
139 this._dragEnd(event);
140 return true; // Cancel drag.
141 }
142
Simon Zünd3141f412020-08-12 09:52:51143 this.sendDragMove(
144 /** @type {number} */ (this._startX), event.pageX, /** @type {number} */ (this._startY), event.pageY,
145 event.shiftKey);
Blink Reformat4c46d092018-04-07 15:32:37146 event.preventDefault();
147 return false; // Continue drag.
148 }
149
150 /**
151 * @param {number} startX
152 * @param {number} currentX
153 * @param {number} startY
154 * @param {number} currentY
155 * @param {boolean} shiftKey
156 */
157 sendDragMove(startX, currentX, startY, currentY, shiftKey) {
158 this.dispatchEventToListeners(
Tim van der Lippe0830b3d2019-10-03 13:20:07159 Events.ResizeUpdate,
Blink Reformat4c46d092018-04-07 15:32:37160 {startX: startX, currentX: currentX, startY: startY, currentY: currentY, shiftKey: shiftKey});
161 }
162
163 /**
164 * @param {!MouseEvent} event
165 */
166 _dragEnd(event) {
Tim van der Lippe0830b3d2019-10-03 13:20:07167 this.dispatchEventToListeners(Events.ResizeEnd);
Blink Reformat4c46d092018-04-07 15:32:37168 delete this._startX;
169 delete this._startY;
170 }
Tim van der Lippe0830b3d2019-10-03 13:20:07171}
Blink Reformat4c46d092018-04-07 15:32:37172
173/** @enum {symbol} */
Tim van der Lippe0830b3d2019-10-03 13:20:07174export const Events = {
Blink Reformat4c46d092018-04-07 15:32:37175 ResizeStart: Symbol('ResizeStart'),
176 ResizeUpdate: Symbol('ResizeUpdate'),
177 ResizeEnd: Symbol('ResizeEnd')
178};
179
Sigurd Schneider46da7db2020-05-20 13:45:11180
Tim van der Lippe0830b3d2019-10-03 13:20:07181export class SimpleResizerWidget extends ResizerWidget {
Blink Reformat4c46d092018-04-07 15:32:37182 constructor() {
183 super();
184 this._isVertical = true;
185 }
186
187 /**
188 * @return {boolean}
189 */
190 isVertical() {
191 return this._isVertical;
192 }
193
194 /**
195 * Vertical widget resizes height (along y-axis).
196 * @param {boolean} vertical
197 */
198 setVertical(vertical) {
199 this._isVertical = vertical;
200 this.updateElementCursors();
201 }
202
203 /**
204 * @override
205 * @return {string}
206 */
207 cursor() {
208 return this._isVertical ? 'ns-resize' : 'ew-resize';
209 }
210
211 /**
212 * @override
213 * @param {number} x
214 * @param {number} y
215 */
216 sendDragStart(x, y) {
217 const position = this._isVertical ? y : x;
Tim van der Lippe0830b3d2019-10-03 13:20:07218 this.dispatchEventToListeners(Events.ResizeStart, {startPosition: position, currentPosition: position});
Blink Reformat4c46d092018-04-07 15:32:37219 }
220
221 /**
222 * @override
223 * @param {number} startX
224 * @param {number} currentX
225 * @param {number} startY
226 * @param {number} currentY
227 * @param {boolean} shiftKey
228 */
229 sendDragMove(startX, currentX, startY, currentY, shiftKey) {
230 if (this._isVertical) {
231 this.dispatchEventToListeners(
Tim van der Lippe0830b3d2019-10-03 13:20:07232 Events.ResizeUpdate, {startPosition: startY, currentPosition: currentY, shiftKey: shiftKey});
Blink Reformat4c46d092018-04-07 15:32:37233 } else {
234 this.dispatchEventToListeners(
Tim van der Lippe0830b3d2019-10-03 13:20:07235 Events.ResizeUpdate, {startPosition: startX, currentPosition: currentX, shiftKey: shiftKey});
Blink Reformat4c46d092018-04-07 15:32:37236 }
237 }
Tim van der Lippe0830b3d2019-10-03 13:20:07238}