-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.diagram.participant;\r
-\r
-import java.awt.datatransfer.Transferable;\r
-import java.awt.datatransfer.UnsupportedFlavorException;\r
-import java.awt.dnd.DnDConstants;\r
-import java.awt.dnd.DropTargetDragEvent;\r
-import java.awt.dnd.DropTargetDropEvent;\r
-import java.awt.dnd.DropTargetEvent;\r
-import java.awt.geom.Point2D;\r
-import java.io.IOException;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.diagram.Logger;\r
-import org.simantics.diagram.adapter.GraphToDiagramSynchronizer;\r
-import org.simantics.g2d.diagram.DiagramHints;\r
-import org.simantics.g2d.diagram.DiagramMutator;\r
-import org.simantics.g2d.diagram.DiagramUtils;\r
-import org.simantics.g2d.diagram.IDiagram;\r
-import org.simantics.g2d.diagram.participant.AbstractDiagramParticipant;\r
-import org.simantics.g2d.dnd.DnDHints;\r
-import org.simantics.g2d.dnd.ElementClassDragItem;\r
-import org.simantics.g2d.dnd.IDnDContext;\r
-import org.simantics.g2d.dnd.IDragItem;\r
-import org.simantics.g2d.dnd.IDropTargetParticipant;\r
-import org.simantics.g2d.element.ElementClass;\r
-import org.simantics.g2d.element.ElementUtils;\r
-import org.simantics.g2d.element.IElement;\r
-import org.simantics.scenegraph.g2d.snap.ISnapAdvisor;\r
-import org.simantics.ui.dnd.LocalObjectTransfer;\r
-import org.simantics.ui.dnd.LocalObjectTransferable;\r
-import org.simantics.utils.datastructures.Callback;\r
-import org.simantics.utils.logging.TimeLogger;\r
-\r
-abstract public class PopulateSelectionDropParticipant extends AbstractDiagramParticipant implements IDropTargetParticipant {\r
-\r
- public abstract List<ElementClassDragItem> getElements(Session session, IStructuredSelection selection) throws DatabaseException;\r
- \r
- protected GraphToDiagramSynchronizer synchronizer;\r
-\r
- public PopulateSelectionDropParticipant(GraphToDiagramSynchronizer synchronizer) {\r
- this.synchronizer = synchronizer;\r
- }\r
-\r
- @Override\r
- public void dragEnter(DropTargetDragEvent dtde, final IDnDContext dp) {\r
-\r
- Transferable tr = dtde.getTransferable();\r
-\r
- if (tr.isDataFlavorSupported(LocalObjectTransferable.FLAVOR)) {\r
-\r
- Session session = synchronizer.getSession();\r
-\r
- // System.out.println("joo");\r
- Object obj = null;\r
-\r
- // This must be done to have SWT transfer set the source data\r
- try {\r
- \r
- obj = tr.getTransferData(LocalObjectTransferable.FLAVOR);\r
- //System.out.println("GOT FROM AWT: " + obj);\r
-\r
- // Check SWT\r
- if (!(obj instanceof IStructuredSelection)) {\r
- obj = LocalObjectTransfer.getTransfer().getObject();\r
- //System.out.println("GOT FROM SWT: " + obj);\r
- }\r
-\r
- if (obj instanceof IStructuredSelection) {\r
-\r
- IStructuredSelection sel = (IStructuredSelection) obj;\r
- if (!sel.isEmpty()) {\r
- \r
- List<ElementClassDragItem> items = getElements(session, sel);\r
-\r
- for(ElementClassDragItem item : items) {\r
- dp.add(item);\r
- }\r
-\r
- dp.getHints().setHint(DnDHints.KEY_DND_GRID_COLUMNS, Integer.valueOf(1));\r
-\r
- }\r
-\r
- }\r
-\r
- } catch (UnsupportedFlavorException e) {\r
- Logger.defaultLogError(e);\r
- } catch (IOException e) {\r
- Logger.defaultLogError(e);\r
- } catch (DatabaseException e) {\r
- Logger.defaultLogError(e);\r
- }\r
-\r
- }\r
-\r
- dtde.acceptDrag(DnDConstants.ACTION_COPY);\r
-\r
- }\r
-\r
- @Override\r
- public void drop(DropTargetDropEvent dtde, final IDnDContext dp) {\r
- TimeLogger.resetTimeAndLog(getClass(), "drop");\r
- \r
- final IDiagram d = getHint(DiagramHints.KEY_DIAGRAM);\r
- if (d == null)\r
- return;\r
-\r
- DiagramUtils.mutateDiagram(d, m -> {\r
- IDragItem items[] = dp.toArray();\r
-\r
- for (IDragItem i : items) {\r
- if (!(i instanceof ElementClassDragItem))\r
- continue;\r
-\r
- ElementClassDragItem res = (ElementClassDragItem) i;\r
- ElementClass ec = res.getElementClass();\r
-\r
- Point2D pos = dp.getItemPosition(i);\r
- // System.out.println(pos);\r
- assert (pos != null);\r
-\r
- IElement element = m.newElement(ec);\r
- element.setHints(res.getHintContext().getHints());\r
-\r
- ISnapAdvisor snapAdvisor = getContext().getHintStack().getHint(DiagramHints.SNAP_ADVISOR);\r
- if(snapAdvisor != null)\r
- snapAdvisor.snap(pos);\r
- ElementUtils.setPos(element, pos);\r
-\r
- // Remove only the drag items we've processed.\r
- dp.remove(i);\r
- }\r
- });\r
-\r
- synchronizer.getCanvasContext().getContentContext().setDirty();\r
- \r
- }\r
-\r
- @Override\r
- public void dragOver(DropTargetDragEvent dtde, IDnDContext dp) {\r
- }\r
- \r
- @Override\r
- public void dragExit(DropTargetEvent dte, IDnDContext dp) {\r
- }\r
- \r
- @Override\r
- public void dropActionChanged(DropTargetDragEvent dtde, IDnDContext dp) {\r
- }\r
-\r
- @Override\r
- public int getAllowedOps() {\r
- return 0;\r
- }\r
- \r
- @Override\r
- public double getPriority() {\r
- return 9.1;\r
- }\r
- \r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * 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.diagram.participant;
+
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.geom.Point2D;
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.simantics.db.Session;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.diagram.Logger;
+import org.simantics.diagram.adapter.GraphToDiagramSynchronizer;
+import org.simantics.g2d.diagram.DiagramHints;
+import org.simantics.g2d.diagram.DiagramMutator;
+import org.simantics.g2d.diagram.DiagramUtils;
+import org.simantics.g2d.diagram.IDiagram;
+import org.simantics.g2d.diagram.participant.AbstractDiagramParticipant;
+import org.simantics.g2d.dnd.DnDHints;
+import org.simantics.g2d.dnd.ElementClassDragItem;
+import org.simantics.g2d.dnd.IDnDContext;
+import org.simantics.g2d.dnd.IDragItem;
+import org.simantics.g2d.dnd.IDropTargetParticipant;
+import org.simantics.g2d.element.ElementClass;
+import org.simantics.g2d.element.ElementUtils;
+import org.simantics.g2d.element.IElement;
+import org.simantics.scenegraph.g2d.snap.ISnapAdvisor;
+import org.simantics.ui.dnd.LocalObjectTransfer;
+import org.simantics.ui.dnd.LocalObjectTransferable;
+import org.simantics.utils.datastructures.Callback;
+import org.simantics.utils.logging.TimeLogger;
+
+abstract public class PopulateSelectionDropParticipant extends AbstractDiagramParticipant implements IDropTargetParticipant {
+
+ public abstract List<ElementClassDragItem> getElements(Session session, IStructuredSelection selection) throws DatabaseException;
+
+ protected GraphToDiagramSynchronizer synchronizer;
+
+ public PopulateSelectionDropParticipant(GraphToDiagramSynchronizer synchronizer) {
+ this.synchronizer = synchronizer;
+ }
+
+ @Override
+ public void dragEnter(DropTargetDragEvent dtde, final IDnDContext dp) {
+
+ Transferable tr = dtde.getTransferable();
+
+ if (tr.isDataFlavorSupported(LocalObjectTransferable.FLAVOR)) {
+
+ Session session = synchronizer.getSession();
+
+ // System.out.println("joo");
+ Object obj = null;
+
+ // This must be done to have SWT transfer set the source data
+ try {
+
+ obj = tr.getTransferData(LocalObjectTransferable.FLAVOR);
+ //System.out.println("GOT FROM AWT: " + obj);
+
+ // Check SWT
+ if (!(obj instanceof IStructuredSelection)) {
+ obj = LocalObjectTransfer.getTransfer().getObject();
+ //System.out.println("GOT FROM SWT: " + obj);
+ }
+
+ if (obj instanceof IStructuredSelection) {
+
+ IStructuredSelection sel = (IStructuredSelection) obj;
+ if (!sel.isEmpty()) {
+
+ List<ElementClassDragItem> items = getElements(session, sel);
+
+ for(ElementClassDragItem item : items) {
+ dp.add(item);
+ }
+
+ dp.getHints().setHint(DnDHints.KEY_DND_GRID_COLUMNS, Integer.valueOf(1));
+
+ }
+
+ }
+
+ } catch (UnsupportedFlavorException e) {
+ Logger.defaultLogError(e);
+ } catch (IOException e) {
+ Logger.defaultLogError(e);
+ } catch (DatabaseException e) {
+ Logger.defaultLogError(e);
+ }
+
+ }
+
+ dtde.acceptDrag(DnDConstants.ACTION_COPY);
+
+ }
+
+ @Override
+ public void drop(DropTargetDropEvent dtde, final IDnDContext dp) {
+ TimeLogger.resetTimeAndLog(getClass(), "drop");
+
+ final IDiagram d = getHint(DiagramHints.KEY_DIAGRAM);
+ if (d == null)
+ return;
+
+ DiagramUtils.mutateDiagram(d, m -> {
+ IDragItem items[] = dp.toArray();
+
+ for (IDragItem i : items) {
+ if (!(i instanceof ElementClassDragItem))
+ continue;
+
+ ElementClassDragItem res = (ElementClassDragItem) i;
+ ElementClass ec = res.getElementClass();
+
+ Point2D pos = dp.getItemPosition(i);
+ // System.out.println(pos);
+ assert (pos != null);
+
+ IElement element = m.newElement(ec);
+ element.setHints(res.getHintContext().getHints());
+
+ ISnapAdvisor snapAdvisor = getContext().getHintStack().getHint(DiagramHints.SNAP_ADVISOR);
+ if(snapAdvisor != null)
+ snapAdvisor.snap(pos);
+ ElementUtils.setPos(element, pos);
+
+ // Remove only the drag items we've processed.
+ dp.remove(i);
+ }
+ });
+
+ synchronizer.getCanvasContext().getContentContext().setDirty();
+
+ }
+
+ @Override
+ public void dragOver(DropTargetDragEvent dtde, IDnDContext dp) {
+ }
+
+ @Override
+ public void dragExit(DropTargetEvent dte, IDnDContext dp) {
+ }
+
+ @Override
+ public void dropActionChanged(DropTargetDragEvent dtde, IDnDContext dp) {
+ }
+
+ @Override
+ public int getAllowedOps() {
+ return 0;
+ }
+
+ @Override
+ public double getPriority() {
+ return 9.1;
+ }
+