blob: ee31a20760c0a106c0e797fc3acebbd5ba5a62f2 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2012 itemis and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* Contributors:
* itemis - Initial API and implementation
*
* </copyright>
*/
package org.eclipse.sphinx.graphiti.workspace.ui.draganddrop;
import java.util.Map;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PrecisionRectangle;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.UnexecutableCommand;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.ui.editor.DiagramEditor;
import org.eclipse.graphiti.ui.internal.dnd.ObjectsTransferDropTargetListener;
import org.eclipse.graphiti.ui.platform.IConfigurationProvider;
import org.eclipse.jface.viewers.ISelection;
/**
* A customized listener for managing drag & drop feature.
*/
@SuppressWarnings("restriction")
public class BasicGraphitiObjectTransferDropTargetListener extends ObjectsTransferDropTargetListener {
protected static final Dimension UNSPECIFIED_SIZE = new Dimension();
private static final Dimension PREFERRED_SIZE = new Dimension(-1, -1);
private DiagramEditor diagramEditor;
private IConfigurationProvider configurationProvider;
/**
* This instanciates the constructor
*
* @param viewer
* @param diagramEditor
* @param configurationProvider
*/
public BasicGraphitiObjectTransferDropTargetListener(EditPartViewer viewer, DiagramEditor diagramEditor,
IConfigurationProvider configurationProvider) {
super(viewer);
this.diagramEditor = diagramEditor;
this.configurationProvider = configurationProvider;
}
@Override
protected Command getCommand() {
Request request = getTargetRequest();
if (request instanceof CreateRequest) {
CreateRequest createRequest = (CreateRequest) request;
return getCreateCommand(createRequest);
}
return null;
}
protected Command getCreateCommand(CreateRequest request) {
Command cmd = UnexecutableCommand.INSTANCE;
// Retrieve the parent object from the diagram input
EObject parentObject = (EObject) diagramEditor.getAdapter(Diagram.class);
if (!(parentObject instanceof ContainerShape) || parentObject == null) {
return cmd;
}
// Retrieve created object
Object createdObject = request.getNewObject();
// determine constraint
org.eclipse.draw2d.geometry.Rectangle rectangle = null;
if (request.getLocation() != null) {
rectangle = getConstraintFor(request);
}
if (request.getNewObjectType() == ISelection.class) {
cmd = new BasicGraphitiAddModelObjectCommand(configurationProvider, (ContainerShape) parentObject, (ISelection) createdObject, rectangle);
// cmd = new AddModelObjectCommand(configurationProvider, (ContainerShape) parentObject, (ISelection)
// createdObject, rectangle);
}
return cmd;
}
private org.eclipse.draw2d.geometry.Rectangle getConstraintFor(CreateRequest request) {
PrecisionRectangle locationAndSize = null;
if (request.getSize() == null || request.getSize().isEmpty()) {
locationAndSize = new PrecisionRectangle(request.getLocation(), UNSPECIFIED_SIZE);
} else {
locationAndSize = new PrecisionRectangle(request.getLocation(), request.getSize());
}
IFigure figure = getLayoutContainer();
figure.translateToRelative(locationAndSize);
figure.translateFromParent(locationAndSize);
Point negatedLayoutOrigin = getLayoutOrigin().getNegated();
locationAndSize.performTranslate(negatedLayoutOrigin.x, negatedLayoutOrigin.y);
return getConstraintFor(request, null, locationAndSize);
}
private org.eclipse.draw2d.geometry.Rectangle getConstraintFor(Request request, GraphicalEditPart child,
org.eclipse.draw2d.geometry.Rectangle rectangle) {
if (UNSPECIFIED_SIZE.equals(rectangle.getSize())) {
return getConstraintFor(rectangle.getLocation());
}
return null;
}
private org.eclipse.draw2d.geometry.Rectangle getConstraintFor(Point p) {
return new org.eclipse.draw2d.geometry.Rectangle(p, PREFERRED_SIZE);
}
private Point getLayoutOrigin() {
return getLayoutContainer().getClientArea().getLocation();
}
private IFigure getLayoutContainer() {
Diagram diagram = (Diagram) diagramEditor.getAdapter(Diagram.class);
Map<?, ?> editPartRegistry = diagramEditor.getGraphicalViewer().getEditPartRegistry();
if (editPartRegistry != null) {
Object obj = editPartRegistry.get(diagram);
if (obj instanceof GraphicalEditPart) {
GraphicalEditPart ep = (GraphicalEditPart) obj;
return ep.getContentPane();
}
}
return null;
}
}