/******************************************************************************* * Copyright 2017 Capital One Services, LLC and Bitwise, Inc. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package hydrograph.ui.graph.command; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.commands.Command; import org.eclipse.gef.ui.actions.Clipboard; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.slf4j.Logger; import hydrograph.ui.graph.editor.ELTGraphicalEditor; import hydrograph.ui.graph.model.CommentBox; import hydrograph.ui.graph.model.Component; import hydrograph.ui.graph.model.Link; import hydrograph.ui.graph.model.Model; import hydrograph.ui.logging.factory.LogFactory; /** * The Class ComponentPasteCommand. */ public class ComponentPasteCommand extends Command { private static final String UNDERSCORE = "_"; private static final Logger LOGGER = LogFactory.INSTANCE.getLogger(ComponentPasteCommand.class); private int pasteCounter=0; private Map<Object,Object> list = new HashMap<>(); @Override public boolean canExecute() { List bList = (ArrayList) Clipboard.getDefault().getContents(); if (bList == null || bList.isEmpty()) return false; Iterator it = bList.iterator(); while (it.hasNext()) { Object node = (Object) it.next(); if (isPastableNode(node)) { list.put(node, null); } } return true; } @Override public void execute() { if (!canExecute()) return; Iterator<Object> it = list.keySet().iterator(); while (it.hasNext()) { Object node = it.next(); try { IWorkbenchPage page = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage(); if(node instanceof Component){ Component clonedComponent = ((Component)node).clone(); clonedComponent.setPrefix(getPrefix(node)); clonedComponent.setParent(((ELTGraphicalEditor) page.getActiveEditor()).getContainer()); Point location = ((Component) node).getLocation(); int incrementedLocation = pasteCounter * 20; clonedComponent.setLocation(new Point(location.getCopy().x + incrementedLocation, location.getCopy().y + incrementedLocation)); list.put(node,clonedComponent); } else if(node instanceof CommentBox){ CommentBox clonedLabel = ((CommentBox) node).clone(); clonedLabel.setParent(((ELTGraphicalEditor) page.getActiveEditor()).getContainer()); clonedLabel.setLabelContents(((CommentBox)node).getLabelContents()); Point location = ((CommentBox)node).getLocation(); int incrementedLocation = pasteCounter * 20; clonedLabel.setLocation(new Point(location.getCopy().x + incrementedLocation, location.getCopy().y + incrementedLocation)); list.put(node,clonedLabel); } } catch (CloneNotSupportedException e) { LOGGER.error("Object could not cloned", e); } } redo(); } private String getPrefix(Object node) { String currentName=((Component) node).getComponentLabel().getLabelContents(); String prefix=currentName; StringBuffer buffer=new StringBuffer(currentName); try { if(buffer.lastIndexOf(UNDERSCORE)!=-1 && (buffer.lastIndexOf(UNDERSCORE)!=buffer.length())){ String substring = StringUtils.trim(buffer.substring(buffer.lastIndexOf(UNDERSCORE)+1,buffer.length())); if(StringUtils.isNumeric(substring)){ prefix=buffer.substring(0,buffer.lastIndexOf(UNDERSCORE)); } }} catch (Exception exception) { LOGGER.warn("Cannot process component name for detecting prefix : ",exception.getMessage()); } return prefix; } @Override public void redo() { Iterator<Object> it = list.values().iterator(); while (it.hasNext()) { Model node = (Model) it.next(); if (isPastableNode(node)) { if(node instanceof Component){ ((Component)node).getParent().addChild(((Component)node)); } else if(node instanceof CommentBox){ ((CommentBox)node).getParent().addChild(((CommentBox)node)); } } } pasteLinks(); } private void pasteLinks() { for(Object originalNode:list.keySet()){ if(originalNode instanceof Component){ Component node = (Component) originalNode; if(!((Component) originalNode).getSourceConnections().isEmpty()){ for(Link originlink: ((Component) originalNode).getSourceConnections()){ Component targetComponent = originlink.getTarget(); Component newSource = (Component) list.get(originalNode); Component newtarget = (Component) list.get(targetComponent); if(newSource!=null && newtarget!=null){ Link link = new Link(); link.setSourceTerminal(originlink.getSourceTerminal()); link.setTargetTerminal(originlink.getTargetTerminal()); link.setSource(newSource); link.setTarget(newtarget); newSource.connectOutput(link); newtarget.connectInput(link); } } } } } } @Override public boolean canUndo() { return !(list.isEmpty()); } @Override public void undo() { Iterator<Object> it = list.values().iterator(); while (it.hasNext()) { Object object = it.next(); if(object instanceof Component){ Component node = (Component) object; if (isPastableNode(node)) { node.getParent().removeChild(node); } } } } /** * Checks if is pastable node. * * @param node * the node * @return true, if is pastable node */ public boolean isPastableNode(Object node) { if (node instanceof Component) return true; if (node instanceof Link) return true; if (node instanceof CommentBox) return true; return false; } /** * * get paste counter * * @return */ public int getPasteCounter() { return pasteCounter; } /** * * Set paste counter * * @param pasteCounter */ public void setPasteCounter(int pasteCounter) { this.pasteCounter = pasteCounter; } }