1 /*******************************************************************************
\r
2 * Copyright (c) 2007- VTT Technical Research Centre of Finland.
\r
3 * All rights reserved. This program and the accompanying materials
\r
4 * are made available under the terms of the Eclipse Public License v1.0
\r
5 * which accompanies this distribution, and is available at
\r
6 * http://www.eclipse.org/legal/epl-v10.html
\r
9 * VTT Technical Research Centre of Finland - initial API and implementation
\r
10 *******************************************************************************/
\r
11 package org.simantics.proconf.g3d.dnd;
\r
13 import java.util.ArrayList;
\r
14 import java.util.List;
\r
16 import org.eclipse.swt.dnd.DND;
\r
17 import org.eclipse.swt.dnd.DropTarget;
\r
18 import org.eclipse.swt.dnd.DropTargetEvent;
\r
19 import org.eclipse.swt.dnd.DropTargetListener;
\r
20 import org.eclipse.swt.dnd.TextTransfer;
\r
21 import org.eclipse.swt.dnd.Transfer;
\r
22 import org.eclipse.swt.dnd.TransferData;
\r
23 import org.eclipse.swt.graphics.Point;
\r
24 import org.eclipse.swt.widgets.Control;
\r
25 import org.simantics.db.Resource;
\r
26 import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;
\r
27 import org.simantics.proconf.g3d.common.StructuredResourceSelection;
\r
28 import org.simantics.proconf.ui.dnd.ResourceReferenceTransfer;
\r
30 public class ShapeDropTarget implements DropTargetListener{
\r
31 ThreeDimensionalEditorBase editor;
\r
32 List<DropListener> listeners;
\r
33 final Control control;
\r
34 private DropTarget target;
\r
36 public ShapeDropTarget(ThreeDimensionalEditorBase editor) {
\r
37 this.editor = editor;
\r
38 listeners = new ArrayList<DropListener>();
\r
39 this.control = editor.getRenderingComposite();
\r
41 target = new DropTarget(control, DND.DROP_LINK);
\r
42 target.setTransfer(new Transfer[] { ResourceReferenceTransfer.getInstance() });
\r
43 target.addDropListener(this);
\r
46 public void addDropListener(DropListener listener) {
\r
47 listeners.add(listener);
\r
50 public void removeDropListener(DropListener listener) {
\r
51 listeners.remove(listener);
\r
55 public void dragEnter(DropTargetEvent event) {
\r
56 event.detail = DND.DROP_LINK;
\r
60 public void dragOperationChanged(DropTargetEvent event) {
\r
63 public void dropAccept(DropTargetEvent event) {
\r
66 public void dragLeave(DropTargetEvent event) {
\r
71 public void dragOver(DropTargetEvent event) {
\r
72 // FIXME : a hack to get the actual data (probably works only in Windows)
\r
73 TransferData data = event.currentDataType;
\r
74 if(!TextTransfer.getInstance().isSupportedType(data))
\r
76 Object o = TextTransfer.getInstance().nativeToJava(data);
\r
78 Point p = getLocalCoords(event);
\r
79 editor.getInputProvider().setMouseMoved(true);
\r
80 editor.getInputProvider().setMouseX(p.x);
\r
81 editor.getInputProvider().setMouseY(p.y);
\r
83 StructuredResourceSelection sel = editor.getSelectionAdapter().getHighlightSelection();
\r
86 Resource ids[] = parseEventData(event);
\r
87 for (DropListener l : listeners) {
\r
88 if(l.acceptDrop(sel, ids)) {
\r
89 event.detail = DND.DROP_LINK;
\r
93 event.detail = DND.DROP_NONE;
\r
97 public void drop(DropTargetEvent event) {
\r
98 StructuredResourceSelection sel = editor.getSelectionAdapter().getHighlightSelection();
\r
99 Resource ids[] = parseEventData(event);
\r
100 for (DropListener l : listeners) {
\r
101 if(l.acceptDrop(sel, ids)) {
\r
102 l.doDrop(sel, ids);
\r
108 protected Point getLocalCoords(DropTargetEvent event) {
\r
109 return editor.getRenderingComposite().toControl(event.x, event.y);
\r
112 public void dispose()
\r
114 target.removeDropListener(this);
\r
118 private Resource[] parseEventData(DropTargetEvent event) {
\r
119 if (ResourceReferenceTransfer.getInstance().isSupportedType(event.currentDataType) && (event.data instanceof Resource[])) {
\r
120 return (Resource[]) event.data;
\r