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