]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/ge/SourceObjectDropAction.java
Externalize org.simantics.document.linking.ui
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / ge / SourceObjectDropAction.java
1 package org.simantics.document.linking.ge;
2
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;
20
21 public class SourceObjectDropAction implements DropActionFactory {
22         
23         
24         @Override
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);
29         if (s == null) {
30                 Variable sv = AdaptionUtils.adaptToSingle(source, Variable.class);
31                 if (sv != null)
32                         s = sv.getRepresents(g);
33         }
34
35         if(t == null || s == null)
36             return null;
37         DocumentLink sl = DocumentLink.getInstance(g);
38         if (g.isInstanceOf(s, sl.Source)) {
39                 return null;
40         }
41                 return getRunnable(t, s);
42         }
43         
44         private Runnable getRunnable(final Variable tv, final Resource s) {
45                 return new Runnable() {
46                         
47                         @Override
48                         public void run() {
49                                 Simantics.getSession().asyncRequest(new WriteRequest() {
50                                         
51                                         @Override
52                                         public void perform(WriteGraph graph) throws DatabaseException {
53                                                 Layer0 l0 = Layer0.getInstance(graph);
54                                                 
55                                                 Resource relation = tv.getPossiblePredicateResource(graph);
56                                                 Resource instance; 
57                                                 if (relation != null && graph.isInstanceOf(relation, l0.FunctionalRelation)) {
58                                                         instance = tv.getParent(graph).getPossibleRepresents(graph);
59                                                 } else {
60                                                         instance = tv.getPossibleRepresents(graph);
61                                                 }
62                                                 if (instance == null)
63                                                         return;
64                                                 
65                                                 try {
66                                                         SourceLinkUtil.createDocumentLink(graph, instance, relation, s);
67                                                 } catch (final DatabaseException e) {
68                                                         String l = NameUtils.getSafeLabel(graph, s);
69                                                         if (l.length() == 0)
70                                                                 l = NameUtils.getSafeName(graph, s);
71                                                         final String label = l;
72                                                         Display.getDefault().asyncExec(new Runnable() {
73                                                                 
74                                                                 @Override
75                                                                 public void run() {
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); 
78                                                                         dialog.open();
79                                                                 }
80                                                         });
81                                                 }
82                                         }
83                                 });
84                                 
85                         }
86                 };
87                 
88         }
89         
90         
91         
92         
93 }