]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/MergeFlagsAction.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/MergeFlagsAction.java
new file mode 100644 (file)
index 0000000..f38cc0e
--- /dev/null
@@ -0,0 +1,103 @@
+package org.simantics.modeling.ui.actions;\r
+\r
+import gnu.trove.set.hash.THashSet;\r
+\r
+import java.lang.reflect.InvocationTargetException;\r
+import java.util.ArrayList;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.SubMonitor;\r
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;\r
+import org.eclipse.jface.operation.IRunnableWithProgress;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.CancelTransactionException;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.ActionFactory;\r
+import org.simantics.modeling.flags.MergeFlags;\r
+import org.simantics.utils.ui.ExceptionUtils;\r
+\r
+/**\r
+ * @author Hannu Niemistö\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class MergeFlagsAction implements ActionFactory {\r
+    \r
+    @Override\r
+    public Runnable create(Object target) {\r
+        if (!(target instanceof Resource))\r
+            return null;\r
+\r
+        Resource composite = (Resource) target;\r
+        final THashSet<Resource> composites = new THashSet<Resource>();\r
+        composites.add(composite);\r
+\r
+        return new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                try {\r
+                    IRunnableWithProgress runnable = new IRunnableWithProgress() {\r
+                        @Override\r
+                        public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {\r
+                            final SubMonitor submonitor = SubMonitor.convert(monitor, "Merge Flags", 1000);\r
+                            try {\r
+                                Simantics.getSession().sync(new WriteRequest() {\r
+                                    @Override\r
+                                    public void perform(WriteGraph graph) throws DatabaseException {\r
+                                        graph.markUndoPoint();\r
+                                        \r
+                                        SubMonitor expand = submonitor.newChild(10);\r
+                                        expand.subTask("Expand Composite Set");\r
+                                        MergeFlags.expandCompositeSet(graph, composites);\r
+                                        if (monitor.isCanceled())\r
+                                            throw new CancelTransactionException();\r
+                                        expand.done();\r
+\r
+                                        SubMonitor collect = submonitor.newChild(490);\r
+                                        collect.subTask("Collect flags");\r
+                                        collect.setWorkRemaining(composites.size());\r
+                                        ArrayList<ArrayList<Resource>> groups = new ArrayList<ArrayList<Resource>>(); \r
+                                        for(Resource composite : composites) {\r
+                                            MergeFlags.collectFlagGroupsInComposite(graph, composite, groups);\r
+                                            if (monitor.isCanceled())\r
+                                                throw new CancelTransactionException();\r
+                                            collect.worked(1);\r
+                                        }\r
+                                        collect.done();\r
+\r
+                                        SubMonitor merge = submonitor.newChild(500);\r
+                                        merge.subTask("Merge collected flags");\r
+                                        merge.setWorkRemaining(composites.size());\r
+                                        for(ArrayList<Resource> group : groups) {\r
+                                            MergeFlags.merge(graph, group);\r
+                                            if (monitor.isCanceled())\r
+                                                throw new CancelTransactionException();\r
+                                            merge.worked(1);\r
+                                        }\r
+                                        merge.done();\r
+                                    }\r
+                                });\r
+                            } catch (CancelTransactionException e) {\r
+                            } catch (DatabaseException e) {\r
+                                throw new InvocationTargetException(e);\r
+                            } finally {\r
+                                monitor.done();\r
+                            }\r
+                        }\r
+                    };\r
+\r
+                    Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();\r
+                    new ProgressMonitorDialog(shell).run(true, true, runnable);\r
+                } catch (InvocationTargetException e) {\r
+                    ExceptionUtils.logAndShowError(e.getTargetException());\r
+                } catch (InterruptedException e) {\r
+                }\r
+            }\r
+        };\r
+    }\r
+\r
+}\r