]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.document.linking.ge;\r
2 \r
3 import java.util.Arrays;\r
4 import java.util.Comparator;\r
5 \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
27 \r
28 public class ShowDocumentWithAction implements ActionFactory{\r
29         \r
30         \r
31         @Override\r
32         public Runnable create(Object target) {\r
33                 if (!(target instanceof Variable))\r
34                         return null;\r
35                 final Variable v = (Variable)target;\r
36                 \r
37 \r
38                 return new Runnable() {\r
39                         \r
40                         @Override\r
41                         public void run() {\r
42                                 SimanticsUI.getSession().asyncRequest(new ReadRequest() {\r
43                                         \r
44                                         @Override\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
49                                                         return;\r
50                                                 final Resource reference = SourceLinkUtil.getReferredDocument(graph, t);\r
51                                                 if (reference == null)\r
52                                                         return;\r
53                                                 final EditorAdapter[] adapters = EditorRegistry.getInstance().getAdaptersFor(graph, reference);\r
54                                                 if (adapters.length == 0)\r
55                                                         return;\r
56                                                 Arrays.sort(adapters, new Comparator<EditorAdapter>() {\r
57                                                         @Override\r
58                                                         public int compare(EditorAdapter o1, EditorAdapter o2) {\r
59                                                                 return o1.getPriority() - o2.getPriority();\r
60                                                         }\r
61                                                 });\r
62                                                 \r
63                                                 Display.getDefault().asyncExec(new Runnable() {\r
64                                                         \r
65                                                         @Override\r
66                                                         public void run() {\r
67                                                                 try {\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
74                                                                                 return;\r
75                                                                         EditorAdapter adapter = (EditorAdapter)dialog.getResult()[0];\r
76                                                                         \r
77                                                                         adapter.openEditor(reference);\r
78                                                                 } catch (Exception e) {\r
79                                                                         ExceptionUtils.logAndShowError("Cannot open editor", e);\r
80                                                                 }\r
81                                                         }\r
82                                                 });\r
83 \r
84                                                 \r
85                                         }\r
86                                 });\r
87                                 \r
88                         }\r
89                 };\r
90 \r
91                 \r
92         }\r
93         \r
94         private static class ArrayContentProvider implements IStructuredContentProvider {\r
95                 public Object[] getElements(Object inputElement) {\r
96                         return (Object[])inputElement;\r
97                 };\r
98                 \r
99                 @Override\r
100                 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
101                         \r
102                 }\r
103                 @Override\r
104                 public void dispose() {\r
105                         \r
106                 }\r
107         }\r
108         \r
109         private static class EditorAdapterLabelProvider extends BaseLabelProvider implements ILabelProvider {\r
110                 private LocalResourceManager localResourceManager;\r
111                 \r
112                 public EditorAdapterLabelProvider() {\r
113                         localResourceManager = new LocalResourceManager(JFaceResources.getResources());\r
114                 }\r
115                 @Override\r
116                 public Image getImage(Object element) {\r
117                         EditorAdapter adapter = (EditorAdapter)element;\r
118                         return localResourceManager.createImage(adapter.getIcon());\r
119                 }\r
120                 \r
121                 @Override\r
122                 public String getText(Object element) {\r
123                         EditorAdapter adapter = (EditorAdapter)element;\r
124                         return adapter.getName();\r
125                 }\r
126                 \r
127                 @Override\r
128                 public void dispose() {\r
129                         localResourceManager.dispose();\r
130                         super.dispose();\r
131                 }\r
132         }\r
133 \r
134 }\r