package com.baselet.gui.command; import java.awt.Point; import java.util.Vector; import com.baselet.control.constants.Constants; import com.baselet.diagram.DiagramHandler; import com.baselet.element.ElementFactorySwing; import com.baselet.element.Selector; import com.baselet.element.interfaces.GridElement; public class Paste extends Command { private Point origin; private Vector<GridElement> entities; private int viewpX = 0; private int viewpY = 0; @Override public void execute(DiagramHandler handler) { super.execute(handler); if (entities == null) { entities = new Vector<GridElement>(); for (GridElement e : ClipBoard.getInstance().paste()) { GridElement clone = ElementFactorySwing.createCopy(e, handler); entities.add(clone); } Selector.replaceGroupsWithNewGroups(entities, handler.getDrawPanel().getSelector()); } // AB: first execution of paste if (origin == null) { origin = handler.getDrawPanel().getOriginAtDefaultZoom(); // AB: Include viewport position to paste on visible area Point viewp = handler.getDrawPanel().getScrollPane().getViewport().getViewPosition(); viewpX = handler.realignToGrid(false, (int) viewp.getX()) / handler.getGridSize(); viewpY = handler.realignToGrid(false, (int) viewp.getY()) / handler.getGridSize(); } if (entities.isEmpty()) { return; } DiagramHandler.zoomEntities(Constants.DEFAULTGRIDSIZE, handler.getGridSize(), entities); // Calculate the rectangle around the copied entities int minX = Integer.MAX_VALUE; int minY = Integer.MAX_VALUE; for (GridElement e : entities) { minX = Math.min(e.getRectangle().x, minX); minY = Math.min(e.getRectangle().y, minY); } for (GridElement e : entities) { e.setLocationDifference( viewpX * handler.getGridSize() - minX + handler.getGridSize() * Constants.PASTE_DISPLACEMENT_GRIDS, viewpY * handler.getGridSize() - minY + handler.getGridSize() * Constants.PASTE_DISPLACEMENT_GRIDS); } int offsetX = origin.x - handler.getDrawPanel().getOriginAtDefaultZoom().x; int offsetY = origin.y - handler.getDrawPanel().getOriginAtDefaultZoom().y; offsetX = offsetX * handler.getGridSize() / Constants.DEFAULTGRIDSIZE; offsetY = offsetY * handler.getGridSize() / Constants.DEFAULTGRIDSIZE; for (GridElement e : entities) { new AddElement(e, handler.realignToGrid(e.getRectangle().x + offsetX), handler.realignToGrid(e.getRectangle().y + offsetY), false).execute(handler); } handler.getDrawPanel().getSelector().deselectAll(); for (GridElement e : entities) { handler.getDrawPanel().getSelector().select(e); } handler.getDrawPanel().updatePanelAndScrollbars(); } @Override public void undo(DiagramHandler handler) { super.undo(handler); DiagramHandler.zoomEntities(handler.getGridSize(), Constants.DEFAULTGRIDSIZE, entities); new RemoveElement(entities, false).execute(handler); handler.getDrawPanel().updatePanelAndScrollbars(); } }