-/*******************************************************************************\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.modeling.ui.symbolEditor;\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.HashSet;\r
-import java.util.Set;\r
-\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.WriteGraph;\r
-import org.simantics.db.common.request.ObjectsWithType;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.request.Read;\r
-import org.simantics.diagram.adapter.GraphToDiagramSynchronizer;\r
-import org.simantics.diagram.stubs.DiagramResource;\r
-import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;\r
-import org.simantics.diagram.synchronization.graph.ElementWriter;\r
-import org.simantics.diagram.ui.DiagramModelHints;\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.layer0.Layer0;\r
-import org.simantics.modeling.ModelingResources;\r
-import org.simantics.modeling.symbolEditor.PopulateTerminal;\r
-import org.simantics.structural.stubs.StructuralResource2;\r
-import org.simantics.ui.dnd.LocalObjectTransfer;\r
-import org.simantics.ui.dnd.LocalObjectTransferable;\r
-import org.simantics.ui.utils.ResourceAdaptionUtils;\r
-import org.simantics.utils.datastructures.Callback;\r
-import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
-import org.simantics.utils.datastructures.hints.IHintContext.KeyOf;\r
-import org.simantics.utils.logging.TimeLogger;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-/**\r
- * @author Tuukka Lehtonen\r
- */\r
-public class PopulateTerminalDropParticipant extends AbstractDiagramParticipant implements IDropTargetParticipant {\r
-\r
- private static final Key KEY_TERMINAL_RELATION = new KeyOf(Resource.class, "TERMINAL_RELATION");\r
-\r
- protected GraphToDiagramSynchronizer synchronizer;\r
- protected Resource symbolDiagram;\r
-\r
- public PopulateTerminalDropParticipant(Resource symbolDiagram, GraphToDiagramSynchronizer synchronizer) {\r
- this.symbolDiagram = symbolDiagram;\r
- this.synchronizer = synchronizer;\r
- }\r
-\r
- @Override\r
- public void dragEnter(final DropTargetDragEvent dtde, final IDnDContext dp) {\r
- Transferable tr = dtde.getTransferable();\r
- if (tr.isDataFlavorSupported(LocalObjectTransferable.FLAVOR)) {\r
-\r
- Session session = synchronizer.getSession();\r
-\r
- try {\r
- tr.getTransferData(LocalObjectTransferable.FLAVOR);\r
- final Resource[] resources = ResourceAdaptionUtils.toResources(LocalObjectTransfer.getTransfer()\r
- .getObject());\r
-\r
- int itemsAdded = session.syncRequest(new Read<Integer>() {\r
- @Override\r
- public Integer perform(ReadGraph g) throws DatabaseException {\r
- int items = 0;\r
-\r
- Layer0 L0 = Layer0.getInstance(g);\r
- DiagramResource DIA = DiagramResource.getInstance(g);\r
- StructuralResource2 STR = StructuralResource2.getInstance(g);\r
- ModelingResources MOD = ModelingResources.getInstance(g);\r
-\r
- Resource symbol = g.getPossibleObject(symbolDiagram, STR.Defines);\r
- if (symbol == null)\r
- return 0;\r
- Resource componentType = g.getPossibleObject(symbol, MOD.SymbolToComponentType);\r
- if (componentType == null)\r
- return 0;\r
- Set<Resource> connectionRelationsOfSymbol = new HashSet<Resource>( g.syncRequest(new ObjectsWithType(componentType, L0.ConsistsOf, STR.ConnectionRelation)) );\r
-\r
-// System.out.println("Symbol: " + NameUtils.getURIOrSafeNameInternal(g, symbolDiagram));\r
-// System.out.println("Component type: " + NameUtils.getURIOrSafeNameInternal(g, componentType));\r
-// System.out.println("Connection relations: " + connectionRelationsOfSymbol);\r
-\r
- Set<Resource> usedConnectionRelations = new HashSet<Resource>();\r
- for (Resource terminal : g.syncRequest(new ObjectsWithType(symbolDiagram, L0.ConsistsOf, DIA.Terminal))) {\r
- Resource binds = DiagramGraphUtil.getPossibleConnectionPointOfTerminal(g, terminal);\r
- if(binds != null)\r
- for (Resource connRel : g.getObjects(binds, MOD.DiagramConnectionRelationToConnectionRelation))\r
- usedConnectionRelations.add(connRel);\r
- }\r
-\r
- for (Resource resource : resources) {\r
- //System.out.println("Name: " + NameUtils.getSafeName(g, resource));\r
- IDragItem di = null;\r
- Resource connectionRelation = null;\r
-\r
- if (g.isInstanceOf(resource, STR.ConnectionRelation)) {\r
- if (!connectionRelationsOfSymbol.contains(resource))\r
- continue;\r
- Resource terminal = g.getPossibleObject(resource, MOD.ConnectionRelationToTerminal);\r
- if (terminal == null)\r
- terminal = MOD.TestTerminal;\r
- di = new ElementClassDragItem(synchronizer.getNodeClass(g, terminal));\r
- connectionRelation = resource;\r
- }\r
- /* TODO should we replace this with something?\r
- else if (g.isInstanceOf(resource, STR.ConnectionPointDefinition)) {\r
- Resource connectionType = g.getPossibleObject(resource, STR.HasConnectionType);\r
- Resource connectionDirection = g.getPossibleObject(resource, STR.HasConnectionDirection);\r
- Collection<Resource> terminals = connectionType == null || connectionDirection == null\r
- ? Collections.<Resource> emptyList() : g.getObjects(connectionType,\r
- g.getInverse(STR.SupportsConnectionType));\r
- if (terminals.isEmpty())\r
- di = new ElementClassDragItem(synchronizer.getNodeClass(g, MOD.TestTerminal));\r
- else\r
- for (Resource t : terminals)\r
- if (connectionDirection.equals(g.getPossibleObject(t, STR.SupportsDirection))) {\r
- di = new ElementClassDragItem(synchronizer.getNodeClass(t));\r
- break;\r
- }\r
-\r
- connectionRelation = g.getSingleObject(resource, L0.ConcernsRelation);\r
- }*/\r
-\r
- if (di != null && connectionRelation != null && !usedConnectionRelations.contains(connectionRelation)) {\r
- di.getHintContext().setHint(KEY_TERMINAL_RELATION, connectionRelation);\r
- dp.add( di );\r
- ++items;\r
- }\r
- }\r
- return items;\r
- }\r
- });\r
-\r
- if (itemsAdded > 0 ) {\r
- dp.getHints().setHint(DnDHints.KEY_DND_GRID_COLUMNS, Integer.valueOf(1));\r
- dtde.acceptDrag(DnDConstants.ACTION_COPY);\r
- }\r
-\r
- } catch (DatabaseException e) {\r
- ErrorLogger.defaultLogError(e);\r
- } catch (UnsupportedFlavorException e) {\r
- ErrorLogger.defaultLogError(e);\r
- } catch (IOException e) {\r
- ErrorLogger.defaultLogError(e);\r
- } catch (IllegalArgumentException e) {\r
- ErrorLogger.defaultLogError(e);\r
- }\r
- }\r
-\r
- }\r
-\r
- @Override\r
- public void dragExit(DropTargetEvent dte, IDnDContext dp) {\r
- // System.out.println("exit");\r
- }\r
-\r
- @Override\r
- public void dragOver(DropTargetDragEvent dtde, IDnDContext dp) {\r
- // System.out.println("over");\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, mutator -> {\r
- IDragItem items[] = dp.toArray();\r
-\r
- for (IDragItem i : items) {\r
- if (!(i instanceof ElementClassDragItem))\r
- continue;\r
- final Resource relation = i.getHintContext().getHint(KEY_TERMINAL_RELATION);\r
- if (relation == null)\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 = mutator.newElement(ec);\r
- ElementUtils.setPos(element, new Point2D.Double(pos.getX(), pos.getY()));\r
- element.setHint(DiagramModelHints.KEY_ELEMENT_WRITER, new ElementWriter() {\r
-\r
- @Override\r
- public void addToGraph(WriteGraph g, IElement element, Resource terminal) throws DatabaseException {\r
- PopulateTerminal.addToGraph(g, symbolDiagram, relation, terminal);\r
- }\r
-\r
- @Override\r
- public void removeFromGraph(WriteGraph graph, Resource elementResource) {\r
- }\r
- });\r
-\r
- dp.remove(i);\r
- }\r
- });\r
-\r
- getContext().getContentContext().setDirty();\r
- }\r
-\r
- @Override\r
- public void dropActionChanged(DropTargetDragEvent dtde, IDnDContext dp) {\r
- dtde.acceptDrag(DnDConstants.ACTION_COPY);\r
- }\r
-\r
- @Override\r
- public int getAllowedOps() {\r
- return DnDConstants.ACTION_COPY | DnDConstants.ACTION_MOVE | DnDConstants.ACTION_LINK;\r
- }\r
-\r
- @Override\r
- public double getPriority() {\r
- return 9.0;\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.modeling.ui.symbolEditor;
+
+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.HashSet;
+import java.util.Set;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.Session;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.request.ObjectsWithType;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.request.Read;
+import org.simantics.diagram.adapter.GraphToDiagramSynchronizer;
+import org.simantics.diagram.stubs.DiagramResource;
+import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;
+import org.simantics.diagram.synchronization.graph.ElementWriter;
+import org.simantics.diagram.ui.DiagramModelHints;
+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.layer0.Layer0;
+import org.simantics.modeling.ModelingResources;
+import org.simantics.modeling.symbolEditor.PopulateTerminal;
+import org.simantics.structural.stubs.StructuralResource2;
+import org.simantics.ui.dnd.LocalObjectTransfer;
+import org.simantics.ui.dnd.LocalObjectTransferable;
+import org.simantics.ui.utils.ResourceAdaptionUtils;
+import org.simantics.utils.datastructures.Callback;
+import org.simantics.utils.datastructures.hints.IHintContext.Key;
+import org.simantics.utils.datastructures.hints.IHintContext.KeyOf;
+import org.simantics.utils.logging.TimeLogger;
+import org.simantics.utils.ui.ErrorLogger;
+
+/**
+ * @author Tuukka Lehtonen
+ */
+public class PopulateTerminalDropParticipant extends AbstractDiagramParticipant implements IDropTargetParticipant {
+
+ private static final Key KEY_TERMINAL_RELATION = new KeyOf(Resource.class, "TERMINAL_RELATION");
+
+ protected GraphToDiagramSynchronizer synchronizer;
+ protected Resource symbolDiagram;
+
+ public PopulateTerminalDropParticipant(Resource symbolDiagram, GraphToDiagramSynchronizer synchronizer) {
+ this.symbolDiagram = symbolDiagram;
+ this.synchronizer = synchronizer;
+ }
+
+ @Override
+ public void dragEnter(final DropTargetDragEvent dtde, final IDnDContext dp) {
+ Transferable tr = dtde.getTransferable();
+ if (tr.isDataFlavorSupported(LocalObjectTransferable.FLAVOR)) {
+
+ Session session = synchronizer.getSession();
+
+ try {
+ tr.getTransferData(LocalObjectTransferable.FLAVOR);
+ final Resource[] resources = ResourceAdaptionUtils.toResources(LocalObjectTransfer.getTransfer()
+ .getObject());
+
+ int itemsAdded = session.syncRequest(new Read<Integer>() {
+ @Override
+ public Integer perform(ReadGraph g) throws DatabaseException {
+ int items = 0;
+
+ Layer0 L0 = Layer0.getInstance(g);
+ DiagramResource DIA = DiagramResource.getInstance(g);
+ StructuralResource2 STR = StructuralResource2.getInstance(g);
+ ModelingResources MOD = ModelingResources.getInstance(g);
+
+ Resource symbol = g.getPossibleObject(symbolDiagram, STR.Defines);
+ if (symbol == null)
+ return 0;
+ Resource componentType = g.getPossibleObject(symbol, MOD.SymbolToComponentType);
+ if (componentType == null)
+ return 0;
+ Set<Resource> connectionRelationsOfSymbol = new HashSet<Resource>( g.syncRequest(new ObjectsWithType(componentType, L0.ConsistsOf, STR.ConnectionRelation)) );
+
+// System.out.println("Symbol: " + NameUtils.getURIOrSafeNameInternal(g, symbolDiagram));
+// System.out.println("Component type: " + NameUtils.getURIOrSafeNameInternal(g, componentType));
+// System.out.println("Connection relations: " + connectionRelationsOfSymbol);
+
+ Set<Resource> usedConnectionRelations = new HashSet<Resource>();
+ for (Resource terminal : g.syncRequest(new ObjectsWithType(symbolDiagram, L0.ConsistsOf, DIA.Terminal))) {
+ Resource binds = DiagramGraphUtil.getPossibleConnectionPointOfTerminal(g, terminal);
+ if(binds != null)
+ for (Resource connRel : g.getObjects(binds, MOD.DiagramConnectionRelationToConnectionRelation))
+ usedConnectionRelations.add(connRel);
+ }
+
+ for (Resource resource : resources) {
+ //System.out.println("Name: " + NameUtils.getSafeName(g, resource));
+ IDragItem di = null;
+ Resource connectionRelation = null;
+
+ if (g.isInstanceOf(resource, STR.ConnectionRelation)) {
+ if (!connectionRelationsOfSymbol.contains(resource))
+ continue;
+ Resource terminal = g.getPossibleObject(resource, MOD.ConnectionRelationToTerminal);
+ if (terminal == null)
+ terminal = MOD.TestTerminal;
+ di = new ElementClassDragItem(synchronizer.getNodeClass(g, terminal));
+ connectionRelation = resource;
+ }
+ /* TODO should we replace this with something?
+ else if (g.isInstanceOf(resource, STR.ConnectionPointDefinition)) {
+ Resource connectionType = g.getPossibleObject(resource, STR.HasConnectionType);
+ Resource connectionDirection = g.getPossibleObject(resource, STR.HasConnectionDirection);
+ Collection<Resource> terminals = connectionType == null || connectionDirection == null
+ ? Collections.<Resource> emptyList() : g.getObjects(connectionType,
+ g.getInverse(STR.SupportsConnectionType));
+ if (terminals.isEmpty())
+ di = new ElementClassDragItem(synchronizer.getNodeClass(g, MOD.TestTerminal));
+ else
+ for (Resource t : terminals)
+ if (connectionDirection.equals(g.getPossibleObject(t, STR.SupportsDirection))) {
+ di = new ElementClassDragItem(synchronizer.getNodeClass(t));
+ break;
+ }
+
+ connectionRelation = g.getSingleObject(resource, L0.ConcernsRelation);
+ }*/
+
+ if (di != null && connectionRelation != null && !usedConnectionRelations.contains(connectionRelation)) {
+ di.getHintContext().setHint(KEY_TERMINAL_RELATION, connectionRelation);
+ dp.add( di );
+ ++items;
+ }
+ }
+ return items;
+ }
+ });
+
+ if (itemsAdded > 0 ) {
+ dp.getHints().setHint(DnDHints.KEY_DND_GRID_COLUMNS, Integer.valueOf(1));
+ dtde.acceptDrag(DnDConstants.ACTION_COPY);
+ }
+
+ } catch (DatabaseException e) {
+ ErrorLogger.defaultLogError(e);
+ } catch (UnsupportedFlavorException e) {
+ ErrorLogger.defaultLogError(e);
+ } catch (IOException e) {
+ ErrorLogger.defaultLogError(e);
+ } catch (IllegalArgumentException e) {
+ ErrorLogger.defaultLogError(e);
+ }
+ }
+
+ }
+
+ @Override
+ public void dragExit(DropTargetEvent dte, IDnDContext dp) {
+ // System.out.println("exit");
+ }
+
+ @Override
+ public void dragOver(DropTargetDragEvent dtde, IDnDContext dp) {
+ // System.out.println("over");
+ }
+
+ @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, mutator -> {
+ IDragItem items[] = dp.toArray();
+
+ for (IDragItem i : items) {
+ if (!(i instanceof ElementClassDragItem))
+ continue;
+ final Resource relation = i.getHintContext().getHint(KEY_TERMINAL_RELATION);
+ if (relation == null)
+ continue;
+
+ ElementClassDragItem res = (ElementClassDragItem) i;
+ ElementClass ec = res.getElementClass();
+
+ Point2D pos = dp.getItemPosition(i);
+ // System.out.println(pos);
+ assert (pos != null);
+
+ IElement element = mutator.newElement(ec);
+ ElementUtils.setPos(element, new Point2D.Double(pos.getX(), pos.getY()));
+ element.setHint(DiagramModelHints.KEY_ELEMENT_WRITER, new ElementWriter() {
+
+ @Override
+ public void addToGraph(WriteGraph g, IElement element, Resource terminal) throws DatabaseException {
+ PopulateTerminal.addToGraph(g, symbolDiagram, relation, terminal);
+ }
+
+ @Override
+ public void removeFromGraph(WriteGraph graph, Resource elementResource) {
+ }
+ });
+
+ dp.remove(i);
+ }
+ });
+
+ getContext().getContentContext().setDirty();
+ }
+
+ @Override
+ public void dropActionChanged(DropTargetDragEvent dtde, IDnDContext dp) {
+ dtde.acceptDrag(DnDConstants.ACTION_COPY);
+ }
+
+ @Override
+ public int getAllowedOps() {
+ return DnDConstants.ACTION_COPY | DnDConstants.ACTION_MOVE | DnDConstants.ACTION_LINK;
+ }
+
+ @Override
+ public double getPriority() {
+ return 9.0;
+ }
+