]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/participant/PopulateSelectionDropParticipant.java
605cef99447f8ebc9737cbb020e6e6d6aecddc92
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / participant / PopulateSelectionDropParticipant.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.participant;\r
13 \r
14 import java.awt.datatransfer.Transferable;\r
15 import java.awt.datatransfer.UnsupportedFlavorException;\r
16 import java.awt.dnd.DnDConstants;\r
17 import java.awt.dnd.DropTargetDragEvent;\r
18 import java.awt.dnd.DropTargetDropEvent;\r
19 import java.awt.dnd.DropTargetEvent;\r
20 import java.awt.geom.Point2D;\r
21 import java.io.IOException;\r
22 import java.util.List;\r
23 \r
24 import org.eclipse.jface.viewers.IStructuredSelection;\r
25 import org.simantics.db.Session;\r
26 import org.simantics.db.exception.DatabaseException;\r
27 import org.simantics.diagram.Logger;\r
28 import org.simantics.diagram.adapter.GraphToDiagramSynchronizer;\r
29 import org.simantics.g2d.diagram.DiagramHints;\r
30 import org.simantics.g2d.diagram.DiagramMutator;\r
31 import org.simantics.g2d.diagram.DiagramUtils;\r
32 import org.simantics.g2d.diagram.IDiagram;\r
33 import org.simantics.g2d.diagram.participant.AbstractDiagramParticipant;\r
34 import org.simantics.g2d.dnd.DnDHints;\r
35 import org.simantics.g2d.dnd.ElementClassDragItem;\r
36 import org.simantics.g2d.dnd.IDnDContext;\r
37 import org.simantics.g2d.dnd.IDragItem;\r
38 import org.simantics.g2d.dnd.IDropTargetParticipant;\r
39 import org.simantics.g2d.element.ElementClass;\r
40 import org.simantics.g2d.element.ElementUtils;\r
41 import org.simantics.g2d.element.IElement;\r
42 import org.simantics.scenegraph.g2d.snap.ISnapAdvisor;\r
43 import org.simantics.ui.dnd.LocalObjectTransfer;\r
44 import org.simantics.ui.dnd.LocalObjectTransferable;\r
45 import org.simantics.utils.datastructures.Callback;\r
46 import org.simantics.utils.logging.TimeLogger;\r
47 \r
48 abstract public class PopulateSelectionDropParticipant extends AbstractDiagramParticipant implements IDropTargetParticipant {\r
49 \r
50         public abstract List<ElementClassDragItem> getElements(Session session, IStructuredSelection selection) throws DatabaseException;\r
51         \r
52         protected GraphToDiagramSynchronizer synchronizer;\r
53 \r
54         public PopulateSelectionDropParticipant(GraphToDiagramSynchronizer synchronizer) {\r
55                 this.synchronizer = synchronizer;\r
56         }\r
57 \r
58         @Override\r
59         public void dragEnter(DropTargetDragEvent dtde, final IDnDContext dp) {\r
60 \r
61                 Transferable tr = dtde.getTransferable();\r
62 \r
63                 if (tr.isDataFlavorSupported(LocalObjectTransferable.FLAVOR)) {\r
64 \r
65                         Session session = synchronizer.getSession();\r
66 \r
67                         // System.out.println("joo");\r
68                         Object obj = null;\r
69 \r
70                         // This must be done to have SWT transfer set the source data\r
71                         try {\r
72                                 \r
73                                 obj = tr.getTransferData(LocalObjectTransferable.FLAVOR);\r
74                                 //System.out.println("GOT FROM AWT: " + obj);\r
75 \r
76                                 // Check SWT\r
77                                 if (!(obj instanceof IStructuredSelection)) {\r
78                                         obj = LocalObjectTransfer.getTransfer().getObject();\r
79                                         //System.out.println("GOT FROM SWT: " + obj);\r
80                                 }\r
81 \r
82                                 if (obj instanceof IStructuredSelection) {\r
83 \r
84                                         IStructuredSelection sel = (IStructuredSelection) obj;\r
85                                         if (!sel.isEmpty()) {\r
86                                                 \r
87                                                 List<ElementClassDragItem> items = getElements(session, sel);\r
88 \r
89                                                 for(ElementClassDragItem item : items) {\r
90                                                         dp.add(item);\r
91                                                 }\r
92 \r
93                                                 dp.getHints().setHint(DnDHints.KEY_DND_GRID_COLUMNS, Integer.valueOf(1));\r
94 \r
95                                         }\r
96 \r
97                                 }\r
98 \r
99                         } catch (UnsupportedFlavorException e) {\r
100                                 Logger.defaultLogError(e);\r
101                         } catch (IOException e) {\r
102                                 Logger.defaultLogError(e);\r
103                         } catch (DatabaseException e) {\r
104                                 Logger.defaultLogError(e);\r
105                         }\r
106 \r
107                 }\r
108 \r
109                 dtde.acceptDrag(DnDConstants.ACTION_COPY);\r
110 \r
111         }\r
112 \r
113         @Override\r
114         public void drop(DropTargetDropEvent dtde, final IDnDContext dp) {\r
115             TimeLogger.resetTimeAndLog(getClass(), "drop");\r
116             \r
117         final IDiagram d = getHint(DiagramHints.KEY_DIAGRAM);\r
118         if (d == null)\r
119             return;\r
120 \r
121         DiagramUtils.mutateDiagram(d, m -> {\r
122             IDragItem items[] = dp.toArray();\r
123 \r
124             for (IDragItem i : items) {\r
125                 if (!(i instanceof ElementClassDragItem))\r
126                     continue;\r
127 \r
128                 ElementClassDragItem res = (ElementClassDragItem) i;\r
129                 ElementClass ec = res.getElementClass();\r
130 \r
131                 Point2D pos = dp.getItemPosition(i);\r
132                 // System.out.println(pos);\r
133                 assert (pos != null);\r
134 \r
135                 IElement element = m.newElement(ec);\r
136                 element.setHints(res.getHintContext().getHints());\r
137 \r
138                 ISnapAdvisor snapAdvisor = getContext().getHintStack().getHint(DiagramHints.SNAP_ADVISOR);\r
139                 if(snapAdvisor != null)\r
140                     snapAdvisor.snap(pos);\r
141                 ElementUtils.setPos(element, pos);\r
142 \r
143                 // Remove only the drag items we've processed.\r
144                 dp.remove(i);\r
145             }\r
146         });\r
147 \r
148         synchronizer.getCanvasContext().getContentContext().setDirty();\r
149                 \r
150         }\r
151 \r
152         @Override\r
153         public void dragOver(DropTargetDragEvent dtde, IDnDContext dp) {\r
154         }\r
155         \r
156         @Override\r
157         public void dragExit(DropTargetEvent dte, IDnDContext dp) {\r
158         }\r
159         \r
160         @Override\r
161         public void dropActionChanged(DropTargetDragEvent dtde, IDnDContext dp) {\r
162         }\r
163 \r
164         @Override\r
165         public int getAllowedOps() {\r
166                 return 0;\r
167         }\r
168         \r
169     @Override\r
170     public double getPriority() {\r
171         return 9.1;\r
172     }\r
173         \r
174 }