From 54ef80e22d4aa225b04fdc68b7546a5608f04a81 Mon Sep 17 00:00:00 2001 From: lempinen Date: Fri, 1 Jul 2011 06:59:44 +0000 Subject: [PATCH] Started updating to new model browser. git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@21408 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 59203 -> 65105 bytes .../Sysdyn_ModelBrowser_Viewpoint.pgraph | 81 ++++++++++++- .../org/simantics/sysdyn/SysdynResource.java | 48 ++++++++ org.simantics.sysdyn.ui/adapters.xml | 2 +- org.simantics.sysdyn.ui/plugin.xml | 8 ++ .../sysdyn/ui/browser/SysdynModelBrowser.java | 2 +- .../browser/actions/NewEnumerationAction.java | 67 +++++++++++ .../ui/browser/actions/NewFunctionAction.java | 59 ++++++++++ .../actions/NewFunctionLibraryAction.java | 86 ++++++++++++++ .../browser/actions/NewModuleTypeAction.java | 107 ++++++++++++++++++ .../NewSharedFunctionLibraryAction.java | 22 ++++ .../childrules/ModuleContentChildRule.java | 56 +++++++++ .../childrules/ModuleTypeChildRule.java | 6 +- .../labelrules/ModuleTypeLabelRule.java | 32 ++++++ .../ui/handlers/ImportFunctionLibrary.java | 38 +++---- .../ui/handlers/NewFunctionHandler.java | 2 +- .../sysdyn/ui/project/SysdynProject.java | 5 - 17 files changed, 585 insertions(+), 36 deletions(-) create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewEnumerationAction.java create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewFunctionAction.java create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewFunctionLibraryAction.java create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewModuleTypeAction.java create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewSharedFunctionLibraryAction.java create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/childrules/ModuleContentChildRule.java create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/labelrules/ModuleTypeLabelRule.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index ddf5cc1bb8e7b6a74b73fb3d0b0a115c2542fe18..6c7f849321afab0020354b0483cfb9386f94dad4 100644 GIT binary patch literal 65105 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 E0BYRB{{R30 literal 59203 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 +SBC.BuiltinFunctions : VP.ResourceNodeType +SBC.ModuleTypeChildRule : VP.ChildRule +SBC.ModuleTypeLabelRule : VP.LabelRule MBC - @VP.relationChildRule MOD.StructuralModel L0.ConsistsOf SYSDYN.ModulesLibrary + // Function libraries + // Functions folder + @VP.relationChildRuleWithFolder MOD.StructuralModel L0.ConsistsOf SYSDYN.SysdynModelicaFunction + SBC.FunctionsFolder : VP.ResourceNodeType + @VP.relationChildRule SBC.FunctionsFolder L0.ConsistsOf SYSDYN.SysdynModelicaFunctionLibrary + // Function libraries + @VP.relationChildRule SYSDYN.SysdynModelicaFunctionLibrary L0.ConsistsOf SYSDYN.SysdynModelicaFunctionLibrary + @VP.relationChildRule SYSDYN.SysdynModelicaFunctionLibrary L0.ConsistsOf SYSDYN.SysdynModelicaFunction + // Built-in functions VP.BrowseContext.HasChildContribution _ : VP.ChildContribution - VP.ChildContribution.HasParentNodeType SYSDYN.ModulesLibrary - VP.ChildContribution.HasChildNodeType L0.Entity - VP.ChildContribution.HasRule SBC.ModuleTypeChildRule : VP.ChildRule \ No newline at end of file + VP.ChildContribution.HasParentNodeType SBC.FunctionsFolder + VP.ChildContribution.HasChildNodeType SBC.BuiltinFunctions + VP.ChildContribution.HasRule _ : VP.ConstantChildRule + VP.ConstantChildRule.HasChild BuiltinFunctions + // Shared functions linked to a model + @VP.relationChildRuleWithFolder SBC.FunctionsFolder L0.IsLinkedTo SYSDYN.SharedFunctionOntology + SBC.SharedFunctionsFolder : VP.ResourceNodeType + + + //Modules + @VP.equalContentChildRule MOD.StructuralModel + SBC.ModulesFolder : VP.ResourceNodeType + @VP.customChildRule SBC.ModulesFolder SBC.ModuleTypeChildRule + SBC.ModuleSymbol : VP.ResourceNodeType + @VP.customChildRule SBC.ModuleSymbol SBC.ModuleContentChildRule STR.Component + + +// Labels +MBC + @VP.constantLabelRule SBC.FunctionsFolder "Functions" + @VP.constantLabelRule SBC.SharedFunctionsFolder "Shared Functions" + @VP.constantLabelRule SBC.ModulesFolder "Modules" + @VP.customLabelRule SBC.BuiltinFunctions VP.ResourceNameLabelRule + @VP.customLabelRule SBC.ModuleSymbol SBC.ModuleTypeLabelRule + + +// Images +MBC + @VP.constantImageRule SBC.FunctionsFolder MBC.Images.Folder + @VP.constantImageRule SBC.SharedFunctionsFolder MBC.Images.Folder + @VP.constantImageRule SYSDYN.SysdynModelicaFunction MBC.Images.Component + @VP.constantImageRule SBC.ModulesFolder MBC.Images.Folder + @VP.constantImageRule SBC.ModuleSymbol MBC.Images.Composite + @VP.constantImageRule SBC.BuiltinFunctions MBC.Images.Folder + +// Modifiers +MBC + @VP.customLabelRule SYSDYN.SysdynModelicaFunction VP.ResourceNameModifierRule + + +// Actions +ACTIONS = SAC.Actions : L0.Library + +// NEW -Actions +ACTIONS.NewModuleType : ACT.Action +ACTIONS.NewEnumeration : ACT.Action +ACTIONS.NewFunction : ACT.Action +ACTIONS.NewFunctionLibrary : ACT.Action +ACTIONS.NewSharedFunctionLibrary : ACT.Action + + +MAC + @VP.actionContribution "Module" SBC.ModulesFolder MBC.Images.Composite VP.NewActionCategory ACTIONS.NewModuleType + @VP.actionContribution "Enumeration" MBC.Configuration MBC.Images.Component VP.NewActionCategory ACTIONS.NewEnumeration + @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 + @VP.actionContribution "Function" SYSDYN.SharedFunctionOntology MBC.Images.Component VP.NewActionCategory ACTIONS.NewFunction + @VP.actionContribution "Function Library" SBC.FunctionsFolder MBC.Images.Folder VP.NewActionCategory ACTIONS.NewFunctionLibrary + @VP.actionContribution "Function Library" SYSDYN.SysdynModelicaFunctionLibrary MBC.Images.Folder VP.NewActionCategory ACTIONS.NewFunctionLibrary + @VP.actionContribution "Function Library" SYSDYN.SharedFunctionOntology MBC.Images.Folder VP.NewActionCategory ACTIONS.NewFunctionLibrary + @VP.actionContribution "Shared Function Library" SBC.SharedFunctionsFolder MBC.Images.Folder VP.NewActionCategory ACTIONS.NewSharedFunctionLibrary \ 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 a363ff30..74c7015d 100644 --- a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java +++ b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java @@ -138,6 +138,22 @@ public class SysdynResource { public final Resource ModuleSymbol; public final Resource NormalExpression; public final Resource ParameterExpression; + public final Resource ProjectActionContext; + public final Resource ProjectActionContext_Actions; + public final Resource ProjectActionContext_Actions_NewEnumeration; + public final Resource ProjectActionContext_Actions_NewFunction; + public final Resource ProjectActionContext_Actions_NewFunctionLibrary; + public final Resource ProjectActionContext_Actions_NewModuleType; + public final Resource ProjectActionContext_Actions_NewSharedFunctionLibrary; + public final Resource ProjectBrowseContext; + public final Resource ProjectBrowseContext_BuiltinFunctions; + public final Resource ProjectBrowseContext_FunctionsFolder; + public final Resource ProjectBrowseContext_ModuleContentChildRule; + public final Resource ProjectBrowseContext_ModuleSymbol; + public final Resource ProjectBrowseContext_ModuleTypeChildRule; + public final Resource ProjectBrowseContext_ModuleTypeLabelRule; + public final Resource ProjectBrowseContext_ModulesFolder; + public final Resource ProjectBrowseContext_SharedFunctionsFolder; public final Resource Redeclaration; public final Resource RefersTo; public final Resource ReplacedEnumeration; @@ -301,6 +317,22 @@ public class SysdynResource { public static final String ModuleSymbol = "http://www.simantics.org/Sysdyn-1.0/ModuleSymbol"; public static final String NormalExpression = "http://www.simantics.org/Sysdyn-1.0/NormalExpression"; public static final String ParameterExpression = "http://www.simantics.org/Sysdyn-1.0/ParameterExpression"; + public static final String ProjectActionContext = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext"; + public static final String ProjectActionContext_Actions = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext/Actions"; + public static final String ProjectActionContext_Actions_NewEnumeration = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext/Actions/NewEnumeration"; + public static final String ProjectActionContext_Actions_NewFunction = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext/Actions/NewFunction"; + 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 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"; + public static final String ProjectBrowseContext_ModuleContentChildRule = "http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext/ModuleContentChildRule"; + public static final String ProjectBrowseContext_ModuleSymbol = "http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext/ModuleSymbol"; + public static final String ProjectBrowseContext_ModuleTypeChildRule = "http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext/ModuleTypeChildRule"; + public static final String ProjectBrowseContext_ModuleTypeLabelRule = "http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext/ModuleTypeLabelRule"; + public static final String ProjectBrowseContext_ModulesFolder = "http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext/ModulesFolder"; + public static final String ProjectBrowseContext_SharedFunctionsFolder = "http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext/SharedFunctionsFolder"; public static final String Redeclaration = "http://www.simantics.org/Sysdyn-1.0/Redeclaration"; public static final String RefersTo = "http://www.simantics.org/Sysdyn-1.0/RefersTo"; public static final String ReplacedEnumeration = "http://www.simantics.org/Sysdyn-1.0/ReplacedEnumeration"; @@ -474,6 +506,22 @@ public class SysdynResource { ModuleSymbol = getResourceOrNull(graph, URIs.ModuleSymbol); NormalExpression = getResourceOrNull(graph, URIs.NormalExpression); ParameterExpression = getResourceOrNull(graph, URIs.ParameterExpression); + ProjectActionContext = getResourceOrNull(graph, URIs.ProjectActionContext); + ProjectActionContext_Actions = getResourceOrNull(graph, URIs.ProjectActionContext_Actions); + ProjectActionContext_Actions_NewEnumeration = getResourceOrNull(graph, URIs.ProjectActionContext_Actions_NewEnumeration); + ProjectActionContext_Actions_NewFunction = getResourceOrNull(graph, URIs.ProjectActionContext_Actions_NewFunction); + 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); + ProjectBrowseContext = getResourceOrNull(graph, URIs.ProjectBrowseContext); + ProjectBrowseContext_BuiltinFunctions = getResourceOrNull(graph, URIs.ProjectBrowseContext_BuiltinFunctions); + ProjectBrowseContext_FunctionsFolder = getResourceOrNull(graph, URIs.ProjectBrowseContext_FunctionsFolder); + ProjectBrowseContext_ModuleContentChildRule = getResourceOrNull(graph, URIs.ProjectBrowseContext_ModuleContentChildRule); + ProjectBrowseContext_ModuleSymbol = getResourceOrNull(graph, URIs.ProjectBrowseContext_ModuleSymbol); + ProjectBrowseContext_ModuleTypeChildRule = getResourceOrNull(graph, URIs.ProjectBrowseContext_ModuleTypeChildRule); + ProjectBrowseContext_ModuleTypeLabelRule = getResourceOrNull(graph, URIs.ProjectBrowseContext_ModuleTypeLabelRule); + ProjectBrowseContext_ModulesFolder = getResourceOrNull(graph, URIs.ProjectBrowseContext_ModulesFolder); + ProjectBrowseContext_SharedFunctionsFolder = getResourceOrNull(graph, URIs.ProjectBrowseContext_SharedFunctionsFolder); Redeclaration = getResourceOrNull(graph, URIs.Redeclaration); RefersTo = getResourceOrNull(graph, URIs.RefersTo); ReplacedEnumeration = getResourceOrNull(graph, URIs.ReplacedEnumeration); diff --git a/org.simantics.sysdyn.ui/adapters.xml b/org.simantics.sysdyn.ui/adapters.xml index 6db4046b..bb6ba6dd 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/plugin.xml b/org.simantics.sysdyn.ui/plugin.xml index f8db234d..487b4742 100644 --- a/org.simantics.sysdyn.ui/plugin.xml +++ b/org.simantics.sysdyn.ui/plugin.xml @@ -269,12 +269,14 @@ locationURI="popup:#SysdynBrowserPopup?after=wbStart"> + + + + + browseContexts = new HashSet(Arrays.asList("http://www.simantics.org/Sysdyn-1.0/ModelBrowser", "http://www.simantics.org/Operating-1.0/Browser", "http://www.simantics.org/Image-1.0/Browser")); + final private Set browseContexts = new HashSet(Arrays.asList("http://www.simantics.org/Sysdyn-1.0/ProjectBrowseContext", "http://www.simantics.org/Operating-1.0/Browser", "http://www.simantics.org/Image-1.0/Browser")); @Override protected IPropertyPage getPropertyPage() { diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewEnumerationAction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewEnumerationAction.java new file mode 100644 index 00000000..4ac2459d --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewEnumerationAction.java @@ -0,0 +1,67 @@ +package org.simantics.sysdyn.ui.browser.actions; + +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.common.utils.OrderedSetUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.ActionFactory; +import org.simantics.layer0.Layer0; +import org.simantics.layer0.utils.direct.GraphUtils; +import org.simantics.modeling.ModelingResources; +import org.simantics.structural.stubs.StructuralResource2; +import org.simantics.sysdyn.SysdynResource; +import org.simantics.ui.SimanticsUI; + +public class NewEnumerationAction 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() { + + + SimanticsUI.getSession().asyncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + SysdynResource sr = SysdynResource.getInstance(g); + Layer0 l0 = Layer0.getInstance(g); + + Resource configuration = null; + if(g.isInstanceOf(resource, sr.Configuration)) { + configuration = resource; + } else if(g.isInheritedFrom(resource, sr.ModuleSymbol)) { + Resource module = g.getPossibleObject(resource,ModelingResources.getInstance(g).SymbolToComponentType); + configuration = g.getPossibleObject(module, StructuralResource2.getInstance(g).IsDefinedBy); + } else { + Resource instanceOf = g.getSingleObject(resource, l0.InstanceOf); + if(g.isInheritedFrom(instanceOf, sr.Module)) { + configuration = g.getPossibleObject(instanceOf, StructuralResource2.getInstance(g).IsDefinedBy); + } else { + return; + } + } + + Resource enumerationIndexes = OrderedSetUtils.create(g, sr.EnumerationIndexes); + + String name = NameUtils.findFreshName(g, "Enum", configuration, l0.ConsistsOf, "%s%d"); + + GraphUtils.create2(g, + sr.Enumeration, + l0.HasName, name, + sr.HasEnumerationIndexes, enumerationIndexes, + l0.PartOf, configuration); + } + }); + } + }; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewFunctionAction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewFunctionAction.java new file mode 100644 index 00000000..e52c0e9a --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewFunctionAction.java @@ -0,0 +1,59 @@ +package org.simantics.sysdyn.ui.browser.actions; + +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.ActionFactory; +import org.simantics.layer0.Layer0; +import org.simantics.layer0.utils.direct.GraphUtils; +import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.manager.FunctionUtils; +import org.simantics.ui.SimanticsUI; + +public class NewFunctionAction 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() { + + SimanticsUI.getSession().asyncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + Layer0 l0 = Layer0.getInstance(g); + SysdynResource sr = SysdynResource.getInstance(g); + + Resource library = null; + if(g.isInstanceOf(resource, sr.SysdynModel) || g.isInstanceOf(resource, l0.Library)) + library = resource; + else if (g.isInstanceOf(resource, sr.SysdynModelicaFunction)) + library = g.getPossibleObject(resource, l0.PartOf); + + if(library == null) + return; + + + String name = NameUtils.findFreshName(g, "Function", library, l0.ConsistsOf, "%s%d"); + + GraphUtils.create2(g, sr.SysdynModelicaFunction, + l0.HasName, name, + l0.HasDescription, "", + sr.HasModelicaFunctionCode, "", + l0.PartOf, library); + + FunctionUtils.updateFunctionFileForLibrary(g, library); + } + }); + + } + }; + } +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewFunctionLibraryAction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewFunctionLibraryAction.java new file mode 100644 index 00000000..1064e019 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewFunctionLibraryAction.java @@ -0,0 +1,86 @@ +package org.simantics.sysdyn.ui.browser.actions; + +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.exception.ResourceNotFoundException; +import org.simantics.db.layer0.adapter.ActionFactory; +import org.simantics.layer0.Layer0; +import org.simantics.layer0.utils.direct.GraphUtils; +import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.manager.FunctionUtils; +import org.simantics.ui.SimanticsUI; + +public class NewFunctionLibraryAction 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() { + createLibrary(resource, false); + } + }; + } + + /** + * Create a new Library to the selected root or to SharedOntologies + * + * @param libraryLocation Resource of the model or other + * library where the new library will be added. + * @param shared is the library a shared library + */ + protected static void createLibrary(final Resource libraryLocation, final boolean shared) { + SimanticsUI.getSession().asyncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + Layer0 l0 = Layer0.getInstance(g); + SysdynResource sr = SysdynResource.getInstance(g); + + if(!(g.isInstanceOf(libraryLocation, sr.SysdynModel) || + g.isInstanceOf(libraryLocation, sr.SysdynModelicaFunctionLibrary) || + g.isInstanceOf(libraryLocation, sr.SharedFunctionOntology))) + return; + + Resource root = libraryLocation; + + String name = "FunctionLibrary"; + Resource libraryType = sr.SysdynModelicaFunctionLibrary; + + if(shared) { + + try { + root = g.getResource("http://SharedOntologies"); + } catch (ResourceNotFoundException e) { + root = g.getResource("http:/"); + root = GraphUtils.create2(g, l0.Library, + l0.HasName, "SharedOntologies", + l0.PartOf, root); + } + + name = "Shared" + name; + libraryType = sr.SharedFunctionOntology; + } + + name = NameUtils.findFreshName(g, name, root, l0.ConsistsOf, "%s%d"); + + Resource functionLibrary = GraphUtils.create2(g, libraryType, + l0.HasName, name, + l0.HasDescription, "", + l0.PartOf, root); + + if(shared) + g.claim(libraryLocation, l0.IsLinkedTo, functionLibrary); + + FunctionUtils.updateFunctionFileForLibrary(g, functionLibrary); + } + }); + } +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewModuleTypeAction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewModuleTypeAction.java new file mode 100644 index 00000000..81a7a21a --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewModuleTypeAction.java @@ -0,0 +1,107 @@ +package org.simantics.sysdyn.ui.browser.actions; + +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.common.utils.OrderedSetUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.ActionFactory; +import org.simantics.db.layer0.adapter.Template; +import org.simantics.diagram.stubs.DiagramResource; +import org.simantics.layer0.Layer0; +import org.simantics.layer0.utils.direct.GraphUtils; +import org.simantics.modeling.ModelingResources; +import org.simantics.structural.stubs.StructuralResource2; +import org.simantics.sysdyn.SysdynResource; +import org.simantics.ui.SimanticsUI; +import org.simantics.utils.datastructures.ArrayMap; + +public class NewModuleTypeAction implements ActionFactory{ + + @Override + public Runnable create(Object target) { + if(!(target instanceof Resource)) + return null; + final Resource model = (Resource)target; + + return new Runnable() { + @Override + public void run() { + SimanticsUI.getSession().asyncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph g) throws DatabaseException { + // Same as in SysdynProject.java. Should use the same code, not copy. + SysdynResource sr = SysdynResource.getInstance(g); + Layer0 l0 = Layer0.getInstance(g); + ModelingResources mr = ModelingResources.getInstance(g); + StructuralResource2 sr2 = StructuralResource2.getInstance(g); + DiagramResource dr = DiagramResource.getInstance(g); + + String name = NameUtils.findFreshName(g, "ModuleType", model, l0.ConsistsOf, "%s%d"); + + Resource moduleType = g.newResource(); + g.claimLiteral(moduleType, l0.HasName, name); + g.claim(moduleType, l0.Inherits, sr.Module); + g.claim(moduleType, l0.PartOf, model); + + Resource configuration = GraphUtils.create2(g, + sr.Configuration, + l0.HasName, name + "Configuration", + l0.PartOf, moduleType); + + g.claim(moduleType, sr2.IsDefinedBy , configuration); + + Resource diagram = g.newResource(); + g.adapt(sr.ConfigurationDiagramTemplate, Template.class).apply(g, + ArrayMap + .keys("", "diagram", "name") + .values(configuration, diagram, "Diagrammi") + ); + + + // Remove default mapping and add sysdyn mapping + for(Resource trigger : g.getObjects(diagram, l0.HasTrigger)) { + if(g.isInstanceOf(trigger, mr.DiagramToCompositeMapping)) { + g.deny(diagram, l0.HasTrigger, trigger); + } + } + Resource mapping = g.newResource(); + g.claim(mapping, l0.InstanceOf, null, sr.DiagramToCompositeMapping); + g.claim(diagram, l0.HasTrigger, mapping); + + Resource moduleSymbol = g.newResource(); + g.claimLiteral(moduleSymbol, l0.HasName, name + " Symbol"); + g.claimLiteral(moduleSymbol, l0.HasLabel, name + " Symbol"); + g.claim(moduleSymbol, l0.Inherits, sr.ModuleSymbol); + g.claim(moduleSymbol, mr.SymbolToComponentType, moduleType); + g.claim(moduleSymbol, l0.PartOf, moduleType); + + Resource terminal = g.newResource(); + g.claim(terminal, l0.InstanceOf, sr.SysdynTerminal); + Resource connectionVariable = g.newResource(); + g.claim(connectionVariable, l0.InstanceOf, sr2.ConnectionVariable); + g.claim(connectionVariable, sr2.Binds, sr.IsHeadOfTerminal); + g.claim(connectionVariable, sr2.IsParameterOf, moduleSymbol); + g.claim(terminal, dr.HasConnectionVariable, connectionVariable); + + + Resource terminal2 = g.newResource(); + g.claim(terminal2, l0.InstanceOf, sr.SysdynTerminal); + Resource connectionVariable2 = g.newResource(); + g.claim(connectionVariable2, l0.InstanceOf, sr2.ConnectionVariable); + g.claim(connectionVariable2, sr2.Binds, sr.IsTailOfTerminal); + g.claim(connectionVariable2, sr2.IsParameterOf, moduleSymbol); + g.claim(terminal2, dr.HasConnectionVariable, connectionVariable2); + + g.claim(moduleSymbol, sr2.IsDefinedBy, OrderedSetUtils.create(g, sr2.Composite, terminal, terminal2)); + + + } + }); + } + }; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewSharedFunctionLibraryAction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewSharedFunctionLibraryAction.java new file mode 100644 index 00000000..c5bdeba4 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/actions/NewSharedFunctionLibraryAction.java @@ -0,0 +1,22 @@ +package org.simantics.sysdyn.ui.browser.actions; + +import org.simantics.db.Resource; + +public class NewSharedFunctionLibraryAction extends NewFunctionLibraryAction { + + + @Override + public Runnable create(Object target) { + if(!(target instanceof Resource)) + return null; + final Resource resource = (Resource)target; + + return new Runnable() { + @Override + public void run() { + createLibrary(resource, true); + } + }; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/childrules/ModuleContentChildRule.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/childrules/ModuleContentChildRule.java new file mode 100644 index 00000000..3bb27557 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/childrules/ModuleContentChildRule.java @@ -0,0 +1,56 @@ +package org.simantics.sysdyn.ui.browser.childrules; + +import java.util.ArrayList; +import java.util.Collection; + +import org.simantics.browsing.ui.model.children.ChildRule; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ObjectsWithType; +import org.simantics.db.exception.DatabaseException; +import org.simantics.layer0.Layer0; +import org.simantics.modeling.ModelingResources; +import org.simantics.structural.stubs.StructuralResource2; + +public class ModuleContentChildRule implements ChildRule { + + @Override + public boolean isCompatible(Class contentType) { + return contentType.equals(Resource.class); + } + + @Override + public Collection getChildren(ReadGraph graph, Object parent) throws DatabaseException { + ArrayList children = new ArrayList(); + + if(!(parent instanceof Resource)) { + return children; + } + + Layer0 l0 = Layer0.getInstance(graph); + StructuralResource2 str = StructuralResource2.getInstance(graph); + + Resource symbol = (Resource)parent; + + Resource component = graph.getPossibleObject(symbol,ModelingResources.getInstance(graph).SymbolToComponentType); + + if(component == null) + return children; + + Resource configuration = graph.getSingleObject(component, str.IsDefinedBy); + + if(configuration == null) + return children; + + children.addAll(graph.syncRequest(new ObjectsWithType(configuration, l0.ConsistsOf, str.Component))); + + return children; + } + + @Override + public Collection getParents(ReadGraph graph, Object child) + throws DatabaseException { + return new ArrayList(); + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/childrules/ModuleTypeChildRule.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/childrules/ModuleTypeChildRule.java index 7b5d7646..7afcb1b9 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/childrules/ModuleTypeChildRule.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/childrules/ModuleTypeChildRule.java @@ -34,9 +34,9 @@ public class ModuleTypeChildRule implements ChildRule { Layer0 l0 = Layer0.getInstance(graph); StructuralResource2 st = StructuralResource2.getInstance(graph); - Resource modulelibrary = (Resource)parent; - - Resource model = graph.getSingleObject(modulelibrary, l0.PartOf); + Resource model = (Resource)parent; + if(!graph.isInstanceOf(model, SysdynResource.getInstance(graph).SysdynModel)) + return children; for(Resource r : graph.syncRequest(new ObjectsWithType(model, l0.ConsistsOf, st.ComponentType))) { if(graph.isInheritedFrom(r, SysdynResource.getInstance(graph).Module)) { diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/labelrules/ModuleTypeLabelRule.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/labelrules/ModuleTypeLabelRule.java new file mode 100644 index 00000000..90d72345 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/labelrules/ModuleTypeLabelRule.java @@ -0,0 +1,32 @@ +package org.simantics.sysdyn.ui.browser.labelrules; + +import java.util.Collections; +import java.util.Map; + +import org.simantics.browsing.ui.common.ColumnKeys; +import org.simantics.browsing.ui.model.labels.LabelRule; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.modeling.ModelingResources; + +public class ModuleTypeLabelRule implements LabelRule { + public static final ModuleTypeLabelRule INSTANCE = new ModuleTypeLabelRule(); + + @Override + public boolean isCompatible(Class contentType) { + return contentType.equals(Resource.class); + } + + @Override + public Map getLabel(ReadGraph graph, Object content) throws DatabaseException { + Resource symbol = (Resource)content; + Resource component = graph.getSingleObject(symbol, ModelingResources.getInstance(graph).SymbolToComponentType); + + return Collections.singletonMap(ColumnKeys.SINGLE, + NameUtils.getSafeName(graph, component) + ); + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/ImportFunctionLibrary.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/ImportFunctionLibrary.java index 3b6bc8e1..4730432c 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/ImportFunctionLibrary.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/ImportFunctionLibrary.java @@ -144,18 +144,33 @@ public class ImportFunctionLibrary extends AbstractHandler { @Override public void perform(WriteGraph graph) throws DatabaseException { - if(!graph.isInstanceOf(root, SysdynResource.getInstance(graph).SysdynModelicaFunctionLibrary)) { - Resource instanceOf = graph.getPossibleObject(root, Layer0.getInstance(graph).InstanceOf); + Layer0 l0 = Layer0.getInstance(graph); + if(graph.isInstanceOf(root, SysdynResource.getInstance(graph).SharedFunctionOntology)) { + Resource library = graph.getResource("http://SharedOntologies"); + if(!graph.hasStatement(library, l0.ConsistsOf, root)) { + graph.claim(library, l0.ConsistsOf, root); + } + + SysdynResource sr = SysdynResource.getInstance(graph); + Resource model = functionLibrary; + while(!graph.isInstanceOf(model, sr.SysdynModel) && graph.isInstanceOf(model, l0.Ontology)) + model = graph.getSingleObject(model, l0.PartOf); + if(graph.isInstanceOf(model, sr.SysdynModel)) { + graph.claim(model, l0.IsLinkedTo, l0.IsLinkedTo_Inverse, root); + } + + } else if(!graph.isInstanceOf(root, SysdynResource.getInstance(graph).SysdynModelicaFunctionLibrary)) { + Resource instanceOf = graph.getPossibleObject(root,l0.InstanceOf); String type = "..."; if(instanceOf != null) type = NameUtils.getSafeName(graph, instanceOf); else { - Resource inheritedFrom = graph.getPossibleObject(root, Layer0.getInstance(graph).Inherits); + Resource inheritedFrom = graph.getPossibleObject(root, l0.Inherits); if(inheritedFrom != null) type = NameUtils.getSafeName(graph, inheritedFrom); } final String ft = type; - graph.deny(root, Layer0.getInstance(graph).PartOf); + graph.deny(root, l0.PartOf); shell.getDisplay().asyncExec(new Runnable() { @@ -177,9 +192,6 @@ public class ImportFunctionLibrary extends AbstractHandler { } private class SysdynFunctionLibraryImportAdvisor extends DefaultPasteImportAdvisor { - - - Resource model = null; public SysdynFunctionLibraryImportAdvisor(Resource library) { super(library); @@ -188,16 +200,7 @@ public class ImportFunctionLibrary extends AbstractHandler { @Override public void analyzeType(ReadGraph graph, Root root) throws DatabaseException { if(root.type.equals(SysdynResource.URIs.SharedFunctionOntology)) { - library = null; try { - SysdynResource sr = SysdynResource.getInstance(graph); - Layer0 l0 = Layer0.getInstance(graph); - Resource r = library; - while(!graph.isInstanceOf(r, sr.SysdynModel) && graph.isInstanceOf(r, l0.Ontology)) - r = graph.getSingleObject(r, l0.PartOf); - if(graph.isInstanceOf(r, sr.SysdynModel)) - model = r; - library = graph.getResource("http://SharedOntologies"); } catch (ResourceNotFoundException e) { e.printStackTrace(); @@ -213,9 +216,6 @@ public class ImportFunctionLibrary extends AbstractHandler { String name = root.name; String newName = nameMappings.get(name); graph.addLiteral(this.root, l0.HasName, l0.NameOf, l0.String, newName, Bindings.STRING); - if(model != null && root.type.equals(SysdynResource.URIs.SharedFunctionOntology)) { - graph.claim(model, l0.IsLinkedTo, l0.IsLinkedTo_Inverse, this.root); - } return this.root; } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewFunctionHandler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewFunctionHandler.java index 41080156..881281f0 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewFunctionHandler.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewFunctionHandler.java @@ -29,7 +29,7 @@ import org.simantics.sysdyn.manager.FunctionUtils; import org.simantics.ui.SimanticsUI; import org.simantics.ui.utils.AdaptionUtils; -public class NewFunctionHandler extends AbstractHandler { +public class NewFunctionHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { 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 3f6cde47..0147a2f2 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 @@ -154,11 +154,6 @@ public class SysdynProject extends AbstractProjectFeature { l0.HasReportFactory, report, l0.PartOf, model); - //model browser2 - Resource moduleslibrary = g.newResource(); - g.claim(moduleslibrary, l0.InstanceOf, sr.ModulesLibrary); - g.claim(model, l0.ConsistsOf, moduleslibrary); - ProjectResource PROJ = ProjectResource.getInstance(g); for(Resource dep : g.getObjects(library, l0.IsLinkedTo)) { if(g.isInstanceOf(dep, PROJ.NamespaceRequirement)) { -- 2.47.1