|
@@ -13,7 +13,11 @@ enum ResizingDirection {
|
|
|
Right,
|
|
|
Left,
|
|
|
Top,
|
|
|
- Bottom
|
|
|
+ Bottom,
|
|
|
+ TopRight,
|
|
|
+ TopLeft,
|
|
|
+ BottomRight,
|
|
|
+ BottomLeft,
|
|
|
}
|
|
|
|
|
|
export class GraphFrame {
|
|
@@ -324,7 +328,29 @@ export class GraphFrame {
|
|
|
this.element.appendChild(topHandle);
|
|
|
topHandle.addEventListener("pointerdown", this._onTopHandlePointerDown);
|
|
|
|
|
|
- this._headerTextElement = root.ownerDocument!.createElement("div");
|
|
|
+ const topRightCornerHandle: HTMLDivElement = root.ownerDocument!.createElement("div");
|
|
|
+ topRightCornerHandle.className = "handle right-handle top-right-corner-handle";
|
|
|
+ this.element.appendChild(topRightCornerHandle);
|
|
|
+ topRightCornerHandle.addEventListener("pointerdown", this._onTopRightHandlePointerDown);
|
|
|
+
|
|
|
+ const bottomRightCornerHandle: HTMLDivElement = root.ownerDocument!.createElement("div");
|
|
|
+ bottomRightCornerHandle.className = "handle right-handle bottom-right-corner-handle";
|
|
|
+ this.element.appendChild(bottomRightCornerHandle);
|
|
|
+ bottomRightCornerHandle.addEventListener("pointerdown", this._onRightHandlePointerDown);
|
|
|
+
|
|
|
+ const topLeftCornerHandle: HTMLDivElement = root.ownerDocument!.createElement("div");
|
|
|
+ topLeftCornerHandle.className = "handle left-handle top-left-corner-handle";
|
|
|
+ this.element.appendChild(topLeftCornerHandle);
|
|
|
+ topLeftCornerHandle.addEventListener("pointerdown", this._onRightHandlePointerDown);
|
|
|
+
|
|
|
+ const bottomLeftCornerHandle: HTMLDivElement = root.ownerDocument!.createElement("div");
|
|
|
+ bottomLeftCornerHandle.className = "handle left-handle bottom-left-corner-handle";
|
|
|
+ this.element.appendChild(bottomLeftCornerHandle);
|
|
|
+ bottomLeftCornerHandle.addEventListener("pointerdown", this._onRightHandlePointerDown);
|
|
|
+
|
|
|
+ // add header elements
|
|
|
+
|
|
|
+ this._headerTextElement = root.ownerDocument!.createElement("div");
|
|
|
this._headerTextElement.classList.add("frame-box-header-title");
|
|
|
this._headerElement.appendChild(this._headerTextElement);
|
|
|
|
|
@@ -545,7 +571,7 @@ export class GraphFrame {
|
|
|
private _onRightHandlePointerDown = (evt: PointerEvent) => {
|
|
|
// tslint:disable-next-line: no-this-assignment
|
|
|
const _this = this;
|
|
|
- this.initResizing(evt)
|
|
|
+ this.initResizing(evt);
|
|
|
_this._resizingDirection = ResizingDirection.Right;
|
|
|
_this.mouseXLimit = evt.clientX - (_this.width - _this._minFrameWidth);
|
|
|
_this._ownerCanvas.hostCanvas.addEventListener("pointerup", _this._onRightHandlePointerUp);
|
|
@@ -562,10 +588,10 @@ export class GraphFrame {
|
|
|
// tslint:disable-next-line: no-this-assignment
|
|
|
const _this = this;
|
|
|
if (_this.mouseXLimit) {
|
|
|
- if (_this._resizingDirection !== ResizingDirection.Right || _this._mouseStartPointX === null || _this._mouseStartPointY === null || evt.clientX < xLimit) {
|
|
|
+ if (!_this._isResizingRight() || _this._mouseStartPointX === null || _this._mouseStartPointY === null || evt.clientX < xLimit) {
|
|
|
return;
|
|
|
}
|
|
|
- if (_this._resizingDirection === ResizingDirection.Right ) {
|
|
|
+ if (_this._isResizingRight()) {
|
|
|
evt.stopPropagation();
|
|
|
const distanceMouseMoved = (evt.clientX - _this._mouseStartPointX) / _this._ownerCanvas.zoom;
|
|
|
_this._expandRight(distanceMouseMoved, evt.clientX);
|
|
@@ -574,20 +600,10 @@ export class GraphFrame {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private _expandRight(widthModification: number, x: number) {
|
|
|
- const frameElementWidth = parseFloat(this.element.style.width.replace("px", ""));
|
|
|
- if ((frameElementWidth + widthModification) > 20) {
|
|
|
- this._mouseStartPointX = x;
|
|
|
- this.element.style.width = `${frameElementWidth + widthModification}px`;
|
|
|
- }
|
|
|
- this.updateMinHeightWithComments();
|
|
|
- this.height = this._borderElement.offsetHeight;
|
|
|
- }
|
|
|
-
|
|
|
private _onRightHandlePointerUp = (evt: PointerEvent) => {
|
|
|
// tslint:disable-next-line: no-this-assignment
|
|
|
const _this = this;
|
|
|
- if (_this._resizingDirection === ResizingDirection.Right) {
|
|
|
+ if (_this._isResizingRight()) {
|
|
|
_this.width = parseFloat(_this.element.style.width.replace("px", ""));
|
|
|
_this._ownerCanvas.hostCanvas.removeEventListener("pointerup", _this._onRightHandlePointerUp);
|
|
|
_this._ownerCanvas.hostCanvas.removeEventListener("pointermove", _this._onRightHandlePointerMove);
|
|
@@ -598,7 +614,7 @@ export class GraphFrame {
|
|
|
private _onBottomHandlePointerDown = (evt: PointerEvent) => {
|
|
|
// tslint:disable-next-line: no-this-assignment
|
|
|
const _this = this;
|
|
|
- this.initResizing(evt);
|
|
|
+ _this.initResizing(evt);
|
|
|
_this._resizingDirection = ResizingDirection.Bottom;
|
|
|
_this._ownerCanvas.hostCanvas.addEventListener("pointermove", _this._onBottomHandlePointerMove);
|
|
|
_this._ownerCanvas.hostCanvas.addEventListener("pointerup", _this._onBottomHandlePointerUp);
|
|
@@ -643,7 +659,7 @@ export class GraphFrame {
|
|
|
private _onLeftHandlePointerDown = (evt: PointerEvent) => {
|
|
|
// tslint:disable-next-line: no-this-assignment
|
|
|
const _this = this;
|
|
|
- this.initResizing(evt);
|
|
|
+ _this.initResizing(evt);
|
|
|
_this._resizingDirection = ResizingDirection.Left;
|
|
|
_this.mouseXLimit = evt.clientX + _this.width - _this._minFrameWidth;
|
|
|
_this._ownerCanvas.hostCanvas.addEventListener("pointerup", _this._onLeftHandlePointerUp);
|
|
@@ -696,7 +712,7 @@ export class GraphFrame {
|
|
|
private _onTopHandlePointerDown = (evt: PointerEvent) => {
|
|
|
// tslint:disable-next-line: no-this-assignment
|
|
|
const _this = this;
|
|
|
- this.initResizing(evt)
|
|
|
+ _this.initResizing(evt);
|
|
|
_this._resizingDirection = ResizingDirection.Top;
|
|
|
_this._ownerCanvas.hostCanvas.addEventListener("pointerup", _this._onTopHandlePointerUp);
|
|
|
_this._ownerCanvas.hostCanvas.addEventListener("pointermove", _this._onTopHandlePointerMove);
|
|
@@ -711,10 +727,10 @@ export class GraphFrame {
|
|
|
private _moveTopHandle = (evt: PointerEvent, yLimit: number) => {
|
|
|
// tslint:disable-next-line: no-this-assignment
|
|
|
const _this = this;
|
|
|
- if (_this._resizingDirection !== ResizingDirection.Top || _this._mouseStartPointX === null || _this._mouseStartPointY === null || evt.clientY > yLimit) {
|
|
|
+ if (!_this._isResizingTop() || _this._mouseStartPointX === null || _this._mouseStartPointY === null || evt.clientY > yLimit) {
|
|
|
return;
|
|
|
}
|
|
|
- if (_this._resizingDirection === ResizingDirection.Top) {
|
|
|
+ if (_this._isResizingTop()) {
|
|
|
evt.stopPropagation();
|
|
|
const distanceMouseMoved = (evt.clientY - _this._mouseStartPointY) / _this._ownerCanvas.zoom;
|
|
|
_this._expandTop(distanceMouseMoved);
|
|
@@ -722,18 +738,12 @@ export class GraphFrame {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private _expandTop(heightModification: number) {
|
|
|
- const frameElementHeight = parseFloat(this.element.style.height.replace("px", ""));
|
|
|
- const frameElementTop = parseFloat(this.element.style.top.replace("px", ""));
|
|
|
- this.element.style.height = `${frameElementHeight - heightModification}px`;
|
|
|
- this.element.style.top = `${frameElementTop + heightModification}px`;
|
|
|
-
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
private _onTopHandlePointerUp = (evt: PointerEvent) => {
|
|
|
// tslint:disable-next-line: no-this-assignment
|
|
|
const _this = this;
|
|
|
- if (_this._resizingDirection === ResizingDirection.Top) {
|
|
|
+ if (_this._isResizingTop()) {
|
|
|
_this.y = parseFloat(_this.element.style.top!.replace("px", ""));
|
|
|
_this.height = parseFloat(_this.element.style.height.replace("px", ""));
|
|
|
_this._ownerCanvas.hostCanvas.removeEventListener("pointerup", _this._onTopHandlePointerUp);
|
|
@@ -742,6 +752,91 @@ export class GraphFrame {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private _isResizingTop(){
|
|
|
+ return this._resizingDirection === ResizingDirection.Top || this._resizingDirection === ResizingDirection.TopRight || this._resizingDirection === ResizingDirection.TopLeft;
|
|
|
+ }
|
|
|
+
|
|
|
+ private _isResizingRight(){
|
|
|
+ return this._resizingDirection === ResizingDirection.Right || this._resizingDirection === ResizingDirection.TopRight || this._resizingDirection === ResizingDirection.BottomRight;
|
|
|
+ }
|
|
|
+
|
|
|
+ private _isResizingBottom(){
|
|
|
+ return this._resizingDirection === ResizingDirection.Bottom || this._resizingDirection === ResizingDirection.BottomLeft || this._resizingDirection === ResizingDirection.BottomRight;
|
|
|
+ }
|
|
|
+
|
|
|
+ private _isResizingLeft(){
|
|
|
+ return this._resizingDirection === ResizingDirection.Left || this._resizingDirection === ResizingDirection.TopLeft || this._resizingDirection === ResizingDirection.BottomLeft;
|
|
|
+ }
|
|
|
+
|
|
|
+ private _onTopRightHandlePointerDown = (evt: PointerEvent) => {
|
|
|
+ console.log('_onTopRightHandlePointerDown()')
|
|
|
+ // tslint:disable-next-line: no-this-assignment
|
|
|
+ const _this = this;
|
|
|
+ _this.initResizing(evt);
|
|
|
+ // _this.initResizing(evt);
|
|
|
+ _this._resizingDirection = ResizingDirection.TopRight;
|
|
|
+ _this._ownerCanvas.hostCanvas.addEventListener("pointerup", _this._onTopRightHandlePointerUp);
|
|
|
+ _this._ownerCanvas.hostCanvas.addEventListener("pointermove", _this._onTopRightHandlePointerMove);
|
|
|
+ }
|
|
|
+
|
|
|
+ private _onTopRightHandlePointerUp = (evt: PointerEvent) => {
|
|
|
+ console.log('_onTopRightHandlePointerUp()')
|
|
|
+ evt.stopPropagation();
|
|
|
+ // tslint:disable-next-line: no-this-assignment
|
|
|
+ const _this = this;
|
|
|
+ if (_this._resizingDirection === ResizingDirection.TopRight) {
|
|
|
+ _this.y = parseFloat(_this.element.style.top!.replace("px", ""));
|
|
|
+ _this.height = parseFloat(_this.element.style.height.replace("px", ""));
|
|
|
+ _this._ownerCanvas.hostCanvas.removeEventListener("pointerup", _this._onTopRightHandlePointerUp);
|
|
|
+ _this._ownerCanvas.hostCanvas.removeEventListener("pointermove", _this._onTopRightHandlePointerMove);
|
|
|
+ _this.cleanUpResizing(evt);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private _onTopRightHandlePointerMove = (evt: PointerEvent) => {
|
|
|
+ console.log('_onTopRightHandlePointerMove()')
|
|
|
+ const topSlack = (this.element.offsetHeight - this._minFrameHeight) * this._ownerCanvas.zoom;
|
|
|
+ const yLimit = (this._mouseStartPointY as number) + topSlack;
|
|
|
+ const rightSlack = (this.element.offsetWidth - this._minFrameWidth) * this._ownerCanvas.zoom;
|
|
|
+ const xLimit = (this._mouseStartPointX as number) - rightSlack;
|
|
|
+ this._moveTopRightHandle(evt, xLimit, yLimit);
|
|
|
+ }
|
|
|
+
|
|
|
+ private _moveTopRightHandle = (evt: PointerEvent, xLimit: number, yLimit: number) => {
|
|
|
+ // tslint:disable-next-line: no-this-assignment
|
|
|
+ const _this = this;
|
|
|
+ if (!(_this._isResizingTop() && _this._isResizingRight()) || _this._mouseStartPointX === null || _this._mouseStartPointY === null || evt.clientY > yLimit || evt.clientX < xLimit) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (_this._isResizingRight() && _this._isResizingTop()) {
|
|
|
+ evt.stopPropagation();
|
|
|
+ const distanceMouseMovedX = (evt.clientX - _this._mouseStartPointX) / _this._ownerCanvas.zoom;
|
|
|
+ _this._expandRight(distanceMouseMovedX, evt.clientX);
|
|
|
+ _this._mouseStartPointX = evt.clientX;
|
|
|
+ console.log('moving top right')
|
|
|
+ const distanceMouseMovedY = (evt.clientY - _this._mouseStartPointY) / _this._ownerCanvas.zoom;
|
|
|
+ _this._expandTop(distanceMouseMovedY);
|
|
|
+ _this._mouseStartPointY = evt.clientY;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private _expandTop(heightModification: number) {
|
|
|
+ const frameElementHeight = parseFloat(this.element.style.height.replace("px", ""));
|
|
|
+ const frameElementTop = parseFloat(this.element.style.top.replace("px", ""));
|
|
|
+ this.element.style.height = `${frameElementHeight - heightModification}px`;
|
|
|
+ this.element.style.top = `${frameElementTop + heightModification}px`;
|
|
|
+ }
|
|
|
+
|
|
|
+ private _expandRight(widthModification: number, x: number) {
|
|
|
+ const frameElementWidth = parseFloat(this.element.style.width.replace("px", ""));
|
|
|
+ if ((frameElementWidth + widthModification) > 20) {
|
|
|
+ this._mouseStartPointX = x;
|
|
|
+ this.element.style.width = `${frameElementWidth + widthModification}px`;
|
|
|
+ }
|
|
|
+ this.updateMinHeightWithComments();
|
|
|
+ // this.height = this._borderElement.offsetHeight;
|
|
|
+ }
|
|
|
+
|
|
|
public dispose() {
|
|
|
this.isCollapsed = false;
|
|
|
|