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