--- /dev/null
+package org.simantics.document.linking.ge;\r
+\r
+import org.eclipse.swt.widgets.Display;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.ActionFactory;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.document.linking.ontology.DocumentLink;\r
+import org.simantics.document.linking.utils.SourceLinkUtil;\r
+import org.simantics.ui.SimanticsUI;\r
+import org.simantics.ui.workbench.editor.EditorAdapter;\r
+import org.simantics.ui.workbench.editor.EditorRegistry;\r
+import org.simantics.utils.ui.ExceptionUtils;\r
+\r
+public class ShowDocumentAction implements ActionFactory{\r
+ \r
+ \r
+ @Override\r
+ public Runnable create(Object target) {\r
+ if (!(target instanceof Variable))\r
+ return null;\r
+ final Variable v = (Variable)target;\r
+ \r
+\r
+ return new Runnable() {\r
+ \r
+ @Override\r
+ public void run() {\r
+ SimanticsUI.getSession().asyncRequest(new ReadRequest() {\r
+ \r
+ @Override\r
+ public void run(ReadGraph graph) throws DatabaseException {\r
+ DocumentLink sl = DocumentLink.getInstance(graph);\r
+ Resource t = v.getPossibleRepresents(graph);\r
+ if (!graph.isInstanceOf(t, sl.Source))\r
+ return;\r
+ final Resource reference = SourceLinkUtil.getReferredDocument(graph, t);\r
+ if (reference == null)\r
+ return;\r
+ EditorAdapter[] adapters = EditorRegistry.getInstance().getAdaptersFor(graph, reference);\r
+ if (adapters.length == 0)\r
+ return;\r
+ EditorAdapter highPri = null;\r
+ int pri = Integer.MIN_VALUE;\r
+ for (EditorAdapter a : adapters) {\r
+ int p = a.getPriority();\r
+ if (highPri == null || p > pri) {\r
+ highPri = a;\r
+ pri = p;\r
+ } \r
+ }\r
+ final EditorAdapter adapter = highPri;\r
+ Display.getDefault().asyncExec(new Runnable() {\r
+ \r
+ @Override\r
+ public void run() {\r
+ try {\r
+ adapter.openEditor(reference);\r
+ } catch (Exception e) {\r
+ ExceptionUtils.logAndShowError("Cannot open editor", e);\r
+ }\r
+ }\r
+ });\r
+\r
+ \r
+ }\r
+ });\r
+ \r
+ }\r
+ };\r
+\r
+ \r
+ }\r
+\r
+}\r