importJava "org.simantics.datatypes.literal.GUID" where\r
\r
data GUID\r
- \r
+\r
+instance Show GUID where\r
+ show guid = guidIndexString guid\r
+\r
+importJava "org.simantics.datatypes.literal.GUID" where\r
@JavaName "BINDING"\r
guidBinding :: Binding a\r
@JavaName random\r
Layer0 L0 = Layer0.getInstance(graph);\r
if (graph.isInstanceOf(r, L0.Assertion)) {\r
Resource pred = graph.getSingleObject(r, L0.HasPredicate);\r
- Resource obj = graph.getSingleObject(r, L0.HasObject);\r
- String tmp = htmlEscape( getResourceName(graph, pred) + " -> " + getResourceName(graph, obj) + " (Assertion)" );\r
+ // Don't know how I encountered this but it seems to be possible in some cases..\r
+ // Resource obj = graph.getSingleObject(r, L0.HasObject);\r
+ Resource obj = graph.getPossibleObject(r, L0.HasObject);\r
+ String tmp = htmlEscape( getResourceName(graph, pred) + " -> " + (obj == null ? "No object ?" : getResourceName(graph, obj)) + " (Assertion)" );\r
name = tmp.substring(0, Math.min(80, tmp.length()));\r
} else {\r
String resourceName = getResourceName(graph, r);\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.desktop.product</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.ManifestBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.SchemaBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.PluginNature</nature>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8\r
+org.eclipse.jdt.core.compiler.compliance=1.8\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.8\r
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Simantics Desktop Product
+Bundle-SymbolicName: org.simantics.desktop.product;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: Semantum Oy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
--- /dev/null
+source.. = src/\r
+output.. = bin/\r
+bin.includes = META-INF/,\\r
+ .,\\r
+ plugin.xml\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?eclipse version="3.4"?>\r
+<plugin>\r
+\r
+ <extension id="desktopProduct"\r
+ point="org.eclipse.core.runtime.products">\r
+ <product\r
+ application="org.simantics.workbench.application"\r
+ description="Simantics Desktop Environment"\r
+ name="Simantics Desktop">\r
+ <property\r
+ name="appName"\r
+ value="Simantics Desktop"/>\r
+ <property\r
+ name="aboutImage"\r
+ value="platform:/plugin/org.simantics.desktop.ui/icons/simantics256.png">\r
+ </property>\r
+ <property\r
+ name="aboutText"\r
+ value="The desktop environment for Simantics products.">\r
+ </property>\r
+ <property\r
+ name="windowImages"\r
+ value="platform:/plugin/org.simantics.desktop.ui/icons/simantics32.png">\r
+ </property>\r
+ </product> \r
+ </extension>\r
+\r
+</plugin>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?pde version="3.5"?>\r
+\r
+<product name="Simantics Desktop" uid="org.simantics.desktop.product.desktopProduct" id="org.simantics.desktop.product.desktopProduct" application="org.simantics.workbench.application" version="1.21.0" useFeatures="true" includeLaunchers="true">\r
+\r
+ <aboutInfo>\r
+ <image path="/org.simantics.desktop.ui/icons/simantics256.png"/>\r
+ <text>\r
+ The desktop environment for Simantics products.\r
+ </text>\r
+ </aboutInfo>\r
+\r
+ <configIni use="">\r
+ </configIni>\r
+\r
+ <launcherArgs>\r
+ <programArgs>--launcher.XXMaxPermSize\r
+192m\r
+-fixerrors\r
+-data\r
+@noDefault\r
+-cssTheme\r
+org.eclipse.e4.ui.css.theme.e4_classic\r
+ </programArgs>\r
+ <vmArgs>-ea\r
+-Xmx500M\r
+-Xshare:off\r
+-XX:MaxPermSize=192m\r
+-Djava.net.preferIPv4Stack=true\r
+-Dorg.simantics.workbench.application.showFastViewBars=false\r
+-Dorg.simantics.workbench.application.showPerspectiveBar=false\r
+-Dorg.simantics.workbench.application.excludePerspectiveFromTitle=true\r
+-Declipse.workaround.bug467000=true\r
+ </vmArgs>\r
+ <vmArgsWin>-Dorg.osgi.framework.os.name=win32\r
+ </vmArgsWin>\r
+ </launcherArgs>\r
+\r
+ <windowImages i32="/org.simantics.desktop.ui/icons/simantics32.png"/>\r
+\r
+ <launcher name="Simantics-Desktop">\r
+ <solaris/>\r
+ <win useIco="false">\r
+ <bmp/>\r
+ </win>\r
+ </launcher>\r
+\r
+ <vm>\r
+ <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8</windows>\r
+ </vm>\r
+\r
+ <license>\r
+ <url>http://www.eclipse.org/legal/epl-v10.html</url>\r
+ </license>\r
+\r
+ <plugins>\r
+ </plugins>\r
+\r
+ <features>\r
+ <feature id="org.simantics.desktop.product" version="1.0.0.qualifier"/>\r
+ </features>\r
+\r
+ <preferencesInfo>\r
+ <targetfile overwrite="false"/>\r
+ </preferencesInfo>\r
+\r
+ <cssInfo>\r
+ </cssInfo>\r
+\r
+</product>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.desktop.ui.ontology</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.simantics.graph.builder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.ManifestBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.SchemaBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.PluginNature</nature>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ <nature>org.simantics.graph.nature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8\r
+org.eclipse.jdt.core.compiler.compliance=1.8\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.8\r
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: http://www.simantics.org/DesktopUI
+Bundle-SymbolicName: org.simantics.desktop.ui.ontology
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: Semantum Oy
+Require-Bundle: org.simantics.layer0,
+ org.simantics.project.ontology;bundle-version="1.2.0",
+ org.simantics.silk.ontology;bundle-version="1.1.0",
+ org.simantics.viewpoint.ontology;bundle-version="1.2.0",
+ org.simantics.modeling.ontology;bundle-version="1.2.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
--- /dev/null
+source.. = src/\r
+output.. = bin/\r
+bin.includes = plugin.xml,\\r
+ META-INF/,\\r
+ .,\\r
+ graph.tg\r
--- /dev/null
+L0 = <http://www.simantics.org/Layer0-1.1>
+PROJECT = <http://www.simantics.org/Project-1.2>
+SILK = <http://www.simantics.org/Silk-1.1>
+VP = <http://www.simantics.org/Viewpoint-1.2>
+MOD = <http://www.simantics.org/Modeling-1.2>
+
+DesktopUI = <http://www.simantics.org/DesktopUI-1.0> : L0.Ontology
+ @L0.new
+
+DesktopUI.SCLMain : L0.SCLModule
+ L0.SCLModule.definition _ : L0.String
+ @L0.loadString "scl/SCLMain.scl"
+
+DesktopUI.BrowseContext : VP.BrowseContext
+ VP.BrowseContext.Includes PROJECT.ProjectBrowseContext
+ VP.BrowseContext.HasChildContribution MOD.Contributions.ModelLibraries
+
+DesktopUI.FileMenuNewActionContext : VP.BrowseContext
+ VP.BrowseContext.IsIncludedIn PROJECT.ProjectFileMenuNewActionContext
+ VP.BrowseContext.HasActionContribution _ : VP.ActionContribution
+ L0.HasLabel "Shared Library"
+ VP.ActionContribution.HasImage SILK.folder
+ VP.ActionContribution.HasCategory VP.EditActionCategory
+ VP.ActionContribution.HasNodeType PROJECT.Project
+ VP.ActionContribution.HasAction ACTIONS.NewSharedLibrary
+
+ACTIONS = DesktopUI.Actions : L0.Library
+
+ACTIONS.NewSharedLibrary
+ @MOD.sclAction "newSharedLibraryAction"
+
\ No newline at end of file
--- /dev/null
+include "Simantics/All"\r
+\r
+newSharedLibraryAction :: Resource -> <Proc> ()\r
+newSharedLibraryAction res = do\r
+ syncWrite (\() -> createSharedOntologyWithUI L0.SharedOntology)\r
+ ()\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.desktop.ui</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.ManifestBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.SchemaBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.PluginNature</nature>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8\r
+org.eclipse.jdt.core.compiler.compliance=1.8\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.8\r
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Simantics Desktop UI
+Bundle-SymbolicName: org.simantics.desktop.ui;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.simantics.desktop.ui.internal.Activator
+Bundle-Vendor: Semantum Oy
+Require-Bundle: org.simantics.workbench;bundle-version="1.5.1",
+ org.eclipse.epp.mpc.core;bundle-version="1.1.1",
+ org.eclipse.epp.mpc.help.ui;bundle-version="1.1.1",
+ org.eclipse.epp.mpc.ui;bundle-version="1.1.1",
+ org.eclipse.ui.browser;bundle-version="3.3.100",
+ org.simantics.platform.ui.ontology;bundle-version="1.0.0",
+ org.simantics.spreadsheet.ontology;bundle-version="1.2.0",
+ org.simantics.spreadsheet.common;bundle-version="1.1.0",
+ org.simantics.selectionview;bundle-version="1.0.0",
+ org.eclipse.e4.ui.model.workbench;bundle-version="1.1.100.v20150407-1430",
+ org.simantics.spreadsheet.graph,
+ org.simantics.spreadsheet;bundle-version="1.1.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
--- /dev/null
+output.. = bin/\r
+bin.includes = META-INF/,\\r
+ .,\\r
+ plugin.xml,\\r
+ icons/appicon.png,\\r
+ icons/simantics256.png,\\r
+ icons/simantics32.png,\\r
+ fragment.e4xmi\r
+source.. = src/\r
--- /dev/null
+<?xml version="1.0" encoding="ASCII"?>\r
+<fragment:ModelFragments xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:fragment="http://www.eclipse.org/ui/2010/UIModel/fragment" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmi:id="_2RrQgMTrEeWlteepFBDbRQ">\r
+ <imports xsi:type="basic:TrimBar" xmi:id="_UrNgIMT_EeWlteepFBDbRQ" elementId="org.eclipse.ui.main.toolbar"/>\r
+ <fragments xsi:type="fragment:StringModelFragment" xmi:id="_fZeBUMT5EeWlteepFBDbRQ" featurename="trimContributions" parentElementId="xpath:/">\r
+ <elements xsi:type="menu:TrimContribution" xmi:id="_f8QlUMT5EeWlteepFBDbRQ" elementId="org.simantics.desktop.ui.trim.modeledToolbar" parentId="org.eclipse.ui.main.toolbar" positionInParent="after=additions">\r
+ <children xsi:type="menu:ToolBar" xmi:id="_gP22wMT5EeWlteepFBDbRQ" elementId="org.simantics.desktop.ui.toolbar.modeled">\r
+ <children xsi:type="menu:ToolControl" xmi:id="_gnD10MT5EeWlteepFBDbRQ" elementId="org.simantics.desktop.ui.toolcontrol.modeled" contributionURI="bundleclass://org.simantics.modeling.ui/org.simantics.modeling.ui.actions.e4.GlobalModeledToolbarActions">\r
+ <tags>http://www.simantics.org/Project-1.2/MainToolbarActionContext</tags>\r
+ </children>\r
+ </children>\r
+ </elements>\r
+ </fragments>\r
+</fragment:ModelFragments>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<plugin>\r
+\r
+ <extension\r
+ point="org.eclipse.ui.perspectives">\r
+ <perspective\r
+ name="Modelling"\r
+ fixed="false"\r
+ class="org.simantics.workbench.Perspective"\r
+ id="org.simantics.desktop.modelling.perspective">\r
+ </perspective>\r
+ </extension>\r
+ <extension\r
+ point="org.simantics.project.feature">\r
+ <feature\r
+ label="Desktop"\r
+ description="Desktop product project feature."\r
+ class="org.simantics.desktop.ui.internal.DesktopProjectFeature"\r
+ published="true"\r
+ id="org.simantics.desktop.ui">\r
+ <installGroup\r
+ version="[1.0.0,2.0.0)"\r
+ id="omnipresent">\r
+ </installGroup>\r
+ </feature>\r
+ </extension>\r
+ <extension\r
+ point="org.eclipse.ui.perspectiveExtensions">\r
+ <perspectiveExtension\r
+ targetID="org.simantics.desktop.modelling.perspective">\r
+ <view\r
+ minimized="true"\r
+ ratio="0.20"\r
+ relative="org.eclipse.ui.editorss"\r
+ closeable="true"\r
+ visible="true"\r
+ id="org.simantics.modeling.ui.browser"\r
+ relationship="left">\r
+ </view>\r
+ <view\r
+ minimized="false"\r
+ ratio="0.5"\r
+ relative="org.simantics.modeling.ui.browser"\r
+ closeable="true"\r
+ visible="true"\r
+ id="org.simantics.browsing.ui.graph.propertyView"\r
+ relationship="bottom">\r
+ </view>\r
+ </perspectiveExtension>\r
+ </extension>\r
+ <!--\r
+ <extension\r
+ point="org.eclipse.epp.mpc.ui.catalog">\r
+ <catalog\r
+ label="Simantics Marketplace"\r
+ url="http://dev.simantics.org:8070/marketplace/"\r
+ icon="icons/simantics32.png"\r
+ description="Marketplace for installing simulation components for Simantics.">\r
+ </catalog>\r
+ </extension>\r
+ -->\r
+ <extension\r
+ point="org.eclipse.ui.views">\r
+ <category\r
+ name="Modeling"\r
+ id="org.simantics.modeling.ui.category">\r
+ </category>\r
+ <view\r
+ name="Model Browser"\r
+ icon="platform:/plugin/com.famfamfam.silk/icons/chart_organisation.png"\r
+ category="org.simantics.modeling.category"\r
+ class="org.simantics.desktop.ui.internal.StandardModelledView:configurationURI=http://www.simantics.org/Modeling-1.2/PlainModelBrowser"\r
+ restorable="true"\r
+ id="org.simantics.modeling.ui.browser">\r
+ </view>\r
+ </extension>\r
+ <extension\r
+ point="org.simantics.ui.doubleClick">\r
+ <doubleClickAction\r
+ name="Modeled Double Click"\r
+ priority="1.0"\r
+ class="org.simantics.modeling.ui.actions.ModeledDoubleClickActions">\r
+ </doubleClickAction>\r
+ </extension>\r
+ <extension\r
+ point="org.eclipse.ui.menus">\r
+ <menuContribution\r
+ locationURI="menu:sFile?after=import.ext">\r
+ <command\r
+ commandId="org.eclipse.ui.file.import">\r
+ </command>\r
+ <command\r
+ commandId="org.eclipse.ui.file.export">\r
+ </command>\r
+ </menuContribution>\r
+ <menuContribution\r
+ allPopups="false"\r
+ locationURI="menu:#FileNewMenu">\r
+ <dynamic\r
+ class="org.simantics.modeling.ui.actions.GlobalModeledActions:context=http://www.simantics.org/Project-1.2/ProjectFileMenuNewActionContext"\r
+ id="org.simantics.desktop.ui.fileMenuNew.modeledActions">\r
+ </dynamic>\r
+ </menuContribution>\r
+ <menuContribution\r
+ allPopups="false"\r
+ locationURI="menu:sFile">\r
+ <dynamic\r
+ class="org.simantics.modeling.ui.actions.GlobalModeledActions:context=http://www.simantics.org/Project-1.2/ProjectFileMenuActionContext"\r
+ id="org.simantics.desktop.ui.fileMenu.modeledActions">\r
+ </dynamic>\r
+ </menuContribution>\r
+ <menuContribution\r
+ locationURI="popup:#ModelBrowserPopup">\r
+ <separator\r
+ name="new.begin"\r
+ visible="false">\r
+ </separator>\r
+ <separator\r
+ name="new.ext"\r
+ visible="false">\r
+ </separator>\r
+ <separator\r
+ name="new.end"\r
+ visible="true">\r
+ </separator>\r
+ <dynamic\r
+ class="org.simantics.modeling.ui.actions.ModeledActions"\r
+ id="org.simantics.desktop.ui.modeledActions">\r
+ </dynamic>\r
+ <dynamic\r
+ class="org.simantics.ui.contribution.OpenWithMenuContribution"\r
+ id="openWith">\r
+ </dynamic>\r
+ <command\r
+ commandId="org.simantics.browsing.ui.common.collapseAll"\r
+ label="Collapse All"\r
+ icon="platform:/plugin/org.simantics.browsing.ui.common/icons/collapseall.png"\r
+ style="push"\r
+ tooltip="Collapse All">\r
+ </command>\r
+ <command\r
+ commandId="org.simantics.browsing.ui.common.collapseSelected"\r
+ label="Collapse Selected"\r
+ icon="platform:/plugin/org.simantics.browsing.ui.common/icons/collapse.png"\r
+ style="push"\r
+ tooltip="Collapse Selected">\r
+ <visibleWhen\r
+ checkEnabled="false">\r
+ <with\r
+ variable="selection">\r
+ <count\r
+ value="(0-">\r
+ </count>\r
+ </with>\r
+ </visibleWhen>\r
+ </command>\r
+ </menuContribution>\r
+ </extension>\r
+ <extension\r
+ id="org.simantics.desktop.ui.fragment"\r
+ point="org.eclipse.e4.workbench.model">\r
+ <fragment\r
+ uri="fragment.e4xmi">\r
+ </fragment>\r
+ </extension>\r
+\r
+</plugin>\r
--- /dev/null
+package org.simantics.desktop.ui.internal;\r
+\r
+import org.eclipse.ui.plugin.AbstractUIPlugin;\r
+import org.osgi.framework.BundleContext;\r
+\r
+/**\r
+ * The activator class controls the plug-in life cycle\r
+ */\r
+public class Activator extends AbstractUIPlugin {\r
+\r
+ // The plug-in ID\r
+ public static final String PLUGIN_ID = "org.simantics.desktop.ui"; //$NON-NLS-1$\r
+\r
+ // The shared instance\r
+ private static Activator plugin;\r
+ \r
+ /**\r
+ * The constructor\r
+ */\r
+ public Activator() {\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
+ */\r
+ public void start(BundleContext context) throws Exception {\r
+ super.start(context);\r
+ plugin = this;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
+ */\r
+ public void stop(BundleContext context) throws Exception {\r
+ plugin = null;\r
+ super.stop(context);\r
+ }\r
+\r
+ /**\r
+ * Returns the shared instance\r
+ *\r
+ * @return the shared instance\r
+ */\r
+ public static Activator getDefault() {\r
+ return plugin;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.\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
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.desktop.ui.internal;\r
+\r
+import org.simantics.project.ProjectKeys;\r
+import org.simantics.project.exception.ProjectException;\r
+import org.simantics.project.features.AbstractProjectFeature;\r
+\r
+public class DesktopProjectFeature extends AbstractProjectFeature {\r
+\r
+ private static final String DEFAULT_PERSPECTIVE = "org.simantics.desktop.modelling.perspective";\r
+\r
+ @Override\r
+ public void configure() throws ProjectException {\r
+ \r
+ Object existing = getProjectElement().getHint(ProjectKeys.DEFAULT_PERSPECTIVE);\r
+ if(existing == null)\r
+ getProjectElement().setHint(ProjectKeys.DEFAULT_PERSPECTIVE, DEFAULT_PERSPECTIVE);\r
+\r
+ }\r
+\r
+ @Override\r
+ public void deconfigure() throws ProjectException {\r
+ \r
+ }\r
+\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2011 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
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.desktop.ui.internal;\r
+\r
+import java.util.Collection;\r
+\r
+import org.eclipse.core.commands.AbstractHandler;\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.simantics.Simantics;\r
+import org.simantics.browsing.ui.swt.AdaptableHintContext;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\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.ProjectModels;\r
+import org.simantics.modeling.ModelingUtils;\r
+import org.simantics.utils.datastructures.hints.IHintContext;\r
+\r
+public class ExportModel extends AbstractHandler {\r
+\r
+ @Override\r
+ public Object execute(ExecutionEvent event) throws ExecutionException {\r
+ \r
+ try {\r
+ \r
+ Resource lib = Simantics.sync(new UniqueRead<Resource>() {\r
+\r
+ @Override\r
+ public Resource perform(ReadGraph graph) throws DatabaseException {\r
+ Collection<Resource> models = graph.sync(new ProjectModels(Simantics.getProjectResource()));\r
+ if(models.size() == 1) return models.iterator().next();\r
+ return null;\r
+ }\r
+ \r
+ });\r
+ if(lib == null) return null;\r
+ \r
+ IHintContext context = new AdaptableHintContext(SelectionHints.KEY_MAIN);\r
+ context.setHint(SelectionHints.KEY_MAIN, lib);\r
+\r
+ IStructuredSelection sel = new StructuredSelection(context);\r
+ ModelingUtils.openWizard(Display.getCurrent(), sel, "org.simantics.modeling.ui.modelExportWizard");\r
+ } catch (DatabaseException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ }\r
+ \r
+ return null;\r
+ \r
+ }\r
+\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2011 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
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.desktop.ui.internal;\r
+\r
+import java.util.List;\r
+\r
+import org.eclipse.core.commands.AbstractHandler;\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.simantics.Simantics;\r
+import org.simantics.browsing.ui.swt.AdaptableHintContext;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\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.modeling.ModelingUtils;\r
+import org.simantics.scl.runtime.tuple.Tuple0;\r
+import org.simantics.utils.datastructures.hints.IHintContext;\r
+\r
+public class ExportSharedLibrary extends AbstractHandler {\r
+\r
+ @Override\r
+ public Object execute(ExecutionEvent event) throws ExecutionException {\r
+ \r
+ try {\r
+ Resource lib = Simantics.sync(new UniqueRead<Resource>() {\r
+\r
+ @Override\r
+ public Resource perform(ReadGraph graph) throws DatabaseException {\r
+ List<Resource> ontologies = Simantics.applySCL("Simantics/SharedOntologies", "getSharedOntologies", graph, Tuple0.INSTANCE);\r
+ if(ontologies.size() == 1) return ontologies.iterator().next();\r
+ return null;\r
+ }\r
+ \r
+ });\r
+ if(lib == null) return null;\r
+ \r
+ IHintContext context = new AdaptableHintContext(SelectionHints.KEY_MAIN);\r
+ context.setHint(SelectionHints.KEY_MAIN, lib);\r
+\r
+ IStructuredSelection sel = new StructuredSelection(context);\r
+ ModelingUtils.openWizard(Display.getCurrent(), sel, "org.simantics.modeling.ui.sharedOntologyExportWizard");\r
+ } catch (DatabaseException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ }\r
+ \r
+ return null;\r
+ \r
+ }\r
+\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2011 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
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.desktop.ui.internal;\r
+\r
+import java.io.File;\r
+\r
+import org.eclipse.core.commands.AbstractHandler;\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.runtime.jobs.Job;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.FileDialog;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.ui.handlers.HandlerUtil;\r
+import org.simantics.DatabaseJob;\r
+import org.simantics.modeling.ModelingUtils;\r
+\r
+public class ImportModel extends AbstractHandler {\r
+\r
+ @Override\r
+ public Object execute(ExecutionEvent event) throws ExecutionException {\r
+ \r
+ // Get imported transferable graph file using FileDialog\r
+ Shell shell = HandlerUtil.getActiveShellChecked(event);\r
+ FileDialog fd = new FileDialog(shell, SWT.OPEN);\r
+ fd.setText("Import Model");\r
+\r
+ String path = Activator.getDefault().getPreferenceStore().getString("IMPORT_MODEL_PATH");\r
+ if(path.isEmpty() || !(new File(path).exists())){\r
+ path = System.getProperty("user.dir");\r
+ }\r
+ \r
+ fd.setFilterPath(path);\r
+ String[] filterExt = {"*.tg", "*.*"};\r
+ fd.setFilterExtensions(filterExt);\r
+ final String selected = fd.open();\r
+ if(selected == null) return null;\r
+\r
+ Job job = new DatabaseJob("Import model") {\r
+\r
+ @Override\r
+ protected IStatus run(IProgressMonitor monitor) {\r
+ ModelingUtils.importModel(selected);\r
+ return Status.OK_STATUS;\r
+ }\r
+ };\r
+ \r
+ job.setUser(true);\r
+ job.schedule();\r
+\r
+ return null;\r
+ \r
+ }\r
+\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2011 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
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.desktop.ui.internal;\r
+\r
+import org.eclipse.core.commands.AbstractHandler;\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.simantics.modeling.ModelingUtils;\r
+\r
+public class ImportSharedLibrary extends AbstractHandler {\r
+\r
+ @Override\r
+ public Object execute(ExecutionEvent event) throws ExecutionException {\r
+ \r
+ IStructuredSelection sel = new StructuredSelection();\r
+ ModelingUtils.openWizard(Display.getCurrent(), sel, "org.simantics.modeling.ui.sharedOntologyImportWizard");\r
+ return null;\r
+ \r
+ }\r
+\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2011 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
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.desktop.ui.internal;\r
+\r
+ import org.eclipse.core.commands.AbstractHandler;\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.runtime.jobs.Job;\r
+import org.simantics.DatabaseJob;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.request.Configuration;\r
+import org.simantics.modeling.ModelingUtils;\r
+import org.simantics.platform.ui.PlatformUIResource;\r
+import org.simantics.spreadsheet.graph.SpreadsheetGraphUtils;\r
+import org.simantics.spreadsheet.util.SpreadsheetUtils;\r
+\r
+public class NewModel extends AbstractHandler {\r
+\r
+ public static Resource execute(WriteGraph graph) throws DatabaseException {\r
+ PlatformUIResource PLATFORM = PlatformUIResource.getInstance(graph);\r
+ return execute(graph, PLATFORM.Model, null);\r
+ }\r
+\r
+ @Override\r
+ public Object execute(ExecutionEvent event) throws ExecutionException {\r
+ Job job = new DatabaseJob("Creating Model") {\r
+ @Override\r
+ protected IStatus run(IProgressMonitor monitor) {\r
+ try {\r
+ Simantics.sync(new WriteRequest() {\r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+ execute(graph);\r
+ }\r
+ });\r
+ return Status.OK_STATUS;\r
+ } catch (DatabaseException e) {\r
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, getName() + " failed.", e);\r
+ }\r
+ }\r
+ };\r
+ job.setUser(true);\r
+ job.schedule();\r
+ return null;\r
+ }\r
+\r
+ public static Resource execute(WriteGraph graph, Resource type, String name) throws DatabaseException {\r
+ Resource model = ModelingUtils.createModel(graph, type, name);\r
+ Resource conf = graph.syncRequest(new Configuration(model));\r
+\r
+ ModelingUtils.addSCLMainToModel(graph, model, "SCLMain", "");\r
+ ModelingUtils.createLocalLibrary(graph, model, "Library");\r
+\r
+ Resource book = SpreadsheetGraphUtils.createBook(graph, conf, "Book1");\r
+ SpreadsheetUtils.createSheet(graph, book, "Sheet1", new String[] { }, new int[] { 50 });\r
+ SpreadsheetUtils.createSheet(graph, book, "Sheet2", new String[] { }, new int[] { 50 });\r
+ SpreadsheetUtils.createSheet(graph, book, "Sheet3", new String[] { }, new int[] { 50 });\r
+\r
+ return model;\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.simantics.desktop.ui.internal;\r
+\r
+import org.simantics.selectionview.StandardPropertyPage;\r
+import org.simantics.ui.workbench.IPropertyPage;\r
+import org.simantics.views.swt.ModelledView;\r
+\r
+public class StandardModelledView extends ModelledView {\r
+\r
+ @Override\r
+ protected IPropertyPage getPropertyPage() {\r
+ return new StandardPropertyPage(getSite());\r
+ }\r
+\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.diagram.svg</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.ManifestBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.SchemaBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.PluginNature</nature>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8\r
+org.eclipse.jdt.core.compiler.compliance=1.8\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.8\r
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Svg
+Bundle-SymbolicName: org.simantics.diagram.svg
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.simantics.diagram.svg.Activator
+Bundle-Vendor: VTT
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.simantics;bundle-version="1.0.0",
+ org.simantics.diagram;bundle-version="1.1.1",
+ org.simantics.diagram.ontology;bundle-version="2.2.0",
+ org.simantics.db.management;bundle-version="1.1.0",
+ org.simantics.structural.ontology;bundle-version="1.2.0",
+ org.simantics.structural2;bundle-version="1.1.1",
+ org.apache.batik;bundle-version="1.8.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Export-Package: org.simantics.diagram.svg.export
--- /dev/null
+source.. = src/\r
+output.. = bin/\r
+bin.includes = META-INF/,\\r
+ .,\\r
+ scl/\r
--- /dev/null
+import "Simantics/DB"\r
+\r
+importJava "org.simantics.diagram.svg.export.DiagramToSVG" where\r
+ diagramToSVG :: Resource -> <Proc> String\r
+ @JavaName diagramToSVG\r
+ diagramToSVGdpi :: Resource -> Double -> <Proc> String\r
+ @JavaName diagramToSVG\r
+ diagramToSVGsize :: Resource -> Integer -> Integer -> <Proc> String
\ No newline at end of file
--- /dev/null
+package org.simantics.diagram.svg;\r
+\r
+import org.eclipse.ui.plugin.AbstractUIPlugin;\r
+import org.osgi.framework.BundleContext;\r
+\r
+/**\r
+ * The activator class controls the plug-in life cycle\r
+ */\r
+public class Activator extends AbstractUIPlugin {\r
+\r
+ // The plug-in ID\r
+ public static final String PLUGIN_ID = "org.simantics.diagram.svg"; //$NON-NLS-1$\r
+\r
+ // The shared instance\r
+ private static Activator plugin;\r
+ \r
+ /**\r
+ * The constructor\r
+ */\r
+ public Activator() {\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
+ */\r
+ public void start(BundleContext context) throws Exception {\r
+ super.start(context);\r
+ plugin = this;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
+ */\r
+ public void stop(BundleContext context) throws Exception {\r
+ plugin = null;\r
+ super.stop(context);\r
+ }\r
+\r
+ /**\r
+ * Returns the shared instance\r
+ *\r
+ * @return the shared instance\r
+ */\r
+ public static Activator getDefault() {\r
+ return plugin;\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.simantics.diagram.svg.export;\r
+\r
+\r
+import java.awt.Point;\r
+import java.util.concurrent.Semaphore;\r
+import java.util.concurrent.atomic.AtomicReference;\r
+\r
+import org.apache.batik.svggen.SVGGraphics2D;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.ResourceArray;\r
+import org.simantics.db.common.request.PossibleIndexRoot;\r
+import org.simantics.db.common.request.UniqueRead;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.exception.ValidationException;\r
+import org.simantics.db.management.ISessionContext;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.diagram.elements.DiagramNodeUtil;\r
+import org.simantics.diagram.export.ImagePrinter;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.g2d.canvas.impl.CanvasContext;\r
+import org.simantics.g2d.scenegraph.ICanvasSceneGraphProvider;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.modeling.ModelingResources;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+import org.simantics.structural2.StructuralVariables;\r
+import org.simantics.utils.DataContainer;\r
+import org.simantics.utils.datastructures.Pair;\r
+import org.simantics.utils.page.MarginUtils.Margins;\r
+import org.simantics.utils.threads.ThreadUtils;\r
+import org.simantics.utils.threads.WorkerThread;\r
+\r
+\r
+public class DiagramToSVG {\r
+ \r
+ \r
+ public static String diagramToSVG(Resource diagram) {\r
+\r
+ try {\r
+ ImagePrinter.ImageExportPlan exportPlan = new ImagePrinter.ImageExportPlan();\r
+ exportPlan.margin = 0.05;\r
+ exportPlan.dpi = 96.0;\r
+ exportPlan.diagram = diagram;\r
+ return render(diagram,exportPlan);\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ return "<b>error</b> "+ e.getMessage();\r
+ }\r
+ \r
+ \r
+ }\r
+ \r
+ public static String diagramToSVG(Resource diagram, int width, int height) {\r
+\r
+ try {\r
+ ImagePrinter.ImageExportPlan exportPlan = new ImagePrinter.ImageExportPlan();\r
+ exportPlan.margin = 0.05;\r
+ exportPlan.size = new Point(width, height);\r
+ exportPlan.diagram = diagram;\r
+ return render(diagram,exportPlan);\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ return "<b>error</b> "+ e.getMessage();\r
+ }\r
+ \r
+ \r
+ }\r
+ \r
+ public static String diagramToSVG(Resource diagram, double dpi) {\r
+\r
+ try {\r
+ ImagePrinter.ImageExportPlan exportPlan = new ImagePrinter.ImageExportPlan();\r
+ exportPlan.margin = 0.05;\r
+ exportPlan.dpi = dpi;\r
+ exportPlan.diagram = diagram;\r
+ return render(diagram,exportPlan);\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ return "<b>error</b> "+ e.getMessage();\r
+ }\r
+ \r
+ \r
+ }\r
+ \r
+ public static String diagramToSVG(Resource diagram, ImagePrinter.ImageExportPlan exportPlan, Margins margins, SVGGraphics2D svgGenerator) {\r
+\r
+ try {\r
+ return render(diagram,exportPlan,margins,svgGenerator);\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ return "<b>error</b> "+ e.getMessage();\r
+ }\r
+ \r
+ }\r
+ \r
+ private static String render(final Resource input, final ImagePrinter.ImageExportPlan exportPlan) throws Exception {\r
+ return render(input, exportPlan, null, SVGBuilder.defaultSVGGenerator()); \r
+ }\r
+ \r
+ private static String render(final Resource input, final ImagePrinter.ImageExportPlan exportPlan, Margins margins, SVGGraphics2D svgExporter) throws Exception {\r
+ Resource diagram = Simantics.getSession().syncRequest(new Read<Resource>() {\r
+ @Override\r
+ public Resource perform(ReadGraph graph) throws DatabaseException {\r
+ DiagramResource DIA = DiagramResource.getInstance(graph);\r
+ if (graph.isInstanceOf(input, DIA.Diagram))\r
+ return input;\r
+ StructuralResource2 SR = StructuralResource2.getInstance(graph);\r
+ ModelingResources MOD = ModelingResources.getInstance(graph);\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ if (graph.isInstanceOf(input, SR.Composite)) {\r
+ Resource possibleDiagram = graph.getPossibleObject(input, MOD.CompositeToDiagram);\r
+ if (possibleDiagram != null)\r
+ return possibleDiagram;\r
+ for (Resource r : graph.getObjects(input, L0.ConsistsOf)) {\r
+ if (graph.isInstanceOf(r, SR.Composite)) {\r
+ possibleDiagram = graph.getPossibleObject(input, MOD.CompositeToDiagram);\r
+ if (possibleDiagram != null)\r
+ return possibleDiagram;\r
+ }\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+ });\r
+ if (diagram == null)\r
+ throw new DatabaseException("Input " + input + " cannot be resolved as diagram");\r
+ \r
+ \r
+ \r
+ \r
+ final WorkerThread thread = new WorkerThread("Diagram Image Painter");\r
+ thread.start();\r
+ \r
+ final CanvasContext ctx = new CanvasContext(thread);\r
+ final AtomicReference<ICanvasSceneGraphProvider> sgProvider = new AtomicReference<ICanvasSceneGraphProvider>();\r
+ final ISessionContext sessionContext = Simantics.getSessionContext();\r
+ final DataContainer<String> result = new DataContainer<String>(null);\r
+ final DataContainer<Exception> exception = new DataContainer<Exception>(null);\r
+ try {\r
+ final Semaphore done = new Semaphore(0);\r
+ // IMPORTANT: Load diagram in a different thread than the canvas context thread!\r
+ ThreadUtils.getBlockingWorkExecutor().execute(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ Pair<Resource, String> modelAndRVI = sessionContext.getSession().syncRequest(new UniqueRead<Pair<Resource, String>>() {\r
+ @Override\r
+ public Pair<Resource, String> perform(ReadGraph graph) throws DatabaseException {\r
+ return new Pair<Resource, String>( resolveModel(graph, exportPlan.diagram ), resolveRVI(graph, exportPlan.diagram) );\r
+ }\r
+ });\r
+\r
+ ICanvasSceneGraphProvider provider = DiagramNodeUtil.loadSceneGraphProvider(ctx, modelAndRVI.first, exportPlan.diagram, modelAndRVI.second);\r
+ sgProvider.set( provider );\r
+ \r
+ ThreadUtils.asyncExec(thread, new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ SVGBuilder chassis = margins != null ?\r
+ new SVGBuilder(exportPlan.dpi,exportPlan.size,margins) :\r
+ new SVGBuilder(exportPlan.dpi,exportPlan.size,exportPlan.margin);\r
+ \r
+ result.set(chassis.paint(ctx, svgExporter));\r
+ } catch (Exception e) {\r
+ exception.set(e);\r
+ } finally {\r
+ done.release();\r
+ }\r
+ }\r
+ });\r
+ } catch (DatabaseException e) {\r
+ exception.set(e);\r
+ done.release();\r
+ } catch (Throwable e) {\r
+ exception.set(new DatabaseException(e));\r
+ done.release();\r
+ } finally {\r
+ done.release();\r
+ }\r
+ }\r
+ });\r
+\r
+ done.acquire(2);\r
+ if (exception.get() != null)\r
+ throw exception.get();\r
+ return result.get();\r
+ } finally {\r
+ if (sgProvider.get() != null)\r
+ sgProvider.get().dispose();\r
+ ctx.dispose();\r
+ }\r
+ }\r
+ \r
+ private static Resource resolveModel(ReadGraph graph, Resource diagram) throws DatabaseException {\r
+ ModelingResources mod = ModelingResources.getInstance(graph);\r
+ Resource composite = graph.getSingleObject(diagram, mod.DiagramToComposite);\r
+ Resource model = graph.syncRequest(new PossibleIndexRoot(composite));\r
+ if (model == null)\r
+ throw new ValidationException("no model found for composite " + NameUtils.getSafeName(graph, composite));\r
+ return model;\r
+ }\r
+\r
+\r
+\r
+ private static String resolveRVI(ReadGraph graph, Resource diagram) throws DatabaseException {\r
+ ModelingResources mod = ModelingResources.getInstance(graph);\r
+ Resource composite = graph.getSingleObject(diagram, mod.DiagramToComposite);\r
+ final ResourceArray compositePath = StructuralVariables.getCompositeArray(graph, composite);\r
+ final ResourceArray variablePath = compositePath.removeFromBeginning(1);\r
+ return StructuralVariables.getRVI(graph, variablePath);\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.simantics.diagram.svg.export;\r
+\r
+import java.awt.Graphics2D;\r
+import java.awt.Point;\r
+import java.awt.RenderingHints;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Rectangle2D;\r
+import java.io.StringWriter;\r
+import java.util.UUID;\r
+\r
+import org.apache.batik.dom.GenericDOMImplementation;\r
+import org.apache.batik.svggen.SVGGraphics2D;\r
+import org.simantics.g2d.canvas.ICanvasContext;\r
+import org.simantics.g2d.diagram.DiagramHints;\r
+import org.simantics.g2d.diagram.DiagramUtils;\r
+import org.simantics.g2d.diagram.IDiagram;\r
+import org.simantics.g2d.participant.TransformUtil;\r
+import org.simantics.scenegraph.g2d.G2DRenderingHints;\r
+import org.simantics.scenegraph.utils.QualityHints;\r
+import org.simantics.utils.page.MarginUtils;\r
+import org.simantics.utils.page.MarginUtils.Margin;\r
+import org.simantics.utils.page.MarginUtils.Margins;\r
+import org.w3c.dom.DOMImplementation;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Element;\r
+\r
+\r
+/**\r
+ * org.simantics.diagram.export.ImageBuilder with SVG support \r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class SVGBuilder {\r
+ Double dpi;\r
+ Point size;\r
+ double margin;\r
+ Margins margins;\r
+ \r
+ /**\r
+ * \r
+ * @param file File to write the image (optional)\r
+ * @param dpi Dots Per Inch\r
+ * @param size Image size in pixels\r
+ * @param margin percentage of image width for margins. 0.05 is 5%.\r
+ */\r
+ public SVGBuilder(Double dpi, Point size, double margin) {\r
+ this.dpi = dpi;\r
+ this.size = size;\r
+ this.margin = Math.max(margin,0.0);\r
+ this.margins = null;\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @param file File to write the image (optional)\r
+ * @param dpi Dots Per Inch\r
+ * @param size Image size in pixels\r
+ * @param margins Margins\r
+ */\r
+ public SVGBuilder(Double dpi, Point size, Margins margins) {\r
+ this.dpi = dpi;\r
+ this.size = size;\r
+ this.margin = 0.0;\r
+ this.margins = margins;\r
+ }\r
+ \r
+ public static SVGGraphics2D defaultSVGGenerator() {\r
+ DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();\r
+ \r
+ // Create an instance of org.w3c.dom.Document.\r
+ String svgNS = "http://www.w3.org/2000/svg";\r
+ Document document = domImpl.createDocument(svgNS, "svg", null);\r
+ \r
+ // Create an instance of the SVG Generator.\r
+ SVGGraphics2D svgGenerator = new SVGGraphics2D(document);\r
+ svgGenerator.getGeneratorContext().setIDGenerator(new UniqueIDGenerator(UUID.randomUUID().toString()));\r
+ return svgGenerator;\r
+ }\r
+\r
+ /**\r
+ * @param canvasContext\r
+ * the canvas context to paint\r
+ * @param writeResults\r
+ * <code>true</code> to actually write the resulting Image to the file.\r
+ */\r
+ public String paint(ICanvasContext canvasContext) throws Exception {\r
+ return paint(canvasContext, defaultSVGGenerator());\r
+ }\r
+ \r
+ /**\r
+ * @param canvasContext\r
+ * the canvas context to paint\r
+ * svgGenerator \r
+ * the svg generator to use\r
+ * @param writeResults\r
+ * <code>true</code> to actually write the resulting Image to the file.\r
+ */\r
+ public String paint(ICanvasContext canvasContext, SVGGraphics2D svgGenerator) throws Exception {\r
+ \r
+ Graphics2D g2 = svgGenerator;\r
+ \r
+ IDiagram diagram = canvasContext.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);\r
+ Rectangle2D diagramRect = DiagramUtils.getContentRect(diagram);\r
+\r
+ if (diagramRect == null)\r
+ diagramRect = new Rectangle2D.Double(0, 0, 100, 100);\r
+\r
+ // add margins to content.\r
+ double off = Math.max(diagramRect.getWidth(), diagramRect.getHeight()) * margin*0.5;\r
+ diagramRect = new Rectangle2D.Double(diagramRect.getX() - off, diagramRect.getY() - off, diagramRect.getWidth() + off * 2.0, diagramRect.getHeight() + off * 2.0);\r
+\r
+ if (margins != null) {\r
+ diagramRect = org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(diagramRect,\r
+ margins.top.diagramAbsolute,\r
+ margins.bottom.diagramAbsolute,\r
+ margins.left.diagramAbsolute,\r
+ margins.right.diagramAbsolute\r
+ );\r
+ }\r
+ \r
+ // Make sure the transformation is reset.\r
+ AffineTransform tr = new AffineTransform();\r
+\r
+ Rectangle2D controlArea;\r
+ if (dpi != null) {\r
+ double mmToInch = 1.0 / 25.4;\r
+ controlArea = new Rectangle2D.Double(0, 0, diagramRect.getWidth() * mmToInch * dpi, diagramRect.getHeight() * mmToInch * dpi);\r
+\r
+ if (margins != null) {\r
+ double w = controlArea.getWidth();\r
+ double h = controlArea.getHeight();\r
+ controlArea = org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(controlArea,\r
+ margins.top.controlAbsolute + margins.top.controlRelative * h,\r
+ margins.bottom.controlAbsolute + margins.bottom.controlRelative * h,\r
+ margins.left.controlAbsolute + margins.left.controlRelative * w,\r
+ margins.right.controlAbsolute + margins.right.controlRelative * w\r
+ );\r
+ }\r
+ } else {\r
+ controlArea = new Rectangle2D.Double(0, 0, size.getX(), size.getY());\r
+ if (margins != null) {\r
+ double w = controlArea.getWidth();\r
+ double h = controlArea.getHeight();\r
+ controlArea = org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(controlArea,\r
+ -(margins.top.controlAbsolute + margins.top.controlRelative * h),\r
+ -(margins.bottom.controlAbsolute + margins.bottom.controlRelative * h),\r
+ -(margins.left.controlAbsolute + margins.left.controlRelative * w),\r
+ -(margins.right.controlAbsolute + margins.right.controlRelative * w)\r
+ );\r
+ }\r
+ }\r
+\r
+ canvasContext.getSingleItem(TransformUtil.class).fitArea(controlArea, diagramRect, MarginUtils.NO_MARGINS);\r
+ \r
+ float width = (float)controlArea.getWidth();\r
+ float height = (float)controlArea.getHeight();\r
+ \r
+\r
+ QualityHints.HIGH_QUALITY_HINTS.setQuality(g2);\r
+ g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);\r
+\r
+\r
+ g2.setTransform(tr);\r
+ g2.setClip(new Rectangle2D.Double(0, 0, controlArea.getWidth(), controlArea.getHeight()));\r
+\r
+ g2.setRenderingHint(G2DRenderingHints.KEY_CONTROL_BOUNDS, new Rectangle2D.Double(0, 0, controlArea.getWidth(), controlArea.getHeight()));\r
+\r
+ if (canvasContext.isLocked())\r
+ throw new IllegalStateException("cannot render image, canvas context is locked: " + canvasContext);\r
+\r
+ canvasContext.getSceneGraph().render(g2);\r
+ \r
+\r
+ \r
+ Element root = svgGenerator.getRoot();\r
+ root.setAttributeNS(null, "viewBox", "0 0 " + width + " " + height); \r
+ root.setAttributeNS(null, "height", Float.toString(height));\r
+ root.setAttributeNS(null, "width", Float.toString(width));\r
+ \r
+ // Finally, stream out SVG to the standard output using\r
+ // UTF-8 encoding.\r
+ boolean useCSS = false; // we want to use CSS style attributes\r
+ StringWriter writer = new StringWriter();\r
+ //svgGenerator.stream(writer, useCSS);\r
+ svgGenerator.stream(root,writer, useCSS, false);\r
+ return writer.toString();\r
+ }\r
+}\r
--- /dev/null
+package org.simantics.diagram.svg.export;\r
+\r
+import org.apache.batik.svggen.SVGIDGenerator;\r
+\r
+public class UniqueIDGenerator extends SVGIDGenerator{\r
+ \r
+ String overallId;\r
+ public UniqueIDGenerator(String overallId) {\r
+ super();\r
+ this.overallId = overallId;\r
+ }\r
+ \r
+ @Override\r
+ public String generateID(String prefix) {\r
+ return super.generateID(overallId+prefix);\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.simantics.document.server.io;\r
+\r
+public interface ITreeTableCell extends ITableCell {\r
+ \r
+ int getParent();\r
+}\r
importJava "org.simantics.document.server.io.ITableCell" where\r
data ITableCell\r
\r
+importJava "org.simantics.document.server.io.ITreeTableCell" where\r
+ data ITreeTableCell\r
+\r
importJava "org.simantics.document.server.io.IFont" where\r
data IFont\r
\r
data CommandContextMutable\r
\r
@JavaName putString\r
- putString :: CommandContextMutable -> String -> String -> CommandContextMutable\r
+ putString :: CommandContextMutable -> String -> String -> <Proc> CommandContextMutable\r
\r
- putValue :: CommandContextMutable -> String -> a -> CommandContextMutable\r
+ putValue :: CommandContextMutable -> String -> a -> <Proc> CommandContextMutable\r
\r
importJava "org.simantics.document.server.io.CommandContextImpl" where\r
\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry exported="true" kind="lib" path="fontbox-1.8.10.jar"/>\r
+ <classpathentry exported="true" kind="lib" path="jempbox-1.8.10.jar"/>\r
+ <classpathentry exported="true" kind="lib" path="xmpbox-1.8.10.jar"/>\r
+ <classpathentry exported="true" kind="lib" path="pdfbox-1.8.10.jar" sourcepath="pdfbox-1.8.10-src.zip"/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>\r
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.help.base</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.ManifestBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.SchemaBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.PluginNature</nature>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7\r
+org.eclipse.jdt.core.compiler.compliance=1.7\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.7\r
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Simantics Contributions for Eclipse Help System
+Bundle-SymbolicName: org.simantics.help.base;singleton:=true
+Bundle-Version: 1.18.3.qualifier
+Bundle-Activator: org.simantics.help.base.internal.Activator
+Bundle-Vendor: Semantum Oy
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.help.base,
+ org.apache.commons.logging;bundle-version="1.0.4",
+ org.bouncycastle;bundle-version="1.47.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .,
+ xmpbox-1.8.10.jar,
+ jempbox-1.8.10.jar,
+ fontbox-1.8.10.jar,
+ pdfbox-1.8.10.jar
--- /dev/null
+source.. = src/\r
+output.. = bin/\r
+bin.includes = META-INF/,\\r
+ .,\\r
+ plugin.xml,\\r
+ pdfbox-1.8.10.jar,\\r
+ fontbox-1.8.10.jar,\\r
+ jempbox-1.8.10.jar,\\r
+ xmpbox-1.8.10.jar\r
+source.. = src/\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?eclipse version="3.4"?>\r
+<plugin>\r
+\r
+ <extension\r
+ point="org.eclipse.help.base.searchParticipant">\r
+ <searchParticipant\r
+ extensions="pdf"\r
+ id="org.simantics.help.base.pdf"\r
+ participant="org.simantics.help.base.internal.PDFSearchParticipant"\r
+ headless="true"/>\r
+ </extension>\r
+\r
+</plugin>\r
--- /dev/null
+package org.simantics.help.base.internal;\r
+\r
+import org.osgi.framework.BundleActivator;\r
+import org.osgi.framework.BundleContext;\r
+\r
+public class Activator implements BundleActivator {\r
+\r
+ private static BundleContext context;\r
+\r
+ static BundleContext getContext() {\r
+ return context;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)\r
+ */\r
+ public void start(BundleContext bundleContext) throws Exception {\r
+ Activator.context = bundleContext;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)\r
+ */\r
+ public void stop(BundleContext bundleContext) throws Exception {\r
+ Activator.context = null;\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.simantics.help.base.internal;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.net.URL;\r
+import java.net.URLDecoder;\r
+\r
+import org.eclipse.core.runtime.FileLocator;\r
+import org.eclipse.core.runtime.IPath;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.Path;\r
+import org.eclipse.core.runtime.Platform;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.help.search.IHelpSearchIndex;\r
+import org.eclipse.help.search.ISearchDocument;\r
+import org.eclipse.help.search.SearchParticipant;\r
+import org.osgi.framework.Bundle;\r
+\r
+/**\r
+ * An abstract search participants for adding XML documents to the search index. Subclass it\r
+ * and implement or override protected methods to handle parsing of the document.\r
+ *\r
+ * @since 1.20.0\r
+ */\r
+public class PDFSearchParticipant extends SearchParticipant {\r
+\r
+ @Override\r
+ public IStatus addDocument(IHelpSearchIndex index, String pluginId, String name, URL url, String id, ISearchDocument doc) {\r
+ try {\r
+ //System.out.println("PDFSearchParticipant.addDocument(" + index + ", " + pluginId + ", " + name + ", " + url + ", " + id + ", " + doc + ")");\r
+ Bundle bundle = Platform.getBundle(pluginId);\r
+ if (bundle == null)\r
+ return new Status(IStatus.ERROR, pluginId, "Failed to find bundle " + bundle + " from the platform.");\r
+\r
+ // Need to decode path because it will fail to resolve if it contains %20 (=' ').\r
+ IPath path = new Path(URLDecoder.decode(name, "UTF-8"));\r
+ path = path.removeFirstSegments(1);\r
+ URL bundleUrl = FileLocator.find(bundle, path, null);\r
+ if (bundleUrl == null)\r
+ return new Status(IStatus.ERROR, pluginId, "Failed to find file " + name + " from bundle " + pluginId + ".");\r
+\r
+ URL fileUrl = FileLocator.toFileURL(bundleUrl);\r
+ if (!fileUrl.getProtocol().equals("file"))\r
+ return new Status(IStatus.ERROR, pluginId, "Failed to make " + url + " available as a file");\r
+\r
+ File f = new File(URLDecoder.decode(fileUrl.getPath(), "UTF-8")).getCanonicalFile();\r
+ PDFUtil.stripText(f, doc);\r
+ return Status.OK_STATUS;\r
+ } catch (IOException e) {\r
+ return new Status(IStatus.ERROR, pluginId, "Failed to strip text from PDF document " + url + ".", e);\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.simantics.help.base.internal;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.IOException;\r
+\r
+import org.apache.pdfbox.cos.COSDocument;\r
+import org.apache.pdfbox.pdfparser.PDFParser;\r
+import org.apache.pdfbox.pdmodel.PDDocument;\r
+import org.apache.pdfbox.pdmodel.PDDocumentInformation;\r
+import org.apache.pdfbox.util.PDFTextStripper;\r
+import org.eclipse.help.search.ISearchDocument;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class PDFUtil {\r
+\r
+ public static void stripText(File fromPdf, ISearchDocument doc) throws IOException {\r
+ PDFParser parser = new PDFParser(new FileInputStream(fromPdf));\r
+ parser.parse();\r
+\r
+ try (COSDocument cosDoc = parser.getDocument()) {\r
+ try (PDDocument pdDoc = new PDDocument(cosDoc)) {\r
+ int numPages = pdDoc.getNumberOfPages();\r
+ PDFTextStripper stripper = new PDFTextStripper();\r
+ stripper.setStartPage(1);\r
+ stripper.setEndPage(numPages);\r
+ String text = stripper.getText(pdDoc);\r
+ PDDocumentInformation docInfo = pdDoc.getDocumentInformation();\r
+ String title = docInfo.getTitle();\r
+ String subject = docInfo.getSubject();\r
+ if (title != null)\r
+ doc.setTitle(title);\r
+ if (subject != null)\r
+ doc.setSummary(subject);\r
+ doc.addContents(text);\r
+ }\r
+ }\r
+ }\r
+\r
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.help.core</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.ManifestBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.SchemaBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.PluginNature</nature>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8\r
+org.eclipse.jdt.core.compiler.compliance=1.8\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.8\r
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Simantics Help Core
+Bundle-SymbolicName: org.simantics.help.core;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.simantics.help.core.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.simantics.help.ontology;bundle-version="1.0.0",
+ org.simantics.db,
+ org.simantics.modeling.ontology,
+ org.simantics.layer0;bundle-version="1.1.0",
+ org.eclipse.help,
+ org.simantics.modeling;bundle-version="1.1.1",
+ winterwell.markdown,
+ org.simantics,
+ org.simantics.document.base.ontology,
+ org.eclipse.mylyn.wikitext.core,
+ org.eclipse.mylyn.wikitext.mediawiki.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Export-Package: org.simantics.help.core
--- /dev/null
+source.. = src/\r
+output.. = bin/\r
+bin.includes = META-INF/,\\r
+ .,\\r
+ scl/,\\r
+ plugin.xml\r
--- /dev/null
+body { \r
+ font-family: "Lucida Grande", "Lucida Grande", Verdana; \r
+ font-size:12px; \r
+ font-weight:normal;\r
+ color:#000000;\r
+ border-left: 2em solid #2b476f;\r
+ border-rigth: 2em hidden #2b476f;\r
+ padding-left: 1em;\r
+ padding-right: 1em;}\r
+ scrollbar-face-color:#006600;\r
+ scrollbar-highlight-color:#C0C0C0;\r
+ scrollbar-3dlight-color:#C0C0C0;\r
+ scrollbar-darkshadow-color:#000000;\r
+ scrollbar-shadow-color:#0F4966;\r
+ scrollbar-arrow-color:#FFFFFF;\r
+ scrollbar-track-color:#C0C0C0;\r
+ background-color: white;\r
+}\r
+\r
+table {\r
+ border-collapse: collapse;\r
+ text-align: left;\r
+ vertical-align: center;\r
+}\r
+\r
+caption {\r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: 12px; \r
+ text-align: left;\r
+ font-style: italic;\r
+}\r
+\r
+th { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: 12px; \r
+ background-color: silver;\r
+ padding-left: 5px;\r
+ padding-right: 5px;\r
+}\r
+\r
+td { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: 12px; \r
+ padding-left: 5px;\r
+ padding-right: 5px;\r
+}\r
+\r
+figure {\r
+ margin: 0;\r
+}\r
+\r
+figcaption {\r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: 12px; \r
+ text-align: left;\r
+ font-style: italic;\r
+}\r
+\r
+h1 { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size:35px; \r
+ color:#2b476f; \r
+}\r
+\r
+h2 { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size:20px; \r
+ color:#000000;\r
+}\r
+\r
+h3 { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size:16px;\r
+}\r
+\r
+A:link, A:visited, A:active { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: inherit; \r
+ text-decoration: none;\r
+ font-weight:bold; \r
+ color:#2b476f; \r
+}\r
+\r
+A:hover { \r
+ font-family: "Lucida Grande", Verdana; \r
+ text-decoration: none; \r
+ font-weight:bold; \r
+ color:#222299; \r
+ background-color:#C0C0C0\r
+}\r
+\r
+A[name]:hover { \r
+ font-family: "Lucida Grande", Verdana; \r
+ text-decoration: inherit; \r
+ font-weight: inherit; \r
+ color: inherit; \r
+ background-color: inherit \r
+}\r
+\r
+.wikitable {\r
+ text-align: left;\r
+ border-collapse: collapse;\r
+}\r
+\r
+.wikitable, .wikitable th, .wikitable td {\r
+ border: 1px solid black;\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?eclipse version="3.4"?>\r
+<plugin>\r
+ <extension\r
+ point="org.eclipse.help.toc">\r
+ <tocProvider\r
+ class="org.simantics.help.core.SimanticsTocProvider">\r
+ </tocProvider>\r
+ </extension>\r
+\r
+</plugin>\r
--- /dev/null
+import "URL"\r
+import "Simantics/DB"\r
+import "http://www.simantics.org/Help-1.0" as HELP\r
+\r
+importJava "org.simantics.help.core.HelpUtils" where\r
+ createHelpLibrary :: Resource -> <WriteGraph, Proc> Resource\r
+ createHelpTutorial :: Resource -> String -> <WriteGraph, Proc> Resource\r
+ clearHelpTocCache :: () -> <Proc> ()\r
+ saveHelpFileContents :: Resource -> String -> <WriteGraph, Proc> ()\r
+ readHelpFileContents :: Resource -> <ReadGraph, Proc> String\r
+ markdownToHtml :: Resource -> <ReadGraph, Proc> String\r
+ getHelpBrowserUrl :: () -> URL\r
+\r
+createHelpLibraryAction :: Resource -> <Proc> ()\r
+createHelpLibraryAction parent = do\r
+ syncWrite (\() -> createHelpLibrary parent)\r
+ ()\r
+\r
+createHelpTutorialAction :: Resource -> <Proc> ()\r
+createHelpTutorialAction parent = do\r
+ tutorialFiles = syncRead (\x -> objectsWithType parent L0.ConsistsOf HELP.TutorialFile)\r
+ fileName = if length tutorialFiles == 0\r
+ then "Tutorial"\r
+ else do\r
+ "Tutorial " + (show (length tutorialFiles))\r
+ syncWrite (\() -> createHelpTutorial parent fileName)\r
+ ()
\ No newline at end of file
--- /dev/null
+package org.simantics.help.core;\r
+\r
+import java.net.URL;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.StandardCopyOption;\r
+\r
+import org.eclipse.core.runtime.IPath;\r
+import org.eclipse.core.runtime.Platform;\r
+import org.eclipse.ui.plugin.AbstractUIPlugin;\r
+import org.osgi.framework.Bundle;\r
+import org.osgi.framework.BundleContext;\r
+\r
+/**\r
+ * The activator class controls the plug-in life cycle\r
+ */\r
+public class Activator extends AbstractUIPlugin {\r
+\r
+ // The plug-in ID\r
+ public static final String PLUGIN_ID = "org.simantics.help.core"; //$NON-NLS-1$\r
+\r
+ public static final String HTML_FOLDER = "html";\r
+ \r
+ // The shared instance\r
+ private static Activator plugin;\r
+ private static Path directory;\r
+ \r
+ /**\r
+ * The constructor\r
+ */\r
+ public Activator() {\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
+ */\r
+ public void start(BundleContext context) throws Exception {\r
+ super.start(context);\r
+ plugin = this;\r
+ Bundle bundle = context.getBundle();\r
+ IPath path = Platform.getStateLocation(bundle);\r
+ Path p = Paths.get(path.toOSString());\r
+ directory = p.resolve(HTML_FOLDER);\r
+ if (!Files.exists(directory))\r
+ Files.createDirectories(directory);\r
+ \r
+ // Ensure that style.css is inside the html directory\r
+ Path css = directory.resolve("style.css");\r
+ if (!Files.exists(css)) {\r
+ Files.createFile(css);\r
+ URL url = bundle.getEntry("css/style.css");\r
+ Files.copy(url.openStream(), css, StandardCopyOption.REPLACE_EXISTING);\r
+ }\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
+ */\r
+ public void stop(BundleContext context) throws Exception {\r
+ plugin = null;\r
+ super.stop(context);\r
+ }\r
+\r
+ /**\r
+ * Returns the shared instance\r
+ *\r
+ * @return the shared instance\r
+ */\r
+ public static Activator getDefault() {\r
+ return plugin;\r
+ }\r
+ \r
+ public static Path getHtmlDirectory() {\r
+ return directory;\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.simantics.help.core;\r
+\r
+import java.io.IOException;\r
+import java.io.StringWriter;\r
+import java.net.URL;\r
+import java.net.URLDecoder;\r
+import java.nio.charset.StandardCharsets;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.StandardOpenOption;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+import java.util.TreeMap;\r
+\r
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;\r
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;\r
+import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.eclipse.ui.help.IWorkbenchHelpSystem;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.ObjectsWithType;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.BindingException;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;\r
+import org.simantics.db.exception.ServiceException;\r
+import org.simantics.document.base.ontology.DocumentationResource;\r
+import org.simantics.help.HelpResources;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.modeling.ModelingUtils;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+\r
+import winterwell.markdown.pagemodel.MarkdownPage;\r
+\r
+public class HelpUtils {\r
+\r
+ public static Resource createHelpLibrary(WriteGraph graph, Resource parent) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ HelpResources HELP = HelpResources.getInstance(graph);\r
+ Resource library = graph.newResource();\r
+ graph.claim(library, L0.InstanceOf, null, HELP.HelpLibrary);\r
+ graph.addLiteral(library, L0.HasName, L0.NameOf, "Help Library", Bindings.STRING);\r
+ graph.claim(parent, L0.ConsistsOf, L0.PartOf, library);\r
+ return library;\r
+ }\r
+ \r
+ public static Resource createHelpTutorial(WriteGraph graph, Resource parent, String name) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ HelpResources HELP = HelpResources.getInstance(graph);\r
+ Resource tutorialFile = graph.newResource();\r
+ graph.claim(tutorialFile, L0.InstanceOf, null, HELP.TutorialFile);\r
+ graph.addLiteral(tutorialFile, L0.HasName, L0.NameOf, name, Bindings.STRING);\r
+ graph.claim(parent, L0.ConsistsOf, L0.PartOf, tutorialFile);\r
+ return tutorialFile;\r
+ }\r
+\r
+ public static List<Path> collectHelps(ReadGraph graph, Resource indexRoot) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ HelpResources HELP = HelpResources.getInstance(graph);\r
+ List<Resource> tutorialFiles = ModelingUtils.searchByType(graph, indexRoot, HELP.TutorialFile);\r
+ if (tutorialFiles.isEmpty())\r
+ return Collections.emptyList();\r
+ List<Path> result = new ArrayList<>(tutorialFiles.size());\r
+ for (Resource tutorialFile : tutorialFiles) {\r
+ StringBuilder sb = new StringBuilder();\r
+ \r
+ htmlHead(sb, graph.getRelatedValue2(tutorialFile, L0.HasName, Bindings.STRING));\r
+ sb.append(HelpUtils.markdownToHtml(graph, tutorialFile));\r
+ htmlHeadClose(sb);\r
+ \r
+ String indexRootURI = graph.getURI(indexRoot);\r
+ String indexRootName = graph.getRelatedValue2(indexRoot, L0.HasName, Bindings.STRING);\r
+ String tutorialFileURI = graph.getURI(tutorialFile);\r
+ String suffix = tutorialFileURI.substring(indexRootURI.length());\r
+ try {\r
+ if (suffix.startsWith("/"))\r
+ suffix = suffix.substring(1);\r
+ suffix = URLDecoder.decode(suffix, StandardCharsets.UTF_8.name());\r
+ Path outputPath = Activator.getHtmlDirectory().resolve(indexRootName).resolve(suffix + ".html");\r
+ createDirsRec(outputPath.getParent());\r
+ if (!Files.exists(outputPath))\r
+ Files.createFile(outputPath);\r
+ Files.write(outputPath, sb.toString().getBytes(StandardCharsets.UTF_8), StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);\r
+ result.add(outputPath);\r
+ } catch (IOException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private static void createDirsRec(Path path) throws IOException {\r
+ Path parent = path.getParent();\r
+ if (!Files.exists(parent)) {\r
+ createDirsRec(parent);\r
+ }\r
+ if (!Files.exists(path))\r
+ Files.createDirectory(path);\r
+ }\r
+\r
+ public static Map<String, List<Path>> collectHelpsFromSharedLibraries(ReadGraph graph) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ Collection<Resource> sharedLibraries = graph.syncRequest(new ObjectsWithType(graph.getRootLibrary(), L0.ConsistsOf, L0.SharedOntology));\r
+ if (sharedLibraries.isEmpty())\r
+ return Collections.emptyMap();\r
+ Map<String, List<Path>> result = new HashMap<>(sharedLibraries.size());\r
+ for (Resource library : sharedLibraries) {\r
+ String libraryName = graph.getRelatedValue2(library, L0.HasName, Bindings.STRING);\r
+ List<Path> paths = collectHelps(graph, library);\r
+ result.put(libraryName, paths);\r
+ }\r
+ return result;\r
+ }\r
+ \r
+ public static Map<String, Path> collectWidgetReferencesFromSharedLibraries(ReadGraph graph) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ Collection<Resource> sharedLibraries = graph.syncRequest(new ObjectsWithType(graph.getRootLibrary(), L0.ConsistsOf, L0.SharedOntology));\r
+ if (sharedLibraries.isEmpty())\r
+ return Collections.emptyMap();\r
+ Map<String, Path> result = new HashMap<>(sharedLibraries.size());\r
+ for (Resource library : sharedLibraries) {\r
+ String html = createWidgetReference(graph, library, "Widget Reference");\r
+ String indexRootName = graph.getRelatedValue2(library, L0.HasName, Bindings.STRING);\r
+ try {\r
+ Path outputPath = Activator.getHtmlDirectory().resolve(indexRootName).resolve("widgetReference.html");\r
+ createDirsRec(outputPath.getParent());\r
+ if (!Files.exists(outputPath))\r
+ Files.createFile(outputPath);\r
+ Files.write(outputPath, html.getBytes(StandardCharsets.UTF_8), StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);\r
+ result.put(indexRootName, outputPath);\r
+ } catch (IOException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+ \r
+ private static void htmlHead(StringBuilder sb, String title) {\r
+ sb.append("<!DOCTYPE html PUBLIC \"-//IETF//DTD HTML//EN\">\n");\r
+ sb.append("<html><head><title>" + title + " Tutorial</title>\n");\r
+ sb.append("<link rel=\"Stylesheet\" type=\"text/css\" media=\"all\" href=\"../style.css\">\n");\r
+ sb.append("</head>\n");\r
+ sb.append("<body style=\"background-color: white;\">\n");\r
+ sb.append("<h1 align=\"center\">" + title + "</h1>\n");\r
+ sb.append("<hr>\n");\r
+ }\r
+ \r
+ private static void htmlHeadClose(StringBuilder sb) {\r
+ sb.append("</body></html>\n");\r
+ }\r
+\r
+ public static String createWidgetReference(ReadGraph graph, Resource indexRoot, String title) throws DatabaseException {\r
+\r
+ String ontologyDesc = NameUtils.getSafeLabel(graph, indexRoot);\r
+ \r
+ StringBuilder sb = new StringBuilder();\r
+ \r
+ sb.append("<!DOCTYPE html PUBLIC \"-//IETF//DTD HTML//EN\">\n");\r
+ sb.append("<html><head><title>" + ontologyDesc+ " Widget Reference</title>\n");\r
+ sb.append("<link rel=\"Stylesheet\" type=\"text/css\" media=\"all\" href=\"../style.css\">\n");\r
+ sb.append("</head>\n");\r
+ sb.append("<body style=\"background-color: white;\">\n");\r
+ sb.append("<h1 align=\"center\">" + ontologyDesc+ "</h1>\n");\r
+ sb.append("<h2 align=\"center\">Widget Reference</h2>\n");\r
+ sb.append("<hr>\n");\r
+ sb.append("<h1 align=\"center\">" + title + "</h1>\n");\r
+ \r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
+ DocumentationResource DOC = DocumentationResource.getInstance(graph);\r
+ \r
+ List<Resource> types = ModelingUtils.searchByType(graph, indexRoot, DOC.DocumentComponentType);\r
+ for(Resource type : types) {\r
+\r
+ \r
+ String label = NameUtils.getSafeLabel(graph, type);\r
+\r
+ sb.append("<h2><a name=\"" + label + "\"></a>" + label + "</h2>\n");\r
+ sb.append("<h3>Description</h3>\n");\r
+\r
+ String desc = graph.getPossibleRelatedValue(type, L0.HasDescription);\r
+ if(desc == null) desc = "";\r
+ \r
+ sb.append("<p>" + WikiParser.parseToHtml(desc, false) + "</p>\n");\r
+ \r
+ sb.append("<h3>Base Types</h3>\n");\r
+ \r
+ Map<String,String> names = new HashMap<String,String>();\r
+\r
+ for(Resource r : graph.getSupertypes(type)) {\r
+\r
+ if(graph.isInheritedFrom(r, STR.Component)) {\r
+ \r
+ String label2 = NameUtils.getSafeLabel(graph, r);\r
+ String name = graph.getRelatedValue(r, L0.HasName);\r
+ //if("Component".equals(name)) continue;\r
+ if("Element".equals(name)) continue;\r
+ if("DefinedElement".equals(name)) continue;\r
+ if("PrimitiveComponent".equals(name)) continue;\r
+ if("DocumentComponent".equals(name)) continue;\r
+ \r
+ names.put(name, label2);\r
+\r
+ }\r
+ \r
+ }\r
+\r
+ for(Map.Entry<String, String> entry : names.entrySet()) {\r
+ String stuff = "predefined/baseWidgets.html#";\r
+ sb.append("<a href=\"" + stuff + entry.getKey() + "\">" + entry.getValue() + "</a>\n");\r
+ //sb.append("<a href=\"baseWidgets.html#" + entry.getKey() + "\">" + entry.getValue() + "</a>\n");\r
+ }\r
+\r
+ sb.append("<h3>Properties</h3>\n");\r
+ sb.append("<table style=\"width: 100%;\" border=\"1\" cellpadding=\"0\" cellspacing=\"0\">\n");\r
+ sb.append("<tbody>\n");\r
+ sb.append(" <tr style=\"background-color: silver;\">\n");\r
+ sb.append(" <td valign=\"top\"><br><strong>Property Name</strong></td>\n");\r
+ sb.append(" <td valign=\"top\"><br><strong>Type</strong></td>\n");\r
+ sb.append(" <td valign=\"top\"><br><strong>Default Value</strong></td>\n");\r
+ sb.append(" <td valign=\"top\"><br><strong>Description</strong></td>\n");\r
+ sb.append(" </tr>\n");\r
+ \r
+ Map<String, Resource> propertyMap = new TreeMap<String, Resource>();\r
+ \r
+ for(Resource ass : graph.getObjects(type, L0.Asserts)) {\r
+ \r
+ Resource object = graph.getSingleObject(ass, L0.HasObject);\r
+ \r
+ if(graph.isInstanceOf(object, L0.SCLValue)) continue;\r
+ if(graph.isInstanceOf(object, L0.Function)) continue;\r
+ if(graph.isInstanceOf(object, L0.ExternalValue)) continue;\r
+\r
+ Resource pred = graph.getSingleObject(ass, L0.HasPredicate);\r
+ String pName = NameUtils.getSafeLabel(graph, pred);\r
+ propertyMap.put(pName, ass);\r
+ }\r
+ \r
+ for (Entry<String, Resource> entry : propertyMap.entrySet()) {\r
+ Resource ass = entry.getValue();\r
+ Resource object = graph.getSingleObject(ass, L0.HasObject);\r
+ \r
+ Resource pred = graph.getSingleObject(ass, L0.HasPredicate);\r
+ String pName = NameUtils.getSafeLabel(graph, pred);\r
+ String valueType = graph.getPossibleRelatedValue(pred, L0.RequiresValueType);\r
+\r
+ Object jObject = graph.getValue(object);\r
+ String objectName = jObject.toString();\r
+ if(jObject.getClass().isArray()) {\r
+ Class<?> c1 = jObject.getClass().getComponentType();\r
+ boolean p1 = c1.isPrimitive();\r
+ if (!p1)\r
+ objectName = Arrays.toString((Object[])jObject);\r
+ if (boolean.class.equals(c1))\r
+ objectName = Arrays.toString((boolean[])jObject);\r
+ else if (byte.class.equals(c1))\r
+ objectName = Arrays.toString((byte[])jObject);\r
+ else if (int.class.equals(c1))\r
+ objectName = Arrays.toString((int[])jObject);\r
+ else if (long.class.equals(c1))\r
+ objectName = Arrays.toString((long[])jObject);\r
+ else if (float.class.equals(c1))\r
+ objectName = Arrays.toString((float[])jObject);\r
+ else if (double.class.equals(c1))\r
+ objectName = Arrays.toString((double[])jObject);\r
+ }\r
+\r
+ String pDesc = graph.getPossibleRelatedValue(pred, L0.HasDescription);\r
+ if(pDesc == null) pDesc = "";\r
+ \r
+ sb.append(" <tr>\n");\r
+ sb.append(" <td valign=\"top\">" + pName + "</td>\n");\r
+ sb.append(" <td valign=\"top\">" + valueType + "</td>\n");\r
+ sb.append(" <td valign=\"top\">" + objectName + "</td>\n");\r
+ sb.append(" <td valign=\"top\">" + WikiParser.parseToHtml(pDesc, false) + "</td>\n");\r
+ sb.append(" </tr>\n");\r
+ }\r
+\r
+ sb.append(" </tbody></table><br>\n");\r
+ }\r
+\r
+ sb.append("</body></html>\n");\r
+ return sb.toString();\r
+ }\r
+ \r
+ public static void clearHelpTocCache() {\r
+ SimanticsTocProvider.clearTocCache();\r
+ }\r
+ \r
+ public static void saveHelpFileContents(WriteGraph graph, Resource helpFile, String currentText) throws BindingException, ManyObjectsForFunctionalRelationException, ServiceException {\r
+ HelpResources HELP = HelpResources.getInstance(graph);\r
+ graph.claimLiteral(helpFile, HELP.HelpFile_contents, currentText, Bindings.STRING);\r
+ }\r
+ \r
+ public static String readHelpFileContents(ReadGraph graph, Resource helpFile) throws DatabaseException {\r
+ HelpResources HELP = HelpResources.getInstance(graph);\r
+ String content = graph.getPossibleRelatedValue2(helpFile, HELP.HelpFile_contents, Bindings.STRING);\r
+ return content != null ? content : "";\r
+ }\r
+ \r
+ public static String markdownToHtml(ReadGraph graph, Resource tutorialFile) throws DatabaseException {\r
+ HelpResources HELP = HelpResources.getInstance(graph);\r
+ String markdown = graph.getRelatedValue2(tutorialFile, HELP.HelpFile_contents, Bindings.STRING);\r
+ MarkdownPage page = new MarkdownPage(markdown);\r
+ return page.html();\r
+ }\r
+ \r
+ public static URL getHelpBrowserUrl() {\r
+ IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench().getHelpSystem();\r
+ URL url = helpSystem.resolve("", false);\r
+ return url;\r
+ }\r
+\r
+ private static class WikiParser {\r
+ \r
+ private static MarkupParser markupParser = new MarkupParser(new MediaWikiLanguage());\r
+ \r
+ private WikiParser() {}\r
+ \r
+ public static String parseToHtml(String wiki, boolean asDocument) {\r
+ StringWriter writer = new StringWriter();\r
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer);\r
+ markupParser.setBuilder(builder);\r
+ markupParser.parse(wiki, asDocument);\r
+ return writer.toString();\r
+ }\r
+ }\r
+}\r
--- /dev/null
+package org.simantics.help.core;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+import javax.xml.parsers.ParserConfigurationException;\r
+\r
+import org.eclipse.help.AbstractTocProvider;\r
+import org.eclipse.help.ITocContribution;\r
+import org.eclipse.help.internal.HelpPlugin;\r
+import org.eclipse.help.internal.Topic;\r
+import org.eclipse.help.internal.entityresolver.LocalEntityResolver;\r
+import org.eclipse.help.internal.toc.Toc;\r
+import org.eclipse.help.internal.toc.TocContribution;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Element;\r
+\r
+@SuppressWarnings("restriction")\r
+public class SimanticsTocProvider extends AbstractTocProvider {\r
+\r
+ private static DocumentBuilder builder;\r
+ private static Document document;\r
+ \r
+ private static Map<String, Path> widgetReferences; \r
+ private static Map<String, List<Path>> tutorials;\r
+ \r
+ @Override\r
+ public ITocContribution[] getTocContributions(String locale) {\r
+ List<ITocContribution> contributions = new ArrayList<>();\r
+ \r
+ if (widgetReferences == null || tutorials == null) {\r
+ try {\r
+ Simantics.getSession().syncRequest(new ReadRequest() {\r
+ @Override\r
+ public void run(ReadGraph graph) throws DatabaseException {\r
+ widgetReferences = HelpUtils.collectWidgetReferencesFromSharedLibraries(graph);\r
+ tutorials = HelpUtils.collectHelpsFromSharedLibraries(graph);\r
+ \r
+ }\r
+ });\r
+ } catch (DatabaseException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ Map<String, Toc> tocs = new HashMap<>();\r
+ \r
+ if (widgetReferences != null) {\r
+ for (Map.Entry<String, Path> widgetReference : widgetReferences.entrySet()) {\r
+ String libName = widgetReference.getKey();\r
+ Path htmlFile = widgetReference.getValue();\r
+ Toc toc = tocs.get(libName);\r
+ if (toc == null) {\r
+ Element element = getDocument().createElement("toc");\r
+ toc = new Toc(element); \r
+ toc.setLabel(libName);\r
+// toc.setTopic(libName);\r
+// toc.setHref(libName);\r
+ tocs.put(libName, toc);\r
+ }\r
+ \r
+ Topic topic = new Topic();\r
+ //topic.setLabel(htmlFile.getFileName().toString());\r
+ topic.setLabel("Widget Reference");\r
+// String href = htmlFile.toUri().toString();\r
+ String href = htmlFile.toString().split(Activator.PLUGIN_ID)[1].substring(1);\r
+ href = "PLUGINS_ROOT/platform:/meta/" + Activator.PLUGIN_ID + "/" + href;\r
+ topic.setHref(href.replace("\\", "/").replace(" ", "%20"));\r
+ \r
+ toc.appendChild(topic);\r
+ }\r
+ }\r
+\r
+ if (tutorials != null) {\r
+ for (Map.Entry<String, List<Path>> tutorial : tutorials.entrySet()) {\r
+ String libName = tutorial.getKey();\r
+ Toc toc = tocs.get(libName);\r
+ if (toc == null) {\r
+ Element element = getDocument().createElement("toc");\r
+ toc = new Toc(element); \r
+ toc.setLabel(libName);\r
+ toc.setTopic(libName);\r
+ toc.setHref(libName);\r
+ tocs.put(libName, toc);\r
+ }\r
+ \r
+ Map<String, Topic> topics = new HashMap<>();\r
+ \r
+ for (Path htmlFile : tutorial.getValue()) {\r
+ Path path = Paths.get(htmlFile.toString().split(libName)[1]);\r
+ Topic topic = getOrCreateTopic(topics, toc, path);\r
+ String href = htmlFile.toString().split(Activator.PLUGIN_ID)[1].substring(1);\r
+ href = "PLUGINS_ROOT/platform:/meta/" + Activator.PLUGIN_ID + "/" + href;\r
+// String href = htmlFile.toUri().toString();\r
+ topic.setHref(href.replace("\\", "/").replace(" ", "%20"));\r
+ }\r
+ }\r
+ }\r
+ \r
+ for (Toc toc : tocs.values()) {\r
+ TocContribution contribution = new TocContribution();\r
+ contribution.setLocale(locale);\r
+ contribution.setId(toc.getLabel());\r
+ contribution.setCategoryId("category_" + toc.getLabel());\r
+ contribution.setPrimary(true);\r
+ contribution.setContributorId(Activator.PLUGIN_ID);\r
+ \r
+ contribution.setToc(toc);\r
+ contributions.add(contribution);\r
+ }\r
+\r
+ \r
+ return (ITocContribution[])contributions.toArray(new ITocContribution[contributions.size()]);\r
+ }\r
+ \r
+ private static Topic getOrCreateTopic(Map<String, Topic> topics, Toc toc, Path topicPath) {\r
+ String topicName = topicPath.getFileName().toString();\r
+ Topic topic = topics.get(topicName);\r
+ if (topic == null) {\r
+ topic = new Topic();\r
+ topic.setLabel(topicName);\r
+ Path parentPath = topicPath.getParent();\r
+ if (parentPath != null && parentPath.getFileName() != null) {\r
+ Topic parentTopic = getOrCreateTopic(topics, toc, parentPath);\r
+ parentTopic.appendChild(topic);\r
+ } else {\r
+ toc.appendChild(topic);\r
+ }\r
+ topics.put(topicName, topic);\r
+ }\r
+ return topic;\r
+ }\r
+ \r
+ private static Document getDocument() {\r
+ if (document == null) {\r
+ if (builder == null) {\r
+ try {\r
+ builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();\r
+ builder.setEntityResolver(new LocalEntityResolver());\r
+ }\r
+ catch (ParserConfigurationException e) {\r
+ String msg = "Error creating document builder"; //$NON-NLS-1$\r
+ HelpPlugin.logError(msg, e);\r
+ }\r
+ }\r
+ document = builder.newDocument();\r
+ }\r
+ return document;\r
+ }\r
+ \r
+ public static void clearTocCache() {\r
+ widgetReferences.clear();\r
+ widgetReferences = null;\r
+ tutorials.clear();\r
+ tutorials = null;\r
+ HelpPlugin.getTocManager().clearCache();\r
+ }\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.help.feature</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.FeatureBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.FeatureNature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+###############################################################################\r
+# Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+# in 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
+# which accompanies this distribution, and is available at\r
+# http://www.eclipse.org/legal/epl-v10.html\r
+#\r
+# Contributors:\r
+# VTT Technical Research Centre of Finland - initial API and implementation\r
+###############################################################################\r
+bin.includes = feature.xml\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!--
+ Copyright (c) 2007, 2010 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
+ -->\r
+<feature\r
+ id="org.simantics.help"\r
+ label="Simantics Help"\r
+ version="1.1.1.qualifier"\r
+ provider-name="VTT Technical Research Centre of Finland">\r
+\r
+ <description>\r
+ This feature gather together the parts of Eclipse SDK that are needed to use the Eclipse help system and cheat sheets.\r
+ </description>\r
+\r
+ <license url="http://www.eclipse.org/legal/epl-v10.html">\r
+ Licensed under Eclipse Public License (EPL) 1.0.\r
+ </license>\r
+\r
+ <plugin\r
+ id="org.eclipse.help"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.help.base"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.help.ui"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.apache.lucene.analysis"\r
+ download-size="887"\r
+ install-size="1772"\r
+ version="3.5.0.v20120725-1805"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.apache.lucene.core"\r
+ download-size="1513"\r
+ install-size="3048"\r
+ version="3.5.0.v20120725-1805"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.help.webapp"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.equinox.http.registry"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="javax.servlet"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="javax.servlet.jsp"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.equinox.jsp.jasper"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.equinox.jsp.jasper.registry"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.equinox.http.jetty"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.equinox.http.servlet"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.ui.cheatsheets"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="javax.el"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="com.sun.el"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.apache.commons.logging"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.apache.jasper.glassfish"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.jetty.continuation"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.jetty.http"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.jetty.io"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.jetty.security"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.jetty.server"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.jetty.servlet"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.eclipse.jetty.util"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="winterwell.markdown"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+</feature>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.help.files</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.ManifestBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.SchemaBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.PluginNature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Simantics Help Files Location
+Bundle-SymbolicName: org.simantics.help.files
+Bundle-Version: 1.0.0.qualifier
--- /dev/null
+bin.includes = META-INF/\r
--- /dev/null
+body { \r
+ font-family: "Lucida Grande", "Lucida Grande", Verdana; \r
+ font-size:12px; \r
+ font-weight:normal;\r
+ color:#000000;\r
+ border-left: 2em solid #2b476f;\r
+ border-rigth: 2em hidden #2b476f;\r
+ padding-left: 1em;\r
+ padding-right: 1em;}\r
+ scrollbar-face-color:#006600;\r
+ scrollbar-highlight-color:#C0C0C0;\r
+ scrollbar-3dlight-color:#C0C0C0;\r
+ scrollbar-darkshadow-color:#000000;\r
+ scrollbar-shadow-color:#0F4966;\r
+ scrollbar-arrow-color:#FFFFFF;\r
+ scrollbar-track-color:#C0C0C0;\r
+ background-color: white;\r
+}\r
+\r
+table {\r
+ border-collapse: collapse;\r
+ text-align: left;\r
+ vertical-align: center;\r
+}\r
+\r
+caption {\r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: 12px; \r
+ text-align: left;\r
+ font-style: italic;\r
+}\r
+\r
+th { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: 12px; \r
+ background-color: silver;\r
+ padding-left: 5px;\r
+ padding-right: 5px;\r
+}\r
+\r
+td { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: 12px; \r
+ padding-left: 5px;\r
+ padding-right: 5px;\r
+}\r
+\r
+figure {\r
+ margin: 0;\r
+}\r
+\r
+figcaption {\r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: 12px; \r
+ text-align: left;\r
+ font-style: italic;\r
+}\r
+\r
+h1 { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size:35px; \r
+ color:#2b476f; \r
+}\r
+\r
+h2 { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size:20px; \r
+ color:#000000;\r
+}\r
+\r
+h3 { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size:16px;\r
+}\r
+\r
+A:link, A:visited, A:active { \r
+ font-family: "Lucida Grande", Verdana; \r
+ font-size: inherit; \r
+ text-decoration: none;\r
+ font-weight:bold; \r
+ color:#2b476f; \r
+}\r
+\r
+A:hover { \r
+ font-family: "Lucida Grande", Verdana; \r
+ text-decoration: none; \r
+ font-weight:bold; \r
+ color:#222299; \r
+ background-color:#C0C0C0\r
+}\r
+\r
+A[name]:hover { \r
+ font-family: "Lucida Grande", Verdana; \r
+ text-decoration: inherit; \r
+ font-weight: inherit; \r
+ color: inherit; \r
+ background-color: inherit \r
+}\r
+\r
+.wikitable {\r
+ text-align: left;\r
+ border-collapse: collapse;\r
+}\r
+\r
+.wikitable, .wikitable th, .wikitable td {\r
+ border: 1px solid black;\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.help.ontology</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.simantics.graph.builder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.ManifestBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.SchemaBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.PluginNature</nature>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ <nature>org.simantics.graph.nature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8\r
+org.eclipse.jdt.core.compiler.compliance=1.8\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.8\r
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Simantics Help Ontology
+Bundle-SymbolicName: org.simantics.help.ontology
+Bundle-Version: 1.0.0.qualifier
+Require-Bundle: org.simantics.layer0,
+ org.simantics.viewpoint.ontology;bundle-version="1.2.0",
+ org.simantics.modeling.ontology;bundle-version="1.2.0",
+ org.simantics.silk.ontology;bundle-version="1.1.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.simantics.help
--- /dev/null
+source.. = src/\r
+output.. = bin/\r
+bin.includes = plugin.xml,\\r
+ META-INF/,\\r
+ .,\\r
+ graph.tg\r
--- /dev/null
+L0 = <http://www.simantics.org/Layer0-1.1>
+VP = <http://www.simantics.org/Viewpoint-1.2>
+MOD = <http://www.simantics.org/Modeling-1.2>
+SILK = <http://www.simantics.org/Silk-1.1>
+
+HELP = <http://www.simantics.org/Help-1.0> : L0.Ontology
+ @L0.new
+ L0.HasResourceClass "org.simantics.help.HelpResources"
+
+HELP.SCLMain : L0.SCLModule
+ L0.SCLModule.definition _ : L0.String
+ @L0.loadString "scl/SCLMain.scl"
+
+HELP.HelpLibrary <T L0.Library
+
+HELP.HelpFile <T L0.Entity : MOD.TypeWithChangeInformation : L0.TypeWithIdentifier
+ >-- HELP.HelpFile.contents --> L0.String <R L0.HasProperty : L0.TotalFunction
+ @L0.assert HELP.HelpFile.contents ""
+
+HELP.TutorialFile <T HELP.HelpFile
+
+MAC = MOD.ModelingActionContext
+MBC = MOD.ModelingBrowseContext
+
+ACTIONS = HELP.Actions : L0.Library
+
+ACTIONS.NewHelpLibrary
+ @MOD.sclAction "createHelpLibraryAction"
+ACTIONS.NewHelpTutorial
+ @MOD.sclAction "createHelpTutorialAction"
+
+CONTRIBUTIONS = HELP.Contributions : L0.Library
+
+TESTS = MAC.Tests
+
+MAC
+ VP.BrowseContext.HasActionContribution CONTRIBUTIONS.NewHelpLibrary : VP.ActionContribution
+ L0.HasLabel "Help Library"
+ VP.ActionContribution.HasImage SILK.book
+ VP.ActionContribution.HasCategory VP.NewActionCategory
+ VP.ActionContribution.HasNodeType
+ L0.Library
+ VP.ActionContribution.HasAction ACTIONS.NewHelpLibrary
+ VP.ActionContribution.IsVisibleIf TESTS.IsContainerNotPublished
+ VP.BrowseContext.HasActionContribution CONTRIBUTIONS.NewHelpTutorial : VP.ActionContribution
+ L0.HasLabel "Help Tutorial"
+ VP.ActionContribution.HasImage SILK.page_white_text
+ VP.ActionContribution.HasCategory VP.NewActionCategory
+ VP.ActionContribution.HasNodeType
+ HELP.HelpLibrary
+ VP.ActionContribution.HasAction ACTIONS.NewHelpTutorial
+ VP.ActionContribution.IsVisibleIf TESTS.IsContainerNotPublished
+
+MBC
+ @VP.namedRelationChildRule CONTRIBUTIONS.HelpFiles L0.Entity L0.ConsistsOf HELP.HelpFile
+ @VP.namedConstantImageRule CONTRIBUTIONS.HelpFileImage HELP.HelpFile SILK.page_white_text
+ @VP.namedConstantImageRule CONTRIBUTIONS.HelpLibraryImage HELP.HelpLibrary SILK.book
--- /dev/null
+include "Simantics/All"\r
+include "Simantics/Help"
\ No newline at end of file
--- /dev/null
+package org.simantics.help;\r
+\r
+import org.simantics.db.RequestProcessor;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.service.QueryControl;\r
+\r
+public class HelpResources {\r
+ \r
+ public final Resource Actions;\r
+ public final Resource Actions_NewHelpLibrary;\r
+ public final Resource Actions_NewHelpTutorial;\r
+ public final Resource Contributions;\r
+ public final Resource Contributions_HelpFileImage;\r
+ public final Resource Contributions_HelpFiles;\r
+ public final Resource Contributions_HelpLibraryImage;\r
+ public final Resource Contributions_NewHelpLibrary;\r
+ public final Resource Contributions_NewHelpTutorial;\r
+ public final Resource HelpFile;\r
+ public final Resource HelpFile_contents;\r
+ public final Resource HelpFile_contents_Inverse;\r
+ public final Resource HelpLibrary;\r
+ public final Resource SCLMain;\r
+ public final Resource TutorialFile;\r
+ \r
+ public static class URIs {\r
+ public static final String Actions = "http://www.simantics.org/Help-1.0/Actions";\r
+ public static final String Actions_NewHelpLibrary = "http://www.simantics.org/Help-1.0/Actions/NewHelpLibrary";\r
+ public static final String Actions_NewHelpTutorial = "http://www.simantics.org/Help-1.0/Actions/NewHelpTutorial";\r
+ public static final String Contributions = "http://www.simantics.org/Help-1.0/Contributions";\r
+ public static final String Contributions_HelpFileImage = "http://www.simantics.org/Help-1.0/Contributions/HelpFileImage";\r
+ public static final String Contributions_HelpFiles = "http://www.simantics.org/Help-1.0/Contributions/HelpFiles";\r
+ public static final String Contributions_HelpLibraryImage = "http://www.simantics.org/Help-1.0/Contributions/HelpLibraryImage";\r
+ public static final String Contributions_NewHelpLibrary = "http://www.simantics.org/Help-1.0/Contributions/NewHelpLibrary";\r
+ public static final String Contributions_NewHelpTutorial = "http://www.simantics.org/Help-1.0/Contributions/NewHelpTutorial";\r
+ public static final String HelpFile = "http://www.simantics.org/Help-1.0/HelpFile";\r
+ public static final String HelpFile_contents = "http://www.simantics.org/Help-1.0/HelpFile/contents";\r
+ public static final String HelpFile_contents_Inverse = "http://www.simantics.org/Help-1.0/HelpFile/contents/Inverse";\r
+ public static final String HelpLibrary = "http://www.simantics.org/Help-1.0/HelpLibrary";\r
+ public static final String SCLMain = "http://www.simantics.org/Help-1.0/SCLMain";\r
+ public static final String TutorialFile = "http://www.simantics.org/Help-1.0/TutorialFile";\r
+ }\r
+ \r
+ public static Resource getResourceOrNull(ReadGraph graph, String uri) {\r
+ try {\r
+ return graph.getResource(uri);\r
+ } catch(DatabaseException e) {\r
+ System.err.println(e.getMessage());\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ public HelpResources(ReadGraph graph) {\r
+ Actions = getResourceOrNull(graph, URIs.Actions);\r
+ Actions_NewHelpLibrary = getResourceOrNull(graph, URIs.Actions_NewHelpLibrary);\r
+ Actions_NewHelpTutorial = getResourceOrNull(graph, URIs.Actions_NewHelpTutorial);\r
+ Contributions = getResourceOrNull(graph, URIs.Contributions);\r
+ Contributions_HelpFileImage = getResourceOrNull(graph, URIs.Contributions_HelpFileImage);\r
+ Contributions_HelpFiles = getResourceOrNull(graph, URIs.Contributions_HelpFiles);\r
+ Contributions_HelpLibraryImage = getResourceOrNull(graph, URIs.Contributions_HelpLibraryImage);\r
+ Contributions_NewHelpLibrary = getResourceOrNull(graph, URIs.Contributions_NewHelpLibrary);\r
+ Contributions_NewHelpTutorial = getResourceOrNull(graph, URIs.Contributions_NewHelpTutorial);\r
+ HelpFile = getResourceOrNull(graph, URIs.HelpFile);\r
+ HelpFile_contents = getResourceOrNull(graph, URIs.HelpFile_contents);\r
+ HelpFile_contents_Inverse = getResourceOrNull(graph, URIs.HelpFile_contents_Inverse);\r
+ HelpLibrary = getResourceOrNull(graph, URIs.HelpLibrary);\r
+ SCLMain = getResourceOrNull(graph, URIs.SCLMain);\r
+ TutorialFile = getResourceOrNull(graph, URIs.TutorialFile);\r
+ }\r
+ \r
+ public static HelpResources getInstance(ReadGraph graph) {\r
+ Session session = graph.getSession();\r
+ HelpResources ret = session.peekService(HelpResources.class);\r
+ if(ret == null) {\r
+ QueryControl qc = graph.getService(QueryControl.class);\r
+ ret = new HelpResources(qc.getIndependentGraph(graph));\r
+ session.registerService(HelpResources.class, ret);\r
+ }\r
+ return ret;\r
+ }\r
+ \r
+ public static HelpResources getInstance(RequestProcessor session) throws DatabaseException {\r
+ HelpResources ret = session.peekService(HelpResources.class);\r
+ if(ret == null) {\r
+ ret = session.syncRequest(new Read<HelpResources>() {\r
+ public HelpResources perform(ReadGraph graph) throws DatabaseException {\r
+ QueryControl qc = graph.getService(QueryControl.class);\r
+ return new HelpResources(qc.getIndependentGraph(graph));\r
+ }\r
+ });\r
+ session.registerService(HelpResources.class, ret);\r
+ }\r
+ return ret;\r
+ }\r
+ \r
+}\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
+ <classpathentry kind="src" path="src"/>\r
+ <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.help.ui</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.jdt.core.javabuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.ManifestBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.SchemaBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.PluginNature</nature>\r
+ <nature>org.eclipse.jdt.core.javanature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8\r
+org.eclipse.jdt.core.compiler.compliance=1.8\r
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.source=1.8\r
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Simantics Help UI
+Bundle-SymbolicName: org.simantics.help.ui;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.simantics.help.ui.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.simantics.ui,
+ org.simantics.help.ontology,
+ winterwell.markdown;bundle-version="1.2.0",
+ org.eclipse.ui.editors;bundle-version="3.9.0",
+ org.eclipse.jface.text;bundle-version="3.10.0",
+ org.eclipse.core.resources;bundle-version="3.10.1",
+ org.simantics.help.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .
--- /dev/null
+source.. = src/\r
+output.. = bin/\r
+bin.includes = META-INF/,\\r
+ .,\\r
+ plugin.xml\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?eclipse version="3.4"?>\r
+<plugin>\r
+ <extension\r
+ point="org.simantics.ui.resourceEditorAdapter">\r
+ <adapterClass\r
+ class="org.simantics.help.ui.OpenHelpFileAdapter"\r
+ priority="0">\r
+ </adapterClass>\r
+ </extension>\r
+ <extension\r
+ point="org.eclipse.ui.editors">\r
+ <editor\r
+ class="org.simantics.help.ui.HelpFileEditor"\r
+ contributorClass="winterwell.markdown.editors.ActionBarContributor"\r
+ default="false"\r
+ id="org.simantics.help.ui.HelpFileEditor"\r
+ name="Simantics Help File Editor">\r
+ </editor>\r
+ </extension>\r
+\r
+</plugin>\r
--- /dev/null
+package org.simantics.help.ui;\r
+\r
+import org.eclipse.ui.plugin.AbstractUIPlugin;\r
+import org.osgi.framework.BundleContext;\r
+\r
+/**\r
+ * The activator class controls the plug-in life cycle\r
+ */\r
+public class Activator extends AbstractUIPlugin {\r
+\r
+ // The plug-in ID\r
+ public static final String PLUGIN_ID = "org.simantics.help.ui"; //$NON-NLS-1$\r
+\r
+ // The shared instance\r
+ private static Activator plugin;\r
+ \r
+ /**\r
+ * The constructor\r
+ */\r
+ public Activator() {\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
+ */\r
+ public void start(BundleContext context) throws Exception {\r
+ super.start(context);\r
+ plugin = this;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
+ */\r
+ public void stop(BundleContext context) throws Exception {\r
+ plugin = null;\r
+ super.stop(context);\r
+ }\r
+\r
+ /**\r
+ * Returns the shared instance\r
+ *\r
+ * @return the shared instance\r
+ */\r
+ public static Activator getDefault() {\r
+ return plugin;\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.simantics.help.ui;\r
+\r
+import java.io.PrintWriter;\r
+import java.io.StringWriter;\r
+\r
+import org.eclipse.core.runtime.CoreException;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.jface.operation.IRunnableContext;\r
+import org.eclipse.jface.text.Document;\r
+import org.eclipse.jface.text.IDocument;\r
+import org.eclipse.jface.text.source.IAnnotationModel;\r
+import org.eclipse.ui.texteditor.AbstractDocumentProvider;\r
+import org.simantics.Simantics;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.UniqueRead;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.util.Layer0Utils;\r
+import org.simantics.help.core.HelpUtils;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.ui.workbench.IResourceEditorInput;\r
+import org.simantics.utils.logging.TimeLogger;\r
+\r
+public class HelpFileDocumentProvider extends AbstractDocumentProvider {\r
+\r
+ private Resource resource;\r
+ private String currentText;\r
+ private boolean errorHappened;\r
+\r
+ @Override\r
+ protected IDocument createDocument(Object element) throws CoreException {\r
+ IResourceEditorInput input = (IResourceEditorInput) element;\r
+ resource = input.getResource();\r
+ try {\r
+ return Simantics.getSession().syncRequest(new UniqueRead<Document>() {\r
+ @Override\r
+ public Document perform(ReadGraph graph) throws DatabaseException {\r
+ currentText = HelpUtils.readHelpFileContents(graph, resource);\r
+ errorHappened = false;\r
+ return new Document(currentText != null ? currentText : "");\r
+ }\r
+ });\r
+ } catch (DatabaseException e) {\r
+ StringWriter sw = new StringWriter();\r
+ PrintWriter pw = new PrintWriter(sw);\r
+ e.printStackTrace(pw);\r
+ errorHappened = true;\r
+ return new Document(sw.toString());\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected IAnnotationModel createAnnotationModel(Object element) throws CoreException {\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException {\r
+ TimeLogger.resetTimeAndLog("HelpFileDocumentProvider.doSaveDocument");\r
+ currentText = document.get();\r
+ Simantics.getSession().asyncRequest(new WriteRequest() {\r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+ graph.markUndoPoint();\r
+ HelpUtils.saveHelpFileContents(graph, resource, currentText);\r
+ Layer0Utils.addCommentMetadata(graph, "Saved SCL Module " + graph.getRelatedValue2(resource, Layer0.getInstance(graph).HasName, Bindings.STRING));\r
+ }\r
+ });\r
+ }\r
+\r
+ @Override\r
+ protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isModifiable(Object element) {\r
+ return !errorHappened;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isReadOnly(Object element) {\r
+ return errorHappened;\r
+ }\r
+\r
+ @Override\r
+ public boolean canSaveDocument(Object element) {\r
+ return !errorHappened && !getDocument(element).get().equals(currentText);\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.simantics.help.ui;\r
+\r
+import java.util.function.Supplier;\r
+\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.IEditorInput;\r
+import org.eclipse.ui.IEditorSite;\r
+import org.eclipse.ui.PartInitException;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.common.request.ParametrizedRead;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.request.combinations.Combinators;\r
+import org.simantics.ui.workbench.IResourceEditorInput;\r
+import org.simantics.ui.workbench.ResourceEditorSupport;\r
+import org.simantics.ui.workbench.TitleUpdater;\r
+import org.simantics.ui.workbench.TitleWithParentNameRequest;\r
+import org.simantics.ui.workbench.ToolTipRequest;\r
+import org.simantics.ui.workbench.editor.input.InputValidationCombinators;\r
+\r
+import winterwell.markdown.editors.MarkdownEditor;\r
+\r
+public class HelpFileEditor extends MarkdownEditor {\r
+\r
+ private static final String EDITOR_ID = "org.simantics.help.ui.HelpFileEditor";\r
+\r
+ private boolean disposed;\r
+\r
+ private static final ParametrizedRead<IResourceEditorInput, Boolean> INPUT_VALIDATOR = \r
+ Combinators.compose(InputValidationCombinators.hasURI(), InputValidationCombinators.extractInputResource());\r
+\r
+ private ResourceEditorSupport support;\r
+\r
+ public HelpFileEditor() {\r
+ super();\r
+ setDocumentProvider(new HelpFileDocumentProvider());\r
+ }\r
+\r
+ @Override\r
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {\r
+ super.init(site, input);\r
+\r
+ support = new ResourceEditorSupport(this, INPUT_VALIDATOR);\r
+ support.activateValidation();\r
+ try {\r
+ getResourceInput().init(null);\r
+ } catch (DatabaseException e) {\r
+ throw new PartInitException("Failed to initialize " + input, e);\r
+ }\r
+\r
+ }\r
+\r
+ protected IResourceEditorInput getResourceInput() {\r
+ return (IResourceEditorInput) getEditorInput();\r
+ }\r
+\r
+ @Override\r
+ public void createPartControl(Composite parent) {\r
+ super.createPartControl(parent);\r
+ updatePartName();\r
+ }\r
+\r
+ protected void updatePartName() {\r
+ setPartName(getEditorInput().getName());\r
+\r
+ Session session = Simantics.peekSession();\r
+ if (session != null) {\r
+ Supplier<Boolean> disposedCallback = this::isDisposed;\r
+ session.asyncRequest(new TitleWithParentNameRequest(getResourceInput()),\r
+ new TitleUpdater(getSite().getShell().getDisplay(), this::setPartName, disposedCallback));\r
+ session.asyncRequest(new ToolTipRequest(getSite().getId(), getResourceInput()),\r
+ new TitleUpdater(getSite().getShell().getDisplay(), this::setTitleToolTip, disposedCallback));\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void dispose() {\r
+ disposed = true;\r
+ if (support != null) {\r
+ support.dispose();\r
+ support = null;\r
+ }\r
+ super.dispose();\r
+ }\r
+\r
+ public boolean isDisposed() {\r
+ return disposed;\r
+ }\r
+\r
+ public static String getEditorId() {\r
+ return EDITOR_ID;\r
+ }\r
+}\r
--- /dev/null
+package org.simantics.help.ui;\r
+\r
+import org.eclipse.ui.PartInitException;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.simantics.Logger;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.PossibleIndexRoot;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.RVI;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.help.HelpResources;\r
+import org.simantics.ui.workbench.ResourceEditorInput2;\r
+import org.simantics.ui.workbench.editor.AbstractResourceEditorAdapter;\r
+import org.simantics.utils.ui.workbench.WorkbenchUtils;\r
+\r
+public class OpenHelpFileAdapter extends AbstractResourceEditorAdapter {\r
+\r
+ public OpenHelpFileAdapter() {\r
+ super("Help File Editor");\r
+ }\r
+\r
+ protected String getEditorId() {\r
+ return HelpFileEditor.getEditorId();\r
+ }\r
+ \r
+ @Override\r
+ protected boolean canHandle(ReadGraph g, Resource input) throws DatabaseException {\r
+ return g.isInstanceOf(input, HelpResources.getInstance(g).HelpFile);\r
+ }\r
+ \r
+ @Override\r
+ protected void openEditor(Resource input) throws Exception {\r
+ Simantics.getSession().asyncRequest(new ReadRequest() {\r
+ @Override\r
+ public void run(ReadGraph g) throws DatabaseException {\r
+\r
+ Variable variable = Variables.getVariable(g, input);\r
+ final Resource model = g.syncRequest(new PossibleIndexRoot(input));\r
+ final RVI rvi = variable.getPossibleRVI(g);\r
+ \r
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ String editorId = getEditorId();\r
+ WorkbenchUtils.openEditor(editorId, new ResourceEditorInput2(editorId, input, model, rvi));\r
+ } catch (PartInitException e) {\r
+ Logger.defaultLogError(e);\r
+ }\r
+ }\r
+ });\r
+ }\r
+ });\r
+ }\r
+\r
+}\r
\r
getDataType :: Resource -> <ReadGraph> Datatype\r
\r
+ @JavaName getSupertypes\r
+ superTypesOf :: Resource -> <ReadGraph> Set.T Resource\r
+ \r
@private\r
@JavaName getURI\r
uriOfResource :: Resource -> <ReadGraph> String\r
\r
@JavaName getProperties\r
properties_ :: Variable -> <ReadGraph> Collection Variable\r
+ \r
+ @JavaName getProperties\r
+ propertiesClassified_ :: Variable -> Resource -> <ReadGraph> Collection Variable\r
+ \r
@JavaName getChildren\r
children_ :: Variable -> <ReadGraph> Collection Variable\r
\r
valueOf v = untypedValue v\r
variantValueOf v = createVariant (datatype v) (untypedValue v :: Dynamic)\r
child = child_\r
- possibleChild = possibleChild_
\ No newline at end of file
+ possibleChild = possibleChild_\r
+\r
+propertiesClassified :: Variable -> Resource -> <ReadGraph> [Variable]\r
+propertiesClassified parent classified = do\r
+ collectionToList $ propertiesClassified_ parent classified
\ No newline at end of file
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2013, 2014 Association for Decentralized \r
+ * Information Management in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the THTH Simantics \r
+ * Division Member Component License which accompanies this \r
+ * distribution, and is available at\r
+ * http://www.simantics.org/legal/sdmcl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Semantum Oy - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.spreadsheet.common;\r
+\r
+import org.simantics.document.server.io.ITreeTableCell;\r
+\r
+public class TreeTableCell extends TableCell implements ITreeTableCell { \r
+ \r
+ private int parent = -1;\r
+\r
+ public TreeTableCell() {\r
+ }\r
+ \r
+ public void setParent(int parent) {\r
+ this.parent = parent;\r
+ }\r
+ \r
+ @Override\r
+ public int getParent() {\r
+ return parent;\r
+ }\r
+\r
+}\r
importJava "org.simantics.spreadsheet.common.TableCell" where\r
data TableCell\r
\r
+importJava "org.simantics.spreadsheet.common.TreeTableCell" where\r
+ data TreeTableCell\r
+\r
importJava "org.simantics.spreadsheet.common.SpreadsheetCell" where\r
data SpreadsheetCell\r
\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.desktop.feature</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.FeatureBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.FeatureNature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+bin.includes = feature.xml\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<feature\r
+ id="org.simantics.desktop"\r
+ label="Simantics Desktop"\r
+ version="1.0.1.qualifier"\r
+ provider-name="Semantum Oy">\r
+\r
+ <description url="http://www.example.com/description">\r
+ [Enter Feature Description here.]\r
+ </description>\r
+\r
+ <copyright url="http://www.example.com/copyright">\r
+ [Enter Copyright Description here.]\r
+ </copyright>\r
+\r
+ <license url="http://www.example.com/license">\r
+ [Enter License Description here.]\r
+ </license>\r
+\r
+ <includes\r
+ id="org.eclipse.equinox.executable"\r
+ version="0.0.0"/>\r
+\r
+ <includes\r
+ id="org.simantics.help"\r
+ version="0.0.0"/>\r
+\r
+ <includes\r
+ id="org.simantics.issues"\r
+ version="0.0.0"/>\r
+\r
+ <includes\r
+ id="org.simantics.modeling"\r
+ version="0.0.0"/>\r
+\r
+ <includes\r
+ id="org.simantics.issues.ui"\r
+ version="0.0.0"/>\r
+\r
+ <includes\r
+ id="org.simantics.workbench"\r
+ version="0.0.0"/>\r
+\r
+ <includes\r
+ id="org.simantics.eclipsec.launcher"\r
+ version="0.0.0"/>\r
+\r
+ <includes\r
+ id="org.eclipse.epp.mpc"\r
+ version="0.0.0"/>\r
+\r
+ <includes\r
+ id="org.eclipse.equinox.p2.discovery.feature"\r
+ version="0.0.0"/>\r
+\r
+ <plugin\r
+ id="org.simantics.desktop.ui"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+ <plugin\r
+ id="org.simantics.desktop.ui.ontology"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+</feature>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+ <name>org.simantics.desktop.product.feature</name>\r
+ <comment></comment>\r
+ <projects>\r
+ </projects>\r
+ <buildSpec>\r
+ <buildCommand>\r
+ <name>org.eclipse.pde.FeatureBuilder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
+ </buildSpec>\r
+ <natures>\r
+ <nature>org.eclipse.pde.FeatureNature</nature>\r
+ </natures>\r
+</projectDescription>\r
--- /dev/null
+bin.includes = feature.xml\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<feature\r
+ id="org.simantics.desktop.product"\r
+ label="Simantics Desktop Product Feature"\r
+ version="1.0.0.qualifier"\r
+ provider-name="Semantum Oy">\r
+\r
+ <description url="http://www.example.com/description">\r
+ [Enter Feature Description here.]\r
+ </description>\r
+\r
+ <copyright url="http://www.example.com/copyright">\r
+ [Enter Copyright Description here.]\r
+ </copyright>\r
+\r
+ <license url="http://www.example.com/license">\r
+ [Enter License Description here.]\r
+ </license>\r
+\r
+ <includes\r
+ id="org.simantics.desktop"\r
+ version="0.0.0"/>\r
+\r
+ <plugin\r
+ id="org.simantics.desktop.product"\r
+ download-size="0"\r
+ install-size="0"\r
+ version="0.0.0"\r
+ unpack="false"/>\r
+\r
+</feature>\r