--- /dev/null
+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