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