Bundle-Vendor: Semantum Oy
Require-Bundle: org.simantics.layer0,
org.simantics.views.ontology;bundle-version="1.1.0",
+ org.simantics.views.text.ontology;bundle-version="1.0.0",
org.simantics.modeling.ontology;bundle-version="1.1.0",
org.simantics.scenegraph.ontology;bundle-version="1.0.0",
org.simantics.document.ontology;bundle-version="1.1.0",
L0 = <http://www.simantics.org/Layer0-1.1>
VIEWS = <http://www.simantics.org/Views-1.2>
+TEXTVIEWS = <http://www.simantics.org/TextViews-1.0>
SG = <http://www.simantics.org/Scenegraph-1.1>
DOC = <http://www.simantics.org/Document-1.2>
ACT = <http://www.simantics.org/Action-1.1>
@L0.list
_ : VIEWS.Composite
VIEWS.Composite.layout _ : VIEWS.RowLayout
- //VIEWS.RowLayout.type VIEWS.Control.Style.Constant.Horizontal
- //VIEWS.RowLayout.spacing 0
- //VIEWS.RowLayout.justify true
- //VIEWS.RowLayout.pack true
- //VIEWS.RowLayout.wrap true
VIEWS.Control.layoutData _ : VIEWS.GridLayout.GridData
VIEWS.GridLayout.GridData.horizontalGrab true
SG.Node.children _ : L0.List
VIEWS.Composite.layout _ : VIEWS.GridLayout
SG.Node.children _ : L0.List
@L0.list
- UI.WikitextContribution.View.Text : VIEWS.StyledText
+ UI.WikitextContribution.View.Text : TEXTVIEWS.MarkupSourceViewer
@VIEWS.Control.style4 VIEWS.Control.Style.Constant.Multi VIEWS.Control.Style.Constant.Border VIEWS.Control.Style.Constant.VScroll VIEWS.Control.Style.Constant.HScroll
VIEWS.TextContainer.text UI.Functions.selectedDocumentPart : L0.Function
L0.HasValueType "String"
VIEWS.SashForm.orientation VIEWS.SashForm.Vertical
SG.Node.children _ : L0.List
@L0.list
-// UI.Scroll : VIEWS.ScrolledComposite
- // VIEWS.Control.layoutData
- // _ : VIEWS.GridLayout.GridData
- // VIEWS.GridLayout.GridData.horizontalGrab true
- // VIEWS.GridLayout.GridData.verticalGrab true
- // SG.Node.children _ : L0.List
- // @L0.list
UI.Browser : VIEWS.Browser
VIEWS.Control.layoutData
_ : VIEWS.GridLayout.GridData
Bundle-Vendor: Semantum Oy
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime,
+ org.simantics.views;bundle-version="1.1.0",
org.simantics.views.swt;bundle-version="1.0.0",
org.simantics.document.ontology;bundle-version="1.0.0",
org.simantics.document.ui.ontology;bundle-version="1.0.0",
org.simantics.modeling.ontology;bundle-version="1.1.0",
org.simantics.scenegraph.ontology;bundle-version="1.0.0",
org.simantics.document;bundle-version="1.0.0",
- org.eclipse.mylyn.wikitext.mediawiki.core;bundle-version="1.5.2",
- org.eclipse.mylyn.wikitext.core;bundle-version="1.5.1",
org.simantics.wiki.ui;bundle-version="1.1.0",
org.simantics.browsing.ui;bundle-version="1.1.0",
org.simantics.selectionview;bundle-version="1.0.0",
- org.simantics.views;bundle-version="1.1.0",
org.simantics.utils.thread.swt;bundle-version="1.1.0",
org.simantics.browsing.ui.model;bundle-version="1.0.0";visibility:=reexport,
org.simantics.graphfile;bundle-version="0.1.0",
org.simantics.annotation.ontology;bundle-version="1.0.0",
org.simantics.annotation.ui;bundle-version="1.0.0",
org.eclipse.ui.editors;bundle-version="3.9.0",
- org.eclipse.jface.text
+ org.eclipse.jface.text,
+ org.slf4j.api;bundle-version="1.7.2"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Export-Package: org.simantics.document.ui,
/*******************************************************************************
- * Copyright (c) 2012 Association for Decentralized Information Management in
+ * Copyright (c) 2012, 2017 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
*
* Contributors:
* VTT Technical Research Centre of Finland - initial API and implementation
+ * Semantum Oy - (#7066) introducing logger & refactoring
*******************************************************************************/
package org.simantics.document.ui.function;
import org.simantics.db.common.request.ReadRequest;
import org.simantics.db.common.request.UnaryRead;
import org.simantics.db.common.request.WriteRequest;
-import org.simantics.db.common.utils.Logger;
import org.simantics.db.common.utils.NameUtils;
import org.simantics.db.common.utils.RequestUtil;
import org.simantics.db.exception.DatabaseException;
import org.simantics.ui.workbench.action.DefaultActions;
import org.simantics.utils.threads.SWTThread;
import org.simantics.utils.ui.workbench.WorkbenchUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class All {
+ private static final Logger LOGGER = LoggerFactory.getLogger(All.class);
+
private static boolean createDocument(WriteGraph graph, Resource resource, Resource model) throws DatabaseException {
Layer0 L0 = Layer0.getInstance(graph);
if(document == null) return;
RemoverUtil.remove(graph, document);
+ graph.markUndoPoint();
}
@Override
public void perform(WriteGraph graph) throws DatabaseException {
-
Variable selection = resolveEditSelection(graph, context, "..../Scroll/Browser#edited");
- if (selection != null)
+ if (selection != null) {
selection.setValue(graph, (String)value, Bindings.STRING);
- else {
- System.err.println("no selection for resource : " + resource + ", Variable context : " + context + ", value : " + value);
+ graph.markUndoPoint();
+ } else {
+ LOGGER.error("No selection for resource : " + resource + ", Variable context : " + context + ", value : " + value);
}
}
String editorId = CSSEditor.EDITOR_ID;
RVI rvi = null;
- PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-
- @Override
- public void run() {
-
- try {
- WorkbenchUtils.openEditor(editorId, new ResourceEditorInput2(editorId, root, root, rvi));
- } catch (PartInitException e) {
- Logger.defaultLogError(e);
- }
-
+ PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
+ try {
+ WorkbenchUtils.openEditor(editorId, new ResourceEditorInput2(editorId, root, root, rvi));
+ } catch (PartInitException e) {
+ LOGGER.error("Failed to open CSS editor for root " + root, e);
}
-
});
}
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import org.simantics.db.Resource;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.views.ontology.ViewsResources;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTButton;
-
-public class ButtonLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public ButtonLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, Variable context) throws DatabaseException {
-
- SWTButton node = parent.addNode(SWTButton.class);
-
- node.setLayoutData(LoaderUtils.getGridData(configuration));
- node.setStyle(LoaderUtils.getStyle(configuration));
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TextContainer_HasText, node.getTextFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Button_Modifier, node.getModifierFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Button_HasImage, node.getImageFunction());
-
- return node;
-
- }
-
-}
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import org.simantics.db.Resource;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.views.ontology.ViewsResources;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTCCombo;
-
-public class CComboLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public CComboLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, Variable context) throws DatabaseException {
-
- SWTCCombo node = parent.addNode(SWTCCombo.class);
-
- node.setLayoutData(LoaderUtils.getGridData(configuration));
- node.setStyle(LoaderUtils.getStyle(configuration));
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Combo_AvailableItems, node.getAvailableFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Combo_SelectedItem, node.getSelectionFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Combo_Modifier, node.getModifierFunction());
-
- return node;
-
- }
-
-}
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import org.simantics.db.Resource;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.views.ontology.ViewsResources;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTCombo;
-
-public class ComboLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public ComboLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, Variable context) throws DatabaseException {
-
- SWTCombo node = parent.addNode(SWTCombo.class);
-
- node.setLayoutData(LoaderUtils.getGridData(configuration));
- node.setStyle(LoaderUtils.getStyle(configuration));
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Combo_AvailableItems, node.getAvailableFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Combo_SelectedItem, node.getSelectionFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Combo_Modifier, node.getModifierFunction());
-
- return node;
-
- }
-
-}
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import org.simantics.datatypes.literal.RGB;
-import org.simantics.db.Resource;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.views.ontology.ViewsResources;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTComposite;
-
-public class CompositeLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public CompositeLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, Variable context) throws DatabaseException {
-
- SWTComposite node = parent.addNode(SWTComposite.class);
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Control_HasBackground, RGB.Integer.BINDING, node.getBackgroundFunction());
-
- node.setLayoutData(LoaderUtils.getGridData(configuration));
- node.setLayout(LoaderUtils.getLayout(configuration));
- node.setStyle(LoaderUtils.getStyle(configuration));
-
- return node;
-
- }
-
-}
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.TreeItem;
-import org.simantics.browsing.ui.BuiltinKeys;
-import org.simantics.browsing.ui.NodeContext;
-import org.simantics.databoard.Bindings;
-import org.simantics.db.ReadGraph;
-import org.simantics.db.Resource;
-import org.simantics.db.VirtualGraph;
-import org.simantics.db.WriteGraph;
-import org.simantics.db.common.request.ResourceRead;
-import org.simantics.db.common.request.WriteRequest;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.util.Simantics;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.views.ViewUtils;
-import org.simantics.views.ontology.ViewsResources;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTExplorer;
-
-public class ExplorerLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public ExplorerLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, final Variable context) throws DatabaseException {
-
- SWTExplorer node = parent.addNode(SWTExplorer.class);
-
- node.setStyle(LoaderUtils.getStyle(configuration));
-
- String browseContextURI = Simantics.getSession().sync(new ResourceRead<String>(configuration) {
-
- @Override
- public String perform(ReadGraph graph) throws DatabaseException {
- ViewsResources VIEW = ViewsResources.getInstance(graph);
- Resource browseContext = graph.getSingleObject(resource, VIEW.Explorer_BrowseContext);
- return graph.getURI(browseContext);
- }
-
- });
-
- node.setBrowseContextURI(browseContextURI);
-
- node.setLayoutData(LoaderUtils.getGridData(configuration));
-
- node.setColumns(LoaderUtils.getColumns(configuration));
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Explorer_InputTransformation, node.getInputFunction());
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Explorer_HasColumnsVisible, node.getColumnsVisibleFunction());
-
- Listener selectionListener = Simantics.getSession().sync(new ResourceRead<Listener>(configuration) {
-
- @Override
- public Listener perform(ReadGraph graph) throws DatabaseException {
- ViewsResources VIEW = ViewsResources.getInstance(graph);
- Resource listener = graph.getPossibleObject(resource, VIEW.Explorer_SelectionListener);
- if(listener == null) return null;
- return graph.adapt(listener, Listener.class);
- }
-
- });
-
- if(selectionListener != null) node.addListenerToControl(SWT.Selection, selectionListener);
-
- node.addListenerToControl(SWT.Selection, new Listener() {
-
- @Override
- public void handleEvent(Event event) {
-
- TreeItem item = (TreeItem)event.item;
-// Tree tree = item.getParent();
-// GraphExplorer explorer = (GraphExplorer)tree.getData("GraphExplorer");
-// final Resource runtimeDiagram = (Resource)explorer.getRoot().getConstant(BuiltinKeys.INPUT);
-// final boolean checked = item.getChecked();
- NodeContext nc = (NodeContext)item.getData();
- Object obj = nc.getConstant(BuiltinKeys.INPUT);
-
- if (obj instanceof Variable) {
- final Variable var = (Variable) obj;
- Simantics.getSession().async(new WriteRequest(Simantics.getSession().getService(VirtualGraph.class)) {
- @Override
- public void perform(WriteGraph graph) throws DatabaseException {
- ViewsResources VIEW = ViewsResources.getInstance(graph);
- System.err.println("setParameter " + context.getURI(graph) + " -> " + var.getURI(graph));
- ViewUtils.setParameter(graph, context, VIEW.Explorer_Selection, var.getURI(graph), Bindings.STRING);
- }
- });
- }
- }
-
- });
-
- return node;
-
- }
-
-}
-
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import org.simantics.db.Resource;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.views.ontology.ViewsResources;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTLabel;
-
-public class LabelLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public LabelLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, Variable context) throws DatabaseException {
-
- SWTLabel node = parent.addNode(SWTLabel.class);
-
- node.setLayoutData(LoaderUtils.getGridData(configuration));
- node.setStyle(LoaderUtils.getStyle(configuration));
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TextContainer_HasText, node.getTextFunction());
-
- return node;
-
- }
-
-}
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import org.simantics.db.Resource;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTScrolledComposite;
-
-public class ScrolledCompositeLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public ScrolledCompositeLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, Variable context) throws DatabaseException {
-
- SWTScrolledComposite node = parent.addNode(SWTScrolledComposite.class);
-
- node.setLayoutData(LoaderUtils.getGridData(configuration));
- node.setLayout(LoaderUtils.getLayout(configuration));
- node.setStyle(LoaderUtils.getStyle(configuration));
-
- return node;
-
- }
-
-}
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.simantics.db.ReadGraph;
-import org.simantics.db.Resource;
-import org.simantics.db.common.request.UniqueRead;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.util.Simantics;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.db.layer0.variable.Variables;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTTabFolder;
-
-public class TabFolderLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public TabFolderLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, Variable context) throws DatabaseException {
-
- SWTTabFolder node = parent.addNode(SWTTabFolder.class);
-
- final Collection<Variable> children = LoaderUtils.getChildren(configuration);
-
- String[] names = Simantics.getSession().sync(new UniqueRead<String[]>() {
-
- @Override
- public String[] perform(ReadGraph graph) throws DatabaseException {
-
- String[] result = new String[children.size()];
-
- int index = 0;
- for(Variable child : children) {
- result[index++] = child.getPropertyValue(graph, Variables.LABEL);
- }
-
- return result;
-
- }
-
- });
-
- node.setTabNames(names);
-
- return node;
-
- }
-
- Set<Control> getControls(CTabItem item) {
- HashSet<Control> result = new HashSet<Control>();
- forControl(item.getControl(), result);
- return result;
- }
-
- void forControl(Control control, HashSet<Control> controls) {
- controls.add(control);
- if(control instanceof Composite) {
- Composite composite = (Composite)control;
- for(Control child : composite.getChildren()) forControl(child, controls);
- }
- }
-
-}
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import org.simantics.datatypes.literal.Font;
-import org.simantics.datatypes.literal.RGB;
-import org.simantics.db.Resource;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.views.ontology.ViewsResources;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTText;
-
-public class TextLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public TextLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, Variable context) throws DatabaseException {
-
- SWTText node = parent.addNode(SWTText.class);
-
- node.setLayoutData(LoaderUtils.getGridData(configuration));
- node.setStyle(LoaderUtils.getStyle(configuration));
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TextContainer_HasText, node.getTextFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Control_HasBackground, RGB.Integer.BINDING, node.getBackgroundFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Control_HasForeground, RGB.Integer.BINDING, node.getForegroundFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Control_HasFont, Font.BINDING, node.getFontFunction());
-
- return node;
-
- }
-
-}
+++ /dev/null
-package org.simantics.views.swt.loader;
-
-import org.simantics.databoard.Bindings;
-import org.simantics.datatypes.literal.Font;
-import org.simantics.datatypes.literal.RGB;
-import org.simantics.db.Resource;
-import org.simantics.db.VirtualGraph;
-import org.simantics.db.WriteGraph;
-import org.simantics.db.common.request.WriteRequest;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.util.Simantics;
-import org.simantics.db.layer0.variable.Variable;
-import org.simantics.scenegraph.ParentNode;
-import org.simantics.scenegraph.loader.ScenegraphLoader;
-import org.simantics.utils.ui.widgets.TrackedModifyEvent;
-import org.simantics.utils.ui.widgets.TrackedModifyListener;
-import org.simantics.views.ViewUtils;
-import org.simantics.views.ontology.ViewsResources;
-import org.simantics.views.swt.client.base.ISWTViewNode;
-import org.simantics.views.swt.client.impl.SWTTrackedText;
-
-public class TrackedTextLoader implements ScenegraphLoader {
-
- final private Resource configuration;
-
- public TrackedTextLoader(Resource configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public ISWTViewNode create(ParentNode<ISWTViewNode> parent, final Variable context) throws DatabaseException {
-
- SWTTrackedText node = parent.addNode(SWTTrackedText.class);
-
- node.setLayoutData(LoaderUtils.getGridData(configuration));
- node.setStyle(LoaderUtils.getStyle(configuration));
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TextContainer_HasText, node.getTextFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Control_HasForeground, RGB.Integer.BINDING, node.getForegroundFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TrackedText_HasInvalidBackground, RGB.Integer.BINDING, node.getInvalidBackgroundFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TrackedText_HasInactiveBackground, RGB.Integer.BINDING, node.getInactiveBackgroundFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TrackedText_HasHoverBackground, RGB.Integer.BINDING, node.getHoverBackgroundFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TrackedText_HasEditingBackground, RGB.Integer.BINDING, node.getEditingBackgroundFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.Control_HasFont, Font.BINDING, node.getFontFunction());
-
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TextReceiver_Modifier, node.getModifierFunction());
- LoaderUtils.listen(configuration, context, ViewsResources.URIs.TextReceiver_Validator, node.getValidatorFunction());
-
- node.addModifyListener(new TrackedModifyListener() {
-
- @Override
- public void modifyText(TrackedModifyEvent e) {
-
- final String text = e.getText();
-
- Simantics.getSession().async(new WriteRequest(Simantics.getSession().getService(VirtualGraph.class)) {
-
- @Override
- public void perform(WriteGraph graph) throws DatabaseException {
- ViewsResources VIEW = ViewsResources.getInstance(graph);
- System.err.println("setParameter " + context.getURI(graph) + " -> " + text);
- ViewUtils.setParameter(graph, context, VIEW.TrackedText_Content, text, Bindings.STRING);
- }
-
- });
-
- }
-
- });
-
- return node;
-
- }
-
-}
--- /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.views.text.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/TextViews
+Bundle-SymbolicName: org.simantics.views.text.ontology
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: Semantum Oy
+Require-Bundle: org.simantics.layer0,
+ org.simantics.views.ontology;bundle-version="1.2.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
--- /dev/null
+source.. = src/\r
+output.. = bin/\r
+bin.includes = META-INF/,\\r
+ .,\\r
+ graph.tg\r
+src.includes = graph/\r
--- /dev/null
+L0 = <http://www.simantics.org/Layer0-1.1>
+VIEWS = <http://www.simantics.org/Views-1.2>
+
+TEXTVIEWS = <http://www.simantics.org/TextViews-1.0> : L0.Ontology
+ @L0.new
+
+TEXTVIEWS.MarkupSourceViewer <T VIEWS.StyledText
--- /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.views.text</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: Modelled Text Viewer UI Controls
+Bundle-SymbolicName: org.simantics.views.text;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.simantics.views.text.internal.Activator
+Bundle-Vendor: Semantum Oy
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.ui.editors;bundle-version="3.9.0",
+ org.eclipse.core.runtime,
+ org.eclipse.jface.text;bundle-version="3.10.0",
+ org.eclipse.mylyn.wikitext.core;bundle-version="2.7.0",
+ org.eclipse.mylyn.wikitext.mediawiki.core;bundle-version="2.7.0",
+ org.eclipse.mylyn.wikitext.ui;bundle-version="2.7.0",
+ org.eclipse.mylyn.wikitext.mediawiki.ui;bundle-version="2.7.0",
+ org.simantics.views;bundle-version="1.1.0",
+ org.simantics.views.swt;bundle-version="1.0.0",
+ org.simantics.views.swt.client;bundle-version="1.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2017 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:
+ Semantum Oy - initial API and implementation
+ -->
+<adapters>
+
+ <target interface="org.simantics.scenegraph.loader.ScenegraphLoader">
+ <type uri="http://www.simantics.org/TextViews-0.0/MarkupSourceViewer" class="org.simantics.scenegraph.loader.StandardScenegraphLoader">
+ <this/>
+ <bundle />
+ <string>org.simantics.views.text.internal.SWTMarkupSourceViewer</string>
+ </type>
+ </target>
+
+</adapters>
--- /dev/null
+source.. = src/\r
+output.. = bin/\r
+bin.includes = META-INF/,\\r
+ .,\\r
+ adapters.xml,\\r
+ plugin.xml\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+ Copyright (c) 2017 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:
+ Semantum Oy - (#7066) undo/redo support for markup editor
+ -->
+
+<plugin>
+
+ <extension
+ point="org.eclipse.core.expressions.definitions">
+ <definition
+ id="org.simantics.views.text.inTextViewer">
+ <with variable="activeFocusControlId">
+ <equals value="inTextViewer"/>
+ </with>
+ </definition>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.simantics.views.text.internal.TextViewerUndoHandler:undo"
+ commandId="org.eclipse.ui.edit.undo">
+ <activeWhen>
+ <reference definitionId="org.simantics.views.text.inTextViewer" />
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.simantics.views.text.internal.TextViewerUndoHandler:redo"
+ commandId="org.eclipse.ui.edit.redo">
+ <activeWhen>
+ <reference definitionId="org.simantics.views.text.inTextViewer" />
+ </activeWhen>
+ </handler>
+ </extension>
+
+</plugin>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2017 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:
+ * Semantum Oy - initial API and implementation
+ *******************************************************************************/
+package org.simantics.views.text.internal;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ * @author Tuukka Lehtonen
+ * @since 1.28.0
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.simantics.views.text"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2017 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:
+ * Semantum Oy - (#7066) initial API and implementation
+ *******************************************************************************/
+package org.simantics.views.text.internal;
+
+import org.eclipse.jface.text.Document;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;
+import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewer;
+import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewerConfiguration;
+import org.eclipse.mylyn.wikitext.ui.editor.ShowInTargetBridge;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.services.IServiceLocator;
+import org.eclipse.ui.swt.IFocusService;
+import org.simantics.views.ViewUtils;
+import org.simantics.views.swt.client.base.SingleSWTViewNode;
+
+/**
+ * @author Tuukka Lehtonen
+ * @since 1.28.0
+ */
+public class SWTMarkupSourceViewer extends SingleSWTViewNode<StyledText> {
+
+ private static final long serialVersionUID = 3034624586096417826L;
+
+ private MarkupSourceViewer viewer;
+ private boolean textInitialized = false;
+
+ @Override
+ public void createControls(Composite parent) {
+ MarkupLanguage language = new MediaWikiLanguage();
+ viewer = new MarkupSourceViewer(parent, null, style | SWT.WRAP, language);
+ viewer.setEditable(false);
+ MarkupSourceViewerConfiguration configuration = new MarkupSourceViewerConfiguration(Activator.getDefault().getPreferenceStore());
+ configuration.setMarkupLanguage(language);
+ configuration.setShowInTarget(new ShowInTargetBridge(viewer));
+ viewer.configure(configuration);
+ viewer.setDocument(new Document(text != null ? text : ""));
+ control = viewer.getTextWidget();
+ control.setData(TextViewerConstants.KEY_UNDO_MANAGER, viewer.getUndoManager());
+ control.setEnabled(false);
+
+ setProperties();
+
+ // Allow undo/redo handler to be bound to this text editor's focus
+ IServiceLocator locator = getSite();
+ if (locator != null) {
+ IFocusService focusService = locator.getService(IFocusService.class);
+ if (focusService != null) {
+ focusService.addFocusTracker(control, TextViewerConstants.CONTEXT_IN_TEXT_VIEWER);
+ }
+ }
+
+ control.addSelectionListener(new SelectionListener() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ ViewUtils.setWorkbenchSelection(viewer.getSelection());
+ }
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ });
+ }
+
+ @Override
+ public void synchronizeText(String text) {
+ this.text = text;
+ if (text != null) {
+ // Try to keep the vertical scroll position of the text widget
+ int caretOffset = control.getCaretOffset();
+ int charCount = control.getCharCount();
+ int topIndex = viewer.getTopIndex();
+ int diff = text.length() - charCount;
+ int newCaretOffset = Math.max(0, Math.min(caretOffset + diff, text.length()));
+
+ viewer.getDocument().set(text);
+ viewer.setTopIndex(topIndex);
+ control.setCaretOffset(newCaretOffset);
+ viewer.setEditable(true);
+ control.setEnabled(true);
+
+ // Prevent text viewer undo from allowing the
+ // user to undo the text viewer back to empty.
+ if (!textInitialized) {
+ viewer.getUndoManager().reset();
+ textInitialized = true;
+ }
+ } else {
+ textInitialized = false;
+ viewer.setEditable(false);
+ control.setEnabled(false);
+ viewer.getDocument().set("");
+ viewer.getUndoManager().reset();
+ }
+ }
+
+ public String readText() {
+ return viewer.getDocument().get();
+ }
+
+ public Point readSelection() {
+ return control.getSelection();
+ }
+
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2017 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:
+ * Semantum Oy - (#7066) initial API and implementation
+ *******************************************************************************/
+package org.simantics.views.text.internal;
+
+import org.eclipse.jface.text.IUndoManager;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Tuukka Lehtonen
+ * @since 1.28.0
+ */
+public class TextViewerConstants {
+
+ /**
+ * The UI focus control context used for enabling normal text undo/redo for
+ * {@link TextViewer} controls.
+ */
+ public static final String CONTEXT_IN_TEXT_VIEWER = "inTextViewer";
+
+ /**
+ * A key used for storing an {@link IUndoManager} as data of a
+ * {@link Control} using {@link Control#setData(String, Object)}.
+ */
+ public static final String KEY_UNDO_MANAGER = "undoManager";
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2017 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:
+ * Semantum Oy - (#7066) initial API and implementation
+ *******************************************************************************/
+package org.simantics.views.text.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.concurrent.Callable;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.jface.text.IUndoManager;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * Handles the undo/redo command for {@link TextViewer}s through
+ * {@link IUndoManager}.
+ *
+ * <p>
+ * The implementation looks for an IUndoManager from the current focus control
+ * using the {@link TextViewerConstants#KEY_UNDO_MANAGER} data key. Its
+ * existence determines whether this handler {@link #isHandled()} returns
+ * <code>true</code> or <code>false</code>.
+ *
+ * <p>
+ * The handler expects to receive a single string as an argument through the
+ * extension definitions ({@link IExecutableExtension}) that determines which
+ * method is invoked from IUndoManager (<code>undo</code> or <code>redo</code>).
+ *
+ * <p>
+ * Implementation is partially copied from
+ * <code>org.eclipse.ui.internal.handlers.WidgetMethodHandler</code>.
+ *
+ * @since 1.28.0
+ */
+public class TextViewerUndoHandler extends AbstractHandler implements IExecutableExtension {
+
+ /**
+ * The parameters to pass to the method this handler invokes. This handler
+ * always passes no parameters.
+ */
+ protected static final Class<?>[] NO_PARAMETERS = new Class[0];
+
+ public TextViewerUndoHandler() {
+ display = Display.getCurrent();
+ if (display != null) {
+ focusListener = new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ updateEnablement();
+ }
+ };
+ display.addFilter(SWT.FocusIn, focusListener);
+ }
+ }
+
+ void updateEnablement() {
+ boolean rc = isHandled();
+ if (rc != isEnabled()) {
+ setBaseEnabled(rc);
+ }
+ }
+
+ /**
+ * The name of the method to be invoked by this handler. This value should
+ * never be <code>null</code>.
+ */
+ protected String methodName;
+ private Listener focusListener;
+ private Display display;
+
+ @Override
+ public Object execute(final ExecutionEvent event) throws ExecutionException {
+ Callable<?> runnable = getMethodToExecute();
+ if (runnable != null) {
+ try {
+ runnable.call();
+ } catch (ExecutionException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ExecutionException("Unexpected failure executing method " + methodName + " through " + runnable);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public final boolean isHandled() {
+ return getMethodToExecute() != null;
+ }
+
+ /**
+ * Looks up the method on the focus control.
+ *
+ * @return The method on the focus control; <code>null</code> if none.
+ */
+ protected Callable<Boolean> getMethodToExecute() {
+ Display display = Display.getCurrent();
+ if (display == null)
+ return null;
+
+ Control focusControl = display.getFocusControl();
+ if (focusControl == null)
+ return null;
+
+ IUndoManager undoManager = (IUndoManager) focusControl.getData(TextViewerConstants.KEY_UNDO_MANAGER);
+ if (undoManager == null)
+ return null;
+
+ try {
+ Method method = undoManager.getClass().getMethod(methodName, NO_PARAMETERS);
+ if (method != null)
+ return runner(undoManager, method);
+ } catch (NoSuchMethodException e) {
+ // Fall through...
+ }
+
+ return null;
+ }
+
+ protected Callable<Boolean> runner(IUndoManager undoManager, Method method) {
+ return () -> {
+ try {
+ method.invoke(undoManager);
+ return true;
+ } catch (IllegalAccessException e) {
+ // The method is protected, so do nothing.
+ return false;
+ } catch (InvocationTargetException e) {
+ throw new ExecutionException(
+ "An exception occurred while executing " //$NON-NLS-1$
+ + method.getName(), e
+ .getTargetException());
+
+ }
+ };
+ }
+
+ @Override
+ public void setInitializationData(IConfigurationElement config, String propertyName, Object data) {
+ methodName = data.toString();
+ }
+
+ @Override
+ public void dispose() {
+ if (display != null && !display.isDisposed()) {
+ display.removeFilter(SWT.FocusIn, focusListener);
+ }
+ display = null;
+ focusListener = null;
+ }
+
+}
\ No newline at end of file
<module>org.simantics.views.ontology</module>
<module>org.simantics.views.swt</module>
<module>org.simantics.views.swt.client</module>
+ <module>org.simantics.views.text</module>
+ <module>org.simantics.views.text.ontology</module>
<module>org.simantics.wiki.ui</module>
<module>org.simantics.workbench</module>
<module>org.simantics.workbench.ontology</module>
<?xml version="1.0" encoding="UTF-8"?>
<feature
id="org.simantics.views.swt.feature"
- label="SWT views"
+ label="Modelled SWT Views"
version="1.0.1.qualifier"
provider-name="Semantum Oy">
version="0.0.0"
unpack="false"/>
+ <plugin
+ id="org.simantics.views.text"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.simantics.views.text.ontology"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
</feature>