1 package org.simantics.document.linking.ge;
\r
3 import java.util.Arrays;
\r
4 import java.util.Comparator;
\r
6 import org.eclipse.jface.resource.JFaceResources;
\r
7 import org.eclipse.jface.resource.LocalResourceManager;
\r
8 import org.eclipse.jface.viewers.BaseLabelProvider;
\r
9 import org.eclipse.jface.viewers.ILabelProvider;
\r
10 import org.eclipse.jface.viewers.IStructuredContentProvider;
\r
11 import org.eclipse.jface.viewers.Viewer;
\r
12 import org.eclipse.swt.graphics.Image;
\r
13 import org.eclipse.swt.widgets.Display;
\r
14 import org.eclipse.ui.dialogs.ListDialog;
\r
15 import org.simantics.db.ReadGraph;
\r
16 import org.simantics.db.Resource;
\r
17 import org.simantics.db.common.request.ReadRequest;
\r
18 import org.simantics.db.exception.DatabaseException;
\r
19 import org.simantics.db.layer0.adapter.ActionFactory;
\r
20 import org.simantics.db.layer0.variable.Variable;
\r
21 import org.simantics.document.linking.ontology.DocumentLink;
\r
22 import org.simantics.document.linking.utils.SourceLinkUtil;
\r
23 import org.simantics.ui.SimanticsUI;
\r
24 import org.simantics.ui.workbench.editor.EditorAdapter;
\r
25 import org.simantics.ui.workbench.editor.EditorRegistry;
\r
26 import org.simantics.utils.ui.ExceptionUtils;
\r
28 public class ShowDocumentWithAction implements ActionFactory{
\r
32 public Runnable create(Object target) {
\r
33 if (!(target instanceof Variable))
\r
35 final Variable v = (Variable)target;
\r
38 return new Runnable() {
\r
42 SimanticsUI.getSession().asyncRequest(new ReadRequest() {
\r
45 public void run(ReadGraph graph) throws DatabaseException {
\r
46 DocumentLink sl = DocumentLink.getInstance(graph);
\r
47 Resource t = v.getPossibleRepresents(graph);
\r
48 if (!graph.isInstanceOf(t, sl.Source))
\r
50 final Resource reference = SourceLinkUtil.getReferredDocument(graph, t);
\r
51 if (reference == null)
\r
53 final EditorAdapter[] adapters = EditorRegistry.getInstance().getAdaptersFor(graph, reference);
\r
54 if (adapters.length == 0)
\r
56 Arrays.sort(adapters, new Comparator<EditorAdapter>() {
\r
58 public int compare(EditorAdapter o1, EditorAdapter o2) {
\r
59 return o1.getPriority() - o2.getPriority();
\r
63 Display.getDefault().asyncExec(new Runnable() {
\r
68 ListDialog dialog = new ListDialog(Display.getCurrent().getActiveShell());
\r
69 dialog.setContentProvider(new ArrayContentProvider());
\r
70 dialog.setLabelProvider(new EditorAdapterLabelProvider());
\r
71 dialog.setInput(adapters);
\r
72 dialog.setTitle("Open with");
\r
73 if (dialog.open() != ListDialog.OK)
\r
75 EditorAdapter adapter = (EditorAdapter)dialog.getResult()[0];
\r
77 adapter.openEditor(reference);
\r
78 } catch (Exception e) {
\r
79 ExceptionUtils.logAndShowError("Cannot open editor", e);
\r
94 private static class ArrayContentProvider implements IStructuredContentProvider {
\r
95 public Object[] getElements(Object inputElement) {
\r
96 return (Object[])inputElement;
\r
100 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
\r
104 public void dispose() {
\r
109 private static class EditorAdapterLabelProvider extends BaseLabelProvider implements ILabelProvider {
\r
110 private LocalResourceManager localResourceManager;
\r
112 public EditorAdapterLabelProvider() {
\r
113 localResourceManager = new LocalResourceManager(JFaceResources.getResources());
\r
116 public Image getImage(Object element) {
\r
117 EditorAdapter adapter = (EditorAdapter)element;
\r
118 return localResourceManager.createImage(adapter.getIcon());
\r
122 public String getText(Object element) {
\r
123 EditorAdapter adapter = (EditorAdapter)element;
\r
124 return adapter.getName();
\r
128 public void dispose() {
\r
129 localResourceManager.dispose();
\r