package com.baselet.gui.command; import java.awt.Point; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.baselet.control.basics.geom.Rectangle; import com.baselet.control.constants.Constants; import com.baselet.diagram.DiagramHandler; import com.baselet.diagram.DrawPanel; import com.baselet.element.interfaces.GridElement; public class Align extends Command { private enum Edge { RIGHT, LEFT, TOP, BOTTOM; } private Point origin; private GridElement dominantEntity; private List<GridElement> entities; private Map<GridElement, Point> orgLocations = new HashMap<GridElement, Point>(); private Edge edge; public Align(List<GridElement> entities, GridElement dominantEntity, String edge) { this.dominantEntity = dominantEntity; this.entities = new ArrayList<GridElement>(entities); this.edge = Edge.valueOf(edge.toUpperCase()); } @Override public void execute(DiagramHandler handler) { super.execute(handler); if (entities.size() == 0 || dominantEntity == null) { return; } // We must zoom to the defaultGridsize before execution int oldZoom = handler.getGridSize(); handler.setGridAndZoom(Constants.DEFAULTGRIDSIZE, false); // AB: determine fix points first item (the "dominantly selected" item) GridElement entity = dominantEntity; int left = entity.getRectangle().x; int right = left + entity.getRectangle().width; int top = entity.getRectangle().y; int bottom = top + entity.getRectangle().height; DrawPanel p = handler.getDrawPanel(); for (GridElement e : entities) { Rectangle rectangle = e.getRectangle(); int x = rectangle.x; int y = rectangle.y; switch (edge) { case LEFT: x = left; break; case RIGHT: x = right - e.getRectangle().width; break; case TOP: y = top; break; case BOTTOM: y = bottom - e.getRectangle().height; break; } orgLocations.put(e, new Point(rectangle.x, rectangle.y)); e.setLocation(handler.realignToGrid(true, x), handler.realignToGrid(true, y)); } // And zoom back to the oldGridsize after execution handler.setGridAndZoom(oldZoom, false); // AB: copy origin and zoom it to 100% origin = handler.getDrawPanel().getOriginAtDefaultZoom(); p.updatePanelAndScrollbars(); p.repaint(); } @Override public void undo(DiagramHandler handler) { super.undo(handler); // We must zoom to the defaultGridsize before execution int oldZoom = handler.getGridSize(); handler.setGridAndZoom(Constants.DEFAULTGRIDSIZE, false); int offsetX = origin.x - handler.getDrawPanel().getOrigin().x; int offsetY = origin.y - handler.getDrawPanel().getOrigin().y; for (GridElement entity : entities) { Point orgLocation = orgLocations.get(entity); entity.setLocation(handler.realignToGrid(true, orgLocation.x + offsetX), handler.realignToGrid(true, orgLocation.y + offsetY)); } // And zoom back to the oldGridsize after execution handler.setGridAndZoom(oldZoom, false); handler.getDrawPanel().updatePanelAndScrollbars(); handler.getDrawPanel().repaint(); } }