--- /dev/null
+package org.simantics.document.linking.ge;\r
+\r
+import java.util.Arrays;\r
+import java.util.Comparator;\r
+\r
+import org.eclipse.jface.resource.JFaceResources;\r
+import org.eclipse.jface.resource.LocalResourceManager;\r
+import org.eclipse.jface.viewers.BaseLabelProvider;\r
+import org.eclipse.jface.viewers.ILabelProvider;\r
+import org.eclipse.jface.viewers.IStructuredContentProvider;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.ui.dialogs.ListDialog;\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 ShowDocumentWithAction 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
+ final EditorAdapter[] adapters = EditorRegistry.getInstance().getAdaptersFor(graph, reference);\r
+ if (adapters.length == 0)\r
+ return;\r
+ Arrays.sort(adapters, new Comparator<EditorAdapter>() {\r
+ @Override\r
+ public int compare(EditorAdapter o1, EditorAdapter o2) {\r
+ return o1.getPriority() - o2.getPriority();\r
+ }\r
+ });\r
+ \r
+ Display.getDefault().asyncExec(new Runnable() {\r
+ \r
+ @Override\r
+ public void run() {\r
+ try {\r
+ ListDialog dialog = new ListDialog(Display.getCurrent().getActiveShell());\r
+ dialog.setContentProvider(new ArrayContentProvider());\r
+ dialog.setLabelProvider(new EditorAdapterLabelProvider());\r
+ dialog.setInput(adapters);\r
+ dialog.setTitle("Open with");\r
+ if (dialog.open() != ListDialog.OK)\r
+ return;\r
+ EditorAdapter adapter = (EditorAdapter)dialog.getResult()[0];\r
+ \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
+ private static class ArrayContentProvider implements IStructuredContentProvider {\r
+ public Object[] getElements(Object inputElement) {\r
+ return (Object[])inputElement;\r
+ };\r
+ \r
+ @Override\r
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
+ \r
+ }\r
+ @Override\r
+ public void dispose() {\r
+ \r
+ }\r
+ }\r
+ \r
+ private static class EditorAdapterLabelProvider extends BaseLabelProvider implements ILabelProvider {\r
+ private LocalResourceManager localResourceManager;\r
+ \r
+ public EditorAdapterLabelProvider() {\r
+ localResourceManager = new LocalResourceManager(JFaceResources.getResources());\r
+ }\r
+ @Override\r
+ public Image getImage(Object element) {\r
+ EditorAdapter adapter = (EditorAdapter)element;\r
+ return localResourceManager.createImage(adapter.getIcon());\r
+ }\r
+ \r
+ @Override\r
+ public String getText(Object element) {\r
+ EditorAdapter adapter = (EditorAdapter)element;\r
+ return adapter.getName();\r
+ }\r
+ \r
+ @Override\r
+ public void dispose() {\r
+ localResourceManager.dispose();\r
+ super.dispose();\r
+ }\r
+ }\r
+\r
+}\r