1 package org.simantics.document.linking.ge;
3 import org.eclipse.jface.dialogs.IDialogConstants;
4 import org.eclipse.jface.dialogs.MessageDialog;
5 import org.eclipse.osgi.util.NLS;
6 import org.eclipse.swt.widgets.Display;
7 import org.simantics.Simantics;
8 import org.simantics.db.ReadGraph;
9 import org.simantics.db.Resource;
10 import org.simantics.db.WriteGraph;
11 import org.simantics.db.common.request.WriteRequest;
12 import org.simantics.db.common.utils.NameUtils;
13 import org.simantics.db.exception.DatabaseException;
14 import org.simantics.db.layer0.adapter.DropActionFactory;
15 import org.simantics.db.layer0.variable.Variable;
16 import org.simantics.document.linking.ontology.DocumentLink;
17 import org.simantics.document.linking.utils.SourceLinkUtil;
18 import org.simantics.layer0.Layer0;
19 import org.simantics.utils.ui.AdaptionUtils;
21 public class SourceObjectDropAction implements DropActionFactory {
25 public Runnable create(ReadGraph g, Object target, Object source, int operation)
26 throws DatabaseException {
27 Variable t = (Variable)target;
28 Resource s = AdaptionUtils.adaptToSingle(source, Resource.class);
30 Variable sv = AdaptionUtils.adaptToSingle(source, Variable.class);
32 s = sv.getRepresents(g);
35 if(t == null || s == null)
37 DocumentLink sl = DocumentLink.getInstance(g);
38 if (g.isInstanceOf(s, sl.Source)) {
41 return getRunnable(t, s);
44 private Runnable getRunnable(final Variable tv, final Resource s) {
45 return new Runnable() {
49 Simantics.getSession().asyncRequest(new WriteRequest() {
52 public void perform(WriteGraph graph) throws DatabaseException {
53 Layer0 l0 = Layer0.getInstance(graph);
55 Resource relation = tv.getPossiblePredicateResource(graph);
57 if (relation != null && graph.isInstanceOf(relation, l0.FunctionalRelation)) {
58 instance = tv.getParent(graph).getPossibleRepresents(graph);
60 instance = tv.getPossibleRepresents(graph);
66 SourceLinkUtil.createDocumentLink(graph, instance, relation, s);
67 } catch (final DatabaseException e) {
68 String l = NameUtils.getSafeLabel(graph, s);
70 l = NameUtils.getSafeName(graph, s);
71 final String label = l;
72 Display.getDefault().asyncExec(new Runnable() {
76 String dialogMessage = NLS.bind(Messages.SourceObjectDropAction_CannotCreateDocumentLink , new Object[] { label , e.getMessage() });
77 MessageDialog dialog = new MessageDialog(Display.getCurrent().getActiveShell(), Messages.SourceObjectDropAction_DocumentLink, null, dialogMessage, MessageDialog.INFORMATION, new String[]{ IDialogConstants.OK_LABEL }, 0);