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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.participant;
\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
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
48 abstract public class PopulateSelectionDropParticipant extends AbstractDiagramParticipant implements IDropTargetParticipant {
\r
50 public abstract List<ElementClassDragItem> getElements(Session session, IStructuredSelection selection) throws DatabaseException;
\r
52 protected GraphToDiagramSynchronizer synchronizer;
\r
54 public PopulateSelectionDropParticipant(GraphToDiagramSynchronizer synchronizer) {
\r
55 this.synchronizer = synchronizer;
\r
59 public void dragEnter(DropTargetDragEvent dtde, final IDnDContext dp) {
\r
61 Transferable tr = dtde.getTransferable();
\r
63 if (tr.isDataFlavorSupported(LocalObjectTransferable.FLAVOR)) {
\r
65 Session session = synchronizer.getSession();
\r
67 // System.out.println("joo");
\r
70 // This must be done to have SWT transfer set the source data
\r
73 obj = tr.getTransferData(LocalObjectTransferable.FLAVOR);
\r
74 //System.out.println("GOT FROM AWT: " + obj);
\r
77 if (!(obj instanceof IStructuredSelection)) {
\r
78 obj = LocalObjectTransfer.getTransfer().getObject();
\r
79 //System.out.println("GOT FROM SWT: " + obj);
\r
82 if (obj instanceof IStructuredSelection) {
\r
84 IStructuredSelection sel = (IStructuredSelection) obj;
\r
85 if (!sel.isEmpty()) {
\r
87 List<ElementClassDragItem> items = getElements(session, sel);
\r
89 for(ElementClassDragItem item : items) {
\r
93 dp.getHints().setHint(DnDHints.KEY_DND_GRID_COLUMNS, Integer.valueOf(1));
\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
109 dtde.acceptDrag(DnDConstants.ACTION_COPY);
\r
114 public void drop(DropTargetDropEvent dtde, final IDnDContext dp) {
\r
115 TimeLogger.resetTimeAndLog(getClass(), "drop");
\r
117 final IDiagram d = getHint(DiagramHints.KEY_DIAGRAM);
\r
121 DiagramUtils.mutateDiagram(d, m -> {
\r
122 IDragItem items[] = dp.toArray();
\r
124 for (IDragItem i : items) {
\r
125 if (!(i instanceof ElementClassDragItem))
\r
128 ElementClassDragItem res = (ElementClassDragItem) i;
\r
129 ElementClass ec = res.getElementClass();
\r
131 Point2D pos = dp.getItemPosition(i);
\r
132 // System.out.println(pos);
\r
133 assert (pos != null);
\r
135 IElement element = m.newElement(ec);
\r
136 element.setHints(res.getHintContext().getHints());
\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
143 // Remove only the drag items we've processed.
\r
148 synchronizer.getCanvasContext().getContentContext().setDirty();
\r
153 public void dragOver(DropTargetDragEvent dtde, IDnDContext dp) {
\r
157 public void dragExit(DropTargetEvent dte, IDnDContext dp) {
\r
161 public void dropActionChanged(DropTargetDragEvent dtde, IDnDContext dp) {
\r
165 public int getAllowedOps() {
\r
170 public double getPriority() {
\r