]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/ge/ShowDocumentWithAction.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / ge / ShowDocumentWithAction.java
diff --git a/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/ge/ShowDocumentWithAction.java b/bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/ge/ShowDocumentWithAction.java
new file mode 100644 (file)
index 0000000..cb782c7
--- /dev/null
@@ -0,0 +1,134 @@
+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