/*******************************************************************************
* Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others.
* 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
*******************************************************************************/
package de.itemis.gmf.runtime.edit.policy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.commands.Command;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DiagramDragDropEditPolicy;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest;
import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
import org.eclipse.gmf.runtime.notation.Node;
public class GenericDiagramDropEditPolicy extends DiagramDragDropEditPolicy {
DiagramEditPart getDiagramEditPart() {
return (DiagramEditPart) getHost();
}
@SuppressWarnings("unchecked")
public Command getDropObjectsCommand(DropObjectsRequest dropRequest) {
List viewDescriptors = new ArrayList();
EObject hostDomainElement = ((IGraphicalEditPart) getHost())
.resolveSemanticElement();
for (Iterator it = dropRequest.getObjects().iterator(); it.hasNext();) {
Object nextObject = it.next();
EObject eObject = reloadAsEObjectInEditingDomain(nextObject);
if (eObject != null) {
if (eObject.eContainer() == hostDomainElement) {
CreateViewRequest.ViewDescriptor viewDescriptor = new CreateViewRequest.ViewDescriptor(
new EObjectAdapter(eObject), Node.class, null,
getDiagramEditPart().getDiagramPreferencesHint());
viewDescriptors.add(viewDescriptor);
}
}
}
Command command = createViewsAndArrangeCommand(dropRequest,
viewDescriptors);
return command;
}
public EObject reloadAsEObjectInEditingDomain(Object object) {
if (!(object instanceof EObject)) {
return null;
}
ResourceSet resourceSet = getEditingDomain().getResourceSet();
URI proxyURI = EcoreUtil.getURI((EObject) object);
if (proxyURI != null) {
EObject eObjectInEditingDomain = resourceSet.getEObject(proxyURI,
true);
return eObjectInEditingDomain;
}
return null;
}
private TransactionalEditingDomain getEditingDomain() {
return ((IGraphicalEditPart) getHost())
.getEditingDomain();
}
}