]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/ge/SourceObjectDropAction.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / ge / SourceObjectDropAction.java
1 package org.simantics.document.linking.ge;\r
2 \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
18 \r
19 public class SourceObjectDropAction implements DropActionFactory {\r
20         \r
21         \r
22         @Override\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
27         if (s == null) {\r
28                 Variable sv = AdaptionUtils.adaptToSingle(source, Variable.class);\r
29                 if (sv != null)\r
30                         s = sv.getRepresents(g);\r
31         }\r
32 \r
33         if(t == null || s == null)\r
34             return null;\r
35         DocumentLink sl = DocumentLink.getInstance(g);\r
36         if (g.isInstanceOf(s, sl.Source)) {\r
37                 return null;\r
38         }\r
39                 return getRunnable(t, s);\r
40         }\r
41         \r
42         private Runnable getRunnable(final Variable tv, final Resource s) {\r
43                 return new Runnable() {\r
44                         \r
45                         @Override\r
46                         public void run() {\r
47                                 SimanticsUI.getSession().asyncRequest(new WriteRequest() {\r
48                                         \r
49                                         @Override\r
50                                         public void perform(WriteGraph graph) throws DatabaseException {\r
51                                                 Layer0 l0 = Layer0.getInstance(graph);\r
52                                                 \r
53                                                 Resource relation = tv.getPossiblePredicateResource(graph);\r
54                                                 Resource instance; \r
55                                                 if (relation != null && graph.isInstanceOf(relation, l0.FunctionalRelation)) {\r
56                                                         instance = tv.getParent(graph).getPossibleRepresents(graph);\r
57                                                 } else {\r
58                                                         instance = tv.getPossibleRepresents(graph);\r
59                                                 }\r
60                                                 if (instance == null)\r
61                                                         return;\r
62                                                 \r
63                                                 try {\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
71                                                                 \r
72                                                                 @Override\r
73                                                                 public void run() {\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
76                                                                         dialog.open();\r
77                                                                 }\r
78                                                         });\r
79                                                 }\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