/******************************************************************************* * 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. *******************************************************************************/ /** * ClipboardEditPolicy.java * * Created 21.12.2011 - 16:11:11 */ package de.tub.tfs.henshin.editor.editparts; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.AbstractEditPolicy; import de.tub.tfs.henshin.editor.commands.SimpleAddEObjectCommand; import de.tub.tfs.henshin.editor.editparts.PasteRequest.IPasteRule; /** * @author nam * */ public class ClipboardEditPolicy extends AbstractEditPolicy { /** * @param clipBoard */ public void performCopy(CopyRequest req) { req.getContents().add(EcoreUtil.copy((EObject) getHost().getModel())); } /* * (non-Javadoc) * * @see * org.eclipse.gef.editpolicies.AbstractEditPolicy#understandsRequest(org * .eclipse.gef.Request) */ @Override public boolean understandsRequest(Request req) { Object type = req.getType(); return (HenshinRequests.REQ_COPY.equals(type) && canCopy()) || (HenshinRequests.REQ_PASTE.equals(type) && canPaste(((PasteRequest) req) .getPastedObject())); } /* * (non-Javadoc) * * @see * org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse * .gef.Request) */ @Override public Command getCommand(Request request) { if (request instanceof PasteRequest) { return createPasteCommand((PasteRequest) request); } return super.getCommand(request); } /** * @param req * @return */ public EObject getPasteTarget(PasteRequest req) { return (EObject) getHost().getModel(); } /** * @param req * @return */ protected EStructuralFeature getPasteFeature(PasteRequest req) { Object o = req.getPastedObject(); if (o instanceof EObject) { EObject model = (EObject) getHost().getModel(); for (EStructuralFeature f : model.eClass() .getEAllStructuralFeatures()) { if (f.getEType().isInstance(o)) { return f; } } // for convenient, tries to paste into container. if (model.eContainer() != null) { for (EStructuralFeature f : model.eContainer().eClass() .getEAllStructuralFeatures()) { if (f.getEType().isInstance(o)) { return f; } } } // tries to paste into target EObject target = getPasteTarget(req); if (target != null) { for (EStructuralFeature f : target.eClass() .getEAllStructuralFeatures()) { if (f.getEType().isInstance(o)) { return f; } } } } return null; } /** * @param o * @return */ protected boolean canPaste(Object o) { return true; } /** * @return */ protected boolean canCopy() { return true; } /** * @param req * @return */ private Command createPasteCommand(PasteRequest req) { EObject toPaste = (EObject) req.getPastedObject(); IPasteRule pasteRule = req.getPasteRule(toPaste.eClass()); if (pasteRule != null) { pasteRule.preparePaste(toPaste, getHost()); } return new SimpleAddEObjectCommand<EObject, EObject>(toPaste, getPasteFeature(req), getPasteTarget(req)); } }