1 package org.simantics.document.linking.ge;
\r
3 import org.eclipse.jface.dialogs.MessageDialog;
\r
4 import org.eclipse.swt.widgets.Display;
\r
5 import org.simantics.db.ReadGraph;
\r
6 import org.simantics.db.Resource;
\r
7 import org.simantics.db.WriteGraph;
\r
8 import org.simantics.db.common.request.WriteRequest;
\r
9 import org.simantics.db.common.utils.NameUtils;
\r
10 import org.simantics.db.exception.DatabaseException;
\r
11 import org.simantics.db.layer0.adapter.DropActionFactory;
\r
12 import org.simantics.db.layer0.variable.Variable;
\r
13 import org.simantics.document.linking.ontology.DocumentLink;
\r
14 import org.simantics.document.linking.utils.SourceLinkUtil;
\r
15 import org.simantics.layer0.Layer0;
\r
16 import org.simantics.ui.SimanticsUI;
\r
17 import org.simantics.utils.ui.AdaptionUtils;
\r
19 public class SourceObjectDropAction implements DropActionFactory {
\r
23 public Runnable create(ReadGraph g, Object target, Object source, int operation)
\r
24 throws DatabaseException {
\r
25 Variable t = (Variable)target;
\r
26 Resource s = AdaptionUtils.adaptToSingle(source, Resource.class);
\r
28 Variable sv = AdaptionUtils.adaptToSingle(source, Variable.class);
\r
30 s = sv.getRepresents(g);
\r
33 if(t == null || s == null)
\r
35 DocumentLink sl = DocumentLink.getInstance(g);
\r
36 if (g.isInstanceOf(s, sl.Source)) {
\r
39 return getRunnable(t, s);
\r
42 private Runnable getRunnable(final Variable tv, final Resource s) {
\r
43 return new Runnable() {
\r
47 SimanticsUI.getSession().asyncRequest(new WriteRequest() {
\r
50 public void perform(WriteGraph graph) throws DatabaseException {
\r
51 Layer0 l0 = Layer0.getInstance(graph);
\r
53 Resource relation = tv.getPossiblePredicateResource(graph);
\r
55 if (relation != null && graph.isInstanceOf(relation, l0.FunctionalRelation)) {
\r
56 instance = tv.getParent(graph).getPossibleRepresents(graph);
\r
58 instance = tv.getPossibleRepresents(graph);
\r
60 if (instance == null)
\r
64 SourceLinkUtil.createDocumentLink(graph, instance, relation, s);
\r
65 } catch (final DatabaseException e) {
\r
66 String l = NameUtils.getSafeLabel(graph, s);
\r
67 if (l.length() == 0)
\r
68 l = NameUtils.getSafeName(graph, s);
\r
69 final String label = l;
\r
70 Display.getDefault().asyncExec(new Runnable() {
\r
74 String dialogMessage = "Cannot create document link to \"" + label +"\":" + e.getMessage();
\r
75 MessageDialog dialog = new MessageDialog(Display.getCurrent().getActiveShell(), "Document Link", null, dialogMessage, MessageDialog.INFORMATION, new String[]{"OK"}, 0);
\r