]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/src/org/simantics/proconf/g3d/dnd/ShapeDropTarget.java
git-svn-id: https://www.simantics.org/svn/simantics/3d/trunk@22279 ac1ea38d-2e2b...
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / proconf / g3d / dnd / ShapeDropTarget.java
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
7  *\r
8  * Contributors:\r
9  *     VTT Technical Research Centre of Finland - initial API and implementation\r
10  *******************************************************************************/\r
11 package org.simantics.proconf.g3d.dnd;\r
12 \r
13 import java.util.ArrayList;\r
14 import java.util.List;\r
15 \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
29 \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
35     \r
36         public ShapeDropTarget(ThreeDimensionalEditorBase editor) {\r
37                 this.editor = editor;\r
38                 listeners = new ArrayList<DropListener>();\r
39                 this.control = editor.getRenderingComposite();\r
40         \r
41         target = new DropTarget(control, DND.DROP_LINK);\r
42         target.setTransfer(new Transfer[] { ResourceReferenceTransfer.getInstance() });\r
43         target.addDropListener(this);  \r
44         }\r
45         \r
46         public void addDropListener(DropListener listener) {\r
47                 listeners.add(listener);\r
48         }\r
49         \r
50         public void removeDropListener(DropListener listener) {\r
51                 listeners.remove(listener);\r
52         }\r
53         \r
54         @Override\r
55         public void dragEnter(DropTargetEvent event) {\r
56                 event.detail = DND.DROP_LINK;\r
57                 dragOver(event);\r
58         }\r
59         \r
60         public void dragOperationChanged(DropTargetEvent event) {\r
61     }\r
62         \r
63         public void dropAccept(DropTargetEvent event) {\r
64     }\r
65         \r
66         public void dragLeave(DropTargetEvent event) {\r
67     }\r
68 \r
69         \r
70         @Override\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
75                         return;\r
76                 Object o = TextTransfer.getInstance().nativeToJava(data);\r
77                 \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
82                 editor.run();\r
83                 StructuredResourceSelection sel = editor.getSelectionAdapter().getHighlightSelection();\r
84                 \r
85                 event.data = o;\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
90                                 return;\r
91                         }\r
92                 }\r
93                 event.detail = DND.DROP_NONE;           \r
94         }\r
95         \r
96         @Override\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
103                                 return;\r
104                         }\r
105                 }\r
106         }\r
107         \r
108         protected Point getLocalCoords(DropTargetEvent event) {\r
109                 return editor.getRenderingComposite().toControl(event.x, event.y);\r
110         }\r
111         \r
112         public void dispose()\r
113     {\r
114         target.removeDropListener(this);\r
115         target = null;\r
116     }\r
117         \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
121         }\r
122         return null;\r
123     }\r
124 }\r