package com.baselet.gwt.client.view; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.baselet.command.AddGridElementCommand; import com.baselet.command.CommandTarget; import com.baselet.command.Controller; import com.baselet.command.RemoveGridElementCommand; import com.baselet.control.basics.geom.Rectangle; import com.baselet.control.constants.SharedConstants; import com.baselet.element.GridElementUtils; import com.baselet.element.Selector; import com.baselet.element.interfaces.Diagram; import com.baselet.element.interfaces.GridElement; import com.baselet.gwt.client.element.BrowserStorage; import com.baselet.gwt.client.element.ElementFactoryGwt; public class CommandInvoker extends Controller { private static final CommandInvoker instance = new CommandInvoker(); public static CommandInvoker getInstance() { return instance; } private CommandInvoker() { super(); } void addElements(CommandTarget target, List<GridElement> elements) { executeCommand(new AddGridElementCommand(target, elements)); } void removeElements(CommandTarget target, List<GridElement> elements) { executeCommand(new RemoveGridElementCommand(target, elements)); } void removeSelectedElements(CommandTarget target) { removeElements(target, target.getSelector().getSelectedElements()); } // TODO implement copy & paste as commands void copySelectedElements(CommandTarget target) { BrowserStorage.setClipboard(copyElementsInList(target.getSelector().getSelectedElements(), target.getDiagram())); // must be copied here to ensure location etc. will not be changed } void cutSelectedElements(CommandTarget target) { copySelectedElements(target); removeSelectedElements(target); } void pasteElements(CommandTarget target) { List<GridElement> copyOfElements = copyElementsInList(BrowserStorage.getClipboard(), target.getDiagram()); Selector.replaceGroupsWithNewGroups(copyOfElements, target.getSelector()); realignElementsToVisibleRect(target, copyOfElements); addElements(target, copyOfElements); // copy here to make sure it can be pasted multiple times } private List<GridElement> copyElementsInList(Collection<GridElement> sourceElements, Diagram targetDiagram) { List<GridElement> targetElements = new ArrayList<GridElement>(); for (GridElement ge : sourceElements) { GridElement e = ElementFactoryGwt.create(ge, targetDiagram); targetElements.add(e); } return targetElements; } void realignElementsToVisibleRect(CommandTarget target, List<GridElement> gridElements) { Rectangle rect = GridElementUtils.getGridElementsRectangle(gridElements); Rectangle visible = target.getVisibleBounds(); for (GridElement ge : gridElements) { ge.getRectangle().move(visible.getX() - rect.getX() + SharedConstants.DEFAULT_GRID_SIZE, visible.getY() - rect.getY() + SharedConstants.DEFAULT_GRID_SIZE); } } public void updateSelectedElementsProperty(CommandTarget target, String key, Object value) { for (GridElement e : target.getSelector().getSelectedElements()) { e.setProperty(key, value); } target.updatePropertiesPanelWithSelectedElement(); } }