package com.baselet.gui.command;
import java.util.Collection;
import java.util.Vector;
import com.baselet.control.HandlerElementMap;
import com.baselet.control.basics.geom.Point;
import com.baselet.control.basics.geom.PointDouble;
import com.baselet.control.basics.geom.Rectangle;
import com.baselet.control.config.SharedConfig;
import com.baselet.diagram.CurrentDiagram;
import com.baselet.diagram.DiagramHandler;
import com.baselet.element.interfaces.GridElement;
import com.baselet.element.old.element.Relation;
import com.baselet.element.sticking.StickingPolygon;
/**
* resizing has been merged with Move command and only remains for old grid elements which will not be migrated but removed from the code after some time
*/
@Deprecated
public class OldResize extends Command {
private int current_id = 0;
private int id;
private final int diffx, diffy, diffw, diffh;
private Vector<OldRelationLinePoint> linepoints;
private final Vector<OldMoveLinePoint> move_commands;
private final GridElement entity;
private int getDiffx() {
return diffx * HandlerElementMap.getHandlerForElement(entity).getGridSize();
}
private int getDiffy() {
return diffy * HandlerElementMap.getHandlerForElement(entity).getGridSize();
}
private int getDiffw() {
return diffw * HandlerElementMap.getHandlerForElement(entity).getGridSize();
}
private int getDiffh() {
return diffh * HandlerElementMap.getHandlerForElement(entity).getGridSize();
}
public OldResize(GridElement entity, int diffx, int diffy, int diffw, int diffh) {
this(entity, diffx, diffy, diffw, diffh, null);
}
// resize for merge
private OldResize(GridElement entity, int id, int diffx, int diffy, int diffw, int diffh,
Vector<OldMoveLinePoint> move_commands, Vector<OldMoveLinePoint> move_commands2) {
this.entity = entity;
this.id = id;
this.move_commands = move_commands;
this.move_commands.addAll(move_commands2);
this.diffx = diffx / HandlerElementMap.getHandlerForElement(entity).getGridSize();
this.diffy = diffy / HandlerElementMap.getHandlerForElement(entity).getGridSize();
this.diffw = diffw / HandlerElementMap.getHandlerForElement(entity).getGridSize();
this.diffh = diffh / HandlerElementMap.getHandlerForElement(entity).getGridSize();
}
public OldResize(GridElement entity, int diffx, int diffy, int diffw, int diffh, OldResize first) {
this.entity = entity;
move_commands = new Vector<OldMoveLinePoint>();
this.diffx = diffx / HandlerElementMap.getHandlerForElement(entity).getGridSize();
this.diffy = diffy / HandlerElementMap.getHandlerForElement(entity).getGridSize();
this.diffw = (diffw - diffx) / HandlerElementMap.getHandlerForElement(entity).getGridSize();
this.diffh = (diffh - diffy) / HandlerElementMap.getHandlerForElement(entity).getGridSize();
Rectangle entityRect = this.entity.getRectangle();
StickingPolygon from = this.entity.generateStickingBorder(entityRect);
// AB: FIXED: Use this.diffw/this.diffh instead of diffw/diffh as calculation base
Rectangle newRect = new Rectangle(entityRect.x + diffx, entityRect.y + diffy, entityRect.width + getDiffw(), entityRect.height + getDiffh());
StickingPolygon to = this.entity.generateStickingBorder(newRect);
if (first != null) {
id = first.id;
linepoints = first.linepoints;
}
else {
id = current_id;
current_id++;
linepoints = getStickingRelationLinePoints(HandlerElementMap.getHandlerForElement(this.entity), from);
}
PointDouble diff;
Point p;
Relation r;
for (OldRelationLinePoint lp : linepoints) {
r = lp.getRelation();
p = r.getLinePoints().get(lp.getLinePointId());
diff = from.getLine(lp.getStickingLineId()).diffToLine(to.getLine(lp.getStickingLineId()), p.x + r.getRectangle().x, p.y + r.getRectangle().y);
DiagramHandler handler = HandlerElementMap.getHandlerForElement(entity);
move_commands.add(new OldMoveLinePoint(lp.getRelation(), lp.getLinePointId(), handler.realignToGrid(diff.x), handler.realignToGrid(diff.y)));
}
}
@Override
public void execute(DiagramHandler handler) {
super.execute(handler);
entity.setLocationDifference(getDiffx(), getDiffy());
entity.setSize(entity.getRectangle().width + getDiffw(), entity.getRectangle().height + getDiffh());
if (SharedConfig.getInstance().isStickingEnabled()) {
for (OldMoveLinePoint c : move_commands) {
c.execute(handler);
}
}
}
@Override
public void undo(DiagramHandler handler) {
super.undo(handler);
entity.setLocationDifference(-getDiffx(), -getDiffy());
entity.setSize(entity.getRectangle().width + -getDiffw(), entity.getRectangle().height + -getDiffh());
for (OldMoveLinePoint c : move_commands) {
c.undo(handler);
}
CurrentDiagram.getInstance().getDiagramHandler().getDrawPanel().updatePanelAndScrollbars();
}
@Override
public boolean isMergeableTo(Command c) {
if (!(c instanceof OldResize)) {
return false;
}
OldResize r = (OldResize) c;
if (id == r.id) {
return true;
}
return false;
}
@Override
public Command mergeTo(Command c) {
OldResize tmp = (OldResize) c;
return new OldResize(entity, Math.max(id, tmp.id), getDiffx() + tmp.getDiffx(), getDiffy() + tmp.getDiffy(),
getDiffw() + tmp.getDiffw(), getDiffh() + tmp.getDiffh(), move_commands, tmp.move_commands);
}
public static Vector<OldRelationLinePoint> getStickingRelationLinePoints(DiagramHandler handler, StickingPolygon stickingPolygon) {
Vector<OldRelationLinePoint> lpts = new Vector<OldRelationLinePoint>();
Collection<Relation> rels = handler.getDrawPanel().getOldRelations();
for (Relation r : rels) {
PointDouble l1 = r.getAbsoluteCoorStart();
PointDouble l2 = r.getAbsoluteCoorEnd();
int c1 = stickingPolygon.isConnected(l1, handler.getGridSize());
int c2 = stickingPolygon.isConnected(l2, handler.getGridSize());
if (c1 >= 0) {
lpts.add(new OldRelationLinePoint(r, 0, c1));
}
if (c2 >= 0) {
lpts.add(new OldRelationLinePoint(r, r.getLinePoints().size() - 1, c2));
}
}
return lpts;
}
}