--- /dev/null
+package org.simantics.views.swt;\r
+\r
+import org.eclipse.ui.IWorkbenchSite;\r
+import org.simantics.Simantics;\r
+import org.simantics.browsing.ui.common.ErrorLogger;\r
+import org.simantics.browsing.ui.graph.impl.GraphInputSources;\r
+import org.simantics.browsing.ui.graph.impl.InputSourceListener;\r
+import org.simantics.browsing.ui.graph.impl.ObservableInputSource;\r
+import org.simantics.browsing.ui.graph.impl.SessionContextInputSource;\r
+import org.simantics.browsing.ui.graph.impl.WorkbenchSessionContextInputSource;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.RequestProcessor;\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.variable.Variable;\r
+import org.simantics.db.layer0.variable.VariableRepository;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.scenegraph.INode;\r
+import org.simantics.scenegraph.loader.ScenegraphLoaderProcess;\r
+import org.simantics.views.ontology.ViewsResources;\r
+import org.simantics.views.swt.client.base.SWTRoot;\r
+\r
+public class SWTViewLoaderProcess extends ScenegraphLoaderProcess {\r
+\r
+ final private ModelledView view;\r
+ final private IWorkbenchSite site;\r
+ \r
+ public static class ISL implements InputSourceListener {\r
+ \r
+ private SWTViewLoaderProcess process;\r
+ \r
+ ISL(SWTViewLoaderProcess process) {\r
+ this.process = process;\r
+ }\r
+ \r
+ void dispose() {\r
+ process = null;\r
+ }\r
+ \r
+ @Override\r
+ public void inputChanged(SessionContextInputSource source) {\r
+ if(process == null) return;\r
+ Object input = source.get( Simantics.getSessionContext() );\r
+ if (input != null)\r
+ process.view.inputChanged(source.getProvider(), input);\r
+ else\r
+ ErrorLogger.defaultLogWarning("input source " + source + " invalidly returned null", new Exception("for stack trace only"));\r
+ }\r
+ };\r
+ \r
+ ISL inputSourceListener = new ISL(this);\r
+ \r
+ public SWTViewLoaderProcess(ModelledView view, IWorkbenchSite site, String name) {\r
+ super(name);\r
+ this.view = view;\r
+ this.site = site;\r
+ this.root = new SWTRoot(site);\r
+ }\r
+\r
+ public SWTViewLoaderProcess(ModelledView view, IWorkbenchSite site) {\r
+ this(view, site, "<unnamed SWTViewLoaderProcess>");\r
+ }\r
+\r
+ @Override\r
+ public INode getRoot() {\r
+ return root;\r
+ }\r
+ \r
+ @Override\r
+ protected void initialize(RequestProcessor processor, final Variable configuration) throws DatabaseException {\r
+ \r
+ SessionContextInputSource inputSource = processor.sync(new UniqueRead<SessionContextInputSource>() {\r
+ @Override\r
+ public SessionContextInputSource perform(ReadGraph graph) throws DatabaseException {\r
+ ViewsResources VIEW = ViewsResources.getInstance(graph);\r
+ Resource represents = configuration.getRepresents(graph);\r
+ Resource inputSource = graph.getPossibleObject(represents, VIEW.HasInputSource);\r
+ if (inputSource == null)\r
+ return GraphInputSources.projectSource();\r
+ return graph.adapt(inputSource, SessionContextInputSource.class);\r
+ }\r
+ });\r
+\r
+ if(view != null)\r
+ view.setInputSource(inputSource);\r
+\r
+ if (inputSource instanceof ObservableInputSource)\r
+ ((ObservableInputSource) inputSource).setListener(inputSourceListener);\r
+\r
+ if (inputSource instanceof WorkbenchSessionContextInputSource)\r
+ ((WorkbenchSessionContextInputSource) inputSource).init(site, view);\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void dispose() {\r
+ \r
+ if (isDisposed())\r
+ return;\r
+ \r
+ inputSourceListener.dispose();\r
+ for(String uri : registeredURIs) VariableRepository.unregister(uri);\r
+ SWTRoot r = (SWTRoot)root;\r
+ r.dispose();\r
+ \r
+ super.dispose();\r
+ \r
+ }\r
+\r
+}\r