devexpress-diagram
Version:
DevExpress Diagram Control
50 lines (47 loc) • 2.48 kB
text/typescript
import { Point } from "@devexpress/utils/lib/geometry/point";
import { PasteSelectionCommandBase } from "./PasteSelectionCommandBase";
import { DiagramItem } from "../../Model/DiagramItem";
import { Shape } from "../../Model/Shapes/Shape";
import { Connector } from "../../Model/Connectors/Connector";
import { DiagramModel } from "../../Model/Model";
export class PasteSelectionCommand extends PasteSelectionCommandBase {
protected getEventPositionOffset(items: DiagramItem[], _evtPosition?: Point): Point {
const { topLeftItem } = items.reduce((acc, item) => {
const x = item instanceof Shape ? item.position.x : item instanceof Connector ? item.getMinX() : Number.MAX_VALUE;
const y = item instanceof Shape ? item.position.y : item instanceof Connector ? item.getMinY() : Number.MAX_VALUE;
if(y < acc.y || (y === acc.y && x < acc.x)) {
acc.topLeftItem = item;
acc.x = x;
acc.y = y;
}
return acc;
}, {
topLeftItem: items[0],
x: Number.MAX_VALUE,
y: Number.MAX_VALUE
});
if(topLeftItem instanceof Shape) {
const newPoint = this.getShapeCorrectedPosition(this.control.model, topLeftItem);
return new Point(newPoint.x - topLeftItem.position.x, newPoint.y - topLeftItem.position.y);
}
else if(topLeftItem instanceof Connector) {
const newPoints = this.getConnectorCorrectedPoints(this.control.model, topLeftItem);
return new Point(topLeftItem.points[0].x - newPoints[0].x, topLeftItem.points[0].y - newPoints[0].y);
}
}
protected getShapeCorrectedPosition(model: DiagramModel, shape: Shape): Point {
const position = shape.position.clone();
while(model.findShapeAtPosition(position))
position.offset(PasteSelectionCommandBase.positionOffset, PasteSelectionCommandBase.positionOffset);
return position;
}
protected getConnectorCorrectedPoints(model: DiagramModel, connector: Connector): Point[] {
const points = connector.points.map(p => p.clone());
while(model.findConnectorAtPoints(points))
points.forEach(pt => {
pt.x += PasteSelectionCommandBase.positionOffset;
pt.y += PasteSelectionCommandBase.positionOffset;
});
return points;
}
}