/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.gef.dnd;
import org.eclipse.swt.dnd.DND;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.Request;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gef.requests.CreationFactory;
/**
* Performs a native Drop using the {@link TemplateTransfer}. The Drop is performed by
* using a {@link CreateRequest} to obtain a <code>Command</code> from the targeted
* <code>EditPart</code>.
* <P>
* This class is <code>abstract</code>. Subclasses are responsible for providing the
* appropriate <code>Factory</code> object based on the template that is being dragged.
* @since 2.1
* @author Eric Bordeau
*/
public class TemplateTransferDropTargetListener
extends AbstractTransferDropTargetListener
{
/**
* Constructs a listener on the specified viewer.
* @param viewer the EditPartViewer
*/
public TemplateTransferDropTargetListener(EditPartViewer viewer) {
super(viewer, TemplateTransfer.getInstance());
}
/**
* @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
*/
protected Request createTargetRequest() {
//Look at the data on templatetransfer.
//Create factory
CreateRequest request = new CreateRequest();
request.setFactory(getFactory(TemplateTransfer.getInstance().getTemplate()));
return request;
}
/**
* A helper method that casts the target Request to a CreateRequest.
* @return CreateRequest
*/
protected final CreateRequest getCreateRequest() {
return ((CreateRequest)getTargetRequest());
}
/**
* Returns the appropriate Factory object to be used for the specified template. This
* Factory is used on the CreateRequest that is sent to the target EditPart.
* @param template the template Object
* @return a Factory
*/
protected CreationFactory getFactory(Object template) {
if (template instanceof CreationFactory)
return ((CreationFactory)template);
else
return null;
}
/**
* The purpose of a template is to be copied. Therefore, the drop operation can't be
* anything but <code>DND.DROP_COPY</code>.
* @see AbstractTransferDropTargetListener#handleDragOperationChanged()
*/
protected void handleDragOperationChanged() {
getCurrentEvent().detail = DND.DROP_COPY;
super.handleDragOperationChanged();
}
/**
* The purpose of a template is to be copied. Therefore, the Drop operation is set to
* <code>DND.DROP_COPY</code> by default.
* @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#handleDragOver()
*/
protected void handleDragOver() {
getCurrentEvent().detail = DND.DROP_COPY;
getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
super.handleDragOver();
}
/**
* Overridden to select the created object.
* @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#handleDrop()
*/
protected void handleDrop() {
super.handleDrop();
selectAddedObject();
}
private void selectAddedObject() {
Object model = getCreateRequest().getNewObject();
if (model == null)
return;
EditPartViewer viewer = getViewer();
viewer.getControl().forceFocus();
Object editpart = viewer.getEditPartRegistry().get(model);
if (editpart instanceof EditPart) {
//Force a layout first.
getViewer().flush();
viewer.select((EditPart)editpart);
}
}
/**
* Assumes that the target request is a {@link CreateRequest}.
*/
protected void updateTargetRequest() {
CreateRequest request = getCreateRequest();
request.setLocation(getDropLocation());
}
}