@eclipse-glsp/client
Version:
A sprotty-based client for GLSP
198 lines • 9.47 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HelperLineManager = exports.DEFAULT_HELPER_LINE_OPTIONS = exports.DEFAULT_MOVE_DELTA = void 0;
/********************************************************************************
* Copyright (c) 2023-2024 EclipseSource and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License v. 2.0 are satisfied: GNU General Public License, version 2
* with the GNU Classpath Exception which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
const sprotty_1 = require("@eclipse-glsp/sprotty");
const inversify_1 = require("inversify");
const selection_service_1 = require("../../base/selection-service");
const set_bounds_feedback_command_1 = require("../bounds/set-bounds-feedback-command");
const model_1 = require("../change-bounds/model");
const grid_1 = require("../grid/grid");
const change_bounds_tool_feedback_1 = require("../tools/change-bounds/change-bounds-tool-feedback");
const helper_line_feedback_1 = require("./helper-line-feedback");
const model_2 = require("./model");
exports.DEFAULT_MOVE_DELTA = { x: 1, y: 1 };
exports.DEFAULT_HELPER_LINE_OPTIONS = {
elementLines: helper_line_feedback_1.DEFAULT_ELEMENT_LINES,
viewportLines: helper_line_feedback_1.DEFAULT_VIEWPORT_LINES,
alignmentEpsilon: helper_line_feedback_1.DEFAULT_EPSILON,
alignmentElementFilter: helper_line_feedback_1.DEFAULT_ALIGNABLE_ELEMENT_FILTER,
minimumMoveDelta: exports.DEFAULT_MOVE_DELTA,
debug: helper_line_feedback_1.DEFAULT_DEBUG
};
let HelperLineManager = class HelperLineManager {
init() {
this.feedback = this.feedbackDispatcher.createEmitter();
const dynamicOptions = {};
if (this.grid) {
dynamicOptions.alignmentEpsilon = 0;
dynamicOptions.minimumMoveDelta = sprotty_1.Point.multiplyScalar(this.grid, 2);
}
this.options = { ...exports.DEFAULT_HELPER_LINE_OPTIONS, ...dynamicOptions, ...this.userOptions };
this.selectionService.addListener(this);
}
handle(action) {
if (change_bounds_tool_feedback_1.MoveInitializedEventAction.is(action)) {
this.handleMoveInitializedAction(action);
}
else if (sprotty_1.MoveAction.is(action)) {
this.handleMoveAction(action);
}
else if (change_bounds_tool_feedback_1.MoveFinishedEventAction.is(action)) {
this.handleMoveFinishedAction(action);
}
else if (sprotty_1.SetBoundsAction.is(action) || set_bounds_feedback_command_1.SetBoundsFeedbackAction.is(action)) {
this.handleSetBoundsAction(action);
}
}
handleMoveInitializedAction(_action) {
this.submitHelperLineFeedback();
}
handleMoveFinishedAction(_action) {
this.feedback.dispose();
}
handleMoveAction(action) {
if (!action.finished) {
this.submitHelperLineFeedback(action.moves.map(move => move.elementId));
}
else {
this.feedback.dispose();
}
}
submitHelperLineFeedback(elementIds = this.selectionService.getSelectedElementIDs()) {
const feedback = this.createHelperLineFeedback(elementIds);
this.feedback.add(feedback, [helper_line_feedback_1.RemoveHelperLinesFeedbackAction.create()]).submit();
}
createHelperLineFeedback(elementIds) {
return helper_line_feedback_1.DrawHelperLinesFeedbackAction.create({ elementIds, ...this.options });
}
handleSetBoundsAction(action) {
this.submitHelperLineFeedback(action.bounds.map(bound => bound.elementId));
}
selectionChanged(root, selectedElements, deselectedElements) {
this.feedback.dispose();
}
getMinimumMoveDelta(element, isSnap, direction) {
if (!isSnap) {
return 0;
}
const minimumMoveDelta = this.options.minimumMoveDelta;
return direction === model_2.Direction.Left || direction === model_2.Direction.Right ? minimumMoveDelta.x : minimumMoveDelta.y;
}
getMinimumMoveVector(element, isSnap, move) {
if (!isSnap) {
return undefined;
}
const state = this.getHelperLineState(element);
if (state.helperLines.length === 0) {
return undefined;
}
const minimum = { ...sprotty_1.Vector.ZERO };
const resize = element instanceof model_1.GResizeHandle
? model_1.ResizeHandleLocation.direction(element.location)
: [model_2.Direction.Left, model_2.Direction.Right, model_2.Direction.Up, model_2.Direction.Down];
if ((state.types.left || state.types.center) && move.includes(model_2.Direction.Left) && resize.includes(model_2.Direction.Left)) {
minimum.x = this.getMinimumMoveDelta(element, isSnap, model_2.Direction.Left);
}
else if ((state.types.right || state.types.center) && move.includes(model_2.Direction.Right) && resize.includes(model_2.Direction.Right)) {
minimum.x = this.getMinimumMoveDelta(element, isSnap, model_2.Direction.Right);
}
if ((state.types.top || state.types.middle) && move.includes(model_2.Direction.Up) && resize.includes(model_2.Direction.Up)) {
minimum.y = this.getMinimumMoveDelta(element, isSnap, model_2.Direction.Up);
}
else if ((state.types.bottom || state.types.middle) && move.includes(model_2.Direction.Down) && resize.includes(model_2.Direction.Down)) {
minimum.y = this.getMinimumMoveDelta(element, isSnap, model_2.Direction.Down);
}
return sprotty_1.Vector.isZero(minimum) ? undefined : minimum;
}
getHelperLineState(element) {
const helperLines = element.root.children.filter(model_2.isHelperLine) || [];
const types = {
left: false,
right: false,
top: false,
bottom: false,
center: false,
middle: false
};
for (const line of helperLines) {
switch (line.lineType) {
case model_2.HelperLineType.Left:
case model_2.HelperLineType.LeftRight:
types.left = true;
break;
case model_2.HelperLineType.Right:
case model_2.HelperLineType.RightLeft:
types.right = true;
break;
case model_2.HelperLineType.Top:
case model_2.HelperLineType.TopBottom:
types.top = true;
break;
case model_2.HelperLineType.Bottom:
case model_2.HelperLineType.BottomTop:
types.bottom = true;
break;
case model_2.HelperLineType.Center:
types.center = true;
break;
case model_2.HelperLineType.Middle:
types.middle = true;
break;
}
}
return { helperLines, types };
}
};
exports.HelperLineManager = HelperLineManager;
__decorate([
(0, inversify_1.inject)(sprotty_1.TYPES.IFeedbackActionDispatcher),
__metadata("design:type", Object)
], HelperLineManager.prototype, "feedbackDispatcher", void 0);
__decorate([
(0, inversify_1.inject)(selection_service_1.SelectionService),
__metadata("design:type", selection_service_1.SelectionService)
], HelperLineManager.prototype, "selectionService", void 0);
__decorate([
(0, inversify_1.optional)(),
(0, inversify_1.inject)(sprotty_1.TYPES.IHelperLineOptions),
__metadata("design:type", Object)
], HelperLineManager.prototype, "userOptions", void 0);
__decorate([
(0, inversify_1.optional)(),
(0, inversify_1.inject)(sprotty_1.TYPES.Grid),
__metadata("design:type", Object)
], HelperLineManager.prototype, "grid", void 0);
__decorate([
(0, inversify_1.postConstruct)(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], HelperLineManager.prototype, "init", null);
exports.HelperLineManager = HelperLineManager = __decorate([
(0, inversify_1.injectable)()
], HelperLineManager);
//# sourceMappingURL=helper-line-manager.js.map