From 91b7cf6f9360fb6eb70ecd39a219e895b680d4f7 Mon Sep 17 00:00:00 2001 From: lempinen Date: Thu, 24 Nov 2011 12:23:07 +0000 Subject: [PATCH] DnD series git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@23338 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 72865 -> 73355 bytes .../ChartAxisAndVariablesViewpoint.pgraph | 9 +- .../org/simantics/sysdyn/SysdynResource.java | 6 ++ org.simantics.sysdyn.ui/adapters.xml | 2 +- .../sysdyn/ui/browser/nodes/ChartNode.java | 9 +- .../trend/chart/graphexplorer/DropAction.java | 95 ++++++++++++++++++ .../AxisAndVariablesExplorerComposite.java | 92 +++++++++++++++++ .../properties/ChartAxisAndVariablesTab.java | 2 +- 8 files changed, 204 insertions(+), 11 deletions(-) create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/graphexplorer/DropAction.java create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/properties/AxisAndVariablesExplorerComposite.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index 2a4147273fc6214aadda96669484067899db53e2..983ac388749e63470573e796ef1907abc7b047d8 100644 GIT binary patch literal 73355 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 UG7qKiniKnbYHj#TCOqu=2CP_~DF6Tf diff --git a/org.simantics.sysdyn.ontology/graph/ChartAxisAndVariablesViewpoint.pgraph b/org.simantics.sysdyn.ontology/graph/ChartAxisAndVariablesViewpoint.pgraph index d07ed227..a7359115 100644 --- a/org.simantics.sysdyn.ontology/graph/ChartAxisAndVariablesViewpoint.pgraph +++ b/org.simantics.sysdyn.ontology/graph/ChartAxisAndVariablesViewpoint.pgraph @@ -22,4 +22,11 @@ CBC CBC @VP.customLabelRule JFREE.Axis VP.ResourceLabelLabelRule - @VP.customLabelRule JFREE.Series VP.ResourceLabelLabelRule \ No newline at end of file + @VP.customLabelRule JFREE.Series VP.ResourceLabelLabelRule + +CBC + @VP.dropActionContribution JFREE.Axis ACTIONS.DropAction 1.0 + @VP.dropActionContribution JFREE.Series ACTIONS.DropAction 1.0 + +ACTIONS = CAC.Actions : L0.Library +ACTIONS.DropAction : ACT.DropAction \ No newline at end of file diff --git a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java index d6ff18c9..05192d1f 100644 --- a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java +++ b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java @@ -47,6 +47,8 @@ public class SysdynResource { public final Resource Built$in_Functions_zidz; public final Resource Center; public final Resource ChartAxisAndVariablesActionContext; + public final Resource ChartAxisAndVariablesActionContext_Actions; + public final Resource ChartAxisAndVariablesActionContext_Actions_DropAction; public final Resource ChartAxisAndVariablesBrowseContext; public final Resource ChartAxisAndVariablesBrowseContext_AxisChildRule; public final Resource ChartAxisAndVariablesBrowseContext_VariableChildRule; @@ -290,6 +292,8 @@ public class SysdynResource { public static final String Built$in_Functions_zidz = "http://www.simantics.org/Sysdyn-1.1/Built-in%20Functions/zidz"; public static final String Center = "http://www.simantics.org/Sysdyn-1.1/Center"; public static final String ChartAxisAndVariablesActionContext = "http://www.simantics.org/Sysdyn-1.1/ChartAxisAndVariablesActionContext"; + public static final String ChartAxisAndVariablesActionContext_Actions = "http://www.simantics.org/Sysdyn-1.1/ChartAxisAndVariablesActionContext/Actions"; + public static final String ChartAxisAndVariablesActionContext_Actions_DropAction = "http://www.simantics.org/Sysdyn-1.1/ChartAxisAndVariablesActionContext/Actions/DropAction"; public static final String ChartAxisAndVariablesBrowseContext = "http://www.simantics.org/Sysdyn-1.1/ChartAxisAndVariablesBrowseContext"; public static final String ChartAxisAndVariablesBrowseContext_AxisChildRule = "http://www.simantics.org/Sysdyn-1.1/ChartAxisAndVariablesBrowseContext/AxisChildRule"; public static final String ChartAxisAndVariablesBrowseContext_VariableChildRule = "http://www.simantics.org/Sysdyn-1.1/ChartAxisAndVariablesBrowseContext/VariableChildRule"; @@ -543,6 +547,8 @@ public class SysdynResource { Built$in_Functions_zidz = getResourceOrNull(graph, URIs.Built$in_Functions_zidz); Center = getResourceOrNull(graph, URIs.Center); ChartAxisAndVariablesActionContext = getResourceOrNull(graph, URIs.ChartAxisAndVariablesActionContext); + ChartAxisAndVariablesActionContext_Actions = getResourceOrNull(graph, URIs.ChartAxisAndVariablesActionContext_Actions); + ChartAxisAndVariablesActionContext_Actions_DropAction = getResourceOrNull(graph, URIs.ChartAxisAndVariablesActionContext_Actions_DropAction); ChartAxisAndVariablesBrowseContext = getResourceOrNull(graph, URIs.ChartAxisAndVariablesBrowseContext); ChartAxisAndVariablesBrowseContext_AxisChildRule = getResourceOrNull(graph, URIs.ChartAxisAndVariablesBrowseContext_AxisChildRule); ChartAxisAndVariablesBrowseContext_VariableChildRule = getResourceOrNull(graph, URIs.ChartAxisAndVariablesBrowseContext_VariableChildRule); diff --git a/org.simantics.sysdyn.ui/adapters.xml b/org.simantics.sysdyn.ui/adapters.xml index 3a9a9e3c..cd26fb0a 100644 --- a/org.simantics.sysdyn.ui/adapters.xml +++ b/org.simantics.sysdyn.ui/adapters.xml @@ -10,5 +10,5 @@ VTT Technical Research Centre of Finland - initial API and implementation --> - none 0 fill 1 + none 0 fill 1 \ No newline at end of file diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ChartNode.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ChartNode.java index 8e40c28b..598124bf 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ChartNode.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ChartNode.java @@ -19,7 +19,6 @@ import org.simantics.browsing.ui.common.node.AbstractNode; import org.simantics.browsing.ui.common.node.DeleteException; import org.simantics.browsing.ui.common.node.IDeletableNode; import org.simantics.browsing.ui.common.node.IDropTargetNode; -import org.simantics.databoard.Bindings; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.ObjectsWithType; @@ -85,14 +84,8 @@ public class ChartNode extends AbstractNode implements IDropTargetNode Resource dataset = graph.syncRequest(new ObjectsWithType(plot, l0.ConsistsOf, jfree.Dataset)).iterator().next(); String rvi = Variables.getRVI(graph, variable); - Resource type = l0.String; - Resource literal = graph.newResource(); - graph.claim(literal, l0.InstanceOf, null, type); - graph.claimValue(literal, rvi, Bindings.STRING); - GraphUtils.create2(graph, jfree.Series, - l0.HasLabel, rvi, - jfree.HasVariableRVI, literal, + jfree.HasVariableRVI, rvi, l0.PartOf, dataset); } }); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/graphexplorer/DropAction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/graphexplorer/DropAction.java new file mode 100644 index 00000000..85f77a5a --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/graphexplorer/DropAction.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright (c) 2007, 2011 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.sysdyn.ui.trend.chart.graphexplorer; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.PossibleObjectWithType; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.DropActionFactory; +import org.simantics.layer0.Layer0; +import org.simantics.sysdyn.JFreeChartResource; +import org.simantics.sysdyn.ui.trend.chart.properties.ChartAxisAndVariablesTab; +import org.simantics.ui.SimanticsUI; +import org.simantics.ui.utils.AdaptionUtils; + +/** + * Drop action for explorer in {@link ChartAxisAndVariablesTab}. This action is used for dropping + * both series and axis on top of each others. + * + * @author Teemu Lempinen + * + */ +public class DropAction implements DropActionFactory { + + @Override + public Runnable create(ReadGraph g, Object target, Object source) throws DatabaseException { + // Make sure that both target and source are resources + Resource t = AdaptionUtils.adaptToSingle(target, Resource.class); + Resource s = AdaptionUtils.adaptToSingle(source, Resource.class); + if(t != null && s != null) + return getRunnable(t, s); + return null; + } + + /** + * Get the runnable for doing the drop action + * + * @param t target resource + * @param s source resource + * @return Runnable + */ + private Runnable getRunnable(final Resource t, final Resource s) { + Runnable runnable = new Runnable() { + + @Override + public void run() { + SimanticsUI.getSession().asyncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + JFreeChartResource jfree = JFreeChartResource.getInstance(graph); + Layer0 l0 = Layer0.getInstance(graph); + Resource target = t; + Resource source = s; + + // Dropped a series over a series -> get target dataset + if(graph.isInstanceOf(target, jfree.Series) && graph.isInstanceOf(source, jfree.Series)) { + Resource dataset = graph.getPossibleObject(target, l0.PartOf); + if(dataset != null) + target = dataset; + } + + // Dropped a series over an axis -> get target dataset + if(graph.isInstanceOf(target, jfree.Axis) && graph.isInstanceOf(source, jfree.Series)) { + Resource dataset = graph.syncRequest(new PossibleObjectWithType(target, jfree.MapToRangeAxis_Inverse, jfree.Dataset)); + if(dataset != null) + target = dataset; + } + + // Move series to a dataset + if(graph.isInstanceOf(target, jfree.Dataset) && graph.isInstanceOf(source, jfree.Series)) { + graph.deny(source, l0.PartOf); + graph.claim(target, l0.ConsistsOf, source); + } + + // TODO: Change the order of axis and series. Implement when they are in ordered sets + } + }); + } + }; + return runnable; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/properties/AxisAndVariablesExplorerComposite.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/properties/AxisAndVariablesExplorerComposite.java new file mode 100644 index 00000000..f15c9f06 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/properties/AxisAndVariablesExplorerComposite.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2007, 2011 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.sysdyn.ui.trend.chart.properties; + +import java.util.ArrayList; +import java.util.Map; + +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IWorkbenchSite; +import org.simantics.browsing.ui.NodeContext; +import org.simantics.browsing.ui.common.ErrorLogger; +import org.simantics.browsing.ui.model.InvalidContribution; +import org.simantics.browsing.ui.model.dnd.DndBrowseContext; +import org.simantics.browsing.ui.swt.widgets.GraphExplorerComposite; +import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ReadRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.procedure.Procedure; +import org.simantics.db.request.Read; +import org.simantics.structural.ui.modelBrowser.ModelBrowser2; +import org.simantics.ui.SimanticsUI; + +/** + * ExplorerComposite allowing ontology-based DnD definitions. DnD Copied from {@link ModelBrowser2} + * + * @author Teemu Lempinen + * + */ +public class AxisAndVariablesExplorerComposite extends GraphExplorerComposite { + + volatile DndBrowseContext dndBrowseContext; + + public AxisAndVariablesExplorerComposite(Map args, IWorkbenchSite site, Composite parent, + WidgetSupport support, int style) { + super(args, site, parent, support, style); + + SimanticsUI.getSession().asyncRequest(new ReadRequest() { + @Override + public void run(ReadGraph graph) throws DatabaseException { + ArrayList browseContexts = new ArrayList(); + for (String uri : getBrowseContexts()) { + Resource browseContext = graph.getPossibleResource(uri); + if (browseContext != null) + browseContexts.add(browseContext); + } + try { + dndBrowseContext = DndBrowseContext.create(graph, browseContexts); + } catch (InvalidContribution e) { + ErrorLogger.defaultLogError(e); + } + } + }); + } + + @Override + protected void handleDrop(final Object data, final NodeContext target) { + if (target == null) + return; + + SimanticsUI.getSession().asyncRequest(new Read() { + @Override + public Runnable perform(ReadGraph graph) throws DatabaseException { + if (dndBrowseContext == null) + return null; + return dndBrowseContext.getAction(graph, target, data); + } + }, new Procedure() { + @Override + public void execute(Runnable result) { + if (result != null) + result.run(); + } + + @Override + public void exception(Throwable t) { + ErrorLogger.defaultLogError(t); + } + }); + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/properties/ChartAxisAndVariablesTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/properties/ChartAxisAndVariablesTab.java index dec67114..1e818b6a 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/properties/ChartAxisAndVariablesTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/chart/properties/ChartAxisAndVariablesTab.java @@ -74,7 +74,7 @@ public class ChartAxisAndVariablesTab extends LabelPropertyTabContributor { GridLayoutFactory.fillDefaults().numColumns(2).margins(3, 3).applyTo(composite); // (Ontology-based) GraphExplorer displaying range axis and variables mapped to those axis - explorer = new GraphExplorerComposite(ArrayMap.keys( + explorer = new AxisAndVariablesExplorerComposite(ArrayMap.keys( "displaySelectors", "displayFilter").values(false, false), site, composite, support, SWT.FULL_SELECTION | SWT.BORDER | SWT.SINGLE); explorer.setBrowseContexts(SysdynResource.URIs.ChartAxisAndVariablesBrowseContext); explorer.setInputSource(new SingleSelectionInputSource( -- 2.47.1