X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fparticipant%2FPopulateSelectionDropParticipant.java;fp=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fparticipant%2FPopulateSelectionDropParticipant.java;h=605cef99447f8ebc9737cbb020e6e6d6aecddc92;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/participant/PopulateSelectionDropParticipant.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/participant/PopulateSelectionDropParticipant.java new file mode 100644 index 000000000..605cef994 --- /dev/null +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/participant/PopulateSelectionDropParticipant.java @@ -0,0 +1,174 @@ +/******************************************************************************* + * 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 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 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; + } + +} \ No newline at end of file