From f18790993f90716789425c2472f791e5d80ec3c2 Mon Sep 17 00:00:00 2001 From: villberg Date: Thu, 7 Jul 2011 12:55:42 +0000 Subject: [PATCH] Adding a workbook for configuration. git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@21424 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 65105 -> 65277 bytes .../Sysdyn_ModelBrowser_Viewpoint.pgraph | 10 ++- .../org/simantics/sysdyn/SysdynResource.java | 3 + org.simantics.sysdyn.ui/META-INF/MANIFEST.MF | 3 +- org.simantics.sysdyn.ui/adapters.xml | 2 +- .../browser/actions/OpenWorkbookAction.java | 82 ++++++++++++++++++ .../sysdyn/ui/project/SysdynProject.java | 63 ++++++++++++++ .../sysdyn/adapter/ConfigurationVariable.java | 18 ++-- 8 files changed, 169 insertions(+), 12 deletions(-) create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/OpenWorkbookAction.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index 6c7f849321afab0020354b0483cfb9386f94dad4..b633d258ad179412f8208215847fb2d1527fdadd 100644 GIT binary patch literal 65277 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 PF+sN$TYeP&2mk&r?HK;4 literal 65105 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 E0BYRB{{R30 diff --git a/org.simantics.sysdyn.ontology/graph/Sysdyn_ModelBrowser_Viewpoint.pgraph b/org.simantics.sysdyn.ontology/graph/Sysdyn_ModelBrowser_Viewpoint.pgraph index 015bb200..18248d92 100644 --- a/org.simantics.sysdyn.ontology/graph/Sysdyn_ModelBrowser_Viewpoint.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Sysdyn_ModelBrowser_Viewpoint.pgraph @@ -81,11 +81,19 @@ ACTIONS.NewEnumeration : ACT.Action ACTIONS.NewFunction : ACT.Action ACTIONS.NewFunctionLibrary : ACT.Action ACTIONS.NewSharedFunctionLibrary : ACT.Action +ACTIONS.OpenWorkbook : ACT.Action -MAC +MAC @VP.actionContribution "Module" SBC.ModulesFolder MBC.Images.Composite VP.NewActionCategory ACTIONS.NewModuleType + VP.BrowseContext.HasActionContribution _ : VP.ActionContribution + L0.HasLabel "Open Workbook" + VP.ActionContribution.HasImage MBC.Images.Component + VP.ActionContribution.HasNodeType MBC.Configuration + VP.ActionContribution.HasAction ACTIONS.OpenWorkbook + @VP.actionContribution "Enumeration" MBC.Configuration MBC.Images.Component VP.NewActionCategory ACTIONS.NewEnumeration + //@VP.actionContribution "Open Workbook" MBC.Configuration MBC.Images.Component VP.NewActionCategory ACTIONS.OpenWorkbook @VP.actionContribution "Enumeration" SBC.ModuleSymbol MBC.Images.Component VP.NewActionCategory ACTIONS.NewEnumeration @VP.actionContribution "Function" SBC.FunctionsFolder MBC.Images.Component VP.NewActionCategory ACTIONS.NewFunction @VP.actionContribution "Function" SYSDYN.SysdynModelicaFunctionLibrary MBC.Images.Component VP.NewActionCategory ACTIONS.NewFunction 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 74c7015d..5308d589 100644 --- a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java +++ b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java @@ -145,6 +145,7 @@ public class SysdynResource { public final Resource ProjectActionContext_Actions_NewFunctionLibrary; public final Resource ProjectActionContext_Actions_NewModuleType; public final Resource ProjectActionContext_Actions_NewSharedFunctionLibrary; + public final Resource ProjectActionContext_Actions_OpenWorkbook; public final Resource ProjectBrowseContext; public final Resource ProjectBrowseContext_BuiltinFunctions; public final Resource ProjectBrowseContext_FunctionsFolder; @@ -324,6 +325,7 @@ public class SysdynResource { public static final String ProjectActionContext_Actions_NewFunctionLibrary = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext/Actions/NewFunctionLibrary"; public static final String ProjectActionContext_Actions_NewModuleType = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext/Actions/NewModuleType"; public static final String ProjectActionContext_Actions_NewSharedFunctionLibrary = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext/Actions/NewSharedFunctionLibrary"; + public static final String ProjectActionContext_Actions_OpenWorkbook = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext/Actions/OpenWorkbook"; public static final String ProjectBrowseContext = "http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext"; public static final String ProjectBrowseContext_BuiltinFunctions = "http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext/BuiltinFunctions"; public static final String ProjectBrowseContext_FunctionsFolder = "http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext/FunctionsFolder"; @@ -513,6 +515,7 @@ public class SysdynResource { ProjectActionContext_Actions_NewFunctionLibrary = getResourceOrNull(graph, URIs.ProjectActionContext_Actions_NewFunctionLibrary); ProjectActionContext_Actions_NewModuleType = getResourceOrNull(graph, URIs.ProjectActionContext_Actions_NewModuleType); ProjectActionContext_Actions_NewSharedFunctionLibrary = getResourceOrNull(graph, URIs.ProjectActionContext_Actions_NewSharedFunctionLibrary); + ProjectActionContext_Actions_OpenWorkbook = getResourceOrNull(graph, URIs.ProjectActionContext_Actions_OpenWorkbook); ProjectBrowseContext = getResourceOrNull(graph, URIs.ProjectBrowseContext); ProjectBrowseContext_BuiltinFunctions = getResourceOrNull(graph, URIs.ProjectBrowseContext_BuiltinFunctions); ProjectBrowseContext_FunctionsFolder = getResourceOrNull(graph, URIs.ProjectBrowseContext_FunctionsFolder); diff --git a/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF b/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF index ed95e058..54792ffe 100644 --- a/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF +++ b/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF @@ -40,7 +40,8 @@ Require-Bundle: org.simantics.layer0.utils;bundle-version="0.6.2", org.simantics.graph;bundle-version="1.0.2", org.simantics.graph.db;bundle-version="1.0.0", org.simantics.structural.ui;bundle-version="1.1.1", - org.simantics.browsing.ui.model;bundle-version="1.0.0" + org.simantics.browsing.ui.model;bundle-version="1.0.0", + org.simantics.spreadsheet.ui;bundle-version="1.1.0" Bundle-Activator: org.simantics.sysdyn.ui.Activator Bundle-ActivationPolicy: lazy Export-Package: org.simantics.sysdyn.ui.browser.nodes diff --git a/org.simantics.sysdyn.ui/adapters.xml b/org.simantics.sysdyn.ui/adapters.xml index bb6ba6dd..f15dc9e0 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/actions/OpenWorkbookAction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/OpenWorkbookAction.java new file mode 100644 index 00000000..f233f3a4 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/OpenWorkbookAction.java @@ -0,0 +1,82 @@ +package org.simantics.sysdyn.ui.browser.actions; + +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.PossibleObjectWithType; +import org.simantics.db.common.request.ReadRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.ActionFactory; +import org.simantics.db.layer0.util.Simantics; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.db.layer0.variable.Variables; +import org.simantics.layer0.Layer0; +import org.simantics.modeling.ui.diagramEditor.OpenSheetAdapter; +import org.simantics.simulation.ontology.SimulationResource; +import org.simantics.spreadsheet.resource.SpreadsheetResource; +import org.simantics.ui.SimanticsUI; +import org.simantics.ui.workbench.ResourceEditorInput2; +import org.simantics.utils.ui.workbench.WorkbenchUtils; + +public class OpenWorkbookAction implements ActionFactory{ + + @Override + public Runnable create(Object target) { + + if(!(target instanceof Resource)) + return null; + + final Resource resource = (Resource)target; + + return new Runnable() { + + @Override + public void run() { + + try { + + SimanticsUI.getSession().asyncRequest(new ReadRequest() { + @Override + public void run(ReadGraph graph) throws DatabaseException { + + Layer0 L0 = Layer0.getInstance(graph); + SpreadsheetResource sr = SpreadsheetResource.getInstance(graph); + + Resource book = graph.syncRequest(new PossibleObjectWithType(resource, L0.ConsistsOf, sr.Book)); + final Resource sheet = graph.syncRequest(new PossibleObjectWithType(book, L0.ConsistsOf, sr.Spreadsheet)); + + SimulationResource SIMU = SimulationResource.getInstance(graph); + Variable variable = graph.adapt(sheet, Variable.class); + Resource model = Variables.getModel(graph, variable); + final String modelURI = graph.getURI(model); + final String RVI = Variables.getRVI(graph, variable); + + PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { + + private static final String EDITOR_ID = "org.simantics.spreadsheet.ui.editor2"; + + @Override + public void run() { + try { + System.out.println("Activating sheet: model=" + modelURI + " rvi=" + RVI); + WorkbenchUtils.openEditor(EDITOR_ID, new ResourceEditorInput2(EDITOR_ID, sheet, modelURI, RVI)); + } catch (PartInitException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + }); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + }; + + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java index 0147a2f2..366e0038 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java @@ -13,6 +13,7 @@ package org.simantics.sysdyn.ui.project; import java.io.File; import java.util.HashMap; +import java.util.UUID; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.IEclipsePreferences; @@ -54,6 +55,7 @@ import org.simantics.project.ontology.ProjectResource; import org.simantics.simulation.experiment.IExperiment; import org.simantics.simulation.ontology.SimulationResource; import org.simantics.simulation.project.IExperimentManager; +import org.simantics.spreadsheet.resource.SpreadsheetResource; import org.simantics.sysdyn.SysdynResource; import org.simantics.sysdyn.ui.Activator; import org.simantics.sysdyn.ui.editor.SysdynEditorNamingService; @@ -104,11 +106,63 @@ public class SysdynProject extends AbstractProjectFeature { } private final WriteRunnable CREATE_MODEL = new WriteRunnable() { + + Resource createSheet(WriteGraph graph, Resource book, String name, String[] colNames, int[] colWidths) throws DatabaseException { + + Layer0 L0 = Layer0.getInstance(graph); + SpreadsheetResource sr = SpreadsheetResource.getInstance(graph); + + Resource result = graph.newResource(); + graph.claim(result, L0.InstanceOf, null, sr.Spreadsheet); + + if(name == null) { + name = NameUtils.findFreshEscapedName(graph, "Sheet", book, sr.HasSheet); + } + graph.claimLiteral(result, L0.HasName, L0.NameOf, L0.String, name, Bindings.STRING); + graph.claim(book, L0.ConsistsOf, L0.PartOf, result); + + { + Resource newCell = graph.newResource(); + graph.claim(newCell, L0.InstanceOf, null, sr.DimensionsCell); + graph.claimLiteral(newCell, L0.HasName, L0.NameOf, L0.String, "Dimensions", Bindings.STRING); + graph.addLiteral(newCell, sr.FitColumns, sr.FitColumnsOf, L0.Boolean, true, Bindings.BOOLEAN); + graph.addLiteral(newCell, sr.FitRows, sr.FitRowsOf, L0.Boolean, true, Bindings.BOOLEAN); + graph.claim(result, L0.ConsistsOf, L0.PartOf, newCell); + } + + { + Resource newCell = graph.newResource(); + graph.claimLiteral(newCell, L0.HasName, L0.NameOf, L0.String, "Headers", Bindings.STRING); + graph.claim(newCell, L0.InstanceOf, null, sr.HeadersCell); + graph.addLiteral(newCell, sr.ColumnLabels, sr.ColumnLabelsOf, L0.StringArray, colNames, Bindings.getBindingUnchecked(String[].class)); + graph.addLiteral(newCell, sr.ColumnWidths, sr.ColumnWidthsOf, L0.IntegerArray, colWidths, Bindings.INT_ARRAY); + graph.claim(result, L0.ConsistsOf, L0.PartOf, newCell); + } + + { + + double[] doubles = new double[10*10]; + for(int i=0;i<10*10;i++) doubles[i] = i; + + Resource newCell = graph.newResource(); + graph.claim(newCell, L0.InstanceOf, null, sr.DoubleArrayCell); + graph.addLiteral(newCell, sr.DoubleArrayCell_HasWidth, sr.DoubleArrayCell_HasWidth_Inverse, L0.Integer, 10, Bindings.INTEGER); + graph.addLiteral(newCell, sr.HasLocation, sr.HasLocation_Inverse, L0.String, "A1", Bindings.STRING); + graph.addLiteral(newCell, sr.DoubleArrayCell_HasDoubleArray, sr.DoubleArrayCell_HasDoubleArray_Inverse, L0.DoubleArray, doubles, Bindings.DOUBLE_ARRAY); + graph.claim(result, L0.HasChildVariables, L0.HasChildVariables_Inverse, newCell); + + } + + return result; + + } + @Override public void run(WriteGraph g, Resource library, Callback callback, Callback errorCallback) { try { Layer0 l0 = Layer0.getInstance(g); SysdynResource sr = SysdynResource.getInstance(g); + SpreadsheetResource SHEET = SpreadsheetResource.getInstance(g); ModelingUtils mu = new ModelingUtils(g); String modelName = NameUtils.findFreshName(g, "Model", SimanticsUI.getProject().get(), l0.ConsistsOf, "%s%d"); @@ -135,6 +189,15 @@ public class SysdynProject extends AbstractProjectFeature { g.claim(model, mu.SIMU.HasConfiguration, conf); + Resource book = g.newResource(); + g.claim(book, l0.InstanceOf, null, SHEET.Book); + g.addLiteral(book, l0.HasName, l0.NameOf, l0.String, "Book" + UUID.randomUUID().toString(), Bindings.STRING); + g.claim(conf, l0.ConsistsOf, l0.PartOf, book); + + createSheet(g, book, "Sheet1", new String[] { "ARG" }, new int[] { 50 }); + + + ModelingResources mr = ModelingResources.getInstance(g); // Remove default mapping and add sysdyn mapping for(Resource trigger : g.getObjects(diagram, l0.HasTrigger)) { diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ConfigurationVariable.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ConfigurationVariable.java index 1402f225..859e5d7f 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ConfigurationVariable.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ConfigurationVariable.java @@ -29,15 +29,15 @@ public class ConfigurationVariable extends StandardGraphChildVariable { super(resource); } - @Override - public Variable getPossibleChild(ReadGraph graph, String name) throws DatabaseException { - Map children = graph.syncRequest(new UnescapedChildMapOfResource(resource)); - Resource child = children.get(name); - if(child == null) { - return getPossibleSpecialChild(graph, name); - } - else return graph.adaptContextual(child, this, Variable.class, Variable.class); - } +// @Override +// public Variable getPossibleChild(ReadGraph graph, String name) throws DatabaseException { +// Map children = graph.syncRequest(new UnescapedChildMapOfResource(resource)); +// Resource child = children.get(name); +// if(child == null) { +// return getPossibleSpecialChild(graph, name); +// } +// else return graph.adaptContextual(child, this, Variable.class, Variable.class); +// } @Override -- 2.47.1