]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/actions/UpdateReferencesAction.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / actions / UpdateReferencesAction.java
1 package org.simantics.document.linking.actions;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Collections;\r
5 \r
6 import org.eclipse.jface.dialogs.MessageDialog;\r
7 import org.eclipse.swt.widgets.Display;\r
8 import org.simantics.Simantics;\r
9 import org.simantics.db.ReadGraph;\r
10 import org.simantics.db.Resource;\r
11 import org.simantics.db.exception.DatabaseException;\r
12 import org.simantics.db.layer0.adapter.ActionFactory;\r
13 import org.simantics.db.request.Read;\r
14 import org.simantics.document.DocumentResource;\r
15 import org.simantics.document.linking.ge.FixAllReferencesAction;\r
16 import org.simantics.document.linking.utils.SourceLinkUtil;\r
17 import org.simantics.utils.datastructures.Pair;\r
18 import org.simantics.utils.ui.ExceptionUtils;\r
19 \r
20 \r
21 public class UpdateReferencesAction implements ActionFactory {\r
22         \r
23         \r
24         \r
25         @Override\r
26         public Runnable create(Object target) {\r
27                 if(!(target instanceof Resource))\r
28                         return null;\r
29                 final Resource document = (Resource)target;\r
30                 return new Runnable() {\r
31                         \r
32                         @Override\r
33                         public void run() {\r
34                                 try {\r
35                                         Collection<Resource> coll = Simantics.getSession().syncRequest(new Read<Collection<Resource>>() {\r
36                                                 @Override\r
37                                                 public Collection<Resource> perform(ReadGraph graph)\r
38                                                                 throws DatabaseException {\r
39                                                     return findDocumentReferences(graph, document);\r
40                                                 }\r
41                                         });\r
42                                         \r
43                                         if (coll == null)\r
44                                                 return;\r
45                                         \r
46                                         String dialogTitle = "Fix References";\r
47                                         String dialogMessage = "Fix " + coll.size() + " old references?";\r
48                                         String dialogButtonLabels[] = new String[]{"Ok","Cancel"};\r
49                                         int defaultIndex = 0;\r
50                                         if (coll.size() == 0) {\r
51                                                 dialogMessage = "Nothing to fix.";\r
52                                                 dialogButtonLabels = new String[]{"OK"};\r
53                                                 MessageDialog dialog = new MessageDialog(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.CONFIRM, dialogButtonLabels, defaultIndex);\r
54                                                 dialog.open();\r
55                                                 return;\r
56                                         }\r
57                                         MessageDialog dialog = new MessageDialog(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.CONFIRM, dialogButtonLabels, defaultIndex);\r
58                                         if (dialog.open() != 0)\r
59                                                 return;\r
60                                         Simantics.getSession().markUndoPoint();\r
61                                         fixDocumentReferences(coll);\r
62                                 } catch (DatabaseException e) {\r
63                                         ExceptionUtils.logAndShowError("Cannot update references",e);\r
64                                 }\r
65                                 \r
66                                 \r
67                         }\r
68                 };\r
69         }\r
70         \r
71         public static Collection<Resource> findDocumentReferences(ReadGraph graph, Resource document) throws DatabaseException {\r
72         DocumentResource doc = DocumentResource.getInstance(graph);\r
73         if (!graph.hasStatement(document, doc.HasNewerVersion))\r
74             return null;\r
75         Resource model = SourceLinkUtil.getModel(graph, document);\r
76         if (model == null)\r
77             return null;\r
78         return SourceLinkUtil.findAllSources(graph, model, document);\r
79         }\r
80         \r
81         public static void fixDocumentReferences(Collection<Resource> resources) throws DatabaseException {\r
82         Simantics.getSession().syncRequest(new FixAllReferencesAction.FixAll(new Pair<Collection<Resource>, Collection<Resource>>(resources, Collections.<Resource> emptyList())));\r
83         }\r
84 \r
85 }\r