]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.charts/src/org/simantics/charts/editor/SubscriptionDropParticipant.java
Sync git svn branch with SVN repository r33406.
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / editor / SubscriptionDropParticipant.java
index c410414d2276a3b2930a00d4938b5b2f6563a837..c41070934cbebe63344c49fbe8e640313bfdc6c5 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
+ * Copyright (c) 2007, 2016 Association for Decentralized Information Management in\r
  * 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
@@ -8,9 +8,11 @@
  *\r
  * Contributors:\r
  *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *     Semantum Oy - JSON plain text input support\r
  *******************************************************************************/\r
 package org.simantics.charts.editor;\r
 \r
+import java.awt.datatransfer.DataFlavor;\r
 import java.awt.datatransfer.Transferable;\r
 import java.awt.datatransfer.UnsupportedFlavorException;\r
 import java.awt.dnd.DnDConstants;\r
@@ -18,13 +20,18 @@ import java.awt.dnd.DropTargetDragEvent;
 import java.awt.dnd.DropTargetDropEvent;\r
 import java.awt.dnd.DropTargetEvent;\r
 import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.nio.charset.Charset;\r
 import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.Collections;\r
 import java.util.List;\r
+import java.util.Optional;\r
+import java.util.stream.Collectors;\r
 \r
 import org.eclipse.jface.viewers.ISelection;\r
 import org.simantics.Simantics;\r
+import org.simantics.charts.internal.JsonUtils;\r
 import org.simantics.charts.query.AddChartItem;\r
 import org.simantics.charts.query.ChartItemDescriptor;\r
 import org.simantics.charts.ui.AddVariableToChartAction;\r
@@ -33,7 +40,9 @@ import org.simantics.charts.ui.ChartVariable;
 import org.simantics.databoard.util.ObjectUtils;\r
 import org.simantics.db.ReadGraph;\r
 import org.simantics.db.Resource;\r
+import org.simantics.db.Session;\r
 import org.simantics.db.common.request.UnaryRead;\r
+import org.simantics.db.common.request.UniqueRead;\r
 import org.simantics.db.exception.DatabaseException;\r
 import org.simantics.db.layer0.SelectionHints;\r
 import org.simantics.db.layer0.request.PossibleModel;\r
@@ -41,7 +50,6 @@ import org.simantics.db.layer0.variable.RVI;
 import org.simantics.db.layer0.variable.Variable;\r
 import org.simantics.db.layer0.variable.VariableReference;\r
 import org.simantics.db.layer0.variable.Variables;\r
-import org.simantics.db.request.Read;\r
 import org.simantics.g2d.diagram.participant.AbstractDiagramParticipant;\r
 import org.simantics.g2d.dnd.DragItem;\r
 import org.simantics.g2d.dnd.IDnDContext;\r
@@ -54,6 +62,7 @@ import org.simantics.modeling.utils.VariableReferences;
 import org.simantics.ui.dnd.LocalObjectTransfer;\r
 import org.simantics.ui.dnd.LocalObjectTransferable;\r
 import org.simantics.ui.selection.WorkbenchSelectionElement;\r
+import org.simantics.utils.FileUtils;\r
 import org.simantics.utils.ui.ErrorLogger;\r
 import org.simantics.utils.ui.ISelectionUtils;\r
 import org.simantics.utils.ui.dialogs.ShowMessage;\r
@@ -88,12 +97,6 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
 \r
     @Override\r
     public void dragEnter(DropTargetDragEvent dtde, IDnDContext dp) {\r
-        // The transferable doesn't know LOT\r
-        if (!dtde.isDataFlavorSupported(LocalObjectTransferable.FLAVOR)) {\r
-            dtde.rejectDrag();\r
-            return;\r
-        }\r
-\r
         // The source cannot link, too bad\r
         if ((dtde.getSourceActions() & DnDConstants.ACTION_LINK) == 0) {\r
             dtde.rejectDrag();\r
@@ -101,26 +104,34 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
         }\r
 \r
         // Ensure the content is usable\r
+        if (dtde.isDataFlavorSupported(LocalObjectTransferable.FLAVOR)) {\r
+            dragEnterLocalObject(dtde, dp);\r
+        } else if (dtde.isDataFlavorSupported(DataFlavor.getTextPlainUnicodeFlavor())) {\r
+            dragEnterPlainText(dtde, dp);\r
+        } else {\r
+            dtde.rejectDrag();\r
+        }\r
+    }\r
+\r
+    private void dragEnterLocalObject(DropTargetDragEvent dtde, IDnDContext dp) {\r
         try {\r
-            Transferable t = dtde.getTransferable();\r
-            Object data = t.getTransferData(LocalObjectTransferable.FLAVOR);\r
+            Object data = dtde.getTransferable().getTransferData(LocalObjectTransferable.FLAVOR);\r
             data = LocalObjectTransfer.getTransfer().getObject();\r
 \r
-            List<IDragItem> items = new ArrayList<IDragItem>();\r
+            List<IDragItem> items = new ArrayList<>();\r
+            Session session = Simantics.getSession();\r
 \r
             final List<Resource> resources = ISelectionUtils.getPossibleKeys(data, SelectionHints.KEY_MAIN, Resource.class);\r
             if (!resources.isEmpty()) {\r
                 // Support SubscriptionItem drags\r
-                items.addAll( Simantics.getSession().syncRequest(new Read<List<IDragItem>>() {\r
+                items.addAll( session.syncRequest(new UniqueRead<List<IDragItem>>() {\r
                     @Override\r
                     public List<IDragItem> perform(ReadGraph graph) throws DatabaseException {\r
-                        List<IDragItem> result = new ArrayList<IDragItem>();\r
-                        //Layer0 L0 = Layer0.getInstance(graph);\r
+                        List<IDragItem> result = new ArrayList<>();\r
                         ModelingResources MOD = ModelingResources.getInstance(graph);\r
                         Resource targetModel = graph.syncRequest(new PossibleModel(container));\r
                         if (targetModel != null) {\r
                             for (Resource r : resources) {\r
-                               //System.out.println( graph.getPossibleRelatedValue(r, L0.HasName) );\r
                                 if (graph.isInstanceOf(r, MOD.Subscription_Item)) {\r
                                     Resource model = graph.syncRequest(new PossibleModel(r));\r
                                     if (ObjectUtils.objectEquals(targetModel, model))\r
@@ -135,7 +146,7 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
 \r
             if(data instanceof RVI) {\r
 \r
-                VariableReferenceDragItem vrdi = new VariableReferenceDragItem(Simantics.getSession().sync(new UnaryRead<RVI, VariableReference>((RVI)data) {\r
+                VariableReferenceDragItem vrdi = new VariableReferenceDragItem(session.sync(new UnaryRead<RVI, VariableReference>((RVI)data) {\r
                     @Override\r
                     public VariableReference perform(ReadGraph graph) throws DatabaseException {\r
                         return new VariableReference(parameter, Variables.getDatatype(graph, model, parameter), null);\r
@@ -150,7 +161,7 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
                 // 1st try Variable\r
                 final List<Variable> vars2 = ISelectionUtils.getPossibleKeys(data, SelectionHints.KEY_MAIN, Variable.class);\r
                 if (!vars2.isEmpty()) {\r
-                    varItems = Simantics.getSession().syncRequest( new Read<List<IDragItem>>() {\r
+                    varItems = session.syncRequest( new UniqueRead<List<IDragItem>>() {\r
                         @Override\r
                         public List<IDragItem> perform(ReadGraph graph) throws DatabaseException {\r
                             return toDragItems( graph.syncRequest(VariableReferences.variablesToReferences(model, vars2)) );\r
@@ -161,7 +172,7 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
                     // Try legacy PropertyVariables\r
                     final List<PropertyVariables> vars = ISelectionUtils.getPossibleKeys(data, SelectionHints.KEY_MAIN, PropertyVariables.class);\r
                     if (!vars.isEmpty()) {\r
-                        varItems = Simantics.getSession().syncRequest( new Read<List<IDragItem>>() {\r
+                        varItems = session.syncRequest( new UniqueRead<List<IDragItem>>() {\r
                             @Override\r
                             public List<IDragItem> perform(ReadGraph graph) throws DatabaseException {\r
                                 List<PropertyVariables> vars2 = PropertyVariablesImpl.resolve(graph, vars);\r
@@ -177,10 +188,10 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
                 if (data instanceof ISelection) {\r
                     final List<WorkbenchSelectionElement> wses = ISelectionUtils.filterSelection((ISelection)data, WorkbenchSelectionElement.class);\r
                     if (!wses.isEmpty()) {\r
-                        items.addAll( Simantics.getSession().syncRequest( new Read<List<IDragItem>>() {\r
+                        items.addAll( session.syncRequest( new UniqueRead<List<IDragItem>>() {\r
                             @Override\r
                             public List<IDragItem> perform(ReadGraph graph) throws DatabaseException {\r
-                                List<Variable> wsevars = new ArrayList<Variable>();\r
+                                List<Variable> wsevars = new ArrayList<>();\r
                                 ChartVariable av = new ChartVariable(graph);\r
                                 for(WorkbenchSelectionElement wse : wses) {\r
                                     Variable v = wse.getContent(av);\r
@@ -214,6 +225,40 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
         }\r
     }\r
 \r
+    private void dragEnterPlainText(DropTargetDragEvent dtde, IDnDContext dp) {\r
+        try {\r
+            DataFlavor flavor = DataFlavor.getTextPlainUnicodeFlavor();\r
+            String flavorCharset = flavor.getParameter("charset");\r
+            Transferable t = dtde.getTransferable();\r
+            InputStream in = (InputStream) t.getTransferData(flavor);\r
+            String data = FileUtils.getContents(in, Charset.forName(flavorCharset));\r
+\r
+            List<IDragItem> items = new ArrayList<>();\r
+            Session session = Simantics.getSession();\r
+            Optional<Variable> v = JsonUtils.tryParseJsonPropertyVariable(session, data);\r
+            if (v.isPresent()) {\r
+                items.addAll( toDragItems( session.syncRequest(VariableReferences.variablesToReferences(model, Collections.singletonList(v.get()))) ) );\r
+            }\r
+\r
+            if (items.isEmpty()) {\r
+                dtde.rejectDrag();\r
+            } else {\r
+                // Accept, make sure it is Link\r
+                for (IDragItem i : items)\r
+                    dp.add(i);\r
+                dtde.acceptDrag( DnDConstants.ACTION_LINK );\r
+            }\r
+        } catch (UnsupportedFlavorException e) {\r
+            throw new RuntimeException(e);\r
+        } catch (IOException e) {\r
+            ErrorLogger.defaultLogError(e);\r
+            dtde.rejectDrag();\r
+        } catch (DatabaseException e) {\r
+            ErrorLogger.defaultLogError(e);\r
+            dtde.rejectDrag();\r
+        }\r
+    }\r
+\r
     @Override\r
     public void dragExit(DropTargetEvent dte, IDnDContext dp) {\r
         for (IDragItem i : dp.getItemsByClass(SubscriptionItemDragItem.class))\r
@@ -228,30 +273,23 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
 \r
     @Override\r
     public void drop(DropTargetDropEvent dtde, IDnDContext dp) {\r
-       // Subscription Item\r
+        // Subscription Item\r
         Collection<SubscriptionItemDragItem> subs = dp.getItemsByClass(SubscriptionItemDragItem.class);\r
         if (!subs.isEmpty()) {\r
-            List<ChartItemDescriptor> cicr = new ArrayList<ChartItemDescriptor>();\r
-            for (SubscriptionItemDragItem sidi : subs) {\r
-                cicr.add(sidi.getObject());\r
-            }\r
-            ChartDropActionFactory.addPlots(container, cicr, Collections.<Resource>emptySet()).run();\r
+            ChartDropActionFactory.addPlots(container,\r
+                    subs.stream().map(DragItem::getObject).collect(Collectors.toList()),\r
+                    Collections.<Resource>emptySet()).run();\r
             dtde.dropComplete(true);\r
             return;\r
         }\r
-        \r
+\r
         // Variable Reference\r
         Collection<VariableReferenceDragItem> vrdis = dp.getItemsByClass(VariableReferenceDragItem.class);\r
         if (!vrdis.isEmpty()) {\r
-            List<VariableReference> refs = new ArrayList<VariableReference>();\r
-            for (VariableReferenceDragItem vrdi : vrdis) {\r
-                refs.add( vrdi.getObject() );\r
-            }\r
-            Resource chart = container;\r
             try {\r
-                AddVariableToChartAction a = new AddVariableToChartAction( chart, null, refs );\r
-                               a.init();\r
-                   a.run();\r
+                new AddVariableToChartAction( container, null,\r
+                        vrdis.stream().map(DragItem::getObject).collect(Collectors.toList()) )\r
+                .init().run();\r
                    dtde.dropComplete(true);\r
                        } catch (DatabaseException e) {\r
                                ShowMessage.showError(e.getClass().getName(), e.getMessage());\r
@@ -259,7 +297,7 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
                        }\r
             return;\r
         }\r
-        \r
+\r
         dtde.rejectDrop();\r
     }\r
 \r
@@ -274,14 +312,9 @@ public class SubscriptionDropParticipant extends AbstractDiagramParticipant impl
     }\r
 \r
     private static List<IDragItem> toDragItems(Collection<VariableReference> references) {\r
-        List<IDragItem> result = new ArrayList<IDragItem>(references.size());\r
-        for (VariableReference vr : references) {\r
-            VariableReferenceDragItem di = new VariableReferenceDragItem( vr );\r
-            result.add( di );\r
-        }\r
-        return result;\r
+        return references.stream().map(VariableReferenceDragItem::new).collect(Collectors.toList());\r
     }\r
-    \r
+\r
     @Override\r
     public double getPriority() {\r
        return 10.0;\r