]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/handler/DeleteHandler.java
Merge "Add missing javax.servlet-api bundle requirement for jersey bundles"
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / handler / DeleteHandler.java
index 7fdd56947ad726f0284c165237b093968b6c2b57..81e6103463d214d28decad76e6cd380117087e58 100644 (file)
@@ -18,10 +18,12 @@ import java.util.Deque;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.function.Consumer;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.swt.widgets.Display;
 import org.simantics.DatabaseJob;
@@ -34,11 +36,9 @@ import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.layer0.adapter.Remover;
 import org.simantics.db.layer0.exception.CannotRemoveException;
 import org.simantics.db.layer0.util.RemoverUtil;
-import org.simantics.diagram.adapter.ElementFactoryUtil;
 import org.simantics.diagram.content.ConnectionUtil;
 import org.simantics.diagram.content.EdgeResource;
 import org.simantics.diagram.internal.Activator;
-import org.simantics.diagram.synchronization.ISynchronizationContext;
 import org.simantics.diagram.synchronization.graph.RemoveBranchpoint;
 import org.simantics.diagram.synchronization.graph.RemoveElement;
 import org.simantics.diagram.ui.DiagramModelHints;
@@ -118,7 +118,16 @@ public class DeleteHandler extends AbstractDiagramParticipant {
             if (ss.isEmpty())
                 return true;
 
-            if (delete(d, ss)) {
+            if (delete(d, ss,
+                    ex -> {
+                        if (ex instanceof CannotRemoveException) {
+                            ShowMessage.showInformation("Delete Selection Was Denied", ex.getLocalizedMessage());
+                        }
+                    },
+                    error -> {
+                        error(error);
+                    }
+                    )) {
                 sel.clear(0);
             }
 
@@ -127,8 +136,8 @@ public class DeleteHandler extends AbstractDiagramParticipant {
         return false;
     }
 
-    public boolean delete(final IDiagram d, Collection<IElement> ss) {
-        TimeLogger.resetTimeAndLog(getClass(), "delete");
+    public static boolean delete(final IDiagram d, Collection<IElement> ss, Consumer<Exception> exceptionListener, Consumer<String> errorListener) {
+        TimeLogger.resetTimeAndLog(DeleteHandler.class, "delete");
         
         Topology topology = d.getDiagramClass().getAtMostOneItemOfClass(Topology.class);
         RelationshipHandler erh = d.getDiagramClass().getAtMostOneItemOfClass(RelationshipHandler.class);
@@ -219,7 +228,9 @@ public class DeleteHandler extends AbstractDiagramParticipant {
                 // Try to work with cases where the model is somewhat corrupt.
                 if (begin != null && end != null) {
                     if (PickFilter.FILTER_BRANCH_POINT.accept(begin.node) && PickFilter.FILTER_BRANCH_POINT.accept(end.node)) {
-                        error("Deletion of branch point connecting edges is not allowed. Must be connected to a node terminal.");
+                        if (errorListener != null) {
+                            errorListener.accept("Deletion of branch point connecting edges is not allowed. Must be connected to a node terminal.");
+                        }
                         return false;
                     }
                 }
@@ -265,9 +276,6 @@ public class DeleteHandler extends AbstractDiagramParticipant {
                     System.out.println("\t\t" + e);
         }
 
-        final IDiagram diagram = this.diagram;
-        final ISynchronizationContext syncContext = ElementFactoryUtil.getContextChecked(diagram); 
-
         new DatabaseJob("Delete selection") {
             @Override
             protected IStatus run(IProgressMonitor monitor) {
@@ -275,17 +283,21 @@ public class DeleteHandler extends AbstractDiagramParticipant {
                     delete(monitor);
                     return Status.OK_STATUS;
                 } catch (CannotRemoveException e) {
-                       ShowMessage.showInformation("Delete Selection Was Denied", e.getLocalizedMessage());
+                    if (exceptionListener != null) exceptionListener.accept(e);
                     return new Status(IStatus.CANCEL, Activator.PLUGIN_ID, e.getLocalizedMessage(), e);
                 } catch (DatabaseException e) {
+                    if (exceptionListener != null) exceptionListener.accept(e);
                     return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Unexpected error in delete.", e);
                 } finally {
-                    error(null);
+                    if (errorListener != null) {
+                        errorListener.accept(null);
+                    }
                     monitor.done();
                 }
             }
 
             private void delete(IProgressMonitor monitor) throws DatabaseException {
+                SubMonitor subMonitor = SubMonitor.convert(monitor, 4);
                 Simantics.getSession().syncRequest(new WriteRequest() {
                     Set<Resource> connectionsToRemove = new HashSet<Resource>();
                     Set<Resource> touchedConnections = new HashSet<Resource>();
@@ -296,7 +308,9 @@ public class DeleteHandler extends AbstractDiagramParticipant {
                         graph.markUndoPoint();
 
                         ConnectionUtil cu = new ConnectionUtil(graph);
-
+                        SubMonitor edgeElementMonitor = subMonitor.split(2); // Consume 50 % of the monitor
+                        edgeElementMonitor.setWorkRemaining(edges.size() + elements.size()); // set work remaining to size of edges and elements
+                        edgeElementMonitor.setTaskName("Removing edges");
                         // Remove edges
                         for (IElement edge : edges) {
                             ConnectionEntity ce = edge.getHint(ElementHints.KEY_CONNECTION_ENTITY);
@@ -308,8 +322,9 @@ public class DeleteHandler extends AbstractDiagramParticipant {
                             if (obj instanceof EdgeResource) {
                                 cu.remove((EdgeResource) obj);
                             }
+                            edgeElementMonitor.worked(1);
                         }
-
+                        edgeElementMonitor.setTaskName("Removing elements");
                         // Remove elements
                         for (IElement element : elements) {
                             ConnectionHandler ch = element.getElementClass().getAtMostOneItemOfClass(ConnectionHandler.class);
@@ -343,8 +358,11 @@ public class DeleteHandler extends AbstractDiagramParticipant {
                                     }
                                 }
                             }
+                            edgeElementMonitor.worked(1);
                         }
-
+                        SubMonitor connectionsMonitor = subMonitor.split(1); // Consume 50 % of the monitor
+                        connectionsMonitor.setWorkRemaining(touchedConnections.size()); // set work remaining to size of edges and elements
+                        connectionsMonitor.setTaskName("Pruning connectors");
                         // Check all touched connections to see if they are empty.
                         for (Resource connection : touchedConnections) {
                             int removedConnectors = cu.removeUnusedConnectors(connection);
@@ -363,13 +381,17 @@ public class DeleteHandler extends AbstractDiagramParticipant {
                             if (connectors < 2) {
                                 connectionsToRemove.add(connection);
                             }
+                            connectionsMonitor.worked(1);
                         }
-
+                        SubMonitor connectionsMonitor2 = subMonitor.split(1); // Consume 50 % of the monitor
+                        connectionsMonitor2.setWorkRemaining(connectionsToRemove.size()); // set work remaini
+                        connectionsMonitor2.setTaskName("Removing leftover connections");
                         // Remove selected/left-over empty connections
                         for (Resource connection : connectionsToRemove) {
                             if (DEBUG_DELETE)
                                 System.out.println("REMOVING CONNECTION: " + connection);
                             RemoveElement.removeElement(graph, (Resource)d.getHint(DiagramModelHints.KEY_DIAGRAM_RESOURCE), connection);
+                            connectionsMonitor2.worked(1);
                         }
                     }