X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fparticipant%2FPopulateSelectionDropParticipant.java;h=0731bd90d7f3c542797e6c4f590e77d27324ba92;hp=605cef99447f8ebc9737cbb020e6e6d6aecddc92;hb=b4374193caf61635d382af556ec913bf278d53a8;hpb=969bd23cab98a79ca9101af33334000879fb60c5 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 index 605cef994..0731bd90d 100644 --- a/bundles/org.simantics.diagram/src/org/simantics/diagram/participant/PopulateSelectionDropParticipant.java +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/participant/PopulateSelectionDropParticipant.java @@ -1,174 +1,171 @@ -/******************************************************************************* - * 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; - } - +/******************************************************************************* + * 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.adapter.GraphToDiagramSynchronizer; +import org.simantics.g2d.diagram.DiagramHints; +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.logging.TimeLogger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +abstract public class PopulateSelectionDropParticipant extends AbstractDiagramParticipant implements IDropTargetParticipant { + + private static final Logger LOGGER = LoggerFactory.getLogger(PopulateSelectionDropParticipant.class); + + 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 (DatabaseException | IOException | UnsupportedFlavorException e) { + LOGGER.error("Unexpected failure", 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