/******************************************************************************* * Copyright (c) 2007- VTT Technical Research Centre of Finland. * 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: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.proconf.g3d.dnd; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.DropTargetListener; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Control; import org.simantics.db.Resource; import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase; import org.simantics.proconf.g3d.common.StructuredResourceSelection; import org.simantics.proconf.ui.dnd.ResourceReferenceTransfer; public class ShapeDropTarget implements DropTargetListener{ ThreeDimensionalEditorBase editor; List listeners; final Control control; private DropTarget target; public ShapeDropTarget(ThreeDimensionalEditorBase editor) { this.editor = editor; listeners = new ArrayList(); this.control = editor.getRenderingComposite(); target = new DropTarget(control, DND.DROP_LINK); target.setTransfer(new Transfer[] { ResourceReferenceTransfer.getInstance() }); target.addDropListener(this); } public void addDropListener(DropListener listener) { listeners.add(listener); } public void removeDropListener(DropListener listener) { listeners.remove(listener); } @Override public void dragEnter(DropTargetEvent event) { event.detail = DND.DROP_LINK; dragOver(event); } public void dragOperationChanged(DropTargetEvent event) { } public void dropAccept(DropTargetEvent event) { } public void dragLeave(DropTargetEvent event) { } @Override public void dragOver(DropTargetEvent event) { // FIXME : a hack to get the actual data (probably works only in Windows) TransferData data = event.currentDataType; if(!TextTransfer.getInstance().isSupportedType(data)) return; Object o = TextTransfer.getInstance().nativeToJava(data); Point p = getLocalCoords(event); editor.getInputProvider().setMouseMoved(true); editor.getInputProvider().setMouseX(p.x); editor.getInputProvider().setMouseY(p.y); editor.run(); StructuredResourceSelection sel = editor.getSelectionAdapter().getHighlightSelection(); event.data = o; Resource ids[] = parseEventData(event); for (DropListener l : listeners) { if(l.acceptDrop(sel, ids)) { event.detail = DND.DROP_LINK; return; } } event.detail = DND.DROP_NONE; } @Override public void drop(DropTargetEvent event) { StructuredResourceSelection sel = editor.getSelectionAdapter().getHighlightSelection(); Resource ids[] = parseEventData(event); for (DropListener l : listeners) { if(l.acceptDrop(sel, ids)) { l.doDrop(sel, ids); return; } } } protected Point getLocalCoords(DropTargetEvent event) { return editor.getRenderingComposite().toControl(event.x, event.y); } public void dispose() { target.removeDropListener(this); target = null; } private Resource[] parseEventData(DropTargetEvent event) { if (ResourceReferenceTransfer.getInstance().isSupportedType(event.currentDataType) && (event.data instanceof Resource[])) { return (Resource[]) event.data; } return null; } }