blob: 7547af8057b4255547fcca2a01a5e690f6e06e90 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2005, 2019 SAP SE
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* SAP SE - initial API, implementation and documentation
* mwenz - Bug 340627 - Features should be able to indicate cancellation
* mgorning - Bug 343983 - Notification for Cancelled Reconnection Events
* Bug 336488 - DiagramEditor API
* pjpaulin - Bug 352120 - Now uses IDiagramContainerUI interface
* Philip Alldredge - Bug 418676 - Undo is not disabled when canUndo is false for Palette features
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.ui.internal.command;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.graphiti.datatypes.ILocation;
import org.eclipse.graphiti.features.IFeature;
import org.eclipse.graphiti.features.IFeatureAndContext;
import org.eclipse.graphiti.features.IReconnectionFeature;
import org.eclipse.graphiti.features.context.IContext;
import org.eclipse.graphiti.features.context.IReconnectionContext;
import org.eclipse.graphiti.features.context.impl.ReconnectionContext;
import org.eclipse.graphiti.internal.command.CommandExec;
import org.eclipse.graphiti.internal.command.GenericFeatureCommandWithContext;
import org.eclipse.graphiti.internal.datatypes.impl.LocationImpl;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.ui.editor.IDiagramBehaviorUI;
import org.eclipse.graphiti.ui.platform.IConfigurationProvider;
/**
* @noinstantiate This class is not intended to be instantiated by clients.
* @noextend This class is not intended to be subclassed by clients.
*/
public class ReconnectCommand extends AbstractCommand implements IFeatureAndContext {
private IReconnectionContext ctx;
private IReconnectionFeature feature;
private boolean reconnectFinished = false;
/**
* Instantiate a command that can reconnect a Connection instance to a
* different source or target endpoint.
*
* @param conn
* the connection instance to reconnect (non-null)
* @throws IllegalArgumentException
* if conn is null
*/
public ReconnectCommand(IConfigurationProvider configurationProvider, Connection connection, Anchor oldAnchor,
Anchor newAnchor, PictogramElement newTargetPictogramElement, String reconnectType, Point location) {
super(configurationProvider);
ILocation targetLocation = null;
if (location != null) {
IDiagramBehaviorUI diagramBehavior = (IDiagramBehaviorUI) getFeatureProvider().getDiagramTypeProvider()
.getDiagramBehavior();
Point realLocation = diagramBehavior.calculateRealMouseLocation(location);
targetLocation = new LocationImpl(realLocation.x, realLocation.y);
}
this.ctx = new ReconnectionContext(connection, oldAnchor, newAnchor, targetLocation);
ctx.setTargetPictogramElement(newTargetPictogramElement);
((ReconnectionContext) ctx).setReconnectType(reconnectType);
this.feature = getFeatureProvider().getReconnectionFeature(ctx);
}
@Override
public boolean canExecute() {
if (feature != null) {
return feature.canReconnect(ctx);
}
return false;
}
@Override
public boolean canUndo() {
if (feature != null) {
return feature.canUndo(ctx);
}
return false;
}
/**
* Reconnect the connection to newSource (if setNewSource(...) was invoked
* before) or newTarget (if setNewTarget(...) was invoked before).
*/
@Override
public void execute() {
if (feature != null) {
// feature.reconnnect(ctx);
GenericFeatureCommandWithContext genericFeatureCommandWithContext = new GenericFeatureCommandWithContext(
feature, ctx);
try {
CommandExec.getSingleton().executeCommand(genericFeatureCommandWithContext,
getTransactionalEditingDomain());
} catch (Exception e) {
// Wrap in runtime exception (handled outside)
if (e instanceof RuntimeException) {
throw (RuntimeException) e;
} else {
throw new RuntimeException(e);
}
}
}
reconnectFinished = true;
}
public IFeature getFeature() {
return feature;
}
public IContext getContext() {
return ctx;
}
public void deactivate() {
if (feature != null && ctx != null && !reconnectFinished) {
feature.canceledReconnect(ctx);
}
}
}