package com.baselet.gui.listener;
import java.awt.event.MouseEvent;
import java.util.Collections;
import java.util.Vector;
import com.baselet.control.HandlerElementMap;
import com.baselet.control.basics.Converter;
import com.baselet.control.basics.geom.Point;
import com.baselet.control.enums.Direction;
import com.baselet.diagram.CurrentDiagram;
import com.baselet.diagram.DiagramHandler;
import com.baselet.element.interfaces.CursorOwn;
import com.baselet.element.old.element.Relation;
import com.baselet.element.sticking.StickableMap;
import com.baselet.gui.CurrentGui;
import com.baselet.gui.command.Command;
import com.baselet.gui.command.Move;
import com.baselet.gui.command.OldMoveLinePoint;
import com.baselet.gui.command.RemoveElement;
/**
* new relation doesnt need its own listener
*/
@Deprecated
public class OldRelationListener extends GridElementListener {
private static class OldAddLinePoint extends Command {
private final Relation _relation;
private final int _where;
private final int _x;
private final int _y;
private int getX() {
return _x * HandlerElementMap.getHandlerForElement(_relation).getGridSize();
}
private int getY() {
return _y * HandlerElementMap.getHandlerForElement(_relation).getGridSize();
}
public OldAddLinePoint(Relation r, int i, int x, int y) {
_relation = r;
_where = i;
_x = x / HandlerElementMap.getHandlerForElement(_relation).getGridSize();
_y = y / HandlerElementMap.getHandlerForElement(_relation).getGridSize();
}
@Override
public void execute(DiagramHandler handler) {
super.execute(handler);
Vector<Point> tmp = _relation.getLinePoints();
tmp.insertElementAt(new Point(getX(), getY()), _where);
_relation.repaint();
}
@Override
public void undo(DiagramHandler handler) {
super.undo(handler);
Vector<Point> tmp = _relation.getLinePoints();
tmp.removeElementAt(_where);
_relation.repaint();
}
}
private static class OldRemoveLinePoint extends Command {
private final Relation _relation;
private final int _where;
private final int _x;
private final int _y;
private int getX() {
return _x * HandlerElementMap.getHandlerForElement(_relation).getGridSize();
}
private int getY() {
return _y * HandlerElementMap.getHandlerForElement(_relation).getGridSize();
}
public OldRemoveLinePoint(Relation r, int i) {
_relation = r;
_where = i;
Point p = r.getLinePoints().elementAt(i);
_x = p.x / HandlerElementMap.getHandlerForElement(_relation).getGridSize();
_y = p.y / HandlerElementMap.getHandlerForElement(_relation).getGridSize();
}
@Override
public void execute(DiagramHandler handler) {
super.execute(handler);
Vector<Point> tmp = _relation.getLinePoints();
tmp.removeElementAt(_where);
_relation.repaint();
}
@Override
public void undo(DiagramHandler handler) {
super.undo(handler);
Vector<Point> tmp = _relation.getLinePoints();
tmp.insertElementAt(new Point(getX(), getY()), _where);
_relation.repaint();
}
}
private boolean IS_DRAGGING_LINEPOINT = false;
private boolean IS_DRAGGING_LINE = false;
private int LINEPOINT = -1;
public OldRelationListener(DiagramHandler handler) {
super(handler);
}
@Override
public void mousePressed(MouseEvent me) {
super.mousePressed(me);
if (me.getButton() == MouseEvent.BUTTON1) {
IS_DRAGGING = false;
Relation rel = (Relation) me.getComponent();
int where = rel.getLinePoint(new Point(me.getX(), me.getY()));
if (where >= 0) {
IS_DRAGGING_LINEPOINT = true;
LINEPOINT = where;
}
else if (rel.isWholeLine(me.getX(), me.getY())) {
IS_DRAGGING_LINE = true;
IS_DRAGGING = true;
}
else if (me.getButton() == MouseEvent.BUTTON2) {
IS_DRAGGING_DIAGRAM = true;
IS_DRAGGING_LINE = false;
IS_DRAGGING_LINEPOINT = false;
IS_DRAGGING = false;
}
}
}
@Override
public void mouseReleased(MouseEvent me) {
super.mouseReleased(me);
if (IS_DRAGGING_LINEPOINT & LINEPOINT >= 0) {
Relation rel = (Relation) me.getComponent();
if (rel.allPointsOnSamePos()) {
// If mousebutton is released and all points of a relation are on the same position,
// the command which moved all points to the same position gets undone and the relation gets removed instead
controller.undo();
controller.executeCommand(new RemoveElement(rel));
}
else if (rel.isOnLine(LINEPOINT)) {
controller.executeCommand(
new OldRemoveLinePoint(rel, LINEPOINT));
}
}
IS_DRAGGING_LINEPOINT = false;
IS_DRAGGING_LINE = false;
}
@Override
public void mouseMoved(MouseEvent me) {
super.mouseMoved(me);
Relation rel = (Relation) me.getComponent();
int where = rel.getLinePoint(new Point(me.getX(), me.getY()));
CursorOwn cursor;
if (where >= 0) {
cursor = CursorOwn.HAND;
}
else if (rel.isWholeLine(me.getX(), me.getY())) {
cursor = CursorOwn.MOVE;
}
else {
cursor = CursorOwn.CROSS;
}
CurrentGui.getInstance().getGui().setCursor(Converter.convert(cursor));
return;
}
@Override
public void mouseDragged(MouseEvent me) {
super.mouseDragged(me);
if (disableElementMovement()) {
return;
}
if (IS_DRAGGING) {
return;
}
if (IS_DRAGGING_DIAGRAM) {
return;
}
Relation r = (Relation) me.getComponent();
int gridSize = CurrentDiagram.getInstance().getDiagramHandler().getGridSize();
// delta
int delta_x = 0;
int delta_y = 0;
if (IS_DRAGGING_LINEPOINT) {
Vector<Point> tmp = r.getLinePoints();
Point p = tmp.elementAt(LINEPOINT);
delta_x = (r.getRectangle().x + p.x) % gridSize;
delta_y = (r.getRectangle().y + p.y) % gridSize;
}
Point newp = getNewCoordinate();
Point oldp = getOldCoordinate();
int diffx = newp.x - oldp.x - delta_x;
int diffy = newp.y - oldp.y - delta_y;
if (IS_DRAGGING_LINEPOINT & LINEPOINT >= 0) {
controller.executeCommand(
new OldMoveLinePoint(r, LINEPOINT, diffx, diffy));
return;
}
else if (IS_DRAGGING_LINE) {
controller.executeCommand(new Move(Collections.<Direction> emptySet(), r, diffx, diffy, oldp, me.isShiftDown(), false, true, StickableMap.EMPTY_MAP));
return;
}
int where = r.getLinePoint(new Point(me.getX(), me.getY()));
if (where >= 0) {
IS_DRAGGING_LINEPOINT = true;
LINEPOINT = where;
controller.executeCommand(
new OldMoveLinePoint(r, where, diffx, diffy));
return;
}
else {
Point p = new Point(me.getX(), me.getY());
int ins = r.getWhereToInsert(p);
if (ins > 0) {
IS_DRAGGING_LINEPOINT = true;
LINEPOINT = ins;
controller.executeCommand(
new OldAddLinePoint(r, ins, me.getX(), me.getY()));
return;
}
}
}
}