/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.diagram.ui.editor; import java.util.Collections; import java.util.List; import org.eclipse.draw2d.FigureCanvas; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.dnd.AbstractTransferDropTargetListener; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.Transfer; import org.teiid.designer.diagram.ui.part.DropEditPart; import org.teiid.designer.ui.util.EObjectTransfer; /** * DiagramDropTargetAdapter * * @since 8.0 */ public class DiagramDropTargetAdapter extends AbstractTransferDropTargetListener { private EditPart currentEditPart = null; /** * Construct an instance of DiagramDropTargetAdapter. * * @param domain * @param viewer */ public DiagramDropTargetAdapter( EditPartViewer viewer ) { super(viewer); } /** * @see org.eclipse.jface.util.TransferDropTargetListener#getTransfer() * @since 4.3 */ @Override public Transfer getTransfer() { return EObjectTransfer.getInstance(); } /** * @see org.eclipse.jface.util.TransferDropTargetListener#isEnabled(org.eclipse.swt.dnd.DropTargetEvent) * @since 4.3 */ @Override public boolean isEnabled( DropTargetEvent event ) { return true; } private List getEventEObjects( DropTargetEvent event ) { Transfer[] transfers = ((DropTarget)event.getSource()).getTransfer(); for (int i = 0; i < transfers.length; i++) { if (transfers[i] instanceof EObjectTransfer) { EObjectTransfer transfer = (EObjectTransfer)transfers[i]; if (transfer.getObject() != null) return (List)transfer.getObject(); } } return Collections.EMPTY_LIST; } /* (non-Javadoc) * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent) */ @Override public void drop( DropTargetEvent event ) { event.detail = DND.DROP_COPY; updateTargetEditPart(); List dropList = getEventEObjects(event); if (!dropList.isEmpty()) { ((DropEditPart)getTargetEditPart()).drop(getCurrentAbsolutePoint(), dropList); } } /* (non-Javadoc) * @see org.eclipse.swt.dnd.DropTargetListener#dragOver(org.eclipse.swt.dnd.DropTargetEvent) */ @Override public void dragOver( DropTargetEvent event ) { boolean allowsDrop = false; setCurrentEditPart(); List dropList = getEventEObjects(event); if (currentEditPart != null && !dropList.isEmpty()) { if (currentEditPart instanceof DropEditPart) { ((DropEditPart)currentEditPart).setLastHoverPoint(getCurrentAbsolutePoint()); allowsDrop = ((DropEditPart)currentEditPart).allowsDrop(currentEditPart, dropList); } } if (!allowsDrop) event.detail = DND.DROP_NONE; else event.detail = DND.DROP_COPY; super.dragOver(event); } /** */ protected void helper( DropTargetEvent theEvent ) { // System.out.println(" DiagramDropTargetAdapter.helper() Called"); } private Point getCurrentAbsolutePoint() { FigureCanvas canvas = (FigureCanvas)getViewer().getControl(); Point newPoint = new Point(getDropLocation()); newPoint.x += canvas.getViewport().getViewLocation().x; newPoint.y += canvas.getViewport().getViewLocation().y; return newPoint; } /** * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#updateTargetRequest() * @since 4.2 */ @Override protected void updateTargetRequest() { updateTargetEditPart(); getTargetRequest().setType(RequestConstants.REQ_ADD); } /** * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest() * @since 4.2 */ @Override protected Request createTargetRequest() { Request req = new Request(); req.setType(RequestConstants.REQ_ADD); return req; } private void setCurrentEditPart() { currentEditPart = getViewer().findObjectAtExcluding(getDropLocation(), getExclusionSet(), new EditPartViewer.Conditional() { @Override public boolean evaluate( EditPart editpart ) { return editpart.getTargetEditPart(proxyGetTargetRequest()) != null; } }); } Request proxyGetTargetRequest() { return getTargetRequest(); } }