]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/MergeFlagsAction.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / actions / MergeFlagsAction.java
1 package org.simantics.modeling.ui.actions;\r
2 \r
3 import gnu.trove.set.hash.THashSet;\r
4 \r
5 import java.lang.reflect.InvocationTargetException;\r
6 import java.util.ArrayList;\r
7 \r
8 import org.eclipse.core.runtime.IProgressMonitor;\r
9 import org.eclipse.core.runtime.SubMonitor;\r
10 import org.eclipse.jface.dialogs.ProgressMonitorDialog;\r
11 import org.eclipse.jface.operation.IRunnableWithProgress;\r
12 import org.eclipse.swt.widgets.Shell;\r
13 import org.eclipse.ui.PlatformUI;\r
14 import org.simantics.Simantics;\r
15 import org.simantics.db.Resource;\r
16 import org.simantics.db.WriteGraph;\r
17 import org.simantics.db.common.request.WriteRequest;\r
18 import org.simantics.db.exception.CancelTransactionException;\r
19 import org.simantics.db.exception.DatabaseException;\r
20 import org.simantics.db.layer0.adapter.ActionFactory;\r
21 import org.simantics.modeling.flags.MergeFlags;\r
22 import org.simantics.utils.ui.ExceptionUtils;\r
23 \r
24 /**\r
25  * @author Hannu Niemistö\r
26  * @author Tuukka Lehtonen\r
27  */\r
28 public class MergeFlagsAction implements ActionFactory {\r
29     \r
30     @Override\r
31     public Runnable create(Object target) {\r
32         if (!(target instanceof Resource))\r
33             return null;\r
34 \r
35         Resource composite = (Resource) target;\r
36         final THashSet<Resource> composites = new THashSet<Resource>();\r
37         composites.add(composite);\r
38 \r
39         return new Runnable() {\r
40             @Override\r
41             public void run() {\r
42                 try {\r
43                     IRunnableWithProgress runnable = new IRunnableWithProgress() {\r
44                         @Override\r
45                         public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {\r
46                             final SubMonitor submonitor = SubMonitor.convert(monitor, "Merge Flags", 1000);\r
47                             try {\r
48                                 Simantics.getSession().sync(new WriteRequest() {\r
49                                     @Override\r
50                                     public void perform(WriteGraph graph) throws DatabaseException {\r
51                                         graph.markUndoPoint();\r
52                                         \r
53                                         SubMonitor expand = submonitor.newChild(10);\r
54                                         expand.subTask("Expand Composite Set");\r
55                                         MergeFlags.expandCompositeSet(graph, composites);\r
56                                         if (monitor.isCanceled())\r
57                                             throw new CancelTransactionException();\r
58                                         expand.done();\r
59 \r
60                                         SubMonitor collect = submonitor.newChild(490);\r
61                                         collect.subTask("Collect flags");\r
62                                         collect.setWorkRemaining(composites.size());\r
63                                         ArrayList<ArrayList<Resource>> groups = new ArrayList<ArrayList<Resource>>(); \r
64                                         for(Resource composite : composites) {\r
65                                             MergeFlags.collectFlagGroupsInComposite(graph, composite, groups);\r
66                                             if (monitor.isCanceled())\r
67                                                 throw new CancelTransactionException();\r
68                                             collect.worked(1);\r
69                                         }\r
70                                         collect.done();\r
71 \r
72                                         SubMonitor merge = submonitor.newChild(500);\r
73                                         merge.subTask("Merge collected flags");\r
74                                         merge.setWorkRemaining(composites.size());\r
75                                         for(ArrayList<Resource> group : groups) {\r
76                                             MergeFlags.merge(graph, group);\r
77                                             if (monitor.isCanceled())\r
78                                                 throw new CancelTransactionException();\r
79                                             merge.worked(1);\r
80                                         }\r
81                                         merge.done();\r
82                                     }\r
83                                 });\r
84                             } catch (CancelTransactionException e) {\r
85                             } catch (DatabaseException e) {\r
86                                 throw new InvocationTargetException(e);\r
87                             } finally {\r
88                                 monitor.done();\r
89                             }\r
90                         }\r
91                     };\r
92 \r
93                     Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();\r
94                     new ProgressMonitorDialog(shell).run(true, true, runnable);\r
95                 } catch (InvocationTargetException e) {\r
96                     ExceptionUtils.logAndShowError(e.getTargetException());\r
97                 } catch (InterruptedException e) {\r
98                 }\r
99             }\r
100         };\r
101     }\r
102 \r
103 }\r