X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fhandler%2FDeleteHandler.java;h=81e6103463d214d28decad76e6cd380117087e58;hb=195c63dd5c7600170f594750de96793ebf06a0ad;hp=7fdd56947ad726f0284c165237b093968b6c2b57;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/handler/DeleteHandler.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/handler/DeleteHandler.java index 7fdd56947..81e610346 100644 --- a/bundles/org.simantics.diagram/src/org/simantics/diagram/handler/DeleteHandler.java +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/handler/DeleteHandler.java @@ -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 ss) { - TimeLogger.resetTimeAndLog(getClass(), "delete"); + public static boolean delete(final IDiagram d, Collection ss, Consumer exceptionListener, Consumer 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 connectionsToRemove = new HashSet(); Set touchedConnections = new HashSet(); @@ -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); } }