/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.stunner.core.client.session.command.impl; import java.util.Collection; import java.util.logging.Level; import java.util.logging.Logger; import javax.enterprise.context.Dependent; import javax.enterprise.event.Observes; import javax.inject.Inject; import com.google.gwt.logging.client.LogConfiguration; import org.kie.workbench.common.stunner.core.client.api.SessionManager; import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvasHandler; import org.kie.workbench.common.stunner.core.client.canvas.controls.select.SelectionControl; import org.kie.workbench.common.stunner.core.client.canvas.event.keyboard.KeyDownEvent; import org.kie.workbench.common.stunner.core.client.canvas.event.keyboard.KeyboardEvent; import org.kie.workbench.common.stunner.core.client.command.CanvasCommandFactory; import org.kie.workbench.common.stunner.core.client.command.SessionCommandManager; import org.kie.workbench.common.stunner.core.client.service.ClientRuntimeError; import org.kie.workbench.common.stunner.core.client.session.ClientFullSession; import org.kie.workbench.common.stunner.core.client.session.Session; import org.kie.workbench.common.stunner.core.client.session.command.AbstractClientSessionCommand; import org.kie.workbench.common.stunner.core.graph.Edge; import org.kie.workbench.common.stunner.core.graph.Element; import org.kie.workbench.common.stunner.core.graph.Node; import static org.uberfire.commons.validation.PortablePreconditions.checkNotNull; /** * This session command obtains the selected elements on session and executes a delete operation for each one. * It also captures the <code>DELETE</code> keyboard event and fires the delete operation as well. */ @Dependent public class DeleteSelectionSessionCommand extends AbstractClientSessionCommand<ClientFullSession> { private static Logger LOGGER = Logger.getLogger(DeleteSelectionSessionCommand.class.getName()); private final SessionManager clientSessionManager; private final SessionCommandManager<AbstractCanvasHandler> sessionCommandManager; private final CanvasCommandFactory<AbstractCanvasHandler> canvasCommandFactory; protected DeleteSelectionSessionCommand() { this(null, null, null); } @Inject public DeleteSelectionSessionCommand(final SessionManager clientSessionManager, final @Session SessionCommandManager<AbstractCanvasHandler> sessionCommandManager, final CanvasCommandFactory<AbstractCanvasHandler> canvasCommandFactory) { super(false); this.clientSessionManager = clientSessionManager; this.sessionCommandManager = sessionCommandManager; this.canvasCommandFactory = canvasCommandFactory; } @Override public <V> void execute(final Callback<V> callback) { checkNotNull("callback", callback); if (null != getSession().getSelectionControl()) { final AbstractCanvasHandler canvasHandler = (AbstractCanvasHandler) getSession().getCanvasHandler(); final SelectionControl<AbstractCanvasHandler, Element> selectionControl = getSession().getSelectionControl(); final Collection<String> selectedItems = selectionControl.getSelectedItems(); if (selectedItems != null && !selectedItems.isEmpty()) { selectedItems.stream().forEach(selectedItemUUID -> { Element element = canvasHandler.getGraphIndex().getNode(selectedItemUUID); if (element == null) { element = canvasHandler.getGraphIndex().getEdge(selectedItemUUID); if (element != null) { log(Level.FINE, "Deleting edge with id " + element.getUUID()); sessionCommandManager.execute(canvasHandler, canvasCommandFactory.deleteConnector((Edge) element)); } } else { log(Level.FINE, "Deleting node with id " + element.getUUID()); sessionCommandManager.execute(canvasHandler, canvasCommandFactory.deleteNode((Node) element)); } }); } else { log(Level.FINE, "Cannot delete element, no element selected on canvas."); } // Run the callback. callback.onSuccess(); } } void onKeyDownEvent(final @Observes KeyDownEvent keyDownEvent) { checkNotNull("keyDownEvent", keyDownEvent); final KeyboardEvent.Key key = keyDownEvent.getKey(); final boolean isDeleteKey = null != key && KeyboardEvent.Key.DELETE.equals(key); final boolean isSameSession = null != getSession() && getSession().equals(clientSessionManager.getCurrentSession()); if (isDeleteKey && isSameSession) { DeleteSelectionSessionCommand.this.execute(new Callback<ClientRuntimeError>() { @Override public void onSuccess() { // Nothing to do. } @Override public void onError(final ClientRuntimeError error) { LOGGER.log(Level.SEVERE, "Error while trying to delete selected items. Message=[" + error.toString() + "]", error.getThrowable()); } }); } } private void log(final Level level, final String message) { if (LogConfiguration.loggingIsEnabled()) { LOGGER.log(level, message); } } }