package com.baselet.gui.command;
import java.awt.Point;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.baselet.control.HandlerElementMap;
import com.baselet.control.constants.Constants;
import com.baselet.diagram.DiagramHandler;
import com.baselet.diagram.DrawPanel;
import com.baselet.element.interfaces.GridElement;
public class AddElement extends Command {
private static final Logger log = LoggerFactory.getLogger(AddElement.class);
// AB: checked false after first execution
private boolean firstCall = true;
private Point origin;
private GridElement _entity;
private int _x;
private int _y;
private boolean _zoom;
private int getX() {
// AB: use default grid size since we zoom the whole entity on execution
if (_zoom) {
return _x * Constants.DEFAULTGRIDSIZE;// _entity.getHandler().getGridSize();
}
else {
return _x;
}
}
private int getY() {
// AB: use default grid size since we zoom the whole entity on execution
if (_zoom) {
return _y * Constants.DEFAULTGRIDSIZE;// _entity.getHandler().getGridSize();
}
else {
return _y;
}
}
public AddElement(GridElement e, int x, int y) {
this(e, x, y, true);
}
public AddElement(GridElement e, int x, int y, boolean zoom) {
_entity = e;
_zoom = zoom;
if (_zoom) {
_x = x / HandlerElementMap.getHandlerForElement(e).getGridSize();
_y = y / HandlerElementMap.getHandlerForElement(e).getGridSize();
DiagramHandler.zoomEntity(HandlerElementMap.getHandlerForElement(e).getGridSize(), Constants.DEFAULTGRIDSIZE, e);
}
else {
_x = x;
_y = y;
}
}
private void addentity(GridElement e, DrawPanel panel, int x, int y) {
panel.getHandler().setHandlerAndInitListeners(e);
panel.addElement(e);
e.setLocation(x, y);
}
@Override
public void execute(DiagramHandler handler) {
super.execute(handler);
// AB: set origin for the first execution;
// NOTE this cannot be done in constructor since we cannot rely that the handler in the constructor is the same as here
if (origin == null) {
origin = handler.getDrawPanel().getOriginAtDefaultZoom();
}
// AB: calculate offset so that we add it on the same position on redo
// NOTE the first time the command is executed, the offset is 0
int offsetX = origin.x - handler.getDrawPanel().getOriginAtDefaultZoom().x;
int offsetY = origin.y - handler.getDrawPanel().getOriginAtDefaultZoom().y;
log.debug("Add Entity at " + getX() + "/" + getY());
addentity(_entity, handler.getDrawPanel(), getX() + offsetX, getY() + offsetY);
if (_zoom) {
DiagramHandler.zoomEntity(Constants.DEFAULTGRIDSIZE, handler.getGridSize(), _entity);
}
handler.getDrawPanel().getSelector().selectOnly(_entity);
// AB: do this because updatePanelAndScrollbars messes up frequent calls of AddEntity in a loop
if (!firstCall) {
handler.getDrawPanel().updatePanelAndScrollbars();
}
firstCall = false;
}
@Override
public void undo(DiagramHandler handler) {
super.undo(handler);
if (_zoom) {
DiagramHandler.zoomEntity(handler.getGridSize(), Constants.DEFAULTGRIDSIZE, _entity);
}
handler.getDrawPanel().removeElement(_entity);
new RemoveElement(_entity, false).execute(handler); // zoom must be false otherwise groups don't work correctly
handler.getDrawPanel().repaint();
handler.getDrawPanel().updatePanelAndScrollbars();
}
}