/******************************************************************************* * Copyright (c) 2010-2015 Henshin developers. All rights reserved. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * TU Berlin, University of Luxembourg, SES S.A. *******************************************************************************/ /** * */ package de.tub.tfs.henshin.tggeditor.actions; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.henshin.model.HenshinPackage; import org.eclipse.emf.henshin.model.Module; import org.eclipse.emf.henshin.model.Rule; import org.eclipse.gef.commands.Command; import org.eclipse.ui.IWorkbenchPart; import de.tub.tfs.henshin.tgg.TGG; import de.tub.tfs.henshin.tggeditor.PasteHenshinRules; import de.tub.tfs.henshin.tggeditor.util.ModelUtil; import de.tub.tfs.muvitor.actions.GenericPasteAction; /** * @author Johann * */ public class TGGGenericPasteAction extends GenericPasteAction { /** * @param part */ public TGGGenericPasteAction(IWorkbenchPart part) { super(part); registerPasteRule(HenshinPackage.Literals.RULE, new PasteHenshinRules()); registerPasteRule(EcorePackage.Literals.EOBJECT, new PasteRuleAdapter(){ @Override public void afterPaste(EObject element, EObject target) { Resource r = element.eResource(); if (target.eResource() != null && !target.eResource().equals(r)){ target.eResource().getContents().add(element); if (r != null) r.getContents().remove(element); } } }); // default rule for named elements } /* * (non-Javadoc) * * @see muvitorkit.actions.GenericPasteAction#run() */ @Override public void run() { // if (targetModel instanceof Module) { // Collection<?> clipboardContents = (Collection<?>) Clipboard // .getDefault().getContents(); // boolean hasRule=false; // boolean hasOther=false; // for (final Object copy : clipboardContents) { // if (copy instanceof Rule) { // hasRule=true; // } // else{ // hasOther=true; // } // } //// if (hasOther && hasRule){ //// return; //// } //// else{ // if (hasRule){ // List<Rule> rules=new ArrayList<Rule>(); // for (final Object copy : clipboardContents) { // Copier c=new Copier(); // rules.add((Rule) c.copy((EObject) copy)); // c.copyReferences(); // } // // command = new PasteRuleCommand((Module)targetModel, // rules); // } //// } // } PasteCommand command = ((PasteCommand)super.command); super.run(); TGG layout = null; outer: for(Resource res :targetModel.eResource().getResourceSet().getResources()){ for (EObject obj : res.getContents()){ if (obj instanceof TGG){ layout = (TGG) obj; // System.out.println("set TGG for layout"); break outer; } } } if (layout == null) return; Collection<EObject> layoutElements = command.getFailedPastedElements(); for (EObject eObject : layoutElements) { // if (eObject instanceof GraphLayout) { // for (Iterator<GraphLayout> iterator = layout.getGraphlayouts().iterator(); iterator.hasNext();) { // GraphLayout graphLayout = iterator.next(); // if (graphLayout.getGraph().equals(((GraphLayout) eObject).getGraph())){ // if ((graphLayout.isIsSC() && ((GraphLayout) eObject).isIsSC()) // || (!graphLayout.isIsSC() && !((GraphLayout) eObject).isIsSC())) { // graphLayout.setDividerX(((GraphLayout) eObject).getDividerX()); // graphLayout.setMaxY(((GraphLayout) eObject).getMaxY()); // } // } // } // } // node and edge layout (deprecated) information is no longer in tgg model, but already in henshin model // if (eObject instanceof NodeLayout){ // for (Iterator<NodeLayout> iterator = layout.getNodelayouts().iterator(); iterator // .hasNext();) { // NodeLayout nodeLayout = iterator.next(); // if (nodeLayout.getNode().equals(((NodeLayout) eObject).getNode())){ // nodeLayout.setRhsTranslated(((NodeLayout) eObject).getRhsTranslated()); // nodeLayout.setLhsTranslated(((NodeLayout) eObject).getLhsTranslated()); // // nodeLayout.setX(((NodeLayout) eObject).getX()); // nodeLayout.setY(((NodeLayout) eObject).getY()); // nodeLayout.setNew(((NodeLayout) eObject).isNew()); // // if (!nodeLayout.isNew()) { // nodeLayout.setLhsnode(((NodeLayout) eObject).getLhsnode()); // } // } // } // } // // if (eObject instanceof EdgeLayout) { // for (Iterator<EdgeLayout> iterator = layout.getEdgelayouts().iterator(); iterator // .hasNext();) { // EdgeLayout edgeLayout = iterator.next(); // System.out.println("hier"); // System.out.println(edgeLayout.getRhsedge() == null); // if (edgeLayout.getRhsedge() != null && edgeLayout.getRhsedge().equals(((EdgeLayout) eObject).getRhsedge())){ // edgeLayout.setNew(((EdgeLayout) eObject).isNew()); // if (((EdgeLayout) eObject).getLhsTranslated() != null) // edgeLayout.setLhsTranslated(((EdgeLayout) eObject).getLhsTranslated()); // if (((EdgeLayout) eObject).getRhsTranslated() != null) // edgeLayout.setRhsTranslated(((EdgeLayout) eObject).getRhsTranslated()); // if (!edgeLayout.isNew()) { // edgeLayout.setLhsedge(((EdgeLayout) eObject).getLhsedge()); // } // } // } // } } } public class PasteRuleCommand extends Command { private Module targetModel; private List<Rule> clipboardContents; /** * @param targetModel * @param clipboardContents */ public PasteRuleCommand(Module targetModel, List<Rule> clipboardContents) { this.targetModel=targetModel; this.clipboardContents=clipboardContents; } /* (non-Javadoc) * @see org.eclipse.gef.commands.Command#execute() */ @Override public void execute() { List<Rule> rules=new ArrayList<Rule>(); Iterator<Rule> iter = clipboardContents.iterator(); while(iter.hasNext()){ Rule rule= iter.next(); String newName=ModelUtil.getNewChildDistinctName(targetModel, HenshinPackage.MODULE__UNITS, "Copy_", "_"+rule.getName()); rule.setName(newName); rules.add(rule); } targetModel.getUnits().addAll(rules); } /* (non-Javadoc) * @see org.eclipse.gef.commands.Command#undo() */ @Override public void undo() { for (Rule copy : clipboardContents) { targetModel.getUnits().remove(copy); } } /* (non-Javadoc) * @see org.eclipse.gef.commands.Command#redo() */ @Override public void redo() { for (Rule copy : clipboardContents) { targetModel.getUnits().add(copy); } } } }